前言 :

游戏参考于B站_【尚学堂】Java开发游戏_大鱼吃小鱼,主体框架不变,代码稍有改动。

大鱼吃小鱼,又称吞食鱼,是一款动作类小游戏。通过不断的吞吃比自己小的鱼类快速成长,最终成为海洋霸主。

游戏主要用到Java知识:变量、数据类型、判断语句、循环结构、类的继承、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件、键盘事件。

非常适合同学Java学习结束后,作为结课作业或者练手项目的不错选择。

代码已经在文章结束语后打包,有兴趣的同学可以免费下载,创作不易,点个免费的赞支持一下!

游戏主要框架:

 游戏代码:

(1)Bg类

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;public class GameWin extends JFrame {/*** 游戏状态 0未开始,1游戏中,2通关失败,3通关成功,4暂停,5重新开始*///定义游戏默认状态static int state = 0;//双缓存Image offScreenImage;//宽高int width = 1320;int height = 780;// 计数器double random;int time = 0;//背景Bg bg = new Bg();//敌方鱼类Enamy enamy = new Enamy_1_L();//我方鱼类MyFish myFish = new MyFish();//boss类Enamy boss;// 是否生成bossboolean isboss = false;/*** 游戏操作方法*/public void launch() {//界面布局this.setVisible(true);this.setSize(width, height);this.setLocationRelativeTo(null);this.setTitle("大鱼吃小鱼");this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//开始或者结束游戏this.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);if (e.getButton() == 1 && state == 0) {state = 1;repaint();}if (e.getButton() == 1 && (state == 2 || state == 3)) {reGame();state = 1;}}});//键盘移动this.addKeyListener(new KeyAdapter() {@Override //按压public void keyPressed(KeyEvent e) {super.keyPressed(e);if (e.getKeyCode() == 87) {GameUtils.UP = true;}if (e.getKeyCode() == 83) {GameUtils.DOWN = true;}if (e.getKeyCode() == 65) {GameUtils.LEFT = true;}if (e.getKeyCode() == 68) {GameUtils.RIGHT = true;}if (e.getKeyCode() == 32) {switch (state) {case 1:state = 4;GameUtils.drawWord(getGraphics(), "游戏暂停!", Color.red, 50, 580, 450);break;case 4:state = 1;break;}}}@Override //抬起public void keyReleased(KeyEvent e) {if (e.getKeyCode() == 87) {GameUtils.UP = false;}if (e.getKeyCode() == 83) {GameUtils.DOWN = false;}if (e.getKeyCode() == 65) {GameUtils.LEFT = false;}if (e.getKeyCode() == 68) {GameUtils.RIGHT = false;}}});//线程while (true) {repaint();time++;try {Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}/*** 游戏阶段绘制鱼类*/@Overridepublic void paint(Graphics g) {//双缓存加载图片offScreenImage = createImage(width, height);Graphics gImage = offScreenImage.getGraphics();bg.paintSelf(gImage, myFish.level);switch (state) {case 0:break;case 1:myFish.paintSelf(gImage);logic();for (Enamy enamy : GameUtils.EnamyList) {enamy.paintSelf(gImage);}if (isboss) {boss.x = boss.x + boss.dir * boss.speed;boss.paintSelf(gImage);if (boss.x < 0) {gImage.setColor(Color.red);gImage.fillRect(boss.x, boss.y + 100, 2400, boss.height / 20);}}break;case 2:for (Enamy enamy : GameUtils.EnamyList) {enamy.paintSelf(gImage);}if (isboss) {boss.paintSelf(gImage);}break;case 3:myFish.paintSelf(gImage);break;case 4:return;default:}g.drawImage(offScreenImage, 0, 0, null);}/*** 游戏核心逻辑*/void logic() {//关卡难度if (GameUtils.count < 5) {GameUtils.level = 0;} else if (GameUtils.count < 15) {GameUtils.level = 1;} else if (GameUtils.count < 40) {GameUtils.level = 2;} else if (GameUtils.count < 75) {GameUtils.level = 3;} else if (GameUtils.count > 150) {state = 3;}//自己鱼升级if (29 < GameUtils.count && GameUtils.count < 79) {myFish.level = 2;} else if (GameUtils.count > 79) {myFish.level = 3;}//阶段生成敌方鱼random = Math.random();switch (GameUtils.level) {case 3:if (time % 120 == 0) {boss = new Enamy_Boss();isboss = true;}case 2:if (time % 120 == 0) {if (random < 0.5) {enamy = new Enamy_3_L();} else {enamy = new Enamy_3_R();}}GameUtils.EnamyList.add(enamy);case 1:if (time % 60 == 0) {if (random < 0.5) {enamy = new Enamy_2_L();} else {enamy = new Enamy_2_R();}}GameUtils.EnamyList.add(enamy);case 0:if (time % 10 == 0) {if (random < 0.5) {enamy = new Enamy_1_L();} else {enamy = new Enamy_1_R();}}GameUtils.EnamyList.add(enamy);break;default:}//生成敌方鱼for (Enamy enamy : GameUtils.EnamyList) {enamy.x = enamy.x + enamy.dir * enamy.speed;//boss鱼碰撞检测if (isboss) {if (boss.getRec().intersects(enamy.getRec())) {enamy.x = -200;enamy.y = -200;}if (boss.getRec().intersects(myFish.getRec())) {state = 2;}}//我方鱼与敌方鱼碰撞检测if (myFish.getRec().intersects(enamy.getRec())) {if (myFish.level >= enamy.type) {enamy.x = -200;enamy.y = -200;GameUtils.count += enamy.count;} else {state = 2;}}}}public static void main(String[] args) {GameWin gameWin = new GameWin();gameWin.launch();}// 重新开始void reGame() {GameUtils.EnamyList.clear();time = 0;myFish.level = 1;GameUtils.count = 0;myFish.x = 650;myFish.y = 400;myFish.width = 45;myFish.height = 45;boss = null;isboss = false;}
}

