之前呢我们用Python的Pygame做过这个Pong游戏

Python 项目实战 教你用Pygame写一个Pong游戏_Leleprogrammer的博客-CSDN博客_pong游戏手把手教你用Pygame写一个Pong游戏https://blog.csdn.net/leleprogrammer/article/details/124227987?spm=1001.2014.3001.5501

这一次,我们用Java的Swing来实现类似的效果

首先我们列出本次的项目结构

这个程序分为四个部分,一个程序入口,一个模型,一个刷新帧,一个视图,模型里面放入球和挡板的类,视图里面放入主窗口Frame和主面板Panel

接下来是项目目录

src资源下面,我们把东西全部写到com.mr包下,main里的Start是主入口,model里面分别是Ball和Board,service下是刷新帧的服务,view视图下分别为主窗体和主面板

好啦,现在先来写GameFrame的代码

package com.mr.view;import javax.swing.*;
import java.awt.*;public class GameFrame extends JFrame {private Container container;private GamePanel panel;public GameFrame() {setTitle("Pong");setBounds(300,300,850,1000);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);container=getContentPane();panel=new GamePanel();addKeyListener(panel);container.add(panel);setVisible(true);}
}

首先啊,还是和平常一样声明package,导入一些东西,然后主窗体继承自JFrame,设置以下标题和窗口大小,还有关闭后退出程序的设置(setDefaultCloseOperation)然后实例化GamePanel面板(待会写),然后绑定事件并添加到container容器中,设置窗口可见

然后是GamePanel的代码,也是整个程序的核心,在这里我们要做出对赛点、得分、球体碰撞等检测,并绘制图形

package com.mr.view;import com.mr.model.Ball;
import com.mr.model.Board;
import com.mr.service.Fresh;import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;public class GamePanel extends JPanel implements KeyListener {private BufferedImage img;private Graphics2D g2;public ArrayList<Object> select;private Fresh fresh;private Board b1;private Board b2;private Ball ball;private int score1;private int score2;private int winPoint;private int matchPoint; // 0表示没有赛点,1表示玩家1的赛点,2表示玩家2的赛点private int winner;public GamePanel() {img=new BufferedImage(850,1000,BufferedImage.TYPE_INT_BGR);g2=img.createGraphics();select=new ArrayList<>();b1=new Board(0);b2=new Board(1);ball=new Ball();score1=0;score2=0;matchPoint=0;winPoint=11;winner=0;fresh=new Fresh(this);fresh.start();}private void paintImage() {g2.setColor(Color.WHITE);if (winner==0) {int width=10;g2.fillRect(425-width/2,0,width,1000);g2.fillRect(b1.x,b1.y,b1.width,b1.height);g2.fillRect(b2.x,b2.y,b2.width,b2.height);g2.fillOval(ball.x-ball.r,ball.y-ball.r,ball.r*2,ball.r*2);}g2.setFont(new Font("黑体",Font.BOLD,56));g2.drawString(String.valueOf(score1),295,150);g2.drawString(String.valueOf(score2),525,150);g2.setFont(new Font("黑体",Font.PLAIN,22));if (winner==0) {switch (matchPoint) {case 1:g2.drawString("赛点",295,200);break;case 2:g2.drawString("赛点",525,200);break;default:break;}} else {g2.drawString("玩家"+String.valueOf(winner)+"获胜",winner==1?295:525,200);}}public void paint(Graphics g) {if (winner==0) {move();ball.move(b1.getBound(),b2.getBound());checkPoint();checkMatchPoint();b1.checkBound();b2.checkBound();}g2.setColor(Color.BLACK);g2.fillRect(0,0,850,1000);paintImage();g.drawImage(img,0,0,this);}private void checkPoint() {if (ball.x<=0) {score2+=1;} else if (ball.x+ball.r*2>=850) {score1+=1;} else {return;}ball=new Ball();}private void checkMatchPoint() {if (score1==winPoint) {winner=1;return;} else if (score2==winPoint) {winner=2;return;}if (score1+1==winPoint&&score2+1!=winPoint) {matchPoint=1;} else if (score1+1!=winPoint&&score2+1==winPoint) {matchPoint=2;} else if (score1+1==winPoint&&score2+1==winPoint) {matchPoint=0;winPoint++;} else if (score1+1!=winPoint&&score2+1!=winPoint) {matchPoint=0;}}private void move() {for (Object code:select) {if (code==(Object)KeyEvent.VK_W) {b1.y-=b1.speed;} else if (code==(Object)KeyEvent.VK_S) {b1.y+=b1.speed;} else if (code==(Object)KeyEvent.VK_UP) {b2.y-=b2.speed;} else if (code==(Object)KeyEvent.VK_DOWN) {b2.y+=b2.speed;}}}@Overridepublic void keyPressed(KeyEvent event) {if (select.indexOf(event.getKeyCode())==-1) {select.add(event.getKeyCode());}}@Overridepublic void keyReleased(KeyEvent event) {select.remove((Object)event.getKeyCode());}@Overridepublic void keyTyped(KeyEvent event) {;}
}

