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]
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值