(2)Enamy类

import java.awt.*;public class Enamy {//定义图片Image img;//定义物体坐标int x;int y;int width;int height;//移动速度int speed;//方向int dir = 1;//类型int type;//分值int count;//绘制自身方法public void paintSelf(Graphics g) {g.drawImage(img, x, y, width, height, null);}//获取自身矩形,用于碰撞检测public Rectangle getRec() {return new Rectangle(x , y , width - 45, height - 30);}
}//敌方鱼左类
class Enamy_1_L extends Enamy {Enamy_1_L() {this.x = -45;this.y = (int) (Math.random() * 980);this.width = 40;this.height = 55;this.speed = 1;this.count = 1;this.type = 1;this.img = GameUtils.enamyl_1img;}@Overridepublic Rectangle getRec() {return new Rectangle(x, y, width, height);}
}class Enamy_1_R extends Enamy_1_L {Enamy_1_R() {this.x = 1400;dir = -1;this.img = GameUtils.enamyr_1img;}
}class Enamy_2_L extends Enamy {Enamy_2_L() {this.x = -100;this.y = (int) (Math.random() * 900 + 100);this.width = 180;this.height = 80;this.speed = 5;this.count = 3;this.type = 2;this.img = GameUtils.enamyl_2img;}
}class Enamy_2_R extends Enamy_2_L {Enamy_2_R() {this.x = 1400;dir = -1;this.img = GameUtils.enamyr_2img;}
}class Enamy_3_L extends Enamy {Enamy_3_L() {this.x = -300;this.y = (int) (Math.random() * 980);this.width = 250;this.height = 150;this.speed = 3;this.count = 10;this.type = 3;this.img = GameUtils.enamyl_3img;}
}class Enamy_3_R extends Enamy_3_L {Enamy_3_R() {this.x = 1400;dir = -1;this.img = GameUtils.enamyr_3img;}
}class Enamy_Boss extends Enamy {Enamy_Boss() {this.x = -1200;this.y = (int) (Math.random() * 700 + 100);this.width = 250;this.height = 200;this.speed = 80;this.type = 10;this.img = GameUtils.bossimg;}
}

(3)GameUtils类

