您的位置:首页 > 编程语言 > Java开发

JAVA开发的一个推箱子游戏原型

2016-12-07 22:37 411 查看
      自从打通了JAVA的任督二脉之后,想法不断出现,想停下来都不行,逼的只能编程实现。下面是开发一个简单的推箱子游戏。

      推箱子游戏很简单,用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移动后如下图所示


       哈哈成功移动,当然了其它的具体逻辑(如通关、不能撞墙等)就不用写了。

     

     不过还有一个问题就是程序启动的时候,地图并没有按我设置的排序,必须按一下才可以恢复。不知道什么原因,不是我暂时学习的重点,先不考虑了,后面再说。

   


     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: