只用400行Java代码就能实现的飞翔的小鸟游戏

目录
  • 一、效果图
  • 二、设计步骤
    • 1.素材准备
    • 2.预备知识及其运用
    • 3.大体流程
  • 三、源码
    • 1.游戏类
    • 2.地面类
    • 3.小鸟类
    • 4.柱子类

一、效果图

二、设计步骤

1.素材准备

相关的素材我放到了github仓库。

github地址https://github.com/ORikkaO/BirdGame

2.预备知识及其运用

1.面向对象的封装:设计包装出小鸟、地面、柱子、游戏四个类。
2.swing和awt包:图形界面工具,绘制出游戏场景。
3.Math类:运用atan等方法辅助完成小鸟旋转角度转换。
4.事件监听器:运用鼠标监听器完成游戏状态转换及小鸟移动。
5.多线程:该项目就用到了一个sleep休眠。

相关的知识用到的不多,一边做一边学习(熟悉)运用就好。

3.大体流程

1.绘制面板,放入背景图。
2.设计地面、柱子类完成移动的效果(移动方法实现)。
3.设计小鸟,完成飞行轨迹、与柱子是否碰撞的方法等。
4.设计游戏类,完成游戏类界面的绘制。
5.设计游戏开始的方法与流程。
6.增加鼠标监听器完成对小鸟飞行及游戏运行的控制。

三、源码

1.游戏类

package game;

import javax.imageio.ImageIO;
import java.util.*;

import javax.swing.*;

import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import java.awt.*;

public class BirdGame extends JPanel {

	Image background;//背景图片
	Image startImage;//开始图片
	Image overImage;//游戏结束图片
	Ground ground;//地面
	Column column1,column2;//两根柱子
	Bird bird;//小鸟
	int score;//游戏分数
	int state;//游戏状态
	//状态常量
	public static final int START=0;//开始
	public static final int RUNNING=1;//运行
	public static final int GAME_OVER=2;//结束

	public BirdGame() throws Exception
	{
		//初始背景图片
		//background = new ImageIcon("D:\\java\\elipse\\project_workplace\\Bird\\src\\resources\\bg.png").getImage();//绝对路径
		//background = new ImageIcon("src\\resources\\bg.png").getImage();//相对路径,一开始默认位置是Bird项目文件夹
		background = new ImageIcon("./source/bg.png").getImage();
		startImage = new ImageIcon("./source/start.png").getImage();
		overImage=new ImageIcon("./source/gameover.png").getImage();
		//初始化地面、柱子、小鸟、分号、状态
		ground=new Ground();
		column1=new Column(1);
		column2=new Column(2);
		bird=new Bird();
		score=0;
		state=0;
	}

	public void paint(Graphics g)
	{
		//绘制背景
		g.drawImage(background, 0, 0,null);
		//绘制地面
		g.drawImage(ground.image, ground.x, ground.y, null);
		//绘制柱子
		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);
		//绘制小鸟
		Graphics2D g2=(Graphics2D) g;
		g2.rotate(-bird.alpha,bird.x,bird.y);
		g.drawImage(bird.image,bird.x-bird.width/2,bird.y-bird.height/2,null);
		g2.rotate(bird.alpha,bird.x,bird.y);
		//绘制分数
		Font f=new Font(Font.SANS_SERIF,Font.BOLD,40);
		g.setFont(f);
		g.drawString(""+score, 40, 60);
		g.setColor(Color.WHITE);
		g.drawString(""+score,40-3, 60-3);//一个阴影效果
		//绘制开始和结束界面
		switch(state)
		{
		case START:
			g.drawImage(startImage, 0, 0, null);
			break;
		case GAME_OVER:
			g.drawImage(overImage, 0, 0, null);
			break;
		}
	}

	public void action() throws Exception
	{
		//不断重复和绘制
		MouseListener l=new MouseAdapter()
		{
			public void mousePressed(MouseEvent e)
			{
				try {
					switch(state) {
					case START:
						//在开始前按下鼠标转为运行状态
						state=RUNNING;
						break;
					case RUNNING:
						//在运行状态,按下鼠标小鸟向上飞行
						bird.flappy();
						break;
					case GAME_OVER:
						//在结束状态,按下鼠标重置数据变为开始
						column1=new Column(1);
						column2=new Column(2);
						bird=new Bird();
						score=0;
						state=START;
						break;
					}
				}
				catch (Exception ex)
				{
					ex.printStackTrace();
				}
			}

		};
		addMouseListener(l);
		while(true)
		{
			switch(state)
			{
			case START:
				bird.fly();
				ground.step();
				break;
			case RUNNING:
				ground.step();
				column1.step();
				column2.step();
				bird.fly();
				bird.step();
//				if(bird.x==column1.x||bird.x==column2.x)
//				{
//					score++;
//				}
				score++;
				//检测是否碰撞
				if(bird.hit(ground)||bird.hit(column1)||bird.hit(column2))
				{
					state=GAME_OVER;
				}
				break;
			}
			//休眠1000/60毫秒
			Thread.sleep(1000/60);
			repaint();
		}
	}

	//启动方法

	public static void main(String[] args) throws Exception
	{

		JFrame frame=new JFrame();
		BirdGame game=new BirdGame();
		frame.add(game);
		frame.setSize(440,670);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		game.action();
	}

}

