仿写:《飞翔的小鸟》游戏代码部分

2023-12-27 01:30

本文主要是介绍仿写:《飞翔的小鸟》游戏代码部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码部分


简单论述:代码注释可能有点乱,里面有些参数是可以改变的,例如:计分的坐标,窗口的大小等。一共有三个状态,可以添加状态和功能。期待一起交流。资料归本人解释所有。

主页类

package cn.ayxy;import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.ForkJoinPool.ManagedBlocker;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BirdGame extends JPanel{//启动飞翔的小鸟游戏的方法  /*声明变量*/Bird bird;//鸟类Column column1;//柱子类1 前一根Column column2;//柱子类2 后一根Ground groud;//地面类BufferedImage background;//创建BufferedImage对象    int score;//分数boolean gameOver;//判断是否结束BufferedImage gameOverImage;//背景图片//游戏结束属性int state;//游戏的状态//公开的权限 (访问权限)  静态不可改变的  常量变量名 一定要大写public static final int START = 0;//游戏初始状态public static final int RUNNING = 1;//public static final int GAME_OVER = 2;//游戏结束状态//游戏属性图片BufferedImage stateImage;public static void main(String[] args) throws Exception {   //有个抛出异常Exception/*创建一个窗体*/JFrame frames = new JFrame("NineFruit");//加入字符串 给窗口一个名字         BirdGame game = new BirdGame();//frames.add(game);//把画放入画框//设置窗体大小frames.setSize(440,670);        //设置窗口显示中间frames.setLocationRelativeTo(null);//用户关闭窗口时,做的操作frames.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/*setDefaultCloseOperation();是用来设定窗口被关闭时(比如点击了右上角的”x”)的行为。EXIT_ON_CLOSE:结束窗口所在的应用程序。在窗口被关闭的时候会退出JVM。*///设置窗口显示frames.setVisible(true);//地面动起来game.action();}//地面移动public void action()throws Exception{//移动方法 地面//写一个监听事件MouseListener l = new MouseAdapter() {//鼠标按下的方法  void表示没有返回值@Overridepublic void mousePressed(MouseEvent e) {// 获得点击//bird.flappy();//调用鸟类的飞翔//抛出异常 抛给 Java编译器 自己处理try {switch (state) {case GAME_OVER://结束状态//二次赋值  容器column1 = new Column(1);column2 = new Column(2);bird = new Bird();score = 0;//分数state = START;break;case START://启动状态//二次赋值  容器state = RUNNING;break;case RUNNING://运行的状态bird.flappy();//运行调动飞翔方法break;}} catch (Exception e2) {// TODO: handle exceptione2.printStackTrace();}}};//将 l 挂接到面板上 addMouseListener(l);while(true){
//                  //什么时候可以飞
//                  if (!gameOver) {//当为false 可以飞  或  gameOver == false
//                      //游戏没有结束的时候飞
//                      groud.step();//重新绘画                 
//                      column1.step();//移动第一个柱子
//                      column2.step();//移动第二个柱子
//                      bird.step();//鸟移动
//                      bird.fly();//鸟挥动翅膀
//                  }
//                  //判断是否碰撞
//                  if (bird.hlt(groud) || bird.hlt(column1)|| bird.hlt(column2)) {//碰到地面  或者碰到 第一个柱子 和第二个柱子
//                      gameOver = true;//如果碰撞 就真的gameover
//                  }
//                  
//                  //计分逻辑
//                  if (bird.x == column1.x || bird.x ==  column2.x ) {
//                      score++;//每次分数加         
//                  }   //switch (state) {case START://启动groud.step();bird.fly();//小鸟飞翔状态break;case RUNNING://启动groud.step();column1.step();column2.step();bird.fly();//鸟飞翔动bird.step();//积分if (bird.x == column1.x || bird.x == column2.x ) {score++;}//碰撞if (bird.hlt(column1) || bird.hlt(column2) || bird.hlt(groud)) {//碰撞 第一个柱子 或者 第二个柱子 或者 地面state = GAME_OVER;//游戏状态为结束}}repaint();//就是1 秒 看到 多少 这是每秒30Thread.sleep(1000/30);                  }               }//重写paint 方法  制作一个画笔public void paint(Graphics g){//这个Graphics 是画笔参数//绘制背景g.drawImage(background, 0, 0, null);//最后一个参数  相当于一个检查者  查看背景图片是否改变/** g.drawImage(img, x, y, width, height, observer)*   *   第一个参数  是背景  *   第二个参数  是横坐标*   第三个参数  是纵坐标*   第四个参数  是检查者*///绘制柱子/*拿第一根柱子的X坐标 减去 第一根柱子的宽2分之1*拿第一根柱子的Y坐标 减去 第一根柱子的高2分之1*/g.drawImage(column1.image, column1.x - column1.width / 2,column1.y - column1.height / 2,null);g.drawImage(column2.image, column2.x - column2.width / 2, column2.y - column2.height / 2, null);//绘制地面g.drawImage(groud.image, groud.x, groud.y, null);//绘制小鸟//改一下画笔 API方法 旋转绘图坐标Graphics2D g2 = (Graphics2D)g;//把之前的画笔强制转换成这个新的  ## g的值不变//开始反转//把鸟的X  Y坐标翻转  这个度  有一个向上,向下的动作(变过以后,再变回来)g2.rotate(-bird.alp, bird.x, bird.y);//负角度 小鸟的头变//X坐标 减去 宽度的二分子一  *根柱子的坐标一样g.drawImage(bird.image, bird.x - bird.width / 2, bird.y - bird.height / 2, null);//再变回来g2.rotate(bird.alp, bird.x, bird.y);//小鸟的头在变过来//  里面的三个参数   字体 样式  大小Font f = new Font(Font.SANS_SERIF, Font.BOLD, 40);//属性 不带括号  方法 带括号g.setFont(f);       //绘制分数g.drawString(""+score, 40, 60);//分数转换字符串 X Y 显示位置  做为背景色g.setColor(Color.WHITE);//字体的颜色为白色g.drawString(""+score, 40-3, 60-3);//游戏结束的画面switch (state) {case GAME_OVER:g.drawImage(gameOverImage, 0, 0, null);break;case START:g.drawImage(stateImage, 0, 0, null);break;}}   //添加构造方法,或者构造器,或者构造函数。/** 第一次赋值 叫初始化* 第二次赋值 是赋值* 自动调用* 类是类型 不真实存在 需要对象*/public BirdGame() throws Exception{// 抛出异常Exception最大异常/** 这里有一个错误1 * column1 = new Column(1);//这里传参数1* column2 = new Column(2);//这里传参数2 * 修改 是在 柱子类 里面*/ /*初始化*/state = START;//游戏初始状态stateImage = ImageIO.read(getClass().getResource("start.png"));//加入游戏结束图片bird = new Bird();groud = new Ground();column1 = new Column(1);//这里传参数1column2 = new Column(2);//这里传参数2//这里是把图片加载进来 添加的是背景图片"图片的名字"background = ImageIO.read(getClass().getResource("bg.png"));gameOver = false;gameOverImage = ImageIO.read(getClass().getResource("gameover.png"));//获取结束图片}
}

