当前位置:首页 » 《随便一记》 » 正文

JAVA 实现《超级玛丽升级版》游戏

5 人参与  2022年08月20日 08:09  分类 : 《随便一记》  评论

点击全文阅读


前言

超级玛丽这款游戏是很多人童年经典的回忆,是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱。并且随着社会的快速发展,人们的生活节奏越来越快,人们对于童年的美好已经不愿意仅仅停留在回忆阶段。
《超级玛丽升级版》游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。

主要设计

功能主要设计

本系统主要是完成超级玛丽游戏的基本操作。本系统需要满足以下几点要求:
(1) 在开始界面按空格键进入游戏。
(2) 利用方向键来控制马里奥的运动。
(3) 碰撞检测:
A.马里奥在运动的过程中如果碰到障碍物则停止运动,在移动到悬崖上方是会掉下去,并失去一条生命。
B.对于有些敌人,如果马里奥跳到敌人头顶上,则敌人消失,否则马里奥失去一条生命。
(4)马里奥顶到金币会增加分数,当马里奥失去3条生命时游戏结束。

界面主要设计

选取和谐Q版的图片,使画面色彩和谐自然。

固定游戏界面大小与初始显示位置。

游戏采用900600像素显示,对于马里奥和障碍物选用6060像素
的正方图片,对于较大的障碍物分割成多个60*60的小正方形。

功能截图

游戏开始:
在这里插入图片描述

马里奥的控制移动
在这里插入图片描述
马里奥与障碍物进行碰撞
在这里插入图片描述

当马里奥失去所有的生命以后,游戏结束
在这里插入图片描述

关卡图
在这里插入图片描述
在这里插入图片描述

大悬崖场景:
在这里插入图片描述
场景借鉴了魂斗罗
在这里插入图片描述

在这里插入图片描述

为了提升游戏的可玩性,加了一个隐藏的过关要点
在这里插入图片描述

在这里插入图片描述

代码实现

马里奥类

