尝试写java小游戏(捕鱼达人)
捕鱼达人
(平时都是在学校搞c语言,写算法。忽然java实验课大作业让设计一个小游戏的确挺蒙的,好在我之前学习过开发微信小程序,边查文档文档边做也比较快,下面有我的源码,截图,欢迎刚接触java小游戏的朋友一起学习。)
以下才是重点
废话不多说先上效果图进入游戏
(进入游戏后的界面)
(点击左键捕到鱼的界面)
一个简单的UML类图
游戏实现(各种类)
(1)GameFrame(窗口)JFram游戏支架,用来固定游戏界面
(2)GamePanel(画板类)往窗口绘出各种表现效果
(3)ImageUtill(图片工具类)运用IO流方便图片的调用
(4)Fish(鱼类)鱼塘里的鱼(主角)
(5)Net(渔网类)展示鼠标的位置,右击可使网改变尺寸,左击进行捕鱼
实验总结
<1>窗口的建立
(1)只学了Java最基本的语法规则,和游戏完全不沾边,首先得创建一个窗口。学习到创建窗口的类继承于JFrame。
(2)有了窗口需要画定背景,这种操作叫画板,画板不但能规定背景颜色(在构造方法中用setBackground(Color.pink)),也可以绘出图片,文字等。
(3)图片的调用需要输入图片地址,返回一张图片,且在游戏中非常常见,另外把其写成ImageUtill(图片工具类)。
(4)将函数入口(main函数)写在GameFrame(窗口)里。
(5)遇到问题:GameFrame frame=new GameFrame();创建窗口对象后其不显示。frame.setVisible(true);需要用setVisible函数使其显示。
(6)遇到问题GamePanel panel=new GamePanel();创建画板后窗口不发生变化。
窗口和画板是两个独立的对象,需要在窗口中添加画板frame.add(panel);将其联系在一起。
(7)学习如何绘制图片,文字。在GamePanel(画板类)里定义public void paint(Graphics g) {在其进行绘图。背景图片:g.drawImage(bg,0,0,null);背景文字:g.drawString(“分数:0”, 20, 30);片用set···可以改变字体大小和颜色g.setColor(Color.yellow);g.setFont(new Font(“楷体”,Font.BOLD,20));
(8)遇到问题:在遇到IO流时报错。用图片路径获得图片时,可能有路径错误的情况,此时应有异常处理,及try和catch的运用。
(9)遇到问题:当关闭窗口,控制台显示程序还在运行。需要在GameFrame(窗口)添加语句setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);实现自动关闭。
(10)在学习(9)时知道了用setLocationRelativeTo(null);可以使窗口居中。
<2>鱼类的创立
(11)开始定义鱼类。所有的鱼类主要是图片不同,宽度和高度都有图片决定。所以鱼类可以不分父类子类,一个类就可以解决问题。
(12)每一条鱼都独立游动,所以每一条鱼就是一个独立的线程public class Fish extends Thread{鱼类继承Thead类,在里面编写run()方法,即线程启动时执行的方法,由于鱼一直游动,将鱼游动的方法写进死循环。需要注意的是在创立鱼时需要fish.start();使线程开始。
(13)需要在鱼类的成员变量里添加Random ran=new Random();随机数对象。在方法中需要用到随机数就很方便了。注:随机数对象有一个即可,多次使用均为随机值。如int index=ran.nextInt(9)+1;(1~9随机数)
(14)如何解决创建时生成随机鱼类的问题:鱼类主要是图片不同,所以在鱼类的构造方法中生成的图片随机即可。
(15)处理鱼类游动的问题:鱼并不是在线程里向左移动即可,想要表示出游动的动作,必须借助每一种鱼游动时的多张图片。创建集合 animation为鱼类的成员变量,在创建方法用随机数确定鱼的种类后,将鱼游动时的图片推入集合animation中。在线程run()方法中每向左移动3,就换下一张图片。
(16)遇到问题:鱼类不游动,偶然发现拖动窗口或者拉宽窗口时鱼的图片和位置才会更新。问题所在:虽然鱼的位置和图片更新了,但是画板却没有更新。但画板和鱼是两个不同的类,如何在鱼类中更新画板呢?解决方案:将画板作为参数传进鱼类的构造方法,在鱼类的成员变量中创建一个画板对象,并将传入的画板对象在构造方法赋值给成员变量的画板对象,此时在鱼类中便可以调用画板的方法。更新语句为panel.repaint();
(17)遇到问题:调试过程中发现窗口并没有鱼游动。原因可能是鱼游得太快,所以在run()方法里的死循环添加线程休眠。Thread.sleep(100);(此处需要异常处理)
(18)遇到问题:鱼游动一步就报错且卡住。图片的路径不准确造成的,鱼的图片是19,但是游动的图片序号确实09,代码错误导致图片读取不到而报错。所以图片的地址一定要精确。
(19)遇到问题:鱼游动时图片变形严重。将初始图片更换为游动过程的图片,且停止鱼的游动,发现图片并没有变形,但是开始游动后就有了图片变形的问题。在画板中画鱼的时候规定了宽度和高度,但是图片改变后,对象鱼的宽度和高度还是第一张图片的参数,所以出现了上述问题。解决方案:每游动一次换一张图片的时候,重新取得图片的高度和宽度。
(20)遇到问题:所有的鱼游动都是同步的,将鱼的初始图片更改,发现游的还是同步的。将游动停止,发现初始图片的确被更改了,但游动开始又开始同步。原因是在更新图片时总是更新为第二张,导致游动一致并没有被改变。将初始图片记录为int step_num=startImg;,更新总是变成下一张图片,即解决问题。
(21)遇到问题:虽然鱼游动不同步,但是仍然看着很假,游戏质量很差,原因是所有鱼的移动速度相同。解决方法:将鱼的游动速度创建为成员变量,在构造方法取随机值,int speed=ran.nextInt(5)+1;(偶然发现在这里可以使用前面的随机数成员变量)x-=speed;(鱼向左移动)
<3>鱼网类的创立
(22)渔网和鱼类同样是调用图片,并呈现在画板上,大致思路一样,且需要和鱼类一样同画板建立关联关系。不同点主要在于渔网的位置应和鼠标的位置保持一致,所以需要对鼠标的动作进行监控(监控直接写在画板类中)。具体步骤:在画板类内创立鼠标监听器,在其内创立鼠标适配器,在适配器内可获取鼠标移动,移出,移入,点击等事件。并需要将鼠标配适器加入到监听器中。
注:需要在画板类内打开鼠标监听器。
(23)遇到问题:渔网的位置不在鼠标的点击处(此时网的横纵坐标定义为鼠标的坐标)。解决方法:将网的横坐标定义为(鼠标的横坐标-网宽度的一半),网的纵坐标定义为(鼠标的纵坐标-网高度的一半)。
(24)在监听器写入方法,右击触发网类的方法,改变网的大小。
(25)遇到问题:右击后网不在鼠标的点击处。解决方法:在触发右击事件时同时更新网的横纵坐标。
(26)在鼠标监听器内写入鼠标的移入移出事件,使网在鼠标移出时隐藏。
<4>捕鱼
(27)需要在鱼的线程里判断鱼是否被抓,在此之前,先给鱼类创立成员变量记录鱼是否被捕获boolean catched=false;。并且写出鱼被捕获时状态改变的方法。
(将鱼的位置改为起点,且纵坐标随机)
(28)在鼠标监听器中,判断网和每一条鱼是否有触碰(需要循环语句,判断每一条鱼),若有触碰,将鱼的catched变量改为true。
(29)遇到问题:虽然被捕的鱼被改变到初始位置,但是并没有向前移动。解决方案:将鱼的数量定义为1,然后发现鱼被捕后在起点疯狂换位置(纵坐标不断改变),且为被捕时的动画,分析出是因为虽然把鱼的位置改变,没有把鱼被捕获的状态改为false。添加语句catched=false;。
最后
另外在画板对象可以把子弹数,分数什么的进行定义,剩下的大家就自由发挥了。
我会另外在CSND上传源码,里面有捕鱼达人的图片资源,大家可以下载使用。
尝试写java小游戏(捕鱼达人)相关推荐
- Java小游戏——捕鱼达人
关于"捕鱼达人"这个小游戏,不同于平时我们玩的那种,这种更加简单,易于理解.最终结果是,在屏幕上出现一个窗口,以海为背景,多种多条鱼在里面"游动",玩家通过控制 ...
- Java小游戏捕鱼达人
先看下效果图: 以下是代码,若有错误欢迎指正(^_^) 另附代码下载地址:https://download.csdn.net/download/blame1/10409935 package fish ...
- html5小游戏主要用的js,用js+HTML5实现的小游戏-- 捕鱼达人游戏
大家基本上都玩过捕鱼达人这款游戏吧,下面我就来一个用js+HTML5实现的小游戏 2.[代码] body, p, canvas { image-rendering: optimizeSpeed; -w ...
- java小游戏之捕鱼达人,学了java,妈妈不再担心我去网吧游戏厅了!
Java小项目捕鱼达人 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 捕鱼达人这款游戏,相信和我年纪相仿的朋友,肯定很熟悉.在当时半智能手机和智能手机刚刚出现 ...
- Java小游戏之捕鱼达人000.序章
000 序言 0.1 吐槽 大四专业校内实习,然后没有期待中的C/C++的项目实习(是意料之中的Java 老师要求做一个Java小游戏 我就蒙了,脑海中闪现过很多念头 不是把不是把,没花钱去培训机构学 ...
- Java写五子棋小游戏
Java写五子棋小游戏 最近用Java写了个五子棋小游戏,遇到了许多细节问题,在此不得不总结一下,以便有同样需求朋友参考. 1.]面板发生变化,重绘棋盘与棋局问题: 必须调用父类的paint方法,因为 ...
- 基于Java+Swing实现捕鱼达人游戏(含课程报告)
基于Java+Swing实现捕鱼达人游戏(含课程报告) 一.系统介绍 1.开发背景 2.基本内容.实现方法及主要技术实现目标 3实现目标 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 1.开 ...
- java小游戏——飞翔的小鸟(java初学作品)
注:学习了java基础后,做出来的一个小作品,可以用来巩固学习 概述: 飞翔的小鸟能够作为Java基础的收官之作,包涵了Java很多的基础知识,在学习完Java基础后,尝试编写一些东西,能够起到很好的 ...
- 【Java】寒假答辩作品:Java小游戏
文章目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 熄灯问题拓展 新游戏拓展 实现切换关卡切换音乐 后续 java入门小游戏[te ...
最新文章
- Javascript 未结束的字符串常量
- js ajax 跨域问题 解决方案
- Go 语言能取代 Java,成为下一个 10 年的王者吗?
- Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方法
- silverlight-Canvas中1像素的线变成了2像素
- C51单片机————中断系统
- [leetcode]5343. 多次求和构造目标数组
- 解决TeamViewer的“现在无法捕捉画面。可能由于快速切换或者远程桌面断开或者最小化”问题...
- 拓端tecdat|Excel 实例:数据进行排序和筛选
- Mac 从零搭建Android开发环境记录以及提高效率软件推荐
- jade的基本使用方法
- php三行情书,《三行情书》经典语录 经典三行情书 最美三行情书
- 基于python的网贷平台Prosper数据分析
- signal信号的基础知识
- 计算一班总分 使用的计算机公式是,班级总分统计excle!excle如图所示,怎样按照班级字段,将每班的数学语文英语分数分别求和汇总?...
- Qt为exe添加ico图片
- https://vkceyugu.cdn.bspapp.com/VKCEYUGU-5e444e88-b038-4060-8096-b66a1ee2f304/e7274947-16bb-444a-ae8
- ffmpeg当前版本mp4容器 支持G711修改
- 麻省理工学院计算机工程专业排名,麻省理工学院计算机科学与工程世界排名2018年最新排名第1(ARWU世界排名)...
- oracle 12c 字符集修改 AL32UTF8 改为 ZHS16GBK