推箱子小游戏实例(C/C++)

// 语句 循环 数组 选择结构程序设计(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("\n");

}

// 控制人物移动

// 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列\n", 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("\n\nYOU ARE WIN !\n\n\n");

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 ...)

*/

猜你喜欢

转载自www.cnblogs.com/ZhenXin0101/p/13405920.html