一、项目简介
- 《大鱼吃小鱼》是一种基于Java技术的简单游戏,可以在桌面应用程序中运行。玩家扮演着一个生活在海洋中的鱼类,在游戏过程中需要不断地吃掉比自己体积小的鱼来成长,并要躲避比自己体积大的鱼的攻击,以避免被吃掉。游戏的界面主要由一个海底场景和多个鱼组成。每条鱼都有自己的身体大小和速度属性,根据这些属性可以判断出鱼之间的大小关系,从而实现吃或被吃的游戏规则。当玩家的鱼体积增长到一定程度后,也可以去捕捉身体比自己小的其他鱼类。在进行游戏时,玩家可以使用键盘控制自己的鱼移动等,通过不断地提高自己的技能和策略,最终成为海洋之王。
二、项目采用技术
- 变量、数据类型、判断语句、循环结构、类的继承、简单窗口创建、图形图片绘制、键盘事件、双缓存技术。
三、功能需求分析
1、游戏界面
- 游戏需要一个逼真的海底场景,以及多个不同种类的鱼等海洋生物。每个游戏元素需要有相应的图片或动画效果,以增加游戏的可玩性。此外,游戏还需要有控制面板、得分牌等辅助信息。
2、鱼类属性
- 每条鱼都需要具备相应的属性,包括体积大小、速度等,同时还要考虑成长和食物等因素对其属性的影响。
3、鱼类操作
- 玩家需要能够操纵自己控制的鱼类进行移动、食用其他鱼类、升级等操作。
鱼类操作
4、AI系统设计
- 游戏中的AI系统需要考虑多个因素来设置敌方鱼类的行为,如视野、移动方式等,以及逃脱策略 。除此之外,还设计了一些特殊的“BOSS”型角色,增加游戏难度。
5、结束游戏
- 玩家碰到比自己等级高的鱼被吃掉,游戏失败。
四、项目核心代码
1、双缓存技术解决闪烁问题(S)
Image offScreenImage;
//循环调用
while(true) {
repaint();
time++;
try {
Thread.sleep(40);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
public 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,2400, boss.height);
}
}
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);
}
2、关卡难度变化(S)
package fish;
void logic() {
//关卡难度
if(GameUtils.count<5) {
GameUtils.level=0;
myFish.level=1;
}else if(GameUtils.count<=15) {
GameUtils.level=1;
}else if(GameUtils.count<=50) {
GameUtils.level=2;
myFish.level=2;
}else if(GameUtils.count<=150) {
GameUtils.level=3;
myFish.level=3;
}else if(GameUtils.count<=300) {
GameUtils.level=4;
myFish.level=3;
}else if(GameUtils.count>300) {
state=3;
}
3、设置游戏状态(S)
package fish;
switch (state) {
case 0: