推箱子游戏

news2025/3/10 14:50:07

java小游戏2

一游戏介绍


二图像准备


墙、箱子、人、箱子目的地,人左边、人右边、人上边、人下边

三结构准备


地图是什么,我们把地图想象成一个网格,每个格子就是工人每次移动的步长,也是箱子移动的距离,设置一个二维数组,对于格子的x,y坐标由二维数组坐标公式 leftx+j*30,lefty+i*30,

定义一些常量,final byte wall=1这个是代表墙,box=2这个是代表箱子,boxend=3是代表放到目的地,mandow=5代表向下的人,manlef向左的人。。。。。

四判断

在玩家通过键盘控制工人推箱子的过程中。需要按照游戏规定进行判断是否响应该按键指示

如果前方是通道或目的地,工人进入p1方格,修改相关位置格子的状态值

地图数据

然后取出数据

地图是记录了人的坐标,就相当于我们每移动一步。需要保存当前游戏状态。也就是保存人的位置和游戏地图的当前状态,所以在撤销移动时,恢复地图也是通过此类获取需要人的位置。地图当前状态和关卡数

下面是游戏代码和解释部分

                                1——这是gamefram.java


public class GameFrame extends JFrame implements ActionListener, MouseListener// 主面板类

创建的类是继承了jframe这个父类,意味的可以使用这个父类的功能如jframe,jpanel.就是swing里面的组件学习。并且实现了actionlister接口,下面是这个接口的注释

您提供的代码是Java的ActionListener接口的官方文档注释和定义。这个接口是Java AWT(Abstract Window Toolkit)事件监听器体系的一部分,用于处理动作事件,如按钮点击或菜单选择等。
以下是ActionListener接口的关键点:
ActionListener 是一个标记接口,意味着它不包含任何方法之外的内容,只是简单地标记实现它的类能够处理动作事件。
该接口继承自 EventListener,这是一个标记接口,表明任何实现它的类都是事件监听器。
接口定义了一个方法 actionPerformed(ActionEvent e),当注册了这个监听器的组件触发了一个动作事件时,这个方法就会被调用。
actionPerformed 方法接收一个 ActionEvent 类型的参数,这个参数包含了关于事件的信息,比如事件源、事件类型以及与事件相关的任何额外信息。
使用 ActionListener 的类必须实现 actionPerformed 方法,以便在事件发生时执行相应的操作。
你可以通过调用组件的 addActionListener 方法来注册一个 ActionListener。
下面是一个简单的例子,展示了如何实现 ActionListener 接口:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ButtonClickListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        // 当按钮被点击时,这里的代码会被执行
        System.out.println("Button was clicked!");
    }
}
在上述代码中,ButtonClickListener 类实现了 ActionListener 接口,并提供了 actionPerformed 方法的实现。当与这个监听器关联的按钮被点击时,控制台会打印出 "Button was clicked!"。

然后是定义一些常规的类属性

private int grade = 0;这个是相当第几关,能上到第几关

// row,column记载人的行号 列号

// leftX,leftY 记载左上角图片的位置 避免图片从(0,0)坐标开始

private int row = 7, column = 7, leftX = 0, leftY = 0;

// 记载地图的行列数

private int mapRow = 0, mapColumn = 0;

// width,height 记载屏幕的大小

private int width = 0, height = 0;

private boolean acceptKey = true;//这个是看到如超过了所进行的关卡,那么开始改变

// 程序所用到的图片

private Image pic[] = null;//存储地图的图片

// 定义一些常量,对应地图的元素

final byte WALL = 1, BOX = 2, BOXONEND = 3, END = 4, MANDOWN = 5,

MANLEFT = 6, MANRIGHT = 7, MANUP = 8, GRASS = 9, MANDOWNONEND = 10,

MANLEFTONEND = 11, MANRIGHTONEND = 12, MANUPONEND = 13;。因为地图是用二维数组表示的,所以用数字填充,占据位置

private byte[][] map = null;

private ArrayList list = new ArrayList();。这里是用来存储地图的状态,如撤销,重新进行下一关

Sound sound;,声音模块

下面是类中的方法

public void getManPosition() {

for (int i = 0; i < map.length; i++)

for (int j = 0; j < map[0].length; j++)

if (map[i][j] == MANDOWN || map[i][j] == MANDOWNONEND

|| map[i][j] == MANUP || map[i][j] == MANUPONEND

|| map[i][j] == MANLEFT || map[i][j] == MANLEFTONEND

|| map[i][j] == MANRIGHT || map[i][j] == MANRIGHTONEND) {

row = i;

column = j;

break;

}

}

getmanposition,这个是为了获得人的位置,这里相当于是

[[1,1,1,1,1,1]

[ 1,1,1,1,1,1],

[1,1,1,1,1,1]

这样的行列结构。第一次是有多少行,第二次多少列。判断一下mandown,manup的位置在地图的哪个方向

将地图的那个位置标记为找到玩家后

row = i;

column = j;然后break

信息框提示

public void DisplayToast(String str) {

JOptionPane.showMessageDialog(null, str, "提示",

JOptionPane.ERROR_MESSAGE);

}

撤销移动的undo.java

public void undo() {

if (acceptKey) {

// 撤销

if (list.size() > 0) {

// 若要撤销 必须走过

Map priorMap = (Map) list.get(list.size() - 1);

map = priorMap.getMap();

row = priorMap.getManX();

column = priorMap.getManY();

repaint();

list.remove(list.size() - 1);

} else

DisplayToast("不能再撤销!");

} else {

DisplayToast("此关已完成,不能撤销!");

}

}

这里有个accepkey.如果通过了所有关卡,那么就没必要撤销了

然后如果listsize大于0,这个时候必须要走了一步或几步的样子,才能实现undo

然后定义一个map环境的promap对象,
Map priorMap = (Map) list.get(list.size() - 1);
  1. list.get(list.size() - 1): 这行代码从 list 中获取最后一个元素。list 是一个列表,它存储了游戏状态的快照,每次玩家移动时,当前的游戏状态都会被添加到这个列表的末尾。list.size() - 1 计算出列表的最后一个元素的索引。

  2. (Map): 这是一个类型转换操作,它将 list.get(list.size() - 1) 返回的对象强制转换为 Map 类型。这里假设 list 是一个 List,它存储了 Map 类型的对象,每个对象代表游戏在某个特定时刻的状态。

  3. priorMap: 这是一个局部变量,用于存储从列表中获取的最后一个地图状态。现在 priorMap 包含了游戏在最后一次移动之前的状态,包括玩家的位置、箱子的位置以及地图的其他元素。

所以list相当于是存储走的,然后获取走的最后一步

                2下面这个是map类


public class Map {
	int manX=0;
	int manY=0;
	byte map[][];
	int grade;
	
	// 此构造方法用于撤销操作
	//撤销操作只需要人的位置和地图的当前状态(人的位置也可以不要,为了方便而加入)
	public Map(int manX,int manY,byte [][]map)
	{
		this.manX=manX;
		this.manY=manY;
		int row=map.length;
		int column=map[0].length;
		byte temp[][]=new byte[row][column];
		for(int i=0;i<row;i++)
			for(int j=0;j<column;j++)
				temp[i][j]=map[i][j];
		this.map=temp;
	}
	
	// 此构造方法用于保存操作
	//恢复地图时需要人的位置,地图当前状态,关卡数(关卡切换时此为基数)
	public Map(int manX,int manY,byte [][]map,int grade)
	{
		this(manX,manY,map);
		this.grade=grade;
	}
	
	public int getManX() {
		return manX;
	}
	public int getManY() {
		return manY;
	}
	public byte[][] getMap() {
		return map;
	}
	
	public int getGrade() {
		return grade;
	}
	
}

    所以我们可以看到用了

public Map(int manX,int manY,byte [][]map)

{

this.manX=manX;

this.manY=manY;

int row=map.length;

int column=map[0].length;

byte temp[][]=new byte[row][column];

for(int i=0;i<row;i++)

for(int j=0;j<column;j++)

temp[i][j]=map[i][j];

this.map=temp;

}这里会复制一个真正的map类相当于记录map类的状态

这里的构造方法,并将list类型赋值为了map类,将map,column,row都设置好了后。用

repaint();重新绘制

nextgrade方法,java

public void nextGrade() {

// grade++;

if (grade >= MapFactory.getCount() - 1) {

DisplayToast("恭喜你完成所有关卡!");

acceptKey = false;

} else {

grade++;

initMap();

repaint();

acceptKey = true;

}

}

这里如果关卡没通过,然后递增grade++,后面是调用方法intmap()

intmap方法

public void initMap() {

map = getMap(grade);

list.clear();

getMapSizeAndPosition();

getManPosition();

// Map currMap=new Map(row, column, map);

// list.add(currMap);

}

这里有个getmap(gtade)就是找到下一关。

其中getmap方法是

public byte[][] getMap(int grade) {

return MapFactory.getMap(grade);

}

mapfactory.getmap方法是放在mapfactory里面

public static byte[][] getMap(int grade)

{ byte temp[][];//一个缓存区

if(grade>=0 && grade<count)

temp=map[grade];

else

temp=map[0];

int row=temp.length;

int column=temp[0].length;//这个第一关的长度,

byte[][] result=new byte[row][column];

for(int i=0;i<row;i++)

for(int j=0;j<column;j++)

result[i][j]=temp[i][j];

return result;

}

选择这里面的存储的关卡

priorgrade.java

public void priorGrade() {

grade--;

acceptKey = true;

if (grade < 0)

grade = 0;

initMap();

repaint();

}

这个是退回前面一关,这里也是grade--,然后初始化,然后重绘

下面是构造器gamframe.java

public GameFrame() {

super("推箱子游戏带音乐版");

setSize(600, 600);

setVisible(true);

setResizable(false);

setLocation(300, 20);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Container cont = getContentPane();

cont.setLayout(null);

cont.setBackground(Color.black);

// 最初始13张图片

getPic();

width = this.getWidth();

height = this.getHeight();

this.setFocusable(true);

initMap();

// 构造方法执行时从优先数据中恢复游戏

// 关卡切换时调用initMap()

// resumeGame();

this.addKeyListener(this);

this.addMouseListener(this);

sound = new Sound();

sound.loadSound();

}

//其中getpic方法是获得

public void getPic() {

pic = new Image[14];

for (int i = 0; i <= 13; i++) {

pic[i] = Toolkit.getDefaultToolkit().getImage(

"images\\pic" + i + ".JPG");

}

}加载一下pic列表

然后initmap初始化地图数据

为其增加监听方法。并且加载声音类

this.addKeyListener(this);

this.addMouseListener(this);

sound = new Sound();

sound.loadSound();

后面是获取地图的位置,这是为了让地图在窗口居中显示

然后是grassorend方法

public byte grassOrEnd(byte man) {

byte result = GRASS;

if (man == MANDOWNONEND || man == MANLEFTONEND || man == MANRIGHTONEND

|| man == MANUPONEND)

result = END;

return result;

}

这个实在移动时候来判断人向左,向右,向前走的时候将

人刚才站的地方变成 grassOrEnd(map[row][column])

map[row][column] = grassOrEnd(map[row][column]);

人在站是时侯会替换掉

人刚才站的地方变成 grassOrEnd(map[row][column])

map[row][column] = grassOrEnd(map[row][column]);

就是相当于是  人 p1 p2,这里人移动到了p1那么原先占据的位置变成了通道,p1就变成了人

下面是重要的方法

move.方法

private void moveUp() {
		// 上一位p1为WALL
		if (map[row - 1][column] == WALL)
			return;
		// 上一位p1为 BOX,BOXONEND,须考虑P2
		if (map[row - 1][column] == BOX || map[row - 1][column] == BOXONEND) {
			// 上上一位p2为 END,GRASS则向上一步,其他不用处理
			if (map[row - 2][column] == END || map[row - 2][column] == GRASS) {
				Map currMap = new Map(row, column, map);
				list.add(currMap);
				byte boxTemp = map[row - 2][column] == END ? BOXONEND : BOX;
				byte manTemp = map[row - 1][column] == BOX ? MANUP : MANUPONEND;
				// 箱子变成temp,箱子往前一步
				map[row - 2][column] = boxTemp;
				// 人变成MANUP,往上走一步
				map[row - 1][column] = manTemp;
				// 人刚才站的地方变成GRASS或者END
				map[row][column] = grassOrEnd(map[row][column]);
				// 人离开后修改人的坐标
				row--;
			}
		} else {
			// 上一位为 GRASS,END,不须考虑P2。其他情况不用处理
			if (map[row - 1][column] == GRASS || map[row - 1][column] == END) {
				Map currMap = new Map(row, column, map);
				list.add(currMap);
				byte temp = map[row - 1][column] == END ? MANUPONEND : MANUP;
				// 人变成temp,人往上走一步
				map[row - 1][column] = temp;
				// 人刚才站的地方变成GRASS或者END
				map[row][column] = grassOrEnd(map[row][column]);
				// 人离开后修改人的坐标
				row--;
			}
		}
	}

请注意,这里我们是moveup向上走的,那么这个时候我们的原先的位置就属于下面,如

[1,1,1,1,1,1,1,1,]

[1,1,1,1,1,1,1,1,]

若玩家在2,2位置的话,向上判断1,2是不是墙。

后面是如果是box或者是boxend。这个时候直接弄完了

if (map[row - 1][column] == BOX || map[row - 1][column] == BOXONEND) {
			// 上上一位p2为 END,GRASS则向上一步,其他不用处理
			if (map[row - 2][column] == END || map[row - 2][column] == GRASS) {
				Map currMap = new Map(row, column, map);
				list.add(currMap);
				byte boxTemp = map[row - 2][column] == END ? BOXONEND : BOX;
				byte manTemp = map[row - 1][column] == BOX ? MANUP : MANUPONEND;
				// 箱子变成temp,箱子往前一步
				map[row - 2][column] = boxTemp;
				// 人变成MANUP,往上走一步
				map[row - 1][column] = manTemp;
				// 人刚才站的地方变成GRASS或者END
				map[row][column] = grassOrEnd(map[row][column]);
				// 人离开后修改人的坐标
				row--;
			}
		}

map,

Map currMap = new Map(row, column, map); list.add(currMap);这里

这行代码创建了一个新的地图对象 currMap,它保存了当前玩家的位置和地图状态。这是为了实现悔棋功能,允许玩家撤销到之前的状态。

这里为了

byte boxTemp = map[row - 2][column] == END ? BOXONEND : BOX;

byte manTemp = map[row - 1][column] == BOX ? MANUP : MANUPONEND;

// 箱子变成temp,箱子往前一步

map[row - 2][column] = boxTemp;

// 人变成MANUP,往上走一步

map[row - 1][column] = manTemp;

// 人刚才站的地方变成GRASS或者END

map[row][column] = grassOrEnd(map[row][column]);

// 人离开后修改人的坐标

row--;

这段代码是为了实现推箱子游戏中玩家推动箱子的逻辑。具体来说,它执行以下步骤:
确定箱子移动后的状态:
byte boxTemp = map[row - 2][column] == END ? BOXONEND : BOX;
如果箱子移动后的位置是目的地(END),则箱子状态更新为 BOXONEND。
如果箱子移动后的位置是空地(GRASS),则箱子状态保持为 BOX。
确定玩家移动后的状态:
byte manTemp = map[row - 1][column] == BOX ? MANUP : MANUPONEND;
如果玩家原本站在箱子上,则玩家移动后的状态更新为 MANUP(表示玩家现在站在空地上)。
如果玩家原本不在箱子上,则玩家移动后的状态更新为 MANUPONEND(表示玩家现在站在目的地)。
更新地图状态以反映箱子的移动:
map[row - 2][column] = boxTemp;
将箱子移动到新位置,并更新该位置的状态。
更新地图状态以反映玩家的移动:
map[row - 1][column] = manTemp;
将玩家移动到新位置,并更新该位置的状态。
更新玩家原来站立的位置:
map[row][column] = grassOrEnd(map[row][column]);
调用 grassOrEnd 方法来决定玩家离开后,原来位置的状态。如果该位置原来是目的地(END),则保持不变;否则,更新为空地(GRASS)。
修改玩家的坐标以反映其移动:
row--;
将玩家的行坐标减一,表示玩家向上移动了一步。
整体来看,这段代码实现了以下功能:
玩家推动箱子向上移动一步。
箱子移动到新位置,并更新其状态。
玩家跟随箱子向上移动一步,并更新其状态。
玩家原来的位置根据 grassOrEnd 方法的返回值更新状态。
更新玩家的位置坐标。
这是推箱子游戏中处理玩家推动箱子动作的标准逻辑。
  • 玩家推动箱子的情况:玩家和箱子都需要移动,且箱子的新位置必须是END或GRASS。
  • 玩家单独移动的情况:玩家移动到的位置必须是END或GRASS,而不涉及箱子。。分两种情况了 ,推了箱子和自己走

再来解释一下map类


public class Map {

int manX=0;

int manY=0;

byte map[][];

int grade;

// 此构造方法用于撤销操作

//撤销操作只需要人的位置和地图的当前状态(人的位置也可以不要,为了方便而加入)

public Map(int manX,int manY,byte [][]map)

{

this.manX=manX;

this.manY=manY;

int row=map.length;

int column=map[0].length;

byte temp[][]=new byte[row][column];

for(int i=0;i<row;i++)

for(int j=0;j<column;j++)

temp[i][j]=map[i][j];

this.map=temp;

}

// 此构造方法用于保存操作

//恢复地图时需要人的位置,地图当前状态,关卡数(关卡切换时此为基数)

public Map(int manX,int manY,byte [][]map,int grade)

{

this(manX,manY,map);

this.grade=grade;

}

public int getManX() {

return manX;

}

public int getManY() {

return manY;

}

public byte[][] getMap() {

return map;

}

public int getGrade() {

return grade;

}

}

在mapfactory里面

import java.io.InputStream;

public class MapFactory {
	 static byte map[][][]={
			{
			{ 0, 0, 1, 1, 1, 0, 0, 0 },
			{ 0, 0, 1, 4, 1, 0, 0, 0 },
			{ 0, 0, 1, 9, 1, 1, 1, 1 },
			{ 1, 1, 1, 2, 9, 2, 4, 1 },
			{ 1, 4, 9, 2, 5, 1, 1, 1 },
			{ 1, 1, 1, 1, 2, 1, 0, 0 },
			{ 0, 0, 0, 1, 4, 1, 0, 0 },
			{ 0, 0, 0, 1, 1, 1, 0, 0 }
			},
			{
			{ 1, 1, 1, 1, 1, 0, 0, 0, 0 },
			{ 1, 9, 9, 5, 1, 0, 0, 0, 0 },
			{ 1, 9, 2, 2, 1, 0, 1, 1, 1 },
			{ 1, 9, 2, 9, 1, 0, 1, 4, 1 },
			{ 1, 1, 1, 9, 1, 1, 1, 4, 1 },
			{ 0, 1, 1, 9, 9, 9, 9, 4, 1 },
			{ 0, 1, 9, 9, 9, 1, 9, 9, 1 },
			{ 0, 1, 9, 9, 9, 1, 1, 1, 1 },
			{ 0, 1, 1, 1, 1, 1, 0, 0, 0 }
			},
			{
			{ 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
			{ 0, 1, 9, 9, 9, 9, 9, 1, 1, 1 },
			{ 1, 1, 2, 1, 1, 1, 9, 9, 9, 1 },
			{ 1, 5, 9, 9, 2, 9, 9, 2, 9, 1 },
			{ 1, 9, 4, 4, 1, 9, 2, 9, 1, 1 },
			{ 1, 1, 4, 4, 1, 9, 9, 9, 1, 0 },
			{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }
			},
			{
			{ 0, 1, 1, 1, 1, 0 },
			{ 1, 1, 9, 9, 1, 0 },
			{ 1, 9, 5, 2, 1, 0 },
			{ 1, 1, 2, 9, 1, 1 },
			{ 1, 1, 9, 2, 9, 1 },
			{ 1, 4, 2, 9, 9, 1 },
			{ 1, 4, 4, 3, 4, 1 },
			{ 1, 1, 1, 1, 1, 1 }
			},
			{
			{ 0, 1, 1, 1, 1, 0, 0, 0 },
			{ 0, 1, 5, 9, 1, 1, 1, 0 },
			{ 0, 1, 9, 2, 9, 9, 1, 0 },
			{ 1, 1, 1, 9, 1, 9, 1, 1 },
			{ 1, 4, 1, 9, 1, 9, 9, 1 },
			{ 1, 4, 2, 9, 9, 1, 9, 1 },
			{ 1, 4, 9, 9, 9, 2, 9, 1 },
			{ 1, 1, 1, 1, 1, 1, 1, 1 }
			},
		{
			{ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },
			{ 0, 0, 1, 1, 9, 9, 1, 9, 5, 1 },
			{ 0, 0, 1, 9, 9, 9, 1, 9, 9, 1 },
			{ 0, 0, 1, 2, 9, 2, 9, 2, 9, 1 },
			{ 0, 0, 1, 9, 2, 1, 1, 9, 9, 1 },
			{ 1, 1, 1, 9, 2, 9, 1, 9, 1, 1 },
			{ 1, 4, 4, 4, 4, 4, 9, 9, 1, 0 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }
			},
		{
			{ 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 },
			{ 0, 1, 1, 1, 9, 9, 9, 9, 1, 0 },
			{ 1, 1, 4, 9, 2, 1, 1, 9, 1, 1 },
			{ 1, 4, 4, 2, 9, 2, 9, 9, 5, 1 },
			{ 1, 4, 4, 9, 2, 9, 2, 9, 1, 1 },
			{ 1, 1, 1, 1, 1, 1, 9, 9, 1, 0 },
			{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0 }
			},
		{
			{ 0, 0, 1, 1, 1, 1, 1, 1 },
			{ 0, 0, 1, 9, 9, 9, 9, 1 },
			{ 1, 1, 1, 2, 2, 2, 9, 1 },
			{ 1, 5, 9, 2, 4, 4, 9, 1 },
			{ 1, 9, 2, 4, 4, 4, 1, 1 },
			{ 1, 1, 1, 1, 9, 9, 1, 0 },
			{ 0, 0, 0, 1, 1, 1, 1, 0 }
			},
		{
			{ 0, 0, 1, 1, 1, 1, 1, 0 },
			{ 1, 1, 1, 9, 9, 9, 1, 0 },
			{ 1, 9, 9, 2, 4, 9, 1, 1 },
			{ 1, 9, 9, 4, 2, 4, 5, 1 },
			{ 1, 1, 1, 9, 3, 2, 9, 1 },
			{ 0, 0, 1, 9, 9, 9, 1, 1 },
			{ 0, 0, 1, 1, 1, 1, 1, 0 }
			},
		{
			{ 0, 0, 1, 1, 1, 1, 0, 0 },
			{ 0, 0, 1, 4, 4, 1, 0, 0 },
			{ 0, 1, 1, 9, 4, 1, 1, 0 },
			{ 0, 1, 9, 9, 2, 4, 1, 0 },
			{ 1, 1, 9, 2, 9, 9, 1, 1 },
			{ 1, 9, 9, 1, 2, 2, 9, 1 },
			{ 1, 9, 9, 5, 9, 9, 9, 1 },
			{ 1, 1, 1, 1, 1, 1, 1, 1 }
			},
		{
			{ 1, 1, 1, 1, 1, 1, 1, 1 },
			{ 1, 9, 9, 1, 9, 9, 9, 1 },
			{ 1, 9, 2, 4, 4, 2, 9, 1 },
			{ 1, 5, 2, 4, 3, 9, 1, 1 },
			{ 1, 9, 2, 4, 4, 2, 9, 1 },
			{ 1, 9, 9, 1, 9, 9, 9, 1 },
			{ 1, 1, 1, 1, 1, 1, 1, 1 }
			},
		{
			{ 0, 0, 1, 1, 1, 1, 1, 1, 0, 0 },
			{ 0, 0, 1, 9, 9, 9, 9, 1, 1, 1 },
			{ 0, 0, 1, 9, 2, 9, 9, 9, 9, 1 },
			{ 1, 1, 1, 9, 2, 9, 1, 1, 9, 1 },
			{ 1, 4, 4, 4, 9, 2, 9, 9, 9, 1 },
			{ 1, 4, 4, 4, 2, 1, 2, 9, 1, 1 },
			{ 1, 1, 1, 1, 9, 1, 9, 2, 9, 1 },
			{ 0, 0, 0, 1, 9, 9, 5, 9, 9, 1 },
			{ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }
			},
		{
			{ 1, 1, 1, 1, 1, 1, 0, 0, 0 },
			{ 1, 9, 9, 5, 9, 1, 0, 0, 0 },
			{ 1, 9, 2, 2, 2, 1, 1, 0, 0 },
			{ 1, 9, 9, 1, 4, 4, 1, 1, 1 },
			{ 1, 1, 9, 9, 4, 4, 2, 9, 1 },
			{ 0, 1, 9, 9, 9, 9, 9, 9, 1 },
			{ 0, 1, 1, 1, 1, 1, 1, 1, 1 }
			},
		{
			{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 },
			{ 0, 0, 1, 9, 9, 9, 1, 4, 9, 1 },
			{ 0, 1, 1, 9, 9, 2, 4, 4, 4, 1 },
			{ 0, 1, 9, 9, 2, 9, 1, 3, 4, 1 },
			{ 1, 1, 9, 1, 1, 2, 1, 9, 1, 1 },
			{ 1, 9, 9, 9, 2, 9, 9, 2, 9, 1 },
			{ 1, 9, 9, 9, 1, 9, 9, 9, 9, 1 },
			{ 1, 1, 1, 1, 1, 1, 1, 5, 9, 1 },
			{ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 }
			},
		{
			{ 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
			{ 0, 1, 4, 4, 4, 4, 9, 1, 0, 0 },
			{ 1, 1, 1, 4, 4, 4, 2, 1, 1, 1 },
			{ 1, 9, 9, 2, 1, 2, 9, 2, 9, 1 },
			{ 1, 9, 2, 2, 9, 9, 1, 2, 9, 1 },
			{ 1, 9, 9, 9, 9, 1, 9, 9, 9, 1 },
			{ 1, 1, 1, 1, 5, 9, 9, 1, 1, 1 },
			{ 0, 0, 0, 1, 1, 1, 1, 1, 0, 0 }
			},
		{
			{ 1, 1, 1, 1, 1, 1, 1 },
			{ 1, 4, 4, 2, 4, 4, 1 },
			{ 1, 4, 4, 1, 4, 4, 1 },
			{ 1, 9, 2, 2, 2, 9, 1 },
			{ 1, 9, 9, 2, 9, 9, 1 },
			{ 1, 9, 2, 2, 2, 9, 1 },
			{ 1, 9, 9, 1, 8, 9, 1 },
			{ 1, 1, 1, 1, 1, 1, 1 }
			},
			{
			{ 0, 1, 1, 1, 1, 1, 0, 0 },
			{ 0, 1, 9, 5, 9, 1, 1, 1 },
			{ 1, 1, 9, 1, 2, 9, 9, 1 },
			{ 1, 9, 3, 4, 9, 4, 9, 1 },
			{ 1, 9, 9, 2, 2, 9, 1, 1 },
			{ 1, 1, 1, 9, 1, 4, 1, 0 },
			{ 0, 0, 1, 9, 9, 9, 1, 0 },
			{ 0, 0, 1, 1, 1, 1, 1, 0 }
			},
			{
			{ 1, 1, 1, 1, 1, 1 },
			{ 1, 9, 9, 9, 9, 1 },
			{ 1, 9, 2, 9, 9, 1 },
			{ 1, 1, 3, 9, 5, 1 },
			{ 1, 9, 3, 9, 1, 1 },
			{ 1, 9, 3, 9, 1, 0 },
			{ 1, 9, 3, 9, 1, 0 },
			{ 1, 9, 4, 9, 1, 0 },
			{ 1, 1, 1, 1, 1, 0 }
			},
			{
			{ 0, 0, 1, 1, 1, 1, 0 },
			{ 0, 0, 1, 9, 9, 1, 0 },
			{ 1, 1, 1, 2, 9, 1, 1 },
			{ 1, 9, 9, 3, 9, 9, 1 },
			{ 1, 9, 9, 3, 9, 9, 1 },
			{ 1, 9, 9, 3, 9, 1, 1 },
			{ 1, 1, 1, 3, 9, 1, 0 },
			{ 0, 0, 1, 4, 1, 1, 0 },
			{ 0, 0, 1, 1, 1, 0, 0 }
			},
			{
			{ 1, 1, 1, 1, 1, 0, 0, 0, 0 },
			{ 1, 9, 9, 9, 1, 1, 1, 1, 1 },
			{ 1, 9, 1, 9, 1, 9, 9, 9, 1 },
			{ 1, 9, 2, 9, 9, 9, 2, 9, 1 },
			{ 1, 4, 4, 1, 2, 1, 2, 1, 1 },
			{ 1, 4, 5, 2, 9, 9, 9, 1, 0 },
			{ 1, 4, 4, 9, 9, 1, 1, 1, 0 },
			{ 1, 1, 1, 1, 1, 1, 0, 0, 0 }
			}
			
		
	};
	
	static int count=map.length;//判断有几个地图
	
	/*public static byte[][] getMap(int grade)
	{
		if(grade>=0 && grade<count-1)
			return map[grade].clone();
		return map[0].clone();
	}*/

	public static byte[][] getMap(int grade)
	{	byte temp[][];//一个缓存区
		if(grade>=0 && grade<count)
			temp=map[grade];
		else
			temp=map[0];
		int row=temp.length;
		int column=temp[0].length;//这个第一关的长度,
		byte[][] result=new byte[row][column];
		for(int i=0;i<row;i++)
			for(int j=0;j<column;j++)
				result[i][j]=temp[i][j];
		return result;
	}
	
	public static int getCount()
	{
		return count;
	}
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Uniapp-Vue3】动态设置页面导航条的样式

1. 动态修改导航条标题 uni.setNavigationBarTitle({ title:"标题名称" }) 点击修改以后顶部导航栏的标题会从“主页”变为“动态标题” 2. 动态修改导航条颜色 uni.setNavigationBarColor({ backgroundColor:"颜色" }) 3. 动态添加导航加载动画 // 添加加…

pytest执行报错:found no collectors

今天在尝试使用pytest运行用例的时候出现报错&#xff1a;found no collectors&#xff1b;从两个方向进行排查&#xff0c;一是看文件名和函数名是不是符合规范&#xff0c;命名要是"test_*"格式&#xff1b;二是是否存在修改文件名的情况&#xff0c;如果修改过文件…

QT6 + CMAKE编译OPENCV3.9

参考文档 [1] https://blog.csdn.net/rjkf_css/article/details/135676077 前提条件 配置好相关运行环境&#xff1a;QT6、OPENCV3.9的sources文件 OPENCV下载网页&#xff1a;https://opencv.org/releases/ QT6下载教程&#xff1a;https://blog.csdn.net/caoshangpa/article…

pycharm踩坑(1)

由于我重装系统&#xff0c;导致我的pycharm需要进行重装&#xff0c;因此我觉得需要记录一下&#xff0c;pycharm的正确使用方法 汉化 汉化很重要&#xff0c;除非你从小就双语教学&#xff0c;不然你看着那些英文就是会消耗大量的精力 我使用的pycharm版本是pycharm-commun…

24_游戏启动逻辑梳理总结

首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…

Datawhale组队学习笔记task2——leetcode面试题

文章目录 写在前面Day5题目1.0112.路径总和解答2.0113路径总和II解答3.0101.对称二叉树解答 Day6题目1.0124.二叉树中的最大路径和解答2.0199.二叉树的右视图解答3.0226.翻转二叉树解答 Day7题目1.0105.从前序与中序遍历序列构造二叉树解答2.0098.验证二叉搜索树解答3.0110.平衡…

2024年博客之星主题创作|2024年蓝桥杯与数学建模年度总结与心得

引言 2024年&#xff0c;我在蓝桥杯编程竞赛和数学建模竞赛中投入了大量时间和精力&#xff0c;这两项活动不仅加深了我对算法、数据结构、数学建模方法的理解&#xff0c;还提升了我的解决实际问题的能力。从蓝桥杯的算法挑战到数学建模的复杂应用&#xff0c;我在这些竞赛中…

【前端】CSS实战之音乐播放器

目录 播放器背景旋转音乐封面按钮进度条音量调节音乐信息按钮的效果JavaScript部分播放和暂停音乐切换音乐信息进度条 音量调节避免拖拽时的杂音音量调节条静音和解除静音 自动下一首实现一个小效果最终效果 播放器背景 <div class"play_box"></div>设置…

VS C++ 配置OPENCV环境

VS C 配置OPENCV环境 1.下载opencv2.安装环境3.opencv环境4.VS配置opencv环境5.EXE执行文件路径的环境lib和dll需要根据是debug还是release环境来区分使用哪个 6.Windows环境 1.下载opencv 链接: link 2.安装环境 双击运行即可 3.opencv环境 include文件路径:opencv\build\…

Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 我们每天都在与各种智能设备打交道&#xff0c;从手机到电脑&#xff0c;再到各种外设&#xff0c;它们已经…

计算机网络 (54)系统安全:防火墙与入侵检测

前言 计算机网络系统安全是确保网络通信和数据不受未经授权访问、泄露、破坏或篡改的关键。防火墙和入侵检测系统&#xff08;IDS&#xff09;是维护网络系统安全的两大核心组件。 一、防火墙 定义与功能 防火墙是一种用来加强网络之间访问控制的特殊网络互联设备&#xff0c;它…

利用 SAM2 模型探测卫星图像中的农田边界

将 Segment Anything Model Version 2 应用于卫星图像以检测和导出农业地区田地边界的分步教程 &#x1f31f; 简介 手动绘制田地边界是最耗时的任务之一&#xff0c;其准确性取决于绘制者的表现。然而&#xff0c;精确的边界检测在很多领域都有应用。例如&#xff0c;假设您…

高效沟通驱动LabVIEW项目成功

在LabVIEW项目开发中&#xff0c;由于涉及软件、硬件及多方协作&#xff0c;项目沟通效率的高低直接影响开发进度与最终质量。不明确的需求、信息传递中的误解以及跨部门协作的阻碍&#xff0c;常导致项目延误甚至失败。因此&#xff0c;建立高效的沟通机制&#xff0c;确保信息…

CCF开源发展委员会开源供应链安全工作组2025年第1期技术研讨会顺利举行

点击蓝字 关注我们 CCF Opensource Development Committee 2025年1月17日&#xff0c;CCF开源发展委员会供应链安全工作组&#xff08;CCF-ODC-OSS&#xff09;2025年第一期技术研讨会——“大模型时代的开源供应链安全风控技术”于北京黄大年茶思屋顺利举行。本次研讨会邀请了…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

基于ESP32-IDF驱动GPIO输出控制LED

基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…

电商网站项目代码

SCHUTZ鞋类电商网站&#xff1a;用代码打造时尚王国 ——零基础也能看懂的现代网页设计揭秘 开篇&#xff1a;当高跟鞋遇见代码 想象你走进一家奢侈品鞋店——灯光优雅&#xff0c;商品陈列如艺术品&#xff0c;轻轻一点就能试穿最新款凉鞋。这不是米兰的实体店&#xff0c;而…

Jenkins上生成的allure report打不开怎么处理

目录 问题背景&#xff1a; 原因&#xff1a; 解决方案&#xff1a; Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx&#xff1a; 通过合理调整CSP配置&a…

3个基于.Net开发的、开源远程管理工具

盘点3个基于.Net开发的、开源Windows远程管理工具。 1、Quasar 这是一个基于 C#开发的、开源的快速、轻量级远程管理工具&#xff0c;是一个高稳定性和易于使用的的远程管理工具。它支持TCP协议&#xff0c;适用于IPv4和IPv6&#xff0c;加密通信保护隐私。功能丰富&#xff…

游戏AI,让AI 玩游戏有什么作用?

让 AI 玩游戏这件事远比我们想象的要早得多。追溯到 1948 年&#xff0c;图灵和同事钱伯恩共同设计了国际象棋程序 Turochamp。之所以设计这么个程序&#xff0c;图灵是想说明&#xff0c;机器理论上能模拟人脑能做的任何事情&#xff0c;包括下棋这样复杂的智力活动。 可惜的是…