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

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

相关文章

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类