声明com.mr.view包下,导入一些东西,然后创建主类GamePanel,继承自JPanel并实现KeyListener事件,接下来就是声明变量,一个主图片img以及对应的g2,select用于储存按下的按键,这个待会讲,接下来是fresh刷新帧线程,两块板,一个球,两个玩家的分数,胜利所需要的分数,赛点归属于谁,是否出现了赢家等。接下来来到构造函数,先创建img主图片850x1000还有g2,初始化一些东西,这里Board的0和1表示归属于哪个玩家,0则为左手边的,1则为右手边的。接下来创建球(ps.这些类待会就来写),然后分数初始化,赛点为0,表示没有人获得赛点,获胜分数为11分,和乒乓球一样,然后winner为0表示没有赢家,创建线程,这里传入了自己,是为了待会可以通过repaint方式不断重绘,然后启动线程。paint中,没有获胜,则移动板(move),移动球,检查得分,检查赛点,保持两块板处于场内(窗口内),然后设置颜色为黑色,填充背景为黑色,绘制,并把主图片画在g中。paintImage中对板、球、得分、中线进行绘制,不难理解。好,GamePanel的最后,我们来讲讲刚刚的那个select,因为我们要同时检测做个键盘按钮,但是这个KeyListener只支持一次性按下一个,按下多个也只会获取到一个,所以我们用一种方法来解决,我们创建一个select数组,按下按键且按键不在select中则添加到select中,松开则删除,这样同时按下多个按钮,这些按钮(就像排着队伍一样)相继添加到select中,这样也便于了我们移动板的if判断。

接下来我们来看看一个同样非常重要的Fresh刷新帧线程

package com.mr.service;import com.mr.view.GamePanel;public class Fresh extends Thread {public final int INTERVAL=20;private GamePanel panel;public Fresh(GamePanel panel) {this.panel=panel;}public void run() {while (true) {panel.repaint();try {Thread.sleep(INTERVAL);} catch (InterruptedException e) {e.printStackTrace();}}}
}

这个就while循环实现啦~~~

然后是Ball

