C語言推箱子游戲,隨機生成地圖
阿新 • • 發佈:2019-01-22
#include <stdio.h>
#include <stdlib.h>
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;
}