import java.awt.*;
import java.util.ArrayList;
import java.util.List;public class GameUtils {//方向static boolean UP = false;static boolean DOWN = false;static boolean LEFT = false;static boolean RIGHT = false;//分数static int count = 0;//关卡等级static int level = 0;//背景图public static Image bgimg = Toolkit.getDefaultToolkit().createImage("src/images/sea.jpg");//敌方鱼类集合public static List<Enamy> EnamyList = new ArrayList<>();//敌方鱼类public static Image enamyl_1img = Toolkit.getDefaultToolkit().createImage("src/images/enemyFish/fish1_r.gif");public static Image enamyr_1img = Toolkit.getDefaultToolkit().createImage("src/images/enemyFish/fish1_l.gif");public static Image enamyl_2img = Toolkit.getDefaultToolkit().createImage("src/images/enemyFish/fish2_r.png");public static Image enamyr_2img = Toolkit.getDefaultToolkit().createImage("src/images/enemyFish/fish2_l.png");public static Image enamyl_3img = Toolkit.getDefaultToolkit().createImage("src/images/enemyFish/fish3_r.gif");public static Image enamyr_3img = Toolkit.getDefaultToolkit().createImage("src/images/enemyFish/fish3_l.gif");public static Image bossimg = Toolkit.getDefaultToolkit().createImage("src/images/enemyFish/boss.gif");//我方鱼类public static Image MyFishimg_L = Toolkit.getDefaultToolkit().createImage("src/images/myFish/myfish_left.gif");public static Image MyFishimg_R = Toolkit.getDefaultToolkit().createImage("src/images/myFish/myfish_right.gif");//绘制文字的工具类public static void drawWord(Graphics g, String str, Color color, int size, int x, int y) {g.setColor(color);g.setFont(new Font("宋体", Font.BOLD, size));g.drawString(str, x, y);}
}

(4)GameWin类

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;public class GameWin extends JFrame {/*** 游戏状态 0未开始,1游戏中,2通关失败,3通关成功,4暂停,5重新开始*///定义游戏默认状态static int state = 0;//双缓存Image offScreenImage;//宽高int width = 1320;int height = 780;// 计数器double random;int time = 0;//背景Bg bg = new Bg();//敌方鱼类Enamy enamy = new Enamy_1_L();//我方鱼类MyFish myFish = new MyFish();//boss类Enamy boss;// 是否生成bossboolean isboss = false;/*** 游戏操作方法*/public void launch() {//界面布局this.setVisible(true);this.setSize(width, height);this.setLocationRelativeTo(null);this.setTitle("大鱼吃小鱼");this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//开始或者结束游戏this.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);if (e.getButton() == 1 && state == 0) {state = 1;repaint();}if (e.getButton() == 1 && (state == 2 || state == 3)) {reGame();state = 1;}}});//键盘移动this.addKeyListener(new KeyAdapter() {@Override //按压public void keyPressed(KeyEvent e) {super.keyPressed(e);if (e.getKeyCode() == 87) {GameUtils.UP = true;}if (e.getKeyCode() == 83) {GameUtils.DOWN = true;}if (e.getKeyCode() == 65) {GameUtils.LEFT = true;}if (e.getKeyCode() == 68) {GameUtils.RIGHT = true;}if (e.getKeyCode() == 32) {switch (state) {case 1:state = 4;GameUtils.drawWord(getGraphics(), "游戏暂停!", Color.red, 50, 580, 450);break;case 4:state = 1;break;}}}@Override //抬起public void keyReleased(KeyEvent e) {if (e.getKeyCode() == 87) {GameUtils.UP = false;}if (e.getKeyCode() == 83) {GameUtils.DOWN = false;}if (e.getKeyCode() == 65) {GameUtils.LEFT = false;}if (e.getKeyCode() == 68) {GameUtils.RIGHT = false;}}});//线程while (true) {repaint();time++;try {Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}/*** 游戏阶段绘制鱼类*/@Overridepublic void paint(Graphics g) {//双缓存加载图片offScreenImage = createImage(width, height);Graphics gImage = offScreenImage.getGraphics();bg.paintSelf(gImage, myFish.level);switch (state) {case 0:break;case 1:myFish.paintSelf(gImage);logic();for (Enamy enamy : GameUtils.EnamyList) {enamy.paintSelf(gImage);}if (isboss) {boss.x = boss.x + boss.dir * boss.speed;boss.paintSelf(gImage);if (boss.x < 0) {gImage.setColor(Color.red);gImage.fillRect(boss.x, boss.y + 100, 2400, boss.height / 20);}}break;case 2:for (Enamy enamy : GameUtils.EnamyList) {enamy.paintSelf(gImage);}if (isboss) {boss.paintSelf(gImage);}break;case 3:myFish.paintSelf(gImage);break;case 4:return;default:}g.drawImage(offScreenImage, 0, 0, null);}/*** 游戏核心逻辑*/void logic() {//关卡难度if (GameUtils.count < 5) {GameUtils.level = 0;} else if (GameUtils.count < 15) {GameUtils.level = 1;} else if (GameUtils.count < 40) {GameUtils.level = 2;} else if (GameUtils.count < 75) {GameUtils.level = 3;} else if (GameUtils.count > 150) {state = 3;}//自己鱼升级if (29 < GameUtils.count && GameUtils.count < 79) {myFish.level = 2;} else if (GameUtils.count > 79) {myFish.level = 3;}//阶段生成敌方鱼random = Math.random();switch (GameUtils.level) {case 3:if (time % 120 == 0) {boss = new Enamy_Boss();isboss = true;}case 2:if (time % 120 == 0) {if (random < 0.5) {enamy = new Enamy_3_L();} else {enamy = new Enamy_3_R();}}GameUtils.EnamyList.add(enamy);case 1:if (time % 60 == 0) {if (random < 0.5) {enamy = new Enamy_2_L();} else {enamy = new Enamy_2_R();}}GameUtils.EnamyList.add(enamy);case 0:if (time % 10 == 0) {if (random < 0.5) {enamy = new Enamy_1_L();} else {enamy = new Enamy_1_R();}}GameUtils.EnamyList.add(enamy);break;default:}//生成敌方鱼for (Enamy enamy : GameUtils.EnamyList) {enamy.x = enamy.x + enamy.dir * enamy.speed;//boss鱼碰撞检测if (isboss) {if (boss.getRec().intersects(enamy.getRec())) {enamy.x = -200;enamy.y = -200;}if (boss.getRec().intersects(myFish.getRec())) {state = 2;}}//我方鱼与敌方鱼碰撞检测if (myFish.getRec().intersects(enamy.getRec())) {if (myFish.level >= enamy.type) {enamy.x = -200;enamy.y = -200;GameUtils.count += enamy.count;} else {state = 2;}}}}public static void main(String[] args) {GameWin gameWin = new GameWin();gameWin.launch();}// 重新开始void reGame() {GameUtils.EnamyList.clear();time = 0;myFish.level = 1;GameUtils.count = 0;myFish.x = 650;myFish.y = 400;myFish.width = 45;myFish.height = 45;boss = null;isboss = false;}
}

