用c/c++写一个推箱子小游戏(特别详细)
主要用到数组。非常简单,入门必写的小游戏。下面代码呈现,地图做得非常简单,可以的话自己修改,有什么错误,请大佬指正。
我觉得有意思的是移动那一块,因为该开始写的时候,每移动一步,就要做出处理,这就导致了做了很多重复的代码,这没有意义。因为没使用函数,所以没想到,这些大量重复的代码,相似的代码,完全可以将他封装起来。
数组,写这个游戏,我第一次用到三维数组,Map[0][][] 表示关卡,Map[][10][10]表示地图,以前真没写过这些。说到数组,这有些坑,我是这样觉得的,对于初学者而言,因为写多了int 型的,一说到数组就会想到数组。这对学结构体很不好,数组只是开辟了一段连续的空间,只是这段空间存什么值不确定需要强制指出来。
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
using namespace std;
int main()
{
int Map[3][10][10] = {
{{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,0,0,0,1,1,1,1,1},
{1,1,0,3,0,1,1,1,1,1},
{1,1,1,1,0,1,0,0,1,1},
{1,1,1,0,0,0,0,0,1,1},
{1,1,2,0,0,1,0,0,1,1},
{1,1,0,0,0,1,0,0,4,1},
{1,1,1,1,1,1,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},},
{
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,4,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,3,0,0,1,0,3,0,1},
{1,0,0,1,0,0,0,0,0,1},
{1,1,2,1,4,0,0,0,1,1},
{1,1,1,1,1,1,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},},
{ {1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,4,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,3,0,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,0,0,0,0,0,0,0,1},
{1,0,2,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},},
};
int MapBuffer[10][10];
memcpy(MapBuffer, Map[0], sizeof(Map[0]));
int PosX, PosY;
int OffSetX = 0, OffSetY = 0;
bool bFlag = false;
int numberSuccess = 0, Success = 0;
int level = 0;
int Input;
for (level; level < 3; level++)
{
memcpy(MapBuffer, Map[level], sizeof(Map[level]));
numberSuccess = 0, Success = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if(2 == Map[level][i][j])
PosX = i, PosY = j;
if (4 == Map[level][i][j])
numberSuccess++;
}
}
while (true)
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
switch (Map[level][i][j])
{
case 0:
cout << " ";
break;
case 1:
cout << "■";
break;
case 2:
case 6:
cout << "♀";
break;
case 3:
case 7:
cout << "●";
break;
case 4:
cout << "○";
break;
}
}
cout << endl;
}
Input = _getch();
system("CLS");
switch (Input)
{
case 'w':
case 'W':
OffSetX = -1, OffSetY = 0;
break;
case 's':
case 'S':
OffSetX = 1, OffSetY = 0;
break;
case 'a':
case 'A':
OffSetY = -1, OffSetX = 0;
break;
case 'd':
case 'D':
OffSetY = 1, OffSetX = 0;
break;
case 'z':
case 'Z':
if (bFlag)
{
Map[level][PosX + OffSetX][PosY + OffSetY] -= 3;
Map[level][PosX][PosY] += 3 - 2;
Map[level][PosX - OffSetX][PosY - OffSetY] += 2;
}
else
{
Map[level][PosX][PosY] -= 2;
Map[level][PosX - OffSetX][PosY - OffSetY] += 2;
}
PosX -= OffSetX, PosY -= OffSetY;
OffSetX = 0, OffSetY = 0;
bFlag = false;
break;
case 'r':
case 'R':
cout << "确定重玩吗?y\/n\n";
int sInput = _getch();
if ('y'== sInput || 'Y' == sInput)
{
memcpy(Map[level], MapBuffer, sizeof(Map[level]));
}
}
if (0 == Map[level][PosX + OffSetX][PosY + OffSetY] || 4 == Map[level][PosX + OffSetX][PosY + OffSetY])
{
bFlag = false;
Map[level][PosX + OffSetX][PosY + OffSetY] += 2;
Map[level][PosX][PosY] -= 2;
PosX += OffSetX, PosY += OffSetY;
}
else if(3 == Map[level][PosX + OffSetX][PosY + OffSetY] || 7 == Map[level][PosX + OffSetX][PosY + OffSetY])
{
if (0 == Map[level][PosX + OffSetX * 2][PosY + OffSetY * 2] || 4 == Map[level][PosX + OffSetX*2][PosY + OffSetY*2])
{
bFlag = true;
Map[level][PosX + OffSetX * 2][PosY + OffSetY * 2] += 3;
Map[level][PosX + OffSetX][PosY + OffSetY] += -3 + 2;
Map[level][PosX][PosY] -= 2;
PosX += OffSetX, PosY += OffSetY;
if (7 == Map[level][PosX + OffSetX][PosY + OffSetY])
{
Success++;
if (numberSuccess == Success)
{
cout << "你赢了" << endl;
break;
}
}
}
}
}
system("cls");
}
return 0;
}