2.地面类

package game;

import javax.swing.*;
import java.awt.*;

public class Ground {

	Image image;

	int x,y;//位置

	int width,height;

	//地面初始化
	public Ground() throws Exception
	{
		image =new ImageIcon("source/ground.png").getImage();
		width=image.getWidth(null);
		height=image.getHeight(null);
		x=0;
		y=500;
	}

	//左移
	public void step()
	{
		x-=4;
		if(x<=-109)
		{
			x=0;
		}
	}

}

3.小鸟类

package game;
import java.awt.*;
import javax.swing.*;
import javax.imageio.ImageIO;

public class Bird {

	Image image;
	int x,y;
	int width,height;
	int size;
	//重力加速度
	double g;
	//位移间隔时间
	double t;
	//最初速度
	double v0;
	//当前上抛速度
	double speed;
	//经过时间t后的位移
	double s;
	//小鸟的倾角(弧度)
	double alpha;

	//一组图片记录小鸟动画帧
	Image[] images;
	//帧数下标
	int index;

	public Bird() throws Exception
	{
		image=new ImageIcon("source/0.png").getImage();
		width = image.getWidth(null);
		height = image.getHeight(null);
		x=132;
		y=280;
		size=40;
		//位移参数
		g=4;
		v0=20;
		t=0.25;
		speed=v0;
		s=0;
		//小鸟偏转角度
		alpha=0;

		//初始化动画帧参数
		images=new Image[8];

		for(int i=0;i<8;i++)
		{
			images[i]=new ImageIcon("source/"+i+".png").getImage();
		}
		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=y-(int)s;
		//计算下次移动速度
		double v=v0-g*t;
		speed =v;
		//计算倾角(反正切函数)
		alpha=Math.atan(s/8);

	}

	//向上飞行
	public void flappy()
	{
		//重置速度
		speed=v0;
	}

	//检测小鸟是否碰撞到地面
	public boolean hit(Ground ground)
	{
		boolean hit =y+size/2>ground.y;
		if(hit)
		{
			y=ground.y-size/2;
			alpha=Math.PI/2;
		}
		return hit;
	}

	//检测小鸟是否撞到柱子
	public boolean hit(Column column)
	{
		//检测是否在柱子范围内
		if(x>column.x-column.width/2-size/2&&x<column.x+column.width/2+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;
	}
}

4.柱子类

package game;

import java.util.*;
import java.awt.*;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Column {

	Image image;

	int x,y;
	int width,height;
	//柱子之间缝隙
	int gap;
	//柱子之间的距离
	int distance;
	Random random =new Random();

	//初始第N根柱子

	public Column(int n) throws Exception
	{
		image=new ImageIcon("source/column.png").getImage();
		width=image.getWidth(null);
		height=image.getHeight(null);
		gap=144;
		distance=245;
		x=550+(n-1)*distance;
		y=random.nextInt(218)+132;
	}

	public void step()
	{
		x-=4;
		if(x<= -width/2)
		{
			x=distance*2-width/2;
			y=random.nextInt(218);
		}
	}
}

到此这篇关于只用400行Java代码就能实现的飞翔的小鸟游戏的文章就介绍到这了,更多相关Java飞翔的小鸟游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java实现简易的五子棋游戏

