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

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

相关文章

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例