整理一下以前学习时找到的程序。
一、游戏框架
1、游戏定义
0: " " 空地
1: ▆ 墙
3:☆ 目的地
4:★ 箱子
5:※ 人
7: ⊙ 箱子和目的地
8:※ 人和目的地
7刚好等于3+4刚好是目的地+箱子,8刚好是5+3刚好是+人和目的地
2、游戏流程
上下左右移动,将箱子推进目的地(好像难点反而在于地图的生成,没看到可以随机生成)
二、游戏代码
/*
1.绘制地图
1.1 多关使用三维数组
2.按键处理
2.1 定位人物坐标
2.2 _getch()
2.3 判断人物可以走
2.4 判断可以推动箱子
3.结束游戏
3.1 count
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//0:空的 1:▆ 3:☆ 4:★ 5:※ 7:⊙ 8:※
//规定地图
int map[][10][10] =
{
{
1,1,1,1,1,1,1,1,1,1,
1,3,0,0,0,0,0,0,3,1,
1,0,4,0,0,0,0,4,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,0,0,5,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,4,0,0,0,0,4,0,1,
1,3,0,0,0,0,0,0,3,1,
1,1,1,1,1,1,1,1,1,1
},
{
1,1,1,1,1,1,1,1,1,1,
1,3,0,0,0,0,0,0,3,1,
1,0,4,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,0,0,5,0,4,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,4,0,0,0,0,4,0,1,
1,3,0,0,0,0,0,0,3,1,
1,1,1,1,1,1,1,1,1,1
},
};
int guan = 0;
//每关箱子个数
int box[1024] = { 0 };
void GetBox(int n)
{
for (int i = 0; i < n; i++)
{
int n_box = 0;
for (int j = 0; j < 10; j++)
{
for (int k = 0; k < 10; k++)
{
switch (map[i][j][k])
{
case 4:
n_box++;
}
}
}
box[i] = n_box; //每关箱子个数
}
}
//绘制地图
void Drawmap()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
//0:空地 1: ▆ 3:☆ 4:★ 5:※ 7: ⊙ 8:※
switch (map[guan][i][j])
{
case 0:
printf(" "); //空地
break;
case 1:
printf("▆"); //墙
break;
case 3:
printf("☆"); //目的地
break;
case 4:
printf("★"); //箱子
break;
case 5: //人
case 8: //人和目的地
printf("※");
break;
case 7:
printf("⊙"); //箱子和目的地
break;
}
}
printf("\n");
}
}
//按键处理
void Keydown()
{
//定位人物
int i, j;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
if (map[guan][i][j] == 5 || map[guan][i][j] == 8)
break;
}
if (map[guan][i][j] == 5 || map[guan][i][j] == 8)
break;
}
//获取按键值
int key = _getch();
switch (key)
{
//小键盘:上72 下80 左75 右77
//上
case 'w':
case 'W':
case 72:
//要走的是空地或目的地
if (map[guan][i - 1][j] == 0 || map[guan][i - 1][j] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人来了
map[guan][i - 1][j] += 5;
}
//判断旁边是箱子
else if (map[guan][i - 1][j] == 4 || map[guan][i - 1][j] == 7)
{
//判断能否推动箱子
if (map[guan][i - 2][j] == 0 || map[guan][i - 2][j] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人5来了,箱子4走了
map[guan][i - 1][j] += 1;
//箱子来了
map[guan][i - 2][j] += 4;
}
}
break;
//下
case 's':
case 'S':
case 80:
//要走的是空地或目的地
if (map[guan][i + 1][j] == 0 || map[guan][i + 1][j] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人来了
map[guan][i + 1][j] += 5;
}
//判断旁边是箱子
else if (map[guan][i + 1][j] == 4 || map[guan][i + 1][j] == 7)
{
//判断能否推动箱子
if (map[guan][i + 2][j] == 0 || map[guan][i + 2][j] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人5来了,箱子4走了
map[guan][i + 1][j] += 1;
//箱子来了
map[guan][i + 2][j] += 4;
}
}
break;
//左
case 'a':
case 'A':
case 75:
//要走的是空地或目的地
if (map[guan][i][j - 1] == 0 || map[guan][i][j - 1] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人来了
map[guan][i][j - 1] += 5;
}
//判断旁边是箱子
else if (map[guan][i][j - 1] == 4 || map[guan][i][j - 1] == 7)
{
//判断能否推动箱子
if (map[guan][i][j - 2] == 0 || map[guan][i][j - 2] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人5来了,箱子4走了
map[guan][i][j - 1] += 1;
//箱子来了
map[guan][i][j - 2] += 4;
}
}
break;
//右
case 'd':
case 'D':
case 77:
//要走的是空地或目的地
if (map[guan][i][j + 1] == 0 || map[guan][i][j + 1] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人来了
map[guan][i][j + 1] += 5;
}
//判断旁边是箱子
else if (map[guan][i][j + 1] == 4 || map[guan][i][j + 1] == 7)
{
//判断能否推动箱子
if (map[guan][i][j + 2] == 0 || map[guan][i][j + 2] == 3)
{
//人走了
map[guan][i][j] -= 5;
//人5来了,箱子4走了
map[guan][i][j + 1] += 1;
//箱子来了
map[guan][i][j + 2] += 4;
}
}
break;
}
}
//游戏结束判断
int Gameover()
{
int count = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (map[guan][i][j] == 7)
count++;
}
}
return count;
}
int main()
{
int n = sizeof(map) / sizeof(map[0]);
GetBox(n);
while (1)
{
printf("第 %d 关\n", guan + 1);
Drawmap();
if (Gameover() == box[guan])
{
guan++;
if (guan == n)
break;
}
Keydown();
system("cls");
}
printf("Gameover\n");
system("pause");
return 0;
}