public class Mario implements Runnable{//坐标private int x;private int y;//定义玛丽奥所在场景private BackGround bg;//加入线程private Thread t = null;//移动速度eprivate int xmove = 0;//跳跃速度private int ymove = 0;//状态private String status;//显示图片private BufferedImage showImage;//生命和分数private int score;private int life;//当前移动中的图片private int moving = 0;//跳跃时间private int upTime = 0;//标记玛丽奥是否死亡private boolean isDead = false;//完成游戏,游戏结束private boolean isClear = false;//构造方法public Mario(int x,int y){this.x = x;this.y = y;//初始化玛丽奥图片this.showImage = StaticValue.allMarioImage.get(0);this.score = 0;this.life = 3;this.t = new Thread(this);t.start();this.status = "right-standing";}public void leftMove(){//移动速度xmove = -5;//改变状态//如果当前已经是跳跃,应该保持原有状态,不能再改变if(this.status.indexOf("jumping") != -1){this.status = "left-jumping";}else{this.status = "left-moving";}}public void rightMove(){xmove = 5;if(this.status.indexOf("jumping") != -1){this.status = "right-jumping";}else{this.status = "right-moving";}}public void leftStop(){this.xmove = 0;if(this.status.indexOf("jumping") != -1){this.status = "left-jumping";}else{this.status = "left-standing";}}public void rightStop(){this.xmove = 0;if(this.status.indexOf("jumping") != -1){this.status = "right-jumping";}else{this.status = "right-standing";}}public void jump(){if(this.status.indexOf("jumping") == -1){if(this.status.indexOf("left") != -1){this.status = "left-jumping";}else{this.status = "right-jumping";}ymove = -10;upTime = 18;}}//下落方法public void down(){if(this.status.indexOf("left") != -1){this.status = "left-jumping";}else{this.status = "right-jumping";}ymove = 10;}//死亡方法public void dead(){this.life--;if(this.life == 0){this.isDead = true;}else{this.bg.reset();this.x = 0;this.y = 480;}}public int getX() {return x;}public int getY() {return y;}public BufferedImage getShowImage() {return showImage;}public void run() {while(true){//判断是否与障碍物碰撞//定义标记if(this.bg.isFlag() && this.x >= 520){this.bg.setOver(true);if(this.bg.isDown()){//降旗后玛丽奥开始移this.status = "right-moving";if(this.x < 580){//向右this.x += 5;}else{if(this.y < 480){//向下this.y += 5;}this.x += 5;if(this.x >= 780){//游戏结束this.setClear(true);}}}else{//如果为最后一个场景,同事Mario的x坐标到了550,游戏结束//自动控制玛丽奥if(this.y < 420){this.y += 5;}if(this.y >= 420){this.y = 420;this.status = "right-standing";}}}else{boolean canLeft = true;boolean canRight = true;//能否跳跃标记boolean onLand = false;for(int i=0;i<this.bg.getAllObstruction().size();i++){Obstruction ob = this.bg.getAllObstruction().get(i);//不能向右移动if(ob.getX()==this.x+60 && (ob.getY()+50>this.y && ob.getY()-50<this.y)){if(ob.getType() != 3){canRight = false;}}//不能向左移动if(ob.getX()==this.x-60 && (ob.getY()+50>this.y && ob.getY()-50<this.y)){if(ob.getType() != 3){canLeft = false;}}//判断能否跳跃if(ob.getY()==this.y+60 && (ob.getX()+60>this.x && ob.getX()-60<this.x)){if(ob.getType() != 3){onLand = true;}}//判断玛丽奥跳跃时是否撞到障碍物if(ob.getY()==this.y-60 && (ob.getX()+50>this.x && ob.getX()-50<this.x)){//如果是砖块if(ob.getType()==0){//移除砖块this.bg.getAllObstruction().remove(ob);//保存到移除的障碍物中this.bg.getRemoveObstruction().add(ob);}//如果是问号||隐藏的砖块if((ob.getType()==4 || ob.getType()==3) && upTime > 0){//增加分数score += 10;ob.setType(2);ob.setImage();}upTime = 0;}}//对敌人的判断for(int i=0;i<this.bg.getAllEnemy().size();i++){Enemy e = this.bg.getAllEnemy().get(i);if((e.getX()+50>this.x && e.getX()-50<this.x) && (e.getY()+60>this.y && e.getY()-60<this.y)){//玛丽奥死亡this.dead();}if(e.getY()==this.y+60 && (e.getX()+60>this.x && e.getX()-60<this.x)){if(e.getType() == 1){e.dead();this.upTime = 5;this.ymove = -10;//敌人死亡,增加分数score += 10;}else if(e.getType() == 2){this.dead();}}}if(onLand && upTime == 0){if(this.status.indexOf("left") != -1){if(xmove != 0){this.status = "left-moving";}else{this.status = "left-standing";}}else{if(xmove != 0){this.status = "right-moving";}else{this.status = "right-standing";}}}else{//上升状态if(upTime != 0){upTime--;}else{this.down();}y += ymove;}if(this.y>600){this.dead();}if(canLeft && xmove<0 || canRight && xmove>0){x += xmove;if(x<0){x = 0;}}}//默认向右int temp = 0;//向左状态if(this.status.indexOf("left") != -1){temp += 5;} //判断是否移动if(this.status.indexOf("moving") != -1){temp += this.moving;moving++;if(moving==4){this.moving = 0;}}if(this.status.indexOf("jumping") != -1){temp += 4;}//改变显示图片this.showImage = StaticValue.allMarioImage.get(temp);try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void setBg(BackGround bg) {this.bg = bg;}public void setX(int x) {this.x = x;}public void setY(int y) {this.y = y;}public boolean isDead() {return isDead;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getLife() {return life;}public void setLife(int life) {this.life = life;}public boolean isClear() {return isClear;}public void setClear(boolean isClear) {this.isClear = isClear;}}

马里奥

小怪

public class Enemy implements Runnable{//坐标private int x;private int y;//初始坐标private int startx;private int starty;//怪物类型private int type;//显示图片private BufferedImage showImage;//移动方向private boolean isLeftOrUp = true;//移动范围private int upMax = 0;private int downMax = 0;//加入线程private Thread t = null;//定义图片变化private int imageType = 0;//定义所在场景private BackGround bg ;//蘑菇怪public Enemy(int x,int y,boolean isLeft,int type,BackGround bg){this.x = x;this.y = y;this.startx = x;this.starty = y;this.isLeftOrUp = isLeft;this.type = type;this.bg = bg;if(type==1){this.showImage = StaticValue.allTriangleImage.get(0);}this.t = new Thread(this);t.start();t.suspend();}//食人花public Enemy(int x,int y,boolean isUp,int type,int upMax,int downMax,BackGround bg){this.x = x;this.y = y;this.startx = x;this.starty = y;this.isLeftOrUp = isUp;this.type = type;this.upMax = upMax;this.downMax = downMax;this.bg = bg;if(type==2){this.showImage = StaticValue.allFlowerImage.get(0);}this.t = new Thread(this);t.start();t.suspend();}public void run() {while(true){//判断怪物类型if(type==1){if(this.isLeftOrUp){this.x -= 5;}else{this.x += 5;}if(imageType==0){imageType = 1;}else{imageType = 0;}//定义标记boolean canLeft = true;boolean canRight = true;for(int i=0;i<this.bg.getAllObstruction().size();i++){Obstruction ob = this.bg.getAllObstruction().get(i);//不能向右移动if(ob.getX()==this.x+60 && (ob.getY()+50>this.y && ob.getY()-50<this.y)){canRight = false;}//不能向左移动if(ob.getX()==this.x-60 && (ob.getY()+50>this.y && ob.getY()-50<this.y)){canLeft = false;}}if(!canLeft && this.isLeftOrUp || this.x == 0){this.isLeftOrUp = false;}else if(!canRight && !this.isLeftOrUp || this.x == 840){this.isLeftOrUp = true;}this.showImage = StaticValue.allTriangleImage.get(imageType);}if(type==2){if(this.isLeftOrUp){this.y -=5;}else{this.y +=5;}if(imageType==0){imageType = 1;}else{imageType = 0;}if(this.isLeftOrUp && this.y == this.upMax){this.isLeftOrUp = false;}if(!this.isLeftOrUp && this.y == this.downMax){this.isLeftOrUp = true;}this.showImage = StaticValue.allFlowerImage.get(imageType);}try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void reset(){//还原坐标this.x = this.startx;this.y = this.starty;//还原图片if(this.type == 1){this.showImage = StaticValue.allTriangleImage.get(0);}else if(this.type == 2){this.showImage = StaticValue.allFlowerImage.get(0);}}public void dead(){//死亡图片this.showImage = StaticValue.allTriangleImage.get(2);this.bg.getAllEnemy().remove(this);this.bg.getRemoveEnemy().add(this);}public int getX() {return x;}public int getY() {return y;}public BufferedImage getShowImage() {return showImage;}public void setBg(BackGround bg) {this.bg = bg;}public int getType() {return type;}public void startMove(){t.resume();}}

总结

通过此次的《超级玛丽升级版》游戏实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

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

源码获取

点赞,关注博主后,私聊博主免费获取
需要技术指导,写项目程序,等更多服务请联系博主

今天是持续写作的第 28 / 100 天。
可以关注我,点赞我、评论我、收藏我啦。


点击全文阅读


本文链接:http://zhangshiyu.com/post/44521.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1