Java实现经典捕鱼达人游戏的示例代码

您所在的位置:网站首页 java捕鱼达人渔网代码 Java实现经典捕鱼达人游戏的示例代码

Java实现经典捕鱼达人游戏的示例代码

2023-05-05 09:18| 来源: 网络整理| 查看: 265

前言

《捕鱼达人》是一款以深海狩猎为题材的休闲竞技游戏。这是一场海底世界的远征,享受捕获大鱼的乐趣,但不是所有的鱼都是友善的,它们会用自己的方式保护自己,保卫属于自己的海底世界。当然,这里也是冒险与机遇共存的地方,诸多埋藏于海底的宝藏等待着被探寻。

游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。

主要需求

在鱼池中有很多鱼,鱼各自游动。有一张渔网,随鼠标移动,点击鼠标可以抓取渔网中的鱼。抓到鱼进行计分。 主要设计

1、业务对象模型(“找对象”,理清对象之间的关系)---->数据模型(用合理的数据模型描述对象)----->类的设计(根据对象关系和数据模型设计类)。

2、渔网的范围和鱼的范围重叠。——判断一个点是否在矩形范围之内即可。同理:打飞机的游戏也可以依照这种算法实现。

3、由于每条鱼的行为不一样,所以要继承线程类,实现并发——屏幕上有多条鱼各自移动。鱼池继承JPannel,并引入自己的新的属性:鱼和鱼池。

4、类的详细设计:

各个属性的说明如下:

- step:鱼的移动速度

- Images:鱼图片的数组

- Image:当前正在显示的鱼的图片

- Index:帧

5、实现诸如鱼的摆尾这样的动画效果:我们只需要将鱼的所有运动的帧放入到一个图片数组,逐帧改变背景图片,由于人眼的视觉暂留,就会产生动画效果。

6、循环显示不同的图片:不断对Index进行自增取余运算,就类似于数据结构中的循环队列那样处理即可。

功能截图

游戏开始

用渔网捕鱼

代码实现 游戏窗体 public class FishlordFrame extends JFrame { public static final int WIDTH = 800; public static final int HEIGHT = 480; private Pool pool; /** * 构造器中初始化界面 */ public FishlordFrame() { this.setTitle("捕鱼达人"); this.setSize(WIDTH, HEIGHT); this.setLocationRelativeTo(null); // 设置窗口居中,必须放在setSize之后 this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { pool = new Pool(); this.getContentPane().add(pool); this.setVisible(true); pool.action(); } catch (IOException e) { JOptionPane.showMessageDialog(this, "加载资源失败!","应用程序错误",JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } catch (Exception e) { JOptionPane.showMessageDialog(this, "初始化游戏失败!","应用程序错误",JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } } } 鱼 class Fish implements Runnable { private static final int BASE_STEP = 5; // x和y坐标的步进值的参考标准 int speedOfFish = 20; // 控制鱼的速度 int x, y, index, width, height, xStep,yStep; BufferedImage fishImage; // 当前鱼的背景图 BufferedImage[] fishImages = new BufferedImage[10]; // 一条鱼的所有帧的图片 Random r; // 产生随机数 /** * 在构造器中初始化鱼的属性 * @param fishname * @throws IOException */ public Fish(String fishName) throws IOException { // 加载鱼的图片 BufferedImage tempFishImage; String resourceName; for (int i = 0; i < 10; i++) { if (i!=9) { resourceName = "/images/" + fishName + "_0" + (i+1) + ".png"; }else { resourceName = "/images/" + fishName + "_" + (i+1) + ".png"; } tempFishImage = ImageIO.read(getClass().getResourceAsStream(resourceName)); fishImages[i] = tempFishImage; } fishImage = fishImages[index]; width = fishImage.getWidth(); // 根据背景图片的宽高设置鱼所占矩形区域的大小 height = fishImage.getHeight(); goInPool(); } /** * 维持鱼的游动---x和y坐标的变化 */ public void run() { while (true) { try { Thread.sleep(speedOfFish); // 如果不休眠,鱼的速度过快,基本感觉不到鱼的存在。视觉暂留:1/24~1/7秒之间 index++; fishImage = fishImages[index % fishImages.length]; // 轮流切换帧,生成动画 x = x - xStep; int temp = r.nextInt(10) + 1; yStep = r.nextBoolean()?temp:-temp; // y = y + yStep; // 判断鱼是否到了边界,因为鱼是从右面进入的,因此只需要判断3个方向 if (x = 0 && dx = 0 && dy


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3