小鸟类

package cn.ayxy;import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;/*  这个是小鸟类* * X Y这个是鸟类的中心点坐标*/
public class Bird extends JPanel{BufferedImage image;//图片int x,y,width,height;//横,纵,宽,高int size;//表示小鸟的大小,用于检测碰撞的使用,表示正方形的边长       //继续增加属性 用于计算鸟的位置double g;//重力加速度double t;//两次位置时间的间隔double v0;//初始上抛速度double s;//时间t以后的位移double alp;//弧度,鸟的倾角double speed;//当前的上抛速度//定义一个数组 是鸟的动画帧BufferedImage[] images;int index;//这个变量是数组元素的下标 从0开始//构造器public Bird() throws Exception{//抛出异常 Exception最大异常image = ImageIO.read(getClass().getResource("0.png"));//添加图片width = image.getWidth();height = image.getHeight();size = 40;//小鸟的大小x = 132;//小鸟在屏幕的距离y = 280;//初始化 定义的g = 4;//真实的不是这 是9.4v0 = 20;//初速度t = 0.25;//两次位置的时间隔speed = v0;//当前的上抛速度s = 0;//t时间以后的位移alp = 0;//鸟的倾角//初始化images = new BufferedImage[8];//定义了一个8张的图片数组for (int i = 0; i < images.length; i++) {//数组填值//添加图片 ,i=0,1,2,3,4,5,6,7images[i] = ImageIO.read(getClass().getResource(i+".png"));/*+ 一个意思是加减乘除 另一个是连接符*/         }index = 0;}//小鸟飞翔的方法public void fly(){//下标递增index++;//图片 挥动的比较慢自然image = images[index / 12 % 8];//翅膀挥动的频率        }//添加一个移动方法public void step(){//没有返回值的移动方法double v0 = speed;s = v0 * t + g * t * t / 2;//公式计算上抛的位移 物理公式y = (int) (y - s);//这里强制类型转换  浮点型 转换成整型  物理公式double v = v0 - g * t;//公式 计算下次的速度speed = v;//*鸟不会移动  //计算倾斜角度  数学公式/*调用API里面的反正切函数*/alp = Math.atan(s/8);//假设 距离是8 (可以改)}public void flappy() {// TODO Auto-generated method stub//设置一下重新向上飞speed = v0;//初始速度 赋值给当前速度}//碰撞的方法public boolean hlt(Ground ground){//碰撞地面 //当小鸟的中心坐标 + 2分之1的小鸟坐标 > 地面的Y坐标boolean hlt = y + size / 2 > ground.y;//前面是小鸟的Y坐标  小鸟的大小  地面的Y坐标    if (hlt) {//将小鸟放置地面y = ground.y - size / 2;//小鸟放到地面的上面  这里减 是显示  如果加 是小鸟被埋。。。}return hlt;//如果碰撞 返回true 没有false}//这是两个不同的方法 参数不一样 方法重载//小鸟碰撞柱子public boolean hlt(Column column){//碰撞到柱子//判断是否在柱子范围内if (x > column.x - column.width / 2 - size / 2 && x < column.width / 2 + column.x + size / 2) {//判断柱子的坐标//当 小鸟大小的二分之一 加上 柱子宽度二分之一  大于 柱子的中心点坐标if (y > column.y - column.gap / 2 +size / 2 && y < column.y + column.gap / 2 - size/ 2 ) {//判断柱子的缝隙return false;}return true;}return false;}}

地面类

package cn.ayxy;import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;//这个是地面类
public class Ground extends JPanel{BufferedImage image;//图片int x;//横坐标int y;//纵坐标int width;//宽int height;//高//创造构造器public Ground() throws Exception{//抛出异常Exception最大异常image = ImageIO.read(getClass().getResource("ground.png"));//加入图片width = image.getWidth();//获取宽度height = image.getHeight();//获取高度x = 0;//赋值y = 500;        }//人眼1秒 看到大于24张图片 会看作动画//实现 地面运动public void step(){//写一个地面运动的类      x--;//每次减-      if (x == -109) {//当x等于-109(可修改) 时  给X重新赋值为0         x = 0;          }               }
}

柱子类

package cn.ayxy;import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;import javax.imageio.ImageIO;
import javax.management.ImmutableDescriptor;
import javax.swing.JPanel;
/** 这个是柱子类* * X  Y 这个是柱子中心坐标*/
public class Column extends JPanel{BufferedImage image;//图片int x,y,width,height;//横,纵,宽,高int gap;//柱子之间的缝隙int distance;//两个柱子之间的距离Random rm = new Random();//创建随机数    /*添加一个有参构造器 错误1*/public Column(int n) throws Exception{//n 代表的是第几根柱子  抛出异常Exception  这里是最大的异常抛出        image = ImageIO.read(getClass().getResource("column.png"));//获取图片width = image.getWidth();//获取图片的宽height = image.getHeight();//获取图片的高gap = 144;//定义柱子的上下之间的距离  144 刚刚好  太大没有难度 太小难度太大distance = 245;//表示两个柱子之间的距离x = 550 + (n-1)*distance;//这里distance 两个之间的距离 是225 n-1 n 第几个柱子y = rm.nextInt(218) + 132;//生成一个0-218的整数  132-350之间浮动 到最上面为132 最下面350 就是上下浮动的距离     }//柱子的移动public void step(){x--;//X坐标一直减少if (x == -width / 2 ) {//柱子宽度的二分之一x = distance * 2 - width / 2;//移动到 边界 回去原始第二柱子的位置  第二个柱子 变成第一个y = y = rm.nextInt(218) + 132;          }}}

效果部分显示图

游戏首页
游戏进行界面1
游戏进行界面2
游戏结束页面

这篇关于仿写:《飞翔的小鸟》游戏代码部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/541435

相关文章

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,