// 语句 循环 数组 选择结构程序设计(switch语句)
// 一句话描述推箱子游戏:人在空地上推着箱子躲避障碍到目标点
// 初始化数据 -- 更新数据、渲染界面 -- 判断结束
/*
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
// 全局区 初始化地图
int Map[10][10] = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 3, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 },
{ 1, 0, 0, 0, 2, 0, 1, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};// 分号
// 主函数 是整个程序的入口
int main()
{
// 游戏主循环
while (true)
{
// 渲染界面 -- 画地图 -- 打印数组的值
for (int i = 0; i < 10; i++)// 外层循环控制行数
{
for (int j = 0; j < 10; j++)// 内层循环控制列数
{
// 打印当前遍历到的数组元素的值
//printf(" %d", Map[i][j]);// 下标
switch (Map[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
case 2:
printf("♀");
break;
case 3:
printf("●");
break;
case 4:
printf("○");
break;
case 6:
printf("♀");
break;
case 7:
printf("★");
break;
default:
break;
}
}
// 打印完一行后换行
printf(" ");
}
// 控制人物移动
// 1 找人:查找数组
// 遍历数组 -- 定位人的位置
int posX = 0;
int posY = 0;
for (int i = 0; i < 10; i++)// 外层循环控制行数
{
for (int j = 0; j < 10; j++)// 内层循环控制列数
{
if (2 == Map[i][j] ||
6 == Map[i][j])
{
posX = i;
posY = j;
}
}
}
//printf("当前人物位置: %d行 %d列 ", posX, posY);
// 2 控制(WSAD wsad)
// 从键盘获取按键内容 -- 根据不同内容作出不同反应
switch (getch())
{
case 'W':
case 'w':
// 需要处理下一个位置是 空地,箱子,目标点 的情况
if (0 == Map[posX - 1][posY] ||
4 == Map[posX - 1][posY])
{
// 当前位置人离开
Map[posX][posY] -= 2;
// 下个位置人过来
Map[posX - 1][posY] += 2;
}
else if (3 == Map[posX - 1][posY])
{
if (4 == Map[posX - 2][posY] ||
0 == Map[posX - 2][posY])
{
// 当前位置人离开
Map[posX][posY] -= 2;
// 下个位置人过来
Map[posX - 1][posY] += 2;
// 下个位置箱子离开
Map[posX - 1][posY] -= 3;
// 下下个位置箱子过来
Map[posX - 2][posY] += 3;
}
}
break;
case 'S':
case 's':
// 需要处理下一个位置是 空地,箱子,目标点 的情况
if (0 == Map[posX + 1][posY] ||
4 == Map[posX + 1][posY])
{
// 当前位置人离开
Map[posX][posY] -= 2;
// 下个位置人过来
Map[posX + 1][posY] += 2;
}
else if (3 == Map[posX + 1][posY])
{
if (4 == Map[posX + 2][posY] ||
0 == Map[posX + 2][posY])
{
// 当前位置人离开
Map[posX][posY] -= 2;
// 下个位置人过来
Map[posX + 1][posY] += 2;
// 下个位置箱子离开
Map[posX + 1][posY] -= 3;
// 下下个位置箱子过来
Map[posX + 2][posY] += 3;
}
}
break;
default:
break;
}
// 判断胜负
bool isWin = true;
for (int i = 0; i < 10; i++)// 外层循环控制行数
{
for (int j = 0; j < 10; j++)// 内层循环控制列数
{
if (3 == Map[i][j])
{
isWin = false;
}
}
}
if (isWin)
{
system("cls");
printf(" YOU ARE WIN ! ");
break;
}
// 清屏
system("cls");
}
return 0;
}
*/
#include <iostream>
using namespace std;
void main()
{
int** pMap = new int*[10];
for (int i = 0; i < 10; i++)
{
pMap[i] = new int[10];
}
// …… pMap 可以作为数组名使用
for (int i = 0; i < 10; i++)
{
delete pMap[i];
pMap[i] = nullptr;
}
delete pMap;
pMap = nullptr;
}
/*
后续:
1 完善左右移动(1.0) posY左减右加
2 改成函数版本(2.0)
3 地图使用动态内存(3.0)
4 EasyX加上图形界面和音乐(4.0)
5 使用游戏引擎,添加关卡和退格等功能(5.0 5.1 5.2 ...)
*/