JAVA初级游戏项目(大鱼吃小鱼)
昨天在B站大神那边,学习了一个用Java变成的小游戏,大鱼吃小鱼。
给大家把游戏的想换代码给大家分享一下。
GameWin---游戏主窗口
package com.sxt;/*
* @author 加墨少言
*@version 2021100100001
*
* */
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暂停*///游戏默认状态static int state =0;//定义成员变量Image offScreenImage;//定义长和宽int width = 1180;int height =640;double random;//计数器int time=0;Bg bg=new Bg();//敌方鱼类Enamy enamy;//敌方BOSS类Enamy boss;//是否生成BOSSboolean isboss=false;//我方鱼类MyFish myFish=new MyFish();public void launch(){this.setVisible(true);//显示窗口this.setSize(width,height);//调用窗口尺寸大小this.setLocationRelativeTo(null);//窗口居中显示this.setResizable(false);//窗口大小不可调整this.setTitle("小鱼成长历险记"+" "+"2021100100001");//定义窗口名称this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗口,自动停止运行//创建鼠标点击事件,点击为1,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);//WASDif(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;}//监听键盘空格键(32),暂停游戏,在1和4之间切换if(e.getKeyCode()==32){switch (state){case 1:state=4;GameUtils.drawWord(getGraphics(),"游戏暂停!!!",Color.GREEN,120,350,500);break;case 4:state=1;break;}}}@Override//抬起public void keyReleased(KeyEvent e){super.keyReleased(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循环,40毫秒,调用一次repaintwhile (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.painSelf(gImage);}//添加BOSSif(isboss){boss.x=boss.x+boss.dir*boss.speed;boss.painSelf(gImage);//BOSS出现预警if(boss.x<0){gImage.setColor(Color.red);gImage.fillRect(boss.x,boss.y,2400,boss.height%30);}}break;case 2:for(Enamy enamy:GameUtils.EnamyList){enamy.painSelf(gImage);}if(isboss){boss.painSelf(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;myFish.level=1;//积分为15及15以下时,等级为1}else if(GameUtils.count<=15){GameUtils.level=1;//积分为50及50以下时,等级为2//鱼类等级为2}else if (GameUtils.count<=50){GameUtils.level=2;myFish.level=2;//积分为150及150以下时,等级为3//鱼类等级为3}else if(GameUtils.count<=150){GameUtils.level=3;myFish.level=3;//积分为300及300以下时,等级为4//鱼类等级为3}else if (GameUtils.count<=300){GameUtils.level=4;myFish.level=3;//当积分超过300,跳转界面3(胜利)}else if (GameUtils.count>300){state =3;}//定义一个随机函数random=Math.random();//通过难度等级,生成对应的鱼switch (GameUtils.level) {case 4://90秒时,开始出现BOSS鱼类if(time%90==0){if (random>0){boss=new Enamy_Boss();isboss=true;}}case 3:case 2://60秒时,开始出现3号鱼类if(time%60==0){if(random>0.5){enamy=new Enamy_3_L();}else {enamy=new Enamy_3_R();}GameUtils.EnamyList.add(enamy);}case 1://30秒时,开始出现2号鱼类if(time%30==0){if(random>0.5){enamy=new Enamy_2_L();}else {enamy=new Enamy_2_R();}GameUtils.EnamyList.add(enamy);}case 0://10秒时,开始添加1号鱼类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;if(isboss){//如果BOSS矩形和敌方鱼类矩形碰撞,敌方鱼类扭转到制定位置if(boss.getRec().intersects(enamy.getRec())){enamy.x=-200;enamy.y=-200;}//如果BOSS矩形和玩家鱼矩形碰撞,跳转到界面2(失败)if(boss.getRec().intersects(myFish.getRec())){state=2;}}//我方鱼与敌方鱼碰撞检测if(myFish.getRec().intersects(enamy.getRec())){//如果我的鱼类等级,高于鱼类类型,吃掉鱼,获得积分,地方鱼类重新出现在指定位置if(myFish.level>=enamy.type){System.out.println("吃啦");System.out.println("获得"+GameUtils.count+"积分");enamy.x=-200;enamy.y=-200;GameUtils.count=GameUtils.count+enamy.count;}else {//不然,跳转到界面2(失败)state=2;}}}}//重新开始void reGame(){GameUtils.EnamyList.clear();time=0;myFish.level=1;GameUtils.count=0;myFish.x=700;myFish.y=500;myFish.width=50;myFish.height=50;boss=null;isboss=false;}//主方法public static void main(String[] args){GameWin gameWin =new GameWin();gameWin.launch();}
}
Bg---游戏背景图片
package com.sxt;import java.awt.*;public class Bg {void paintSelf(Graphics g,int fishlevel){g.drawImage(GameUtils.bgimg,0,0,null);switch (GameWin.state){case 0:GameUtils.drawWord(g,"开始",Color.red,80,450,350);break;case 1:GameUtils.drawWord(g,"积分"+GameUtils.count,Color.ORANGE,30,200,70);GameUtils.drawWord(g,"难度"+GameUtils.level,Color.ORANGE,30,600,70);GameUtils.drawWord(g,"等级"+fishlevel,Color.ORANGE,30,1000,70);break;case 2:GameUtils.drawWord(g,"积分"+GameUtils.count,Color.ORANGE,30,200,70);GameUtils.drawWord(g,"难度"+GameUtils.level,Color.ORANGE,30,600,70);GameUtils.drawWord(g,"等级"+fishlevel,Color.ORANGE,30,1000,70);GameUtils.drawWord(g,"失败",Color.red,200,350,350);break;case 3:GameUtils.drawWord(g,"积分"+GameUtils.count,Color.ORANGE,30,200,70);GameUtils.drawWord(g,"难度"+GameUtils.level,Color.ORANGE,30,600,70);GameUtils.drawWord(g,"等级"+fishlevel,Color.ORANGE,30,1000,70);GameUtils.drawWord(g,"胜利",Color.red,150,700,500);break;case 4:break;default:}}
}
GameUtil----工具类
package com.sxt;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 List<Enamy>EnamyList=new ArrayList<>();//定义固定的静态图片public static Image bgimg=Toolkit.getDefaultToolkit().createImage("img/sea.jpg");//敌方鱼类public static Image enemyl_img=Toolkit.getDefaultToolkit().createImage("img/enemyfish/fish1_l.jpg");public static Image enemyr_img=Toolkit.getDefaultToolkit().createImage("img/enemyfish/fish1_r.jpg");public static Image enemyl_2img=Toolkit.getDefaultToolkit().createImage("img/enemyfish/fish2_l.jpg");public static Image enemyr_2img=Toolkit.getDefaultToolkit().createImage("img/enemyfish/fish2_r.jpg");public static Image enemyl_3img=Toolkit.getDefaultToolkit().createImage("img/enemyfish/fish3_l.jpg");public static Image enemyr_3img=Toolkit.getDefaultToolkit().createImage("img/enemyfish/fish3_r.jpg");public static Image bossimg=Toolkit.getDefaultToolkit().createImage("img/enemyfish/boss.jpg");//我方鱼public static Image MyFishimg_L=Toolkit.getDefaultToolkit().createImage("img/myfish/myfish_left.jpg");public static Image MyFishimg_R=Toolkit.getDefaultToolkit().createImage("img/myfish/myfish_right.jpg");//绘制文字的工具类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);}
}
MyFish----我的鱼
package com.sxt;import java.awt.*;public class MyFish {//图片Image img=GameUtils.MyFishimg_L;//坐标int x=700;int y=500;int width=94;int height=57;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);}
}
Enamy----敌方鱼类
package com.sxt;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 painSelf(Graphics g){g.drawImage(img,x,y,width,height,null);}//获取自身矩形用于碰撞检测public Rectangle getRec(){return new Rectangle(x,y,width,height);}
}
//敌方鱼左类
class Enamy_1_L extends Enamy{Enamy_1_L(){this.x=-57;this.y=(int)(Math.random()*700+100);this.width=57;this.height=30;this.speed=5;this.count=1;this.type=1;this.img=GameUtils.enemyl_img;}
}
class Enamy_1_R extends Enamy_1_L{Enamy_1_R(){this.x=1400;dir=-1;this.img=GameUtils.enemyr_img;}
}
//定义第二类鱼
class Enamy_2_L extends Enamy{Enamy_2_L(){this.x=-100;this.y=(int)(Math.random()*700+100);this.width=69;this.height=37;this.speed=7;this.count=2;this.type=2;this.img=GameUtils.enemyl_2img;}
}
class Enamy_2_R extends Enamy_2_L{Enamy_2_R(){this.x=1400;dir=-1;this.img=GameUtils.enemyr_2img;}
}
//定义第三类鱼
class Enamy_3_L extends Enamy{Enamy_3_L(){this.x=-300;this.y=(int)(Math.random()*700+100);this.width=64;this.height=39;this.speed=13;this.count=4;this.type=4;this.img=GameUtils.enemyl_3img;}@Override//因为鱼体积过大,从新定义碰撞矩形public Rectangle getRec() {return new Rectangle(x+40,y+30,width+80,height+60);}
}
class Enamy_3_R extends Enamy_3_L{Enamy_3_R(){this.x=1400;dir=-1;this.img=GameUtils.enemyr_3img;}
}//定义BOSS类
class Enamy_Boss extends Enamy{Enamy_Boss(){this.x=-1000;this.y=(int)(Math.random()*700+100);this.width=300;this.height=300;this.speed=20;this.type=10;this.count=0;this.img=GameUtils.bossimg;}
}
链接:https://pan.baidu.com/s/1XcoB1Ve5xrs1Le0rWlj1rw
提取码:aabb
JAVA初级游戏项目(大鱼吃小鱼)相关推荐
- 【java游戏项目】适合初学者练习的java小游戏--大鱼吃小鱼
课程介绍: 大鱼吃小鱼,又称吞食鱼,是一款动作类小游戏.通过不断的吞吃比自己小的鱼类快速成长,最终成为海洋霸主. 本课程讲解一个大鱼吃小鱼游戏的详细开发过程.只要60分钟就可以完成一个你自己亲手开发出 ...
- 今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~
今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~ [源码+教程]Java桌球游戏_Java初级项目_Java练手项目_Java项目实战_Java游戏开发实战教学_Java小游戏_体验 ...
- 年底了,如何准备 Java 初级和高级的技术面试?
作者:hsm_computer 来自:cnblogs.com/JavaArchitect/p/9032323.html 本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一 ...
- 面试总结----java初级工程师
最近在找java初级工程师的工作,投了很多简历都没有反馈,只收到了几个面试通知,可能是因为工作年限和项目经历都不是很丰富,另外一个原因可能是之前接触的技术不新,对于现在想进互联网公司来说,技术上不太符 ...
- java的编译器怎么出来_怎样掌握ava编译器的使用,教程在这里,如何进行Java初级学习...
原标题:怎样掌握ava编译器的使用,教程在这里,如何进行Java初级学习 Java的学习中,并没有那么的繁琐,只需要我们逐步掌握,就能够发觉java是全世界最好的编程语言之一.那么今天就带领大家进行简 ...
- 如何准备Java初级和高级技术的面试呢?
IT行业的崛起带动了一大批的新兴职业,Java数据开发就是其中之一,作为IT行业的刚需职位,企业对合格的Java开发人员求贤若渴, 在各大主流招聘平台上, Java相关职位数量一直名列前茅,那么我们如 ...
- java面试总结(一)-----如何准备Java初级和高级的技术面试
java面试总结(一)--如何准备Java初级和高级的技术面试 本文内容来自:https://mp.weixin.qq.com/s?__biz=MzAxNDMwMTMwMw==&mid=224 ...
- java吃货联盟系统源码_小项目,吃货联盟,java初级小项目,源代码
小项目,吃货联盟,java初级小项目,源代码 1importjava.util.Scanner;23/**4* 吃货联盟订餐管理系统5*6*/7publicclassOrderingMsg {8pub ...
- 编程java好学吗,java初级编程好学吗
先就业后付款 java初级编程好学吗 IT培训网面向所有课程学员提供先就业后付款学习方案,保证学员稳定就业,可谓0学费!免除学习压力. 正文: java初级编程好学吗,计算机专业的学生怎样练习编程才能 ...
最新文章
- 电子商务网站是这样诞生的
- C# Get network adapter info.
- 【职场】技术P7往后是一道坎?
- 黑马程序员_集合学习1
- 掌握 Angular2 的服务 (service)
- 使用 SQL 语句实现一个年会抽奖程序
- go 怎么等待所有的协程完成_理解真实世界中 Go 的并发 BUG
- innerXml,outerXml,innerText的不同
- 最新小白详细描述在centos7.5上安装python3并使用Nginx+virtualenv+supervisor来部署tornado项目(整理集合结合实际)系列1
- 【Java_基础】java中static与final关键字的区别
- cs231n作业——softmax
- linux上apk免杀,kali 免杀工具shellter安装以及使用(示例代码)
- VSCode使用Windows用户名而不是config中设置的User
- 为什么边缘概率密度是联合概率密度的积分_看懂蒙特卡洛积分(一) 概率分布变换与随机采样...
- segmentation fault(core dump);Run-Time Check Failure #3 -The variable 'p' is being used without bein
- 微信小程序实现拍照功能
- 神奇密码锁 bfs
- [Android Studio]开发APP应用出现软件程序打开闪退的排错
- 企业网站制作之PageAdmin自助建站系统
- VMWare Player设置双屏显示