java实现推箱子游戏课程设计,推箱子java项目报告
这是完整的代码:
公共枚举游戏状态{
玩,
已完成
}
公共类映射{
私有最终int[][] 数据。
私有int 玩家X;
私有int 玩家Y;
公共地图(int [] []数据){
this.data=数据;
for (int i=0; i getHeight(); i++) {
for (int j=0; j getWidth(); j++) {
如果(isPlayer(j,i)){
玩家X=j;
玩家Y=i;
}
}
}
}
公共int getWidth() {
返回数据[0].长度;
}
公共int getHeight() {
返回数据的长度。
}
公共布尔isPlayer(int x, int y) {
返回数据[y][x]==Game.PLAYER;
}
公共布尔isBox(int x, int y) {
返回数据[y][x]==Game.BOX || 数据[y][x]==Game.BOX_ON_GOAL;
}
公共布尔isWall(int x, int y) {
返回数据[y][x]==Game.WALL;
}
公共布尔isGoal(int x, int y) {
返回数据[y][x]==Game.GOAL || 数据[y][x]==Game.BOX_ON_GOAL;
}
公共布尔移动(int dx,int dy){
int newX=玩家X + dx;
int newY=玩家Y + dy;
int newBoxX=newX + dx;
int newBoxY=newY + dy;
if (isBox(newX, newY)) {
if (isWall(newBoxX, newBoxY) || isBox(newBoxX, newBoxY)) {
返回假。
}
数据[newBoxY][newBoxX]=数据[newY][newX]==Game.BOX Game.BOX : Game.BOX_ON_GOAL;
}
data[玩家Y][玩家X]=isGoal(玩家X, 玩家Y) Game.GOAL : Game.SPACE;
玩家X=新X;
玩家Y=新Y;
data[玩家Y][玩家X]=isGoal(玩家X, 玩家Y) Game.PLAYER_ON_GOAL : Game.PLAYER;
返回真。
}
公共int getPlayerX() {
返回玩家X。
}
公共int getPlayerY() {
返回玩家Y。
}
公共布尔isCompleted() {
for (int i=0; i getHeight(); i++) {
for (int j=0; j getWidth(); j++) {
if (isBox(j, i) !isGoal(j, i)) {
返回假。
}
}
}
返回真。
}
}
公开课游戏{
公共静态最终整数WALL=1;
公共静态最终整数SPACE=0;
公共静态最终整数PLAYER=2;
公共静态最终整数框=3;
公共静态最终int 目标=4;
公共静态最终int PLAYER_ON_GOAL=5;
公共静态最终整数BOX_ON_GOAL=6;
私人最终地图地图。
私有GameState 游戏状态;
公共游戏(int [] []数据){
地图=新地图(数据);
游戏状态=游戏状态. 正在玩;
}
公共无效移动(int dx,int dy){
if (map.move(dx, dy)) {
if (map.isCompleted()) {
游戏状态=游戏状态.COMPLETED;
否则{gameState=GameState.PLAYING;
}
}
}
公共int[][] getData() {
int[][] data=new int[map.getHeight()][map.getWidth()];
for (int i=0; i map.getHeight(); i++) {
for (int j=0; j map.getWidth(); j++) {
if (map.isWall(j, i)) {
数据[i][j]=墙;
否则if (map.isGoal(j, i)) {
if (map.isPlayer(j, i)) {
数据[i][j]=PLAYER_ON_GOAL;
否则if (map.isBox(j, i)) {
数据[i][j]=box_on_goal;
} 除此之外{
数据[i][j]=目标;
}
否则if (map.isPlayer(j, i)) {
数据[i][j]=玩家;
否则if (map.isBox(j, i)) {
数据[i][j]=框;
} 除此之外{
数据[i][j]=空间;
}
}
}
返回数据。
}
公共GameState getGameState() {
返回游戏状态。
}
}
公共类主{ 公共静态无效主(字符串[] args) { int[][] 数据={ {1, 1, 1, 1, 1}, {1, 0, 0, 0, 1}, {1, 0, 3, 4, 1}, {1, 0, 0, 0, 1}, {1, 1, 1, 1, 1}, }; 游戏game=新游戏(数据); 扫描仪扫描仪=新扫描仪( System.in); while (game.getGameState()==GameState.PLAYING) { int[][] mapData=game.getData(); for (int[] row : mapData) { for (int cell : row) {开关(单元格){ case Game.WALL: System.out.print('#');break;case Game.SPACE: System.out.print('');break;case Game.PLAYER: System.out.print('@ '); Break; case Game.BOX: System.out.print('$'); Break; case Game.GOAL: System.out.print('.'); Break; case Game.PLAYER_ON_GOAL: System.out.print(' +'); Break; case Game.BOX_ON_GOAL: System.out.print('*'); Break; } } System.out.println(); } System.out.print('输入move: '); 字符串输入=扫描仪.nextLine(); int dx=0; int dy=0; switch (输入) { case 'w': dy=-1; Break; case 'a': dx=-1; Break; case 's': dy=1;break;case 'd': dx=1;break; } game.move(dx, dy); } if (game.getGameState()==GameState.COMPLETED) { System.out.println('恭喜谢谢你,你赢了!'); } } }
以下是实现Java 推盒游戏的简单步骤。
创建一个地图类Map来表示游戏地图,具有以下属性和方法: map: 2D数组,用于存储地图数据playerX,playerY: 玩家坐标目标isWall(int x, int y): 判断指定坐标是否是墙isBox(int x, int y): 判断指定给定坐标是否有a box isGoal(int x, int y): 确定给定坐标是否是目标点isCompleted(): 确定游戏是否完成move(int dx, int dy): 创建一个玩家和一个游戏类Game。它包含以下属性和方法: ): 构造函数接受二维数组作为参数,用于初始化游戏地图run(): 是游戏执行方法,包含游戏的主要逻辑。创建一个主类Main,打开其中的Game类,并调用其run方法来启动游戏。实现Map类的构造函数,将二维数组转换为地图数据。公共地图(int [] []数据){
this.map=new int[data.length][data[0].length];
for (int i=0; i data.length; i++) {
for (int j=0; j data[i].length; j++) {
地图[i][j]=数据[i][j];
if (数据[i][j]==玩家) {
玩家X=j;
玩家Y=i;
} else if (data[i][j]==BOX) {
boxList.add(new int[]{j, i});
} else if (数据[i][j]==目标) {
目标X=j;
目标Y=i;
}
}
}
}
5、实现Map类的isWall方法,判断给定的坐标是否是墙。
公共布尔isWall(int x, int y) {
返回地图[y][x]==墙;
}
6. 实现Map类的isBox方法,检查指定坐标处是否存在盒子。
公共布尔isBox(int x, int y) {
for (int[] box : boxList) {
if (box[0]==x box[1]==y) {
返回真。
}
}
返回假。
}
7、实现Map类的isGoal方法,判断指定坐标是否为目标点。
公共布尔isGoal(int x, int y) {
返回地图[y][x]==目标;
}
8. 实现Map类的isCompleted方法来判断游戏是否完成。
公共布尔isCompleted() {
for (int[] box : boxList) {
if (!isGoal(box[0], box[1])) {
返回假。
}
}
返回真。
}
9. 实现Map类的move方法,移动玩家和盒子,并返回移动是否成功。
公共布尔移动(int dx,int dy){
int newPlayerX=玩家X + dx;
int newPlayerY=玩家Y + dy;
int newBoxX=-1;
int newBoxY=-1;
for (int[] box : boxList) {
if (box[0]==newPlayerX box[1]==newPlayerY) {
newBoxX=框[0] + dx;
newBoxY=框[1] + dy;
if (isWall(newBoxX, newBoxY) || isBox(newBoxX, newBoxY)) {
返回假。
}
框[0]=新框X;
box[1]=新框Y;
}
}
if (isWall(newPlayerX, newPlayerY) || isBox(newPlayerX, newPlayerY)) {
返回假。
}
玩家X=新玩家X;
玩家Y=新玩家Y;
返回真。
}
10. 实现Game类的构造函数,接受二维数组作为参数,并初始化游戏地图。
公共游戏(int [] []数据){
这张地图
=新地图(数据);
}
11. 实现Game类的move方法并调用地图的move方法来移动玩家和盒子并更新游戏状态。 java public void move(int dx, int dy) { if (map.move(dx, dy)) { if (map.isCompleted()) { gameState=GameState.COMPLETED; } else { gameState=GameState.PLAYING; } } }
12. 实现Game类的getMap方法,返回游戏地图: java public Map getMap() { return map; }
13、实现Game类的getGameState方法,返回游戏状态: java public GameState getGameState() { return gameState; }
14. 实现Main类来运行游戏。首先我们读取游戏地图数据,然后创建游戏对象并进入游戏循环。
公共类主要{
公共静态无效主(字符串[] args){
int[][] 数据={
{墙,墙,墙,墙,墙,墙,墙},
{墙,玩家,空间,盒子,空间,空间,墙},
{墙,空间,墙,墙,盒子,空间,墙},
{墙,空间,盒子,球门,墙,空间,墙},
{墙,墙,墙,墙,墙,墙,墙}
};
游戏game=新游戏(数据);
扫描仪扫描仪=新扫描仪(System.in);
while (game.getGameState()==GameState.PLAYING) {
MapMap=game.getMap();
for (int i=0; i map.getHeight(); i++) {
for (int j=0; j map.getWidth(); j++) {
if (map.getPlayerX()==j map.getPlayerY()==i) {
System.out.print('@');
否则if (map.isBox(j, i)) {
System.out.print('$');
否则if (map.isGoal(j, i)) {
System.out.print('.');
否则if (map.isWall(j, i)) {
System.out.print('#');
} 除此之外{
System.out.print(' ');
}
}
System.out.println();
}
System.out.print('输入move:');
字符串输入=scanner.nextLine();
int dx=0;
整数dy=0;
if (input.equalsIgnoreCase('w')) {
dy=-1;
else if (input.equalsIgnoreCase('s')) {
dy=1;
否则if (input.equalsIgnoreCase('a')) {
dx=-1;
否则if (input.equalsIgnoreCase('d')) {
dx=1;
}
游戏.移动(dx,dy);
}
if (game.getGameState()==GameState.COMPLETED) {
System.out.println('恭喜!您已通关游戏!');
} 除此之外{
System.out.println('游戏结束!');
}
}
}
运行游戏并尝试移动玩家和盒子直到游戏结束。