1. 程式人生 > >C語言推箱子游戲,隨機生成地圖

C語言推箱子游戲,隨機生成地圖

#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; }