思路:
一、地图初始化
- 使用奇数行和列相同的二维数组存储地图,初始化全部为墙
- 使用一个1-2的随机数确定挖坑方向,1向左,2向右
- 定义步进,随机数范围: 2至(列数-1)
- 利用步进和方向挖坑,先从顶部挖到中间一行,再从底部挖到中间,然后将中间的墙全部连起来,得到完整路径。
二、推箱子
- 0代表小人,X代表箱子
- 左移和右移:判断小人所在位置临近向右(左)的位置是否是箱子,以及箱子的右(左)边位置是否是墙,如果都不是,将箱子和小人向右(左)移动一格;如果小人的右边没有箱子也不是墙,则将小人向右(左)移动,箱子不变
- 上移和下移:判断小人所在位置临近向下(上)的位置是否是箱子,以及箱子的下(上)边位置是否是墙,如果都不是,将箱子和小人向下(上)移动一格;;如果小人的右边没有箱子也不是墙,则将小人向下(上)移动,箱子不变
- 箱子到终点的时候游戏结束
#include
#include
void setMap (int rows,int cols,char arr[][cols]);//初始化随机地图
void printMap (int rows,int cols, char arr[][cols]);//打印地图
char dirIn (void);//返回输入的方向
int main()
{
int inNanDu = 0; //难度系数
int rows = 25,cols = 25; //行和列数默认值
int nowRow = 1; //当前行座标初始化
int set =1; //步进设置初始化
loop3:
system ("clear");
printf ("# # # # # # # # # # # # # # # # # # # # # # #\n");
printf ("\n\n\n\n\n");
printf (" 推箱子游戏\n");
printf ("\n\n\n\n\n");
printf ("# # # # # # # # # # # # # # # # # # # # # # #\n\n");
printf ("请输入游戏地图的难度值,0-简单,1-普通,2,较难\n");
scanf ("%d",&inNanDu);
switch (inNanDu)
{
case 0:
rows = 25;cols = 25;
break;
case 1:
rows = 35;cols = 35;
break;
case 2:
rows = 45;cols = 45;
break;
default:
goto loop3;
}
char arr[rows][cols];
char ch = '0';
char *pNow = arr[1]; //定义行的移动指针
setMap (rows,cols,arr); //初始化随机地图
printMap (rows,cols,arr); //打印地图
while (ch != 'q')//游戏主体程序
{
pNow = arr[nowRow];
system ("clear"); //清屏
printMap (rows,cols,arr); //打印地图
printf ("方向控制,a-左,s-下,d-右,w-上,q-退出\n");
ch = dirIn(); //获取用户输入的方向控制
switch (ch)
{
case 'a':
case 'A': //向左移动
if (pNow[set-1] == 'X' && pNow[set-2] != '#')
{
pNow[set-2] = 'X';
pNow[set-1] = '0';
pNow[set] = ' ';
set--;
break;
}
else if (*(pNow+set-1) != 'X' && *(pNow+set-1) != '#')
{
pNow[set-1] = '0';
pNow[set] = ' ';
set--;
break;
}
break;
case 's':
case 'S': //向下移动
if (arr[nowRow+1][set] == 'X' && arr[nowRow+2][set] != '#')
{
arr[nowRow][set] = ' ';
arr[nowRow+1][set] = '0';
arr[nowRow+2][set] = 'X';
nowRow++;
if(nowRow+2 >= cols)
{
system ("clear");
printMap (rows,cols,arr);
printf ("你好牛逼!游戏结束!、\n");
return 0;
}
break;
}
else if (arr[nowRow+1][set] != 'X' && arr[nowRow+1][set] != '#')
{
arr[nowRow][set] = ' ';
arr[nowRow+1][set] = '0';
nowRow++;
break;
}
break;
case 'd':
case 'D': //向右移动
if (pNow[set+1] == 'X' && pNow[set+1] != '#')
{
pNow[set+2] = 'X';
pNow[set+1] = '0';
pNow[set] = ' ';
set++;
break;
}
else if (*(pNow+set+1) != 'X' && *(pNow+set+1) != '#')
{
pNow[set+1] = '0';
pNow[set] = ' ';
set++;
break;
}
break;
case 'w':
case 'W': //向上移动
if (arr[nowRow-1][set] == 'X' && arr[nowRow-2][set] != '#')
{
arr[nowRow][set] = ' ';
arr[nowRow-1][set] = '0';
arr[nowRow-2][set] = 'X';
nowRow--;
break;
}
else if (arr[nowRow-1][set] != 'X' && arr[nowRow-1][set] != '#')
{
arr[nowRow][set] = ' ';
arr[nowRow-1][set] = '0';
nowRow--;
break;
}
break;
}
}
}
void setMap (int rows,int cols,char arr[][cols])//初始化随机地图
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
arr[i][j] = '#'; //填充所有的墙
}
}
int nowR = 1,temp=1; //当前座标点位置,及存储座标的临时变量
for (int i = 1; i < rows /2 ;i+=2)
{
char *pRwo = arr[i]; //指针指向第一行数组
loop:
printf ("");
int dir = arc4random_uniform(2)+1; //获取左右随机方向
int set = arc4random_uniform(cols-2-2)+2;//获取随机步进值
switch (dir)
{
case 1: //向左挖坑移动
if (nowR-2 < set)
{
goto loop;
}
else
{
for (int j = nowR; j > nowR-set; j--)
{
*(pRwo+j) = ' ';
arr[i+1][j] = ' ';
temp = j;
}
nowR = temp;
break;
}
case 2: //向右挖坑移动
if (set > cols -2 - nowR)
{
goto loop;
}
else
{
for (int j = nowR; j < nowR+set; j++)
{
*(pRwo+j) = ' ';
arr[i+1][j] = ' ';
temp =j;
}
nowR = temp;
break;
}
}
arr[i+2][nowR] = ' '; //向下挖坑移动
arr[i+2][nowR+1] = ' ';
arr[i+2][nowR-1] = ' ';
arr[i+3][nowR] = ' '; //向下挖坑移动
arr[i+3][nowR+1] = ' ';
arr[i+3][nowR-1] = ' ';
}
for (int i = rows-2; i > rows /2 ;i-=2) //由下往上挖坑,到中间值截止
{
char *pRwo = arr[i]; //指针指向第一行数组
loop2:
printf ("");
int dir = arc4random_uniform(2)+1; //左右随机方向
int set = arc4random_uniform(cols-2-2)+2;
switch (dir)
{
case 1: //向左挖坑移动
if (nowR-2 < set)
{
goto loop2;
}
else
{
for (int j = nowR; j > nowR-set; j--)
{
*(pRwo+j) = ' ';
arr[i-1][j] = ' ';
temp = j;
}
nowR = temp;
break;
}
case 2: //向右挖坑移动
if (set > cols -2 - nowR)
{
goto loop2;
}
else
{
for (int j = nowR; j < nowR+set; j++)
{
*(pRwo+j) = ' ';
arr[i-1][j] = ' ';
temp =j;
}
nowR = temp;
break;
}
}
arr[i-2][nowR] = ' '; //向下移动
arr[i-2][nowR+1] = ' ';
arr[i-2][nowR-1] = ' ';
arr[i-3][nowR] = ' '; //向下移动
arr[i-3][nowR+1] = ' ';
arr[i-3][nowR-1] = ' ';
}
for (int i = 1; i < cols-1; i++ ) //为末行、首先和中间行挖全坑
{
arr[rows-2][i]= ' ';
arr[rows-3][i]= ' ';
arr[rows/2][i]= ' ';
arr[1][i]= ' ';
arr[2][i]= ' ';
}
arr[rows-1][cols-2] = ' '; //初始化终点、小人、箱子位置
arr[1][1] = '0';
arr[2][2] = 'X';
}
void printMap (int rows,int cols, char arr[][cols])//打印地图
{
for (int i = 0; i < rows; i++ )
{
for (int j = 0; j < cols; j++)
{
printf ("%c ",arr[i][j]);
}
printf ("\n");
}
}
char dirIn (void)//返回输入的方向
{
char ch = '0';
rewind (stdin);
scanf ("%c",&ch);
return ch;
}