首页 > 其他分享 >PinBall击球游戏

PinBall击球游戏

时间:2024-11-16 09:43:39浏览次数:3  
标签:recketX canvas 游戏 WIDTH int private 击球 PinBall TABLE

package com.shrimpking.t9;


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2024/11/13 20:39
 */
public class PinBall extends JFrame implements KeyListener
{
    private BallCanvas canvas; //面板
    private Timer timer; // 定时器
    private boolean isOver = false; //游戏是否结束
    private static final int TABLE_WIDTH = 350; //屏幕宽度
    private static final int TABLE_HEIGHT = 500; //屏幕高度
    private static final int BALL_SIZE = 18; // 球的尺寸
    private static final int RECKET_WIDTH = 100; // 球拍宽度
    private static final int RECKET_HEIGHT = 20; //球拍厚度
    private int ballX = 120; //球的坐标
    private int ballY = 30; //
    private int speedX = 5; // 加速度
    private int speedY = 10; //
    private int recketX = 120; // 球拍的坐标
    private int recketY = 400;  //
    private int score = 0;

    public PinBall(){
        this.setTitle("击球游戏");
        this.setSize(TABLE_WIDTH, TABLE_HEIGHT); //窗体尺寸
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗体关闭事件

        canvas = new BallCanvas();
        canvas.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT)); //面板尺寸
        canvas.addKeyListener(this); //键盘事件
        this.getContentPane().add(canvas);

        ActionListener task = new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {

                //根据边界,修正加速度
                if (ballX <= 0 || ballX >= (TABLE_WIDTH - BALL_SIZE - speedX)){
                    //如果球的x坐标,小于左边界,或大于右边界时,速度转向
                    speedX = -speedX;
                }
                if (ballY <= 0 || (ballY >= recketY - BALL_SIZE - speedY && ballX > recketX && ballX < recketX + RECKET_WIDTH)){
                    //如果球的y坐标,小于顶边界,大于球拍的y坐标的边界,速度转向
                    if (ballY >= recketY - BALL_SIZE - speedY){
                        score += 100;
                    }
                    speedY = -speedY;
                }

                if (ballY > recketY - BALL_SIZE && (ballX < recketX || ballX > recketX + RECKET_WIDTH)){
                    //如果球的y坐标,超出球拍的边界,停止游戏
                    timer.stop(); //停止计时,球静止了
                    isOver = true; //游戏结束
                    canvas.repaint(); //面板重绘
                }

                ballX += speedX; //球运动
                ballY += speedY; //
                canvas.repaint();
            }
        };

        timer = new Timer(100,task); //计时器

        this.addKeyListener(this); //窗体键盘事件
        this.setResizable(false); //不可伸缩
        this.setLocationRelativeTo(null); //居中显示
        this.setVisible(true); //可见
        timer.start(); //计时器开启
    }

    public static void main(String[] args)
    {
        PinBall w = new PinBall();
    }

    @Override
    public void keyTyped(KeyEvent e)
    {

    }

    @Override
    public void keyPressed(KeyEvent e)
    {
        if (e.getKeyCode() == KeyEvent.VK_LEFT){
            if (recketX > 0){
                //方向键,左,
                recketX -= 11;
                canvas.repaint();
            }
        }else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
            if (recketX < (TABLE_WIDTH - RECKET_WIDTH)){
                //方向键,右
                recketX += 11;
                canvas.repaint();
            }
        }else if (e.getKeyCode() == KeyEvent.VK_ENTER){
            //方向键,回车
            if (isOver){
                //如果游戏结束了,回车开启新游戏
                isOver = false; //
                score = 0; //成绩
                ballX = (int) (Math.random() * TABLE_WIDTH); //随机,球坐标
                ballY = 30; //
                canvas.repaint(); //重绘
                timer.start(); //计时器开启
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e)
    {

    }

    private class BallCanvas extends JPanel{
        @Override
        public void paint(Graphics g)
        {
            super.paint(g);
            if (isOver){
                //游戏结束
                g.setColor(Color.BLUE);
                g.setFont(new Font("宋体",Font.PLAIN,40));
                g.drawString("游戏结束!",70,220);
            }else {
                //游戏进行中
                g.setColor(Color.RED);
                g.fillOval(ballX,ballY,BALL_SIZE,BALL_SIZE);  //球

                g.setColor(Color.PINK);
                g.fillRect(recketX,recketY,RECKET_WIDTH,RECKET_HEIGHT); //球拍

                g.setColor(Color.BLACK);
                g.setFont(new Font("黑体",Font.PLAIN,18));
                g.drawString("得分:" + score, 10,20); //得分

            }
        }
    }

}

