JAVA开发的一个推箱子游戏原型
2016-12-07 22:37
411 查看
自从打通了JAVA的任督二脉之后,想法不断出现,想停下来都不行,逼的只能编程实现。下面是开发一个简单的推箱子游戏。
推箱子游戏很简单,用C大一的学生都做出来,关键要解决的问题有:地图, 元素, 移动。我这里构造一个10*10的地图,元素就人和箱子,移动就是人在地图上的位置。
好了开始编程了,用JAVA编游戏肯定不能是控制台,太不方便了,要用图形编程。我用button做地图最基本元素,button的不同颜色代表不同事物,黑色是墙,白色是空地,人是绿色,箱子是红色。
设计了三个类,一个是元素类(人,箱子),一个地图类,最主要的游戏类(包含地图类,和人,箱子)。
具体如下:元素类
包和运行代码如下:
效果如下图先
,通过键盘a,d,s,w移动后如下图所示
哈哈成功移动,当然了其它的具体逻辑(如通关、不能撞墙等)就不用写了。
不过还有一个问题就是程序启动的时候,地图并没有按我设置的排序,必须按一下才可以恢复。不知道什么原因,不是我暂时学习的重点,先不考虑了,后面再说。
推箱子游戏很简单,用C大一的学生都做出来,关键要解决的问题有:地图, 元素, 移动。我这里构造一个10*10的地图,元素就人和箱子,移动就是人在地图上的位置。
好了开始编程了,用JAVA编游戏肯定不能是控制台,太不方便了,要用图形编程。我用button做地图最基本元素,button的不同颜色代表不同事物,黑色是墙,白色是空地,人是绿色,箱子是红色。
设计了三个类,一个是元素类(人,箱子),一个地图类,最主要的游戏类(包含地图类,和人,箱子)。
具体如下:元素类
class Elem { int loc_x; int loc_y; int role; //1是人,2是箱子 }地图类
class Map{ JButton[][] mapBt; JPanel panel; JFrame frame; Map() { mapBt = new JButton[10][10]; frame = new JFrame("Boxman"); panel = new JPanel(); frame.setSize(600, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 添加面板 frame.add(panel); int i, j; for(i=0; i<10; i++) for(j=0; j<10; j++) mapBt[i][j] = new JButton(); for(i=0; i<10; i++) for(j=0; j<10; j++) { panel.add(mapBt[i][j]); } initmap(); frame.setVisible(true); } //初始化地图就是把外转一圈置黑为墙,内部设置为白 void initmap() { int i, j; for(i=0; i<10; i++) for(j=0; j<10; j++) { mapBt[i][j].setBackground(Color.BLACK); mapBt[i][j].setBounds(20*j, 20*i,20, 20); } for(i=1; i<9; i++) for(j=1; j<9; j++) { mapBt[i][j].setBackground(Color.WHITE); mapBt[i][j].setBounds(20*j, 20*i,20, 20); } } }游戏类
class Boxgame{ Elem man; Elem box; Map gameMap; Boxgame() { //初始化人和箱子及地图 gameMap = new Map(); man = new Elem(); box = new Elem(); man.loc_x = 4; man.loc_y = 2; man.role = 1; box.loc_x = 6; box.loc_y = 3; box.role = 2; } void run() { gameKeyEvent(gameMap); } void setElem(Elem ele) { if(ele.role == 1) gameMap.mapBt[ele.loc_y][ele.loc_x].setBackground(Color.BLUE); //人是蓝色 else if(ele.role == 2) gameMap.mapBt[ele.loc_y][ele.loc_x].setBackground(Color.RED); //箱子是红色 } void move()//人物的移动就是不同颜色到地图上 { setElem(man); setElem(box); } void gameKeyEvent(final Map map) { map.frame.requestFocus(); //响应键盘按键事件 map.frame.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if(key == KeyEvent.VK_A) { man.loc_x = man.loc_x -1; map.initmap(); move(); } if(key == KeyEvent.VK_D) { man.loc_x = man.loc_x + 1; map.initmap(); move(); } if(key == KeyEvent.VK_W) { man.loc_y = man.loc_y -1; map.initmap(); move(); } if(key == KeyEvent.VK_S) { man.loc_y = man.loc_y + 1; map.initmap(); move(); } } }); } }这个类里最难的是事件的窗口事件的监听,不过既然任督二脉打通了就没什么不好理解,只要去找用法就行了。
包和运行代码如下:
package example; import java.awt.Color; import java.awt.KeyboardFocusManager; import java.awt.Window; import java.io.IOException; import java.awt.event.*; import javax.swing.*; public class Example { public static void main(String[] args) { // 创建 game实例 Boxgame game = new Boxgame(); game.run(); } }将上面的代码结合起来就能运行了
效果如下图先
,通过键盘a,d,s,w移动后如下图所示
哈哈成功移动,当然了其它的具体逻辑(如通关、不能撞墙等)就不用写了。
不过还有一个问题就是程序启动的时候,地图并没有按我设置的排序,必须按一下才可以恢复。不知道什么原因,不是我暂时学习的重点,先不考虑了,后面再说。
相关文章推荐
- eclipse git 报 git: 401 Unauthorized 解决办法
- 第8章 Spring Boot的数据访问
- java代码:new 类名(){方法定义}应该如何理解?
- 梁勇2011JAVA语言程序设计基础篇第16章编程题16.11
- java多线程-06-atomic包
- SpringMVC学习笔记(七)
- Java 基础 - 基本 IO
- day06-java-(方法,猜字符小游戏)
- java中字节流与字符流的区别
- Java 基础 - 异常
- java 实现打印输出一个空心菱形
- 使用Eclipse构建Maven的SpringMVC项目
- Java条件表达式结果类型的规则
- java命令
- Java 基础 - 集合
- Quartz 定时器的使用之 XML 配置方式 (二)
- java-三大特性之一继承
- Java XML XXE 底层防御
- java 打印输出一个菱形
- MyEclipse2015在线安装SVN