技术选型

平台:Windows开发工具:Intelij IDEA

JDK环境:Java 8

UI界面:基于Swing的桌面编程技术。

绘图技术:Graphics

集合框架

IO流

多线程等

地图配置

地图map.txt文件

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,1,0,0,0,1,1,1,1,0,0,2,2,0,0,0,0,0,0,3
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

读取地图

package cn.tx.util;import org.junit.Test;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;/*** 地图配置类* @author 任亮* @company 拓薪教育* @QQ:206229531*/
public class GameMap {//数据容器public List<String> list = new ArrayList<>();// 二维数组元素又是一个一维数组:行列矩阵public int[][] map = null;// 单元测试:验证Map类的readMap()方法确实把地图配置文件map.txt// 加载成了二维数组@Testpublic void testResult() throws Exception {int[][] result = readMap();// 二维数组的内容输出,看一下是否是地图的配置信息for(int i = 0 ; i < result.length ; i++ ){for(int j = 0 ; j < result[i].length ; j++) {System.out.print(result[i][j]+" ");}System.out.println();}}public int[][] readMap() throws Exception {// 构造文件输入流FileInputStream fis = new FileInputStream("map.txt");InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr);//直接读取一行数据String value = br.readLine();while (value != null) {//将读取到的一行数据加入到容器中list.add(value);value = br.readLine();}br.close();//得到多少行多少列int row = list.size();int cloum = 0;for (int i = 0; i < 1; i++) {String str = list.get(i);String[] values = str.split(",");cloum = values.length;}map = new int[row][cloum];//将读到的字符创转换成整数,并赋值给二位数组mapfor (int i = 0; i < list.size(); i++) {String str = list.get(i);String[] values = str.split(",");for (int j = 0; j < values.length; j++) {map[i][j] = Integer.parseInt(values[j]);}}return map;}}

定义角色

超级玛丽中的角色包括了,水管,怪物,砖头等。并显示到主界面。

障碍物抽象父类Enemy

package cn.tx.role;import java.awt.Image;
/**敌人抽象类* @author 任亮* @company 拓薪教育* @QQ:206229531*/
public abstract class Enemy {//坐标位置public int x,y;//宽高public int width,height;//图片public Image img;public Enemy(int x, int y, int width, int height, Image img) {this.x = x;this.y = y;this.width = width;this.height = height;this.img=img;}
}

水管类

package cn.tx.role;
import java.awt.Image;/*** 水管类* @author 任亮* @company 拓薪教育* @QQ:206229531*/
public class Pipe extends Enemy {public Pipe(int x, int y, int width, int height, Image img) {super(x, y, width, height, img);}
}

砖头类

package cn.tx.role;import java.awt.Image;/*** 砖** @author 任亮* @company 拓薪教育* @QQ:206229531*/
public class Brick extends Enemy {public Brick(int x, int y, int width, int height, Image img) {super(x, y, width, height, img);}
}

金币类

package cn.tx.role;import java.awt.Image;/**金币类* @author 任亮* @company 拓薪教育* @QQ:206229531*/
public class Coin extends Enemy {public Coin(int x, int y, int width, int height, Image img) {super(x, y, width, height, img);}
}

子弹类

package cn.tx.role;
/**子弹类* @author 任亮* @company 拓薪教育* @QQ:206229531*/
public class Boom {//子弹的坐标,大小,速度public int x,y;public int width;public int speed=1;public Boom(int x, int y, int width) {super();this.x = x;this.y = y;this.width = width;}
}

马里奥类

package cn.tx.mario;import java.awt.Image;
import java.awt.Rectangle;
import javax.swing.ImageIcon;import cn.tx.ui.GameFrame;
import cn.tx.role.Enemy;/*** 玛丽** @author 任亮* @company 拓薪教育* @QQ:206229531*/
public class Mario extends Thread {//窗体对象public GameFrame gf;//是否跳起public boolean jumpFlag = true;//马里奥的坐标,原点为左上角,所以y周越小玛丽越高public int x = 50, y = 358;//马里奥的速度public int xspeed = 5, yspeed = 1;//马里奥的宽高public int width = 30, height = 32;//马里奥的图片public Image img = new ImageIcon("image/mari1.png").getImage();//键盘上的上下左右是否被按下public boolean left = false, right = false, down = false, up = false;public String Dir_Up = "Up", Dir_Left = "Left", Dir_Right = "Right", Dir_Down = "Down";public Mario(GameFrame gf) {this.gf = gf;this.Gravity();}// 玛丽飞翔的逻辑 ;移动的逻辑都在这里。public void run() {while (true) {//向左走if (left) {//碰撞到了if (hit(Dir_Left)) {this.xspeed = 0;}//没有撞击到障碍物if (this.x >= 0) {//马里奥的位置的更新this.x -= this.xspeed;//改变马里奥的图片this.img = new ImageIcon("image/mari_left.gif").getImage();}this.xspeed = 5;}//向右走if (right) {// 右边碰撞物检测应该是往右走的时候检测// 进行碰撞检测:至少主角(玛丽,碰撞物)if (hit(Dir_Right)) {this.xspeed = 0;}//任人物向右移动if (this.x < 400) {this.x += this.xspeed;this.img = new ImageIcon("image/mari_right.gif").getImage();}//玛丽奥x轴的坐标大于400的时候发生什么if (this.x >= 400) {//背景向左移动gf.bg.x -= this.xspeed;//障碍物项左移动for (int i = 0; i < gf.eneryList.size(); i++) {Enemy enery = gf.eneryList.get(i);enery.x -= this.xspeed;}//图标的变化this.img = new ImageIcon("image/mari_right.gif").getImage();}this.xspeed = 5;}//向上跳if (up) {if (jumpFlag && !isGravity) {jumpFlag = false;new Thread() {public void run() {jump();jumpFlag = true;}}.start();}}try {this.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}}}//向上跳的函数public void jump() {//定义高度值int jumpHeigh = 0;for (int i = 0; i < 150; i++) {//玛丽的y轴位置减去玛丽的y轴速度gf.mario.y -= this.yspeed;//玛丽的高度递增jumpHeigh++;//如果撞到障碍物跳出if (hit(Dir_Up)) {break;}try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}//玛丽跳起来后下落for (int i = 0; i < jumpHeigh; i++) {//玛丽的y轴高度加上y轴速度gf.mario.y += this.yspeed;//如果撞到下面障碍则停止if (hit(Dir_Down)) {this.yspeed = 0;}try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}this.yspeed = 1;//还原速度}//检测碰撞public boolean hit(String dir) {// Swing技术中,人家已经提供了!!Rectangle myrect = new Rectangle(this.x, this.y, this.width, this.height);Rectangle rect = null;for (int i = 0; i < gf.eneryList.size(); i++) {Enemy enery = gf.eneryList.get(i);if (dir.equals("Left")) {rect = new Rectangle(enery.x + 2, enery.y, enery.width, enery.height);} else if (dir.equals("Right")) {// 右侧碰撞物检测。rect = new Rectangle(enery.x - 2, enery.y, enery.width, enery.height);} else if (dir.equals("Up")) {rect = new Rectangle(enery.x, enery.y + 1, enery.width, enery.height);} else if (dir.equals("Down")) {rect = new Rectangle(enery.x, enery.y - 2, enery.width, enery.height);}//碰撞检测if (myrect.intersects(rect)) {return true;}}return false;}//检查是否贴地public boolean isGravity = false;// 重力线程!public void Gravity() {new Thread() {public void run() {while (true) {try {sleep(10);} catch (InterruptedException e) {e.printStackTrace();}while (true) {//如果没有跳起退出if (!jumpFlag) {break;}//如果撞到下面障碍跳出if (hit(Dir_Down)) {break;}//大于385 在地面之下if (y >= 358) {isGravity = false;} else {//在地面上isGravity = true;//y是马里奥的纵向的位置y += yspeed;}try {sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}}.start();}
}

窗体

package cn.tx.ui;import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JFrame;import cn.tx.mario.Mario;
import cn.tx.role.*;
import cn.tx.util.GameMap;
import cn.tx.util.MusicUtil;
/**主体窗口界面:展示角色。*/
public class GameFrame extends JFrame{// 超级玛丽:界面需要一个超级玛丽的。public Mario mario;// 分别定义:水管,金币和砖块public Enemy pipe ,coin , brick;//背景图片public BackgroundImage bg ;//定义一个集合容器装敌人对象public ArrayList<Enemy> eneryList = new ArrayList<Enemy>();//定义一个集合容器装子弹public ArrayList<Boom> boomList = new ArrayList<Boom>();//子弹的速度public int bspeed=0;//地图数据,制定规则,是1画砖头,是2画金币,是3画水管public int[][] map = null;//对象代码块: 当前类的创建的时候执行{// 实例代码块中初始化地图资源的数据GameMap mp = new GameMap();map = mp.readMap();}//构造函数里面初始化背景图片和马里奥对象public GameFrame() throws Exception {// 创建背景图片bg = new BackgroundImage();//初始化窗体相关属性信息数据// this代表了当前主界面对象。this.setSize(800,450);this.setTitle("超级玛丽");this.setResizable(true);// 居中展示窗口this.setLocationRelativeTo(null);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setVisible(true);// 创建玛丽对象mario = new Mario(this);// 读取地图,并配置地图for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[0].length; j++) {//读取到的是1,画砖头if(map[i][j]==1){// xbrick = new Brick(j*30,i*30,30,30,new ImageIcon("image/brick.png").getImage());eneryList.add(brick);}//读到2画金币if(map[i][j]==2){coin = new Coin(j*30,i*30,30,30,new ImageIcon("image/coin_brick.png").getImage());eneryList.add(coin);}//读到3画水管if(map[i][j]==3){pipe = new Pipe(j*30,i*30,60,120,new ImageIcon("image/pipe.png").getImage());eneryList.add(pipe);}}}mario.start();//开启一个线程负责界面的窗体重绘线程new Thread(){public void run(){while(true){//重绘窗体repaint(); // 自动触发当前窗口中的paint方法//检查子弹是否出界//checkBoom();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();//设置背景音乐new Thread(new Runnable() {@Overridepublic void run() {MusicUtil.playBackground();}}).start();}/*** 画窗体* @param g*/@Overridepublic void paint(Graphics g) {//利用双缓冲画背景图片和马里奥BufferedImage bi =(BufferedImage)this.createImage(this.getSize().width,this.getSize().height);//创建画图对象Graphics big = bi.getGraphics();//画背景big.drawImage(bg.img, bg.x, bg.y, null);// 开始绘制界面上的敌人。for (int i = 0; i < eneryList.size(); i++) {Enemy e = eneryList.get(i);//绘制敌人big.drawImage(e.img, e.x, e.y, e.width, e.height,null);}//画子弹for (int i = 0; i < boomList.size(); i++) {Boom b =boomList.get(i);Color c =big.getColor();big.setColor(Color.red);big.fillOval(b.x+=b.speed, b.y, b.width, b.width);big.setColor(c);}//画人物 玛丽自己big.drawImage(mario.img, mario.x, mario.y, mario.width, mario.height,null);g.drawImage(bi,0,0,null);}//检查子弹是否出界,出界则从容器中移除,不移除的话,内存会泄漏public void checkBoom(){for (int i = 0; i < boomList.size(); i++) {Boom b = boomList.get(i);if(b.x<0 || b.x>800){boomList.remove(i);}}}
}

键盘事件监听

package cn.tx.util;import cn.tx.role.Boom;
import cn.tx.ui.GameFrame;import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;import javax.swing.ImageIcon;//键盘按下监听类
public class KeyListener extends KeyAdapter {// 接收到了当前主界面:游戏界面public GameFrame gf;public KeyListener(GameFrame gf) {this.gf = gf;}//键盘监听@Overridepublic void keyPressed(KeyEvent e) {//code是按下键盘的键对应的值int code = e.getKeyCode();switch (code) {//向右走case 39:gf.mario.right = true; // 信号位break;//向左走case 37:gf.mario.left = true;break;case 66:addBoom();break;//向上跳case 38:gf.mario.up = true;break;}}//添加子弹public void addBoom() {Boom b = new Boom(gf.mario.x, gf.mario.y + 5, 10);if (gf.mario.left) b.speed = -2;if (gf.mario.right) b.speed = 2;gf.boomList.add(b);}//键盘释放监听@Overridepublic void keyReleased(KeyEvent e) {int code = e.getKeyCode();//释放右键if (code == 39) {gf.mario.right = false;gf.mario.img = new ImageIcon("image/mari1.png").getImage();}//释放左键if (code == 37) {gf.mario.left = false;gf.mario.img = new ImageIcon("image/mari_left1.png").getImage();}//释放上键if (code == 38) {gf.mario.up = false;}}
}

主方法和事件绑定

import cn.tx.ui.GameFrame;
import cn.tx.util.KeyListener;
/**超级玛丽启动类。*/
public class Run {//主函数,程序入口public static void main(String[] args) throws Exception {GameFrame gf = new GameFrame();// 创建监听器对象KeyListener kl = new KeyListener(gf);// 给窗体添加键盘监听器gf.addKeyListener(kl);}
}

完整源码和讲解QQ加群:685168267

java版超级玛丽游戏相关推荐

  1. 基于java的超级玛丽游戏系统设计与实现(项目报告+答辩PPT+源代码+部署视频)

    项目报告 基于java的超级玛丽游戏的设计与实现 近年来,Java作为一种新的编程语言,以其简单性.可移植性和平台无关性等优点,得到了广泛地应用.J2SE称为Java标准版或Java标准平台.J2SE ...

  2. Java版SLG游戏 竜退治2

    剣と魔法の世界のターン制シミュレーションゲーム.マップは小規模ながら完成度は高いです. ストーリーは希薄で.ひたすら仲間やアイテムを集めつつ.淡々とステージクリアしていきます.   アイテムの経験値が ...

  3. java写枪战游戏,Java版星球大战游戏(横向射击)

    Java版星球大战游戏(横向射击) 准备逐步整理一下手中的第三方Java游戏代码,将能用的部分融入到LGame里去,没有能用部分的就直接删掉. 但无论程式难易如何,也是原作者一番心血,不应将它们弃如敝 ...

  4. Java版AVG游戏开发入门示例 3 ——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

  5. Java版AVG游戏开发入门示例[3]——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

  6. 基于Java的超级玛丽游戏的设计与实现

    项目介绍 本软件是针对超级玛丽小游戏的JAVA程序,进入游戏后首先按空格键开始,利用方向键来控制的马里奥的移动,同时检测马里奥与场景中的障碍物和敌人的碰撞,并判断马里奥的可移动性和马里奥的生命值.当马 ...

  7. Java版星球大战游戏(横向射击)

    准备逐步整理一下手中的第三方Java游戏代码,将能用的部分融入到LGame里去,没有能用部分的就直接删掉. 但无论程式难易如何,也是原作者一番心血,不应将它们弃如敝履,所以我将一一整理后发布到网上保留 ...

  8. Java版SLG游戏开发入门 1 --关于本系列

    离上次更新博客又过了较长的一段时间,其实也没什么正经事,就是一堆闲事闲人闹的.本来这个系列想写一篇文章加一部分代码,但考虑到近期未必能时常更新,所以准备先把完成的用例发上来,等本系列写完后再统一发源码 ...

  9. JAVA版扫雷游戏,清晰易懂,注释多

    这是一篇关于JAVA的扫雷游戏,所有的图片均用文字代替,代码可直接运行. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.代码部分 1.代码如下 总结 开发环境 开发工具:eclipse202 ...

  10. java实现超级玛丽游戏

    创建窗口 package org.wn.mario; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event. ...

最新文章

  1. 算力超英伟达?华为推出两款“昇腾”芯片;五大AI战略正式公布
  2. Safari、IE浏览器出现允许改写地址栏的漏洞
  3. python web框架互相融合, Pyramid或取代Django
  4. 釜底抽薪:掌控能源成本,根治企业能源损耗
  5. NLP十大数据扩充策略
  6. 华为8c系统语言切换,华为WS331C怎么设置 华为WS331C设置教程(使用方法)-192路由网...
  7. mongo系统(1)
  8. linux如何开发端口,Linux 开发中常见端口号
  9. pytorch写FCN进行手提包的图像分割,有数据集
  10. 学C++的室友手握这个项目,面试稳了
  11. Dlink ?一款交互式FlinkSQL开发平台
  12. 光滑曲线_光滑流形初步(2)——切向量与微分
  13. 多条件查找并计算机,EXCEL 多条件求和、多条件计数、多条件查找
  14. UEFIEDKII Introduction:UEFIEDKII概述[1]
  15. 使用JS将PDF文档转成图片,一页文档对应一张图片,并支持将图片批量导出!
  16. 泡泡龙游戏开发系列教程(五)
  17. IBM Spectrum LSF-手册
  18. 微信小程序记事本+后台管理系统
  19. 【VJudge】【Legilimens Contest 1】
  20. 微信小程序金额输入限制

热门文章

  1. syswow64删除文件_syswow64,教您syswow64是什么文件夹
  2. 用大数据与可视化分析有钱任性的瑞幸咖啡,看它和浑水谁在说谎
  3. 溢出的文字用省略号表示。
  4. 《女生宿舍第二部》(1-46上) 转贴
  5. java如何重命名class_java – 如何重命名XStream列表元素?
  6. (轉貼) 寶蘭開發工具部門將分割成完全獨立的子公司 (C/C++) (News)
  7. Docker 三剑客之 Compose
  8. 苏州科技大学的计算机专业怎么样,苏州科技大学怎么样?有什么王牌专业?排名如何?...
  9. PHP中smart原则,目标smart原则 “smart原则”什么意思?
  10. 常用的各平台 hosts 文件位置