Java推箱子
开局
这是开始做的时候写的:
2020.5.18
By Mr CanLiu
1.Game.class:
游戏逻辑:角色的位置信息、地图信息等
2.GameJpanel.class
本身是一个大的容器
装入容器列表
//这里可以不使用小容器,但是为了试一试内部类这些用法,强行使用一下
8*8个小容器,每个容器加入图片就绘制出了整个游戏的界面
3.GameFrame.class
是游戏的窗体
可能实现的:
4.一个容器作为计时功能的显现
5.一个容器装载按钮实现选择关卡的功能
注:很多遇到的问题都在写的过程中写下来了,有点随心所欲。。。。。顺序大致是文件实现的顺序
文件结构
Game.java
负责游戏逻辑实现,包括地图(数组)和英雄移动
package allcode;
import java.io.BufferedReader;
import java.io.FileReader;
import javax.swing.JOptionPane;
public class Game {
//公共静态成员列表,据说相当于C语言的宏定义
public static final int wall = 0;//墙
public static final int box = 1;//箱子
public static final int aim = 2;//目的地
public static final int nothing = 3;//空地
public static final int hero = 4;//英雄
public static final int boxonaim = 5;//箱子在目的地//因为有不同的图片表示,所以单独的列出来
//游戏角色位置信息
private int x;
private int y;
/*这里我遭了一个意想不到的
在Java中不会定义数组了,写成了private int map[]
在IDE这里不会报错,运行起来就说是没有初始化这个东西,他也应该是一个对象才对
*/
//游戏生成的初始地图
//0:墙体;1:箱子;2:目的地;3:空地;4:英雄;5:箱子在目的地上;
private int map[][]=new int[8][8];
//游戏的状态地图,表示了展现给用户的样子
//0:墙体;1:箱子;2:目的地;3:空地;4:英雄;5:箱子在目的地上;
public int maptoman[][]=new int[8][8];
//
public int flag;
//作为最大的关卡数量
public final int max=2;
//构造函数,从文件获取当前关卡的初始地图信息
//现在先设置为固定地图;
public Game()
{
flag=1;
get_map();
}
/*public Game(int level) {
this.flag=level;
get_map(flag);
}*/
//重新开始游戏,或者重新设置游戏关卡的函数
public void regame(int level) {
if(level>max) {
JOptionPane.showMessageDialog(null, "暂无该关卡!", "警告",JOptionPane.WARNING_MESSAGE);
this.flag=max;
get_map();
}
else {
this.flag=level;
get_map();
}
}
public void get_map() {
int i=0;
try {
BufferedReader reader=new BufferedReader(new FileReader("res/map/map"+flag+".txt"));
String line=reader.readLine();
while(line!=null) {
String str[]=line.split("");
for(int j=0;j<8;j++) {
map[i][j]=(int)str[j].charAt(0)-48;
maptoman[i][j]=map[i][j];
if(maptoman[i][j]==4) {
//这个位置是英雄
this.x=i;
this.y=j;
}
}
line=reader.readLine();
i++;
}
reader.close();
}catch(Exception e) {
e.printStackTrace();
}
}
public void print()
{
for(int i=0;i<8;i++) {
for(int j=0;j<8;j++) {
System.out.format("%d ",map[i][j]);
}
System.out.println();
}
}
//开始书写逻辑结构的函数
//推箱子游戏就是人物的上下左右移动
//一个角色的移动要考虑两个点:目的点是什么情况,当前的点移开后是什么情况
//向左
//注!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//因为一开始逻辑反了,所以在ToUp函数中注释是向左。。。。。
//但是道理是相同的,我就不改了
public void ToUp()
{
//首先是移动的位置横轴要大于1,才有移动的价值
if(x>=1)
{
//左边当前是空地或者一个目的地,把英雄左移,当前的位置恢复成地图初始化的样子(有问题,地图初始化的样子可能是箱子)
//所以应该是判定初始化的时候是空地还是目的地
if(maptoman[x-1][y]==nothing || maptoman[x-1][y]==aim) {
//处理用户看到的地图
maptoman[x-1][y]=hero;
//判定初始化的时候是不是一个目的地,不然就是变成空地
maptoman[x][y]= (map[x][y]==aim) ? aim : nothing;
//处理英雄坐标
x-=1;
}
//左边是箱子或者在目的地的箱子
else if(maptoman[x-1][y]==box || maptoman[x-1][y]==boxonaim) {
if(x>=2) {
//判断箱子是不是可以推动,其实是保证数组不超界
if(maptoman[x-2][y]==nothing) {
//箱子的左边是空地
//箱子移过去
maptoman[x-2][y]=box;
//英雄移过去
maptoman[x-1][y]=hero;
//判定初始化的时候是不是一个目的地,不然就是变成空地
maptoman[x][y]