package com.mr.model;import java.awt.*;
import java.util.Random;public class Ball {public int x;public int y;public int r;private int xspeed;private int yspeed;private int max_speed;private int min_speed;private int max_speed2;private int min_speed2;public Ball() {x=425;y=500;r=15;Random rd=new Random();xspeed=rd.nextInt(1,3)==1?rd.nextInt(4,7):rd.nextInt(-6,-3);yspeed=rd.nextInt(1,3)==1?rd.nextInt(4,7):rd.nextInt(-6,-3);max_speed=12;min_speed=3;max_speed2=-3;min_speed2=-12;}public void move(Rectangle b1,Rectangle b2) {x+=xspeed;y+=yspeed;Random rd=new Random();if (getBound().intersects(b1)||getBound().intersects(b2)) {xspeed=-xspeed;yspeed+=rd.nextInt(-2,3);}else if (y-r<=0||y+r>=965) {yspeed=-yspeed;xspeed+=rd.nextInt(-2,3);}if (xspeed>max_speed&&xspeed>0) {xspeed=max_speed;}if (yspeed>max_speed&&yspeed>0) {yspeed=max_speed;}if (xspeed<min_speed&&xspeed>0) {xspeed=min_speed;}if (yspeed<min_speed&&yspeed>0) {yspeed=min_speed;}if (xspeed>max_speed2&&xspeed<0) {xspeed=max_speed2;}if (yspeed>max_speed&&yspeed<0) {yspeed=max_speed2;}if (xspeed<min_speed&&xspeed<0) {xspeed=min_speed2;}if (yspeed<min_speed&&yspeed<0) {yspeed=min_speed2;}}private Rectangle getBound() {return new Rectangle(x-r,y-r,r*2,r*2);}
}

这个模型嘛,一般情况下都有x和y还有大小,因为这个是个圆,所以我们用半径r,然后xspeed和yspeed表示各个方向的速度从而实现斜着移动,还有max_speed和min_speed用于把动态变换的速度限制于这个范围内,待会每碰到一次墙壁或板,就会适当增加或减少速度,所以要把速度限制在特定范围内,max_speed2和min_speed2也一样,前2者是用于正数速度的,后2者是用于负数速度的,然后移动的时候就对一些碰撞等情况进行检测就好了,getBound用于返回对象的Rect长方形对象,用于检测碰撞。

最后是Board

package com.mr.model;import java.awt.*;public class Board {public int x;public int y;public int width;public int height;public int speed;public Board(int type) {width=8;height=120;speed=15;y=500-height/2;if (type==0) {x=0;} else {x=850-15-width;}}public void checkBound() {if (y+height>=985) {y=985-height;}if (y<=0) {y=0;}}public Rectangle getBound() {return new Rectangle(x,y,width,height);}
}

Board和Ball也有着差不多的一些参数和类成员和方法

现在全部就都写完了,最后画上点睛之笔,写上最后的程序入口就大功告成啦!!!

Start.java:

package com.mr.main;import com.mr.view.GameFrame;public class Start {public static void main(String[] args) {GameFrame gameFrame=new GameFrame();}
}

好啦,这样就实现了Pong游戏的效果,喜欢的话就点赞收藏关注吧!!!

Java Swing 制作一个Pong小游戏相关推荐

  1. android打地鼠设计报告,android开发中利用handler制作一个打地鼠小游戏

    android开发中利用handler制作一个打地鼠小游戏 发布时间:2020-11-25 15:21:11 来源:亿速云 阅读:136 作者:Leah 这期内容当中小编将会给大家带来有关androi ...

  2. python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!

    导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环 ...

  3. 小福利,用Excel VBA编程制作一个变色小游戏

    小福利,用Excel VBA编程制作一个变色小游戏 设计思想:在正方形的四条边上都是设置循环函数,不断改变颜色和单元格里面的数值. Option ExplicitSub 按钮1_Click() Dim ...

  4. 基于 Vue 制作一个猜拳小游戏

    目录 前言: 项目效果展示: 对应素材: 代码实现思路: 实现代码: 总结: 前言: 在工作学习之余玩一会游戏既能带来快乐,还能缓解生活压力,跟随此文一起制作一个小游戏吧. 描述: 石头剪子布,是一种 ...

  5. python制作阴阳师脚本_利用python制作一个阴阳师小游戏

    利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...

  6. 基于java制作一个飞机小游戏(学习心得)

    emmm,第一篇博客 用了这么久的csdn,都是在观摩大佬们发帖,一只小萌新瑟瑟发抖,不敢说话,甚 至连代码也不能完全读懂.假期在b站自学(可以说是复习)了java课程,尚学堂的 2018版.链接如下 ...

  7. 手把手教Java初学者制作一个王者荣耀游戏,1天就能学会。

    刚入门的java初学者,在学会一定项目后,都想先做一款游戏来练练手,来看看自己的知识掌握的怎么样了,那有的初学者并不知道可以做哪些项目,和不知道自己能做什么项目,现在小编就带大家来一起看看Java开发 ...

  8. Java swing实现的俄罗斯方块小游戏源码附带视频导入运行教程

    大家好,今天给大家演示一下由Java swing实现的小游戏俄罗斯方块的运行过程,该小游戏虽小,但功能非常丰富,可以设置速度.颜色.声音等等,是学习Java开发的童鞋参考学习不可多得的好项目.该程序可 ...

  9. 用swing设计一个打地鼠小游戏_这7个风靡欧美的英语小游戏,学会胜过刷100道题!...

    精彩导读 小编为大家搜罗了一些在国外家喻户晓的语言类小游戏.好的方法胜过刷上100道题,真正让孩子觉得好玩,教学才会事半功倍! 01 Would You Rather... 最近牛津大学的面试考题惊天 ...

  10. 基于小程序制作一个猜拳小游戏

    在工作学习之余玩一会游戏既能带来快乐,还能缓解生活压力,跟随此文一起制作一个小程序游戏吧. 创建小程序 功能实现 界面优化 代码块 创建小程序 访问微信公众平台,点击账号注册. 选择小程序,并在表单填 ...

最新文章

  1. 都有Python了,还要什么编译器!
  2. ios 设置属性的center_IOS开发-常用UI控件的基本使用(Transform形变属性、frame属性、center属性的使用)...
  3. 判断滚动条是否到某个位置,还有滑动的方向,以此来判断什么时候阻止滚动条滚动...
  4. come type6 定义_COMe-B6101龙芯3A3000 COM Express Type6模块
  5. OC开发笔记之第二篇
  6. 大大小小的正六边形嵌套,就会形成像万花筒般有趣的视觉图形!
  7. 存储芯片在智能化产业链中扮演的角色将更加重要
  8. c语言编写计算器保存结果的程序,c语言编写计算器程序.doc
  9. 自定义xadmin后台首页
  10. 【C/C++】成员变量的初始化顺序
  11. Sql注入截取字符串常用函数
  12. 【计算机语言】C语言小游戏——贪吃蛇
  13. jsp购物车和mysql_jsp购物车的代码和数据库
  14. html输入正确用户名和密码,为什么输入正确用户名和密码还会提示“用户名或密码错误”?...
  15. 高职高考数学可以用计算机吗,将高职高考数学成绩从39分提到120分,3个月时间可能吗?...
  16. mysql binlog是什么_什么是 binlog?
  17. Unity3D 点击物品交互动画制作——开箱子和关箱子
  18. Android的UAS及UAP定制
  19. 程序君带你畅聊发送短信验证码
  20. 2020年服务器的七个发展趋势:数据为王、特定领域的CPU将崛起、机架密度新增一倍以上……...

热门文章

  1. NIOSII 软核的流水灯
  2. E45: ‘readonly‘ option is set (add ! to override)
  3. html尖角效果,CSS3之尖角标签_html/css_WEB-ITnose
  4. Oracle Database 11g SQL开发指南store模式脚本
  5. 好程序员web前端分享如何构建单页Web应用
  6. 酒店管理系统/酒店客房管理系统的设计与实现
  7. 关注公众号回复图片php,公众号被关注回复可以回复文字加图片消息吗? | 微信公众号指南...
  8. 闲置路由器做无线打印服务器
  9. 云科技网络验证源码_酸酸云科技-网络验证界面版注册机注入工具 V3.2
  10. Various Image/Video Caption(视觉字幕化新任务)