标签:recketX,canvas,游戏,WIDTH,int,private,击球,PinBall,TABLE
From: https://blog.csdn.net/modern358/article/details/143753843

相关文章

  • (分享源码)计算机毕业设计必看必学 上万套实战教程手把手教学JAVA、PHP,node.js,C++、pyth
    摘要随着计算机科学技术日渐成熟,人们已经深刻认识到了计算机功能的强大,计算机已经进入到了人类社会发展的各个领域,并且发挥着十分重要的作用。通过管理系统在电脑上的应用,人们能更好的管理信息,储存数据。为了能够提供游戏商城的方便性,开发了基于vue的游戏网站。此游戏网站......
  • C++ 游戏开发入门教程:从基础到实践
    引言C++是一种广泛应用于游戏开发的编程语言,因其高性能和对硬件资源的精细控制能力,成为了许多大型游戏和引擎的首选语言。无论是开发2D还是3D游戏,C++都能够提供高效的计算和优异的性能,尤其在需要处理大量数据和实时计算的情况下,如渲染、物理计算和网络通信等。本文将介......
  • c语言——三子棋基础游戏
    首先,我们先有整体思路:它的棋盘到底是怎么样子的?它实现的过程是怎么一步一步来的棋盘到底是怎么样子的?大概是这么一个轮廓。实现过程中,我们该如何思考呢?1.我们想到,开始游戏的时候,我们肯定会一个菜单的吧?2.利用菜单选择是否开始游戏3.开始游戏后,我们就开始设计排版棋盘了:1......
  • Unity 6发布:付费下载机制下线,游戏运行效果显著提升
    Unity6发布:付费下载机制下线,游戏运行效果显著提升点击蓝链领取游戏开发教程在十月中旬,Unity公司在多个平台上隆重发布了其游戏开发引擎的全新力作——Unity6版本,此版本恰好紧随Unity官方宣布废除“付费下载”制度之后问世,标志着一次重要的版本迭代。点击蓝链领取游戏......
  • 怎么用云游戏玩Steam?ToDesk云电脑新手入门教程
    对于新手玩家来说,想要上手Steam游戏,这门槛真有点高。不说要从众多真假难辨的软件中找出正版,遇到Steam内想玩的游戏还得等着下载安装解压,费时又费力。玩家想解决这个困难也很简单,只需下个ToDesk云游戏即可。它是ToDesk云电脑中专门玩游戏的版块,预安装了上百款热门游戏,免费使用加......
  • 网络游戏安全现状及相关应对方案
    中国网络游戏历经十余年的飞速发展,取得了显著成就,但与此同时,也陷入了诸多安全问题的泥沼。一、中国网络游戏发展中的安全困境(一)灰色产业链滋生外挂、私服、盗号、打金工作室以及网络信息诈骗等灰色产业链在游戏行业中肆意生长。这些问题严重影响了游戏的正常运营与发展,成为行业......
  • 【鸣潮,原神PC端启动器】仿二次元手游PC端游戏启动器,以鸣潮为例。
    二游GAMELanucher启动器1.前言许多二次元手游(原神,鸣潮,少女前线)的PC端启动器都是使用Qt做的,正好最近正在玩鸣潮,心血来潮,便仿鸣潮启动器,从头写一个。先下载一个官方版的PC启动器,找到图标,背景图等素材,然后对着界面写代码就行。效果如下2.划分模块游戏启动器大致可以......
  • 线上线下游戏陪玩app源码,陪玩平台源码有哪些功能?
    系统源码 交友系统APP游戏陪玩系统源码圈子同城搭子小程序源码陪玩接单平台app家政系统源码家政预约服务小程序源码游戏陪玩源码搭建平台 陪玩小游戏源码是一套专为游戏爱好者设计的软件开发工具,它集成了多种功能,旨在为用户提供一个全方位的游戏社交平台。游戏陪玩app......
  • python实现的扫雷游戏的AI解法(启发式算法)
    相关:python编写的扫雷游戏如何使用计算机程序求解扫雷游戏本文中实现的《扫雷》游戏的AI解法的项目地址:https://openi.pcl.ac.cn/devilmaycry812839668/AI_mine_game该项目的解法效果:之前介绍了网上的一些解决《扫雷》游戏的一些解法,包括DQN和启发式等AI算法,看着这......
  • python编写的扫雷游戏
    使用python语言编写的命令行方式的交互的《扫雷》游戏:importnumpyasnpimportrandomfromtypingimportListH=36W=64defbelong_to(h,w,H=H,W=W):near=[]foriinrange(h-2,h+3):forjinrange(w-2,w+3):ifi>=0andj......