    本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 先上效果图 一.问题分析 1.五子棋游戏分析: 五子棋作为较为普遍且简易的娱乐游戏,受到众多人的热爱,且五子棋AI也是一个较为容易实现的AI.下面我们先来分析游戏规则.(哈哈,虽然大家都知道,但我还是想写写)双方分别使用黑白两色棋子,下在棋盘横线交叉处,先连成五子者胜利.(黑棋禁手啥的规则在我的程序里没加,就不赘述了). 2.程序分析: (1)首先,五子棋开始,我们需要一个棋盘,15*15的棋盘,需要黑白棋子.

  • java实现简单贪吃蛇小游戏

    本文实例为大家分享了java实现贪吃蛇小游戏,供大家参考,具体内容如下 有两个类,放在同一文件下下即可,背景图片,标题,蛇尾可自行更改 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class MyJFrame extends JFrame{ public MyJFrame() { int x= Toolkit.getDefaultToolkit().getScreenSize().width;

  • java实现简单的扫雷小游戏

    使用java制作一款简单的扫雷游戏,供大家参考,具体内容如下 import java.util.*; public class nephelokokkygia { int[][] abarta;//数字矩阵 boolean[][] abhartach;//当前点是否被标记 boolean alpluachra;//判断是否结束游戏 int caoineag;//标记的flag数 int catSith;//标记命中雷的个数 static int count; Scanner clurichaun

  • Java实战之飞翔的小鸟小游戏

    前言 一个简单的单机小游戏:flypybird ,用来巩固java基础. 涉及主要知识点:JFrame . JPanel . 继承. 键盘/鼠标监听 . 多线程 . 工具类设计 提示:这是大致的实现过程,实际实现过程有一定的修改,具体以源码为准. 一.大体思路 1.首先要有一个框架,作为主程序入口,这里使用 JFrame  类. 2.然后需要有一个画布,用来把游戏场景画上去,然后在上面添加键盘/鼠标监听来控制,这里使用的是 JPenal 类. 3.需要创建几个类:小鸟.地面.障碍物柱子.一个获取

  • java实现弹球小游戏

    GUI实现弹球小游戏,供大家参考,具体内容如下 先看一下游戏效果图. 一个简单的Demo.也比较简单,新手试着做一做完善改进. 源代码 import Com.Style.FontStyle; import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * @Author: 冀十三 * @DescIption: 弹球小游戏 * @Date:2021--06--10--17:08 */ public class Demo

  • 一天时间用Java写了个飞机大战游戏,朋友直呼高手

    一.代码实现 创建窗口 首先创建一个游戏窗体类GameFrame,继承至JFrame,用来显示在屏幕上(window的对象),每个游戏都有一个窗口,设置好窗口标题.尺寸.布局等就可以. /* * 游戏窗体类 */ public class GameFrame extends JFrame { public GameFrame() { setTitle("飞机大战");//设置标题 setSize(526, 685);//设定尺寸 setLayout(new BorderLayout()

  • 只用400行Java代码就能实现的飞翔的小鸟游戏

    目录 一.效果图 二.设计步骤 1.素材准备 2.预备知识及其运用 3.大体流程 三.源码 1.游戏类 2.地面类 3.小鸟类 4.柱子类 一.效果图 二.设计步骤 1.素材准备 相关的素材我放到了github仓库. github地址https://github.com/ORikkaO/BirdGame 2.预备知识及其运用 1.面向对象的封装:设计包装出小鸟.地面.柱子.游戏四个类. 2.swing和awt包:图形界面工具,绘制出游戏场景. 3.Math类:运用atan等方法辅助完成小鸟旋转角

  • 70行Java代码实现深度神经网络算法分享

    对于现在流行的深度学习,保持学习精神是必要的--程序员尤其是架构师永远都要对核心技术和关键算法保持关注和敏感,必要时要动手写一写掌握下来,先不用关心什么时候用到--用不用是政治问题,会不会写是技术问题,就像军人不关心打不打的问题,而要关心如何打赢的问题. 程序员如何学习机器学习 对程序员来说,机器学习是有一定门槛的(这个门槛也是其核心竞争力),相信很多人在学习机器学习时都会为满是数学公式的英文论文而头疼,甚至可能知难而退.但实际上机器学习算法落地程序并不难写,下面是70行代码实现的反向多层(BP

  • 200行Java代码编写一个计算器程序

    发现了大学时候写的计算器小程序,还有个图形界面,能够图形化展示表达式语法树,哈哈;) 只有200行Java代码,不但能够计算加减乘除,还能够匹配小括号~ 代码点评: 从朴素的界面配色到简单易懂错误提示,无不体现了"用户体验"至上的设计理念:代码异常处理全面合理.滴水不漏,代码缩进优雅大方,变量命名直观易懂:再结合长度适中简单明了的注释,程序整体给人一种清新脱俗之感.背后不难看出作者对学习的热爱以及对设计的苛求,工匠精神可见一斑,真可谓是大学数据结构学以致用的典范! 实现代码如下所示:

  • 如何用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区块链的原理! "用不到120行 Java 代码就能实现一个自己的区块链!" 听起来不可思议吧?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事互联网金融的科技公司,所以我们采用虚拟资产金额作为这篇文章中的示例数据.大家可以先为自己想一个数字,后

  • 25行Java代码将普通图片转换为字符画图片和文本的实现

    本文主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,分享给大家,具体如下: 原图 生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用notepad++等软件打开) 生成字符画图片(背景颜色和画笔颜色代码里可设置调节) 新建普通java 项目,Java单类实现代码,复制到java项目中,用idea编辑器 主方法运行.(引入的Class 都是JDK中自有的) import javax.imageio.ImageIO; import j

  • 只用40行Python代码就能写出pdf转word小工具

    一.图示 上面为pdf截图内容,下面为转化后的word截图内容 接下来,我们试试自己动作写这个工具吧! 二.前期准备 由于我们采用的是python进行工具编写,并最终需要打包成一个exe文件供我们使用.为了降低包体大小,我们需要先创建一个虚拟环境备用. 另外,pdf转word有现成的第三方库pdf2docx,同时关于gui我们用的是pysimplegui,打包成exe采用的是pyinstaller.在创建虚拟环境后,我们将这些需要用到的第三方库也一一安装吧. # 创建虚拟环境 conda cre

  • 只用20行Python代码实现屏幕录制功能

    一.模块安装 首先,我们需要用到两个python的两个模块,win32gui和PyQt5 1.pip install win32gui 2.pip install PyQt5 1.pip install win32gui PS C:\Users\lex\Desktop> pip install win32gui Looking in indexes: http://mirrors.aliyun.com/pypi/simple Requirement already satisfied: win3

  • 只用50行Python代码爬取网络美女高清图片

    一.技术路线 requests:网页请求 BeautifulSoup:解析html网页 re:正则表达式,提取html网页信息 os:保存文件 import re import requests import os from bs4 import BeautifulSoup 二.获取网页信息 常规操作,获取网页信息的固定格式,返回的字符串格式的网页内容,其中headers参数可模拟人为的操作,'欺骗'网站不被发现 def getHtml(url): #固定格式,获取html内容 headers

  • 200行Java代码如何实现依赖注入框架详解

    依赖注入介绍 先回顾下依赖注入的概念: 我们常提起的依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念.具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为

  • 200行java代码实现2048小游戏

    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 效果图: 游戏介绍: 1.2048是一款益智类小游戏,刚开始随机出现两个数字,可以上下左右控制数字的移动. 2.当选择一个方向移动后,所有数字都会沿该方向移动到表格尽头,并且空余表格会随机出现2或4,当碰到相同的两个数字时,该两个数字会合并相加成一个数字,直到最大的数字变成2048游戏成功 3.否则当数字填满表格且不能再移动时游戏失败. 游戏代码: import java.awt.*; import java.a

随机推荐