(5)MyFish类

import java.awt.*;public class MyFish {//图片Image img = GameUtils.MyFishimg_L;//坐标int x =650;int y = 400;int width = 45;int height = 45;//移动速度int speed = 20;//等级int level = 1;//移动void logic() {if (GameUtils.UP) {y = y - speed;}if (GameUtils.DOWN) {y = y + speed;}if (GameUtils.LEFT) {x = x - speed;img = GameUtils.MyFishimg_L;}if (GameUtils.RIGHT) {x = x + speed;img = GameUtils.MyFishimg_R;}}//绘制自身方法public void paintSelf(Graphics g) {logic();g.drawImage(img, x, y, width + GameUtils.count, height + GameUtils.count, null);}//获取自身矩形方法,用于碰撞检测public Rectangle getRec() {return new Rectangle(x, y, width + GameUtils.count, height + GameUtils.count);}
}

结束语:

游戏还有很多缺陷和改进的地方,比如我方鱼可以离开游戏界面之外,敌方鱼在离开游戏界面之后没有清除,导致额外重绘,占用内存。都需要小伙伴们自己去改进,挖掘。

游戏源码打包如下:

链接:https://pan.baidu.com/s/1v4DXCYa1jMMOsxUxI7tqQg?pwd=y3ib 
提取码:y3ib

Java实现大鱼吃小鱼游戏(开源)相关推荐

  1. 出自北大教授java项目大鱼吃小鱼游戏开发教学 附带源码和资料

    课程介绍: 大鱼吃小鱼,又称吞食鱼,是一款动作类小游戏.通过不断的吞吃比自己小的鱼类快速成长,最终成为海洋霸主. 本课程讲解一个大鱼吃小鱼游戏的详细开发过程.只要60分钟就可以完成一个你自己亲手开发出 ...

  2. Java 编写大鱼吃小鱼游戏 窗体程序 完整源码

    今天为大家分享大鱼吃小鱼游戏开发与制作.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步 开发环境 开发语言为Java,开发环境Eclipse或者IDEA都可 ...

  3. 【项目】游戏开发期末大作业 之 基于Java的小游戏 “大鱼吃小鱼“ (代码素材齐全)

    1.EatFish游戏开发过程 1.游戏窗口创建 2.添加背景图片 3.启动封面 4.启动页面的点击事件 5.游戏开始的背景添加 6.双缓存解决闪屏问题 7.敌方鱼类的生成 8.我方鱼的生成 9.我方 ...

  4. 用JAVA来制作大鱼吃小鱼游戏,JAVA项目实战

    大鱼吃小鱼,又称吞食鱼,是一款动作类小游戏.通过不断的吞吃比自己小的鱼类快速成长,最终成为海洋霸主. 本课程讲解一个大鱼吃小鱼游戏的详细开发过程.只要60分钟就可以完成一个你自己亲手开发出来的Java ...

  5. java鱼游动源码_java版大鱼吃小鱼游戏

    [实例简介] java语言开发的简单的大鱼吃小鱼游戏,开发工具eclipse,直接将该工程导入即可运行,StartGame_Eatfish.java是开始游戏类,游戏中的声音是直接使用的第三方插件,在 ...

  6. 【洞幺邦】基于JAVA实现的大鱼吃小鱼游戏

    打开百度APP看高清图片 (1)当游戏打开,在游戏进行时会一直有背景音乐,当然,如果玩家关闭 音乐按钮就会停止. (2)"开始游戏"界面设计及响应的问题 游戏在玩家面前展现的第一个 ...

  7. Java《大鱼吃小鱼》游戏思路及实现(含源码)

    本游戏代码参考[尚学堂]Java开发游戏_大鱼吃小鱼项目实战教程 目录 游戏展示 游戏脑图 详细分析 GameUtils Enemy Myfish GameWin 键盘监听 鼠标监听 重绘界面 游戏状 ...

  8. 人生如梦游戏间,RPG游戏开源开发讲座 JAVA篇 4 ——一步莲华

    从星期一开始一直郁闷-- 最近的状况--用迷信的说法就是犯小人,以社会学的观点是由于出现人际交往困难造成社会评价降低--无比郁闷中,继续写这个-- 上一回我们写到关于如何改变角色的移动样式及线程的初步 ...

  9. 人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[4]——一步莲华

    从星期一开始一直郁闷-- 最近的状况--用迷信的说法就是犯小人,以社会学的观点是由于出现人际交往困难造成社会评价降低--无比郁闷中,继续写这个-- 上一回我们写到关于如何改变角色的移动样式及线程的初步 ...

最新文章

  1. linux中截断日志
  2. postgresql如何实现group_concat功能
  3. [原]一些KVM测试过程中的命令笔记(2)分配实例
  4. 感谢支持,超预期重印并加码
  5. mysql 二进制日志删除_MYSQL 删除二进制日志的 3 个方法
  6. Java中抽象类和接口
  7. JSP(九大内置对象)
  8. $$\int_0^{nh}x(x-h)\cdots (x-nh)dx=h^{n+2}\int_0^nx(x-1)\cdots (x-n)dx$$
  9. Ubuntu安装Atom编辑器
  10. PLSQL中的RECORD小例子
  11. 【建议收藏】货币交易信息爬取+筛选(Python附源码)
  12. lisp语言画地物符号_地形图中的地物符号说明汇总
  13. 《计算机网络教程》(微课版 第五版) 第六章 网络应用层 课后习题及答案
  14. SQL 建表与索引
  15. 手机屏幕分辨率说明大全 VGA - hd
  16. Sequence (矩阵快速幂+快速幂+费马小定理)
  17. 使用NSIS脚本制作一个安装包
  18. 计算机无法启动 主板,主板故障导致电脑无法启动的原因以及解决方法!
  19. win10彻底永久关闭自动更新【亲测有效】
  20. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(标准灯光分类及简介—目标聚光灯、泛光灯、台灯+射灯+壁灯+筒灯+电视灯+平行光,灯带+天光灯)图文教程之详细攻略

热门文章

  1. java线程池最大线程数_Java项目中,线程池中线程数量太大会有什么影响?
  2. facebook人脸照片_如何在手机上保留Facebook照片的本地副本
  3. window重启Nginx的BAT脚本
  4. 简通易证:一级造价师报考条件
  5. 要求员工对企业忠诚度高?凭什么?
  6. 分布式存储原理:TiDB
  7. 联合证券|主力加仓电气设备、有色金属等行业
  8. 适合小作坊生产宠物饲料的配方工艺
  9. 【Lombok】val 和 var的使用 | 像 JavaScript 一样的去声明变量
  10. MySQL的BlackHole引擎