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

目录
  • 前言
  • 主要设计
  • 功能截图
  • 代码实现
    • 游戏窗体
    • 鱼池类继承自Jpanel
  • 总结

前言

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

游戏是用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 || y <= 0 || y >= 480){
					goInPool();
				}

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 *  判断鱼是否在网内
	 */
	public boolean fishInNet(int netX, int netY) {
		int dx = netX - x;
		int dy = netY - y;
		return dx >= 0 && dx <= width && dy >= 0 && dy <= height;
	}

	/**
	 * 鱼从屏幕上游出或者被网罩住的时候消失,再从屏幕的右侧游动到屏幕中,实际上还是那几条鱼
	 */
	void goInPool() {
		r = new Random();
		x = FishlordFrame.WIDTH - 10;						// 鱼从右侧游动到屏幕左侧
		y = r.nextInt(FishlordFrame.HEIGHT - 20 - height);	// 鱼的初始y的坐标是根据窗体的高度随机指定的
		xStep = r.nextInt(BASE_STEP) + 1;					// 鱼游动的速度是随机的
	}
}

鱼池类继承自Jpanel

class Pool extends JPanel {

	BufferedImage background = null;	// 游戏界面的背景图片
	Fish fish = null;    				// 鱼
	Fish[] fishs = new Fish[11];		// 鱼对象数组
	Net net = null;						// 渔网

	int score = 0;						// 分数
	Font font = new Font("楷体", Font.BOLD, 20);

	public Pool() throws IOException {

		/** getClass().getResourceAsStream()方法读取的是src/images包下的资源文件【图片】*/
		background = ImageIO.read(getClass().getResourceAsStream("/images/bg.jpg"));

		/* 产生11条鱼,每1条鱼都是1个线程 */
		for (int i = 0; i < 11; i++) {
			if (i < 9) {
				fish = new Fish("fish0" + (i + 1));
			} else {
				fish = new Fish("fish" + (i + 1));
			}

			fishs[i] = fish;
			new Thread(fish).start();
		}
	}

	@Override
	public void paint(Graphics g) {

		g.drawImage(background, 0, 0, null); 												// 绘制背景
		for (int i = 0; i < fishs.length; i++) {
			Fish tempfish = fishs[i];
			g.drawImage(tempfish.fishImage, tempfish.x, tempfish.y, null); 					// 绘制鱼
		}
		if (net.show) {
			g.drawImage(net.netImage, net.x - net.width / 2, net.y - net.height / 2, null); // 判断渔网是否显示,绘制渔网
		}
		g.setFont(font);
		g.setColor(Color.YELLOW);
		g.drawString("SCORE:", 10, 20);
		g.setColor(Color.MAGENTA);
		g.drawString("      " + score, 10, 20);
	}

	/**
	 * 处理鼠标事件-实现点击鼠标进行捕鱼
	 * @throws Exception
	 */
	public void action() throws Exception {

		net = new Net();

		/**
		 * 实现鼠标适配器避免出现实现鼠标监听器接口或者使用匿名内部类出现的代码冗余
		 * 我们可以根据需要重写自己需要的方法
		 */

		MouseAdapter adapter = new MouseAdapter() {

			/* 鼠标进入,渔网显示;鼠标移出,渔网不显示 */
			@Override
			public void mouseEntered(MouseEvent e) {
				net.show = true;
			}

			@Override
			public void mouseExited(MouseEvent e) {
				net.show = false;
			}

			/**
			 * 渔网的位置随着鼠标的位置变化
			 */
			@Override
			public void mouseMoved(MouseEvent e) {

				net.x = e.getX();
				net.y = e.getY();
			}

			/**
			 * 当鼠标按下的时候进行捕鱼操作
			 */
			@Override
			public void mousePressed(MouseEvent e) {
				catchFish();
			}

		};

		this.addMouseListener(adapter); 		// 添加鼠标监听器
		this.addMouseMotionListener(adapter);	// 鼠标移动监听器

		while (true) {
			repaint();
			try {
				Thread.sleep(100); 				// 每隔一定时间刷新屏幕,需要符合视觉暂留设置50~100ms
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 渔网是否捉到鱼
	 */
	protected void catchFish() {
		// 鱼在不在网的范围内?在的话就让鱼消失
		for (int i = 0; i < fishs.length; i++) {
			fish = fishs[i];
			if (fish.fishInNet(net.x, net.y)) {// 判断在不在网的范围
				fish.goInPool();				 // 鱼从池子中消失,重新从右边游入
				score += fish.width / 10;		 // 不同的鱼有不同的分数
			}
		}
	}

}

总结

通过此次的《捕鱼达人》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

以上就是Java实现经典捕鱼达人游戏的示例代码的详细内容,更多关于Java捕鱼达人的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java实现经典游戏复杂迷宫

    目录 前言 主要设计 功能截图 代码实现 总结 前言 人类建造迷宫已有5000年的历史.在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲.困难重重的小路吃力地行走,寻找真相.迷宫类小游戏应运而生.在游戏中,迷宫被表现为冒险舞台里,藏有各式各样奇妙与谜题或宝藏的危险区域.型态有洞窟.人工建筑物.怪物巢穴.密林或山路等.迷宫内有恶徒或凶猛的生物(真实存在或想像物体都有)徘徊,其中可能会有陷阱.不明设施.遗迹等. <复杂迷宫>游戏是用java语言实现,采用了swing技术进行了界面

  • Java+swing实现经典贪吃蛇游戏

    目录 前言 主要设计 功能截图 代码实现 总结 前言 贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长. 本程序是通过java的swing来实现<贪吃蛇大作战>这款游戏. 主要需求 1.通过上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,蛇的身体会变长 2.蛇头碰到自己的身体,则算失败 主要设计 1.设置swing的窗体大小 2.随机初始化蛇的位置和食物的位置,且食物不能落在蛇的身体上.

  • JAVA实现经典游戏坦克大战的示例代码

    目录 前言 主要设计 功能截图 代码实现 总结 前言 小时候大家都玩过坦克大战吧,熟悉的旋律和丰富的关卡陪伴了我们一整个寒暑假,还记得传说中的经典坦克大战 吗?那些怀旧的记忆,伴随着我们一起走过来的经典坦克大战,刚开始那战战兢兢,屡屡被敌人坦克击毁的情景历历在目.现在好了,再也不用担心敌人坦克了,可 以横冲直撞,横扫敌人坦克了.快哉!!! <坦克大战>游戏以坦克战斗为主题,用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可以生成不同的地图,消灭地

  • Python写捕鱼达人的游戏实现

    当今最火的莫过于用Python写出捕鱼达人的效果了.啥都不用说,亮代码~~~ # coding:utf-8 # 导入模块 import pygame,sys,time,random from pygame.locals import * # 初始化pygame环境 pygame.init() # 创建一个长宽分别为800/480的窗口 canvas = pygame.display.set_mode((800,480)) canvas.fill((255,255,255)) # 设置窗口标题 p

  • java实现捕鱼达人游戏

    本文实例为大家分享了java实现捕鱼达人游戏的具体代码,供大家参考,具体内容如下 效果图如下: 源代码分享: 测试类: package game; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; /** * 测试类 * @author Lenovo * */ p

  • Java实现经典大富翁游戏的示例详解

    目录 前言 主要设计 功能截图 代码实现 总结 前言 大富翁,又名地产大亨.是一种多人策略图版游戏.参与者分得游戏金钱,凭运气(掷骰子)及交易策略,买地.建楼以赚取租金.英文原名monopoly意为“垄断”,因为最后只得一个胜利者,其余均破产收场. <大富翁>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可多人参与的大富翁游戏,玩家有初始资金,通过掷骰子,玩家移动指定骰子点数步骤,根据对应格子上的交易策略,来决定是赚钱还是亏钱,其他玩家破

  • Java+Swing实现中国象棋游戏

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 二.系统展示 三.部分代码 一.系统介绍 1.开发环境 开发工具:Eclipse2021 JDK版本:jdk1.8 Mysql版本:8.0.13 2.技术选型 Java+Swing 3.系统功能 实现中国象棋游戏,开始游戏,悔棋,退出功能. 二.系统展示 1.首页 2.红旗走 3.黑棋走 三.部分代码 ChineseCheseRule.java package com.sjsq; import java.awt.event.Mouse

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

    目录 前言 主要设计 功能截图 代码实现 游戏窗体 鱼 鱼池类继承自Jpanel 总结 前言 <捕鱼达人>是一款以深海狩猎为题材的休闲竞技游戏.这是一场海底世界的远征,享受捕获大鱼的乐趣,但不是所有的鱼都是友善的,它们会用自己的方式保护自己,保卫属于自己的海底世界.当然,这里也是冒险与机遇共存的地方,诸多埋藏于海底的宝藏等待着被探寻. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 在鱼池中有很多鱼,鱼各自游动. 有一张渔网,随鼠标移动,点

  • C#实现经典飞行棋游戏的示例代码

    目录 效果展示 主函数 场景类型枚举 控制台基础设置 开始及结束场景逻辑 游戏场景逻辑 固定打印的信息 格子类型枚举和格子结构体 地图结构体 玩家和电脑结构体 绘制玩家 扔骰子逻辑 效果展示 主函数      static void Main(string[] args)         {             int w = 50;             int h = 30;             ConsoleInit(w, h);             E_SceneType

  • Java实现英文猜词游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 处理 单词判断 总结 前言 <英文猜词游戏>代码行数没有超过200行,是之前为了背英语单词,特意研发的小游戏. 主要设计 1.事先准备单词文本. 2.为了让玩家能与程序互动,使用下面这个命令可达效果 Scanner sc = new Scanner(System.in); 3.运行WordleMaster里的main方法 4.在Wordle中输入第一个单词(默认第一个单词是abort,会显示在console中.可在代码中修改) 5.将Wor

  • Java实现接月饼小游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心类 画面绘制 总结 前言 <接月饼小游戏>是一个基于java的自制游戏,不要被月亮砸到,尽可能地多接月饼. 此小项目可用来巩固JAVA基础语法,swing的技巧用法. 主要设计 设计游戏界面,用swing实现 设计背景 设计得分物体-月饼,碰到加一分 设计障碍物-月亮,碰到会死亡 监听鼠标的左右键,用来控制篮子左右移动 设计积分系统 将resource文件夹设为resource(Project Manage中可以设置),因为要用里面的图

  • C语言实现经典扫雷小游戏的示例代码

    目录 一.游戏简介 二.游戏实现 1.初始化棋盘 2.打印棋盘 3.布置雷 4.排查雷 三.源文件 1.game.h 2.game.c 3.Test.c 一.游戏简介 游戏初始界面有两个选择,选项“1”为开始游戏,选项“0”为退出游戏:选择开始游戏之后将会打印出9*9的棋盘,此时系统已经为游戏设置了10个雷,输入坐标之后将会打印出此坐标周围八个位置有几个雷,如果踩到了雷,那么游戏结束,打印出所有雷的位置. 二.游戏实现 1.初始化棋盘 void InitBoard(char board[ROWS

  • Java实现蓝桥杯数独游戏的示例代码

    你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一的,所以,多个解也称为无解. 本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目.但对会使用计算机编程的你来说,恐怕易如反掌了. 本题的要求就是输入数独题目,程序输出数独的唯一解.我们保证所有已知数据的格式都是合法的,并且题目有唯一的解. 格式要求: 输入9行,每行9个数字,0代表未知,其它数字为

  • JAVA实现经典扫雷游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 总结 前言 windows自带的游戏<扫雷>是陪伴了无数人的经典游戏,本程序参考<扫雷>的规则进行了简化,用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 1.要有难度等级,初级,中级,高级 2.由玩家逐个翻开方块,以找出所有地雷为最终游戏目标.如果玩家翻开的方块有地雷,则游戏结束 3.游戏主区域由很多个方格组成.使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字:方格中数字则表示其

  • Java实现经典角色扮演侦探游戏游戏的示例代码

    目录 前言 游戏背景 主要需求 主要设计 功能截图 代码实现 游戏主界面 主卧 初始化 大厅 总结 前言 游戏背景 百变山庄坐落于太平洋的一座小岛上,山庄主人亦是小岛的主人.这个神秘主人细致周到,邀请函里不仅附着往返港口的机票,港口的邮船也是通往小岛的专线. 初登小岛,恢宏大气的山庄直入眼帘,通过门廊,金碧辉煌的大厅震人心魄. 受邀的侦探们陆续到齐,[侍者]彬彬有礼地站在一旁,他安排你们围坐在一个奇特十边形的桌子旁稍加等待.[侦探指尖]回忆着自己临行前调查的各位名侦探的资料,除了那个神秘的[电话

  • Java实现经典拳皇误闯冒险岛游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏主界面 英雄 总结 前言 <拳皇误闯冒险岛>是拳皇和冒险岛素材的基于JavaSwing的动作类游戏,独创改编. 主要需求 拳皇迷迷糊糊醒来,发现自己在一间废弃的工厂里,地上爬满怪兽..这么可爱的怪兽,一拳下去,应该会哭很久吧~拳皇心里吐槽了下,向怪兽的怀抱冲了上去~~ 主要设计 1.游戏面板生成显示 2.背景选用冒险岛素材图 3.设计英雄,包含生命值,法术值,英雄的动作变化处理,英雄的技能特效 4.设计怪兽,包含怪物血量,攻击力,位置,步长等 5.

随机推荐