<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言遞迴應用實現掃雷遊戲的具體程式碼,供大家參考,具體內容如下
test.c檔案主要內容及功能講解
#include"game.h" int main() { srand((unsigned int)time(NULL)); int x = 0; while (1) { menu();//選單 printf("請選擇:>"); scanf("%d", &x); if (x == 1) { char mine[ROWS][COLS] = { 0 };//佈置雷的棋盤 char show[ROWS][COLS] = { 0 };//查詢雷的棋盤 //初始化 setboard(mine, ROWS, COLS, '0');//設定雷的棋盤初始化 setboard(show, ROWS, COLS, '*');//設定排查的棋盤初始化 //列印 displayboard(show, ROW, COL);//列印排查的棋盤9 //佈雷 putmine(mine, ROW, COL);// //displayboard(mine, ROW, COL);//列印用來方便測試 //排雷 findmine(mine,show, ROW, COL); } else if (x == 0) { printf("退出遊戲!n"); break; } else { printf("輸入錯誤,請重新輸入!n");//處理非法輸入 } } system("pause"); return 0; }
game.c檔案主要內容及功能講解
#include"game.h" void menu()//選單 { printf("*****************************n"); printf("**** 1.play 0.exit ****n"); printf("*****************************n"); } void setboard(char board[ROWS][COLS], int rows, int cols, char n)//初始化,mine初始化為0,show初始化為* { int x = 0; int y = 0; int a = 0; for (x = 0; x < rows; x++) { for (y = 0; y < cols; y++) { board[x][y] = n; } } } void displayboard(char board[ROWS][COLS], int rows, int cols)//列印棋盤 { int x = 0; int y = 0; for (x = 0; x <= cols; x++) { printf("%d ", x);//列印列的序號 } printf("n"); for (x = 1; x <= rows; x++) { printf("%d ", x);//列印行的序號 for (y = 1; y <= cols; y++) { printf("%c ", board[x][y]); } printf("n"); } printf("n"); } //佈雷,使用rand產生隨機值,srand呼叫在主函數裡 void putmine(char mine[ROWS][COLS], int rows, int cols) { int x = 0; int y = 0; int count = low; while (count) { x = rand() % ROW + 1; y = rand() % COL + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //計算盤中還有多少個*, //後面用來和雷數比較判斷, //當*等於雷數時排雷成功 int number(char show[ROWS][COLS]) { int count = 0; int x = 0; int y = 0; for (x = 1; x <= ROW; x++) { for (y = 1; y <= COL; y++) { if (show[x][y] == '*') count++; } } return count; } void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols) { int x = 0; int y = 0; while (number(show) != low) { printf("請輸入查詢座標:>"); scanf("%d%d", &x, &y); if (x > 0 && x <= rows && y > 0 && y <= cols && show[x][y] != ' ')//注意判斷座標合法性 { if (mine[x][y] == '1') { if (number(show) == ROW * COL)//第一步踩雷時要替換雷位保證玩家不會first blood { firstsafe(mine, x, y); //displayboard(mine, ROW, COL);//用來列印方便測試雷位有沒有被替換 goto first;//替換之後繼續判斷該座標,轉到first } printf("YOU LOSE!GAME OVER!n");//當玩家不是第一步踩雷時就輸了 printf("n"); displayboard(mine, ROW, COL);//列印雷盤讓玩家看到自己踩得是不是雷 break; } else { first: recfindmine(mine, show, x, y);//展開程式 displayboard(show, ROW, COL); //displayboard(mine, ROW, COL);//方便測試 } } else { printf("座標錯誤,請重新輸入!n"); } } if (number(show) == low)//當*等於雷數時排雷成功 { printf("YOU WIN!n"); displayboard(mine, ROW, COL); } } //算一個座標周圍8個有沒有雷 //minE槽裡放的是字元'0'和'1', //函數返回是整型值, //'1'-'0'=1; int minenum(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0'; } //本來寫的時候寫的查詢周圍8個座標,結果後來發現找周圍4個也是一樣的 //用遞回來進行判斷 //目前這個函數還有bug,展開有時候遇到周圍有雷的時候不會停,會繼續判斷 //導致展開不是連續的,就像掃雷開掛了。。但是基本的展開功能還是能夠實現的 //希望看出來的大佬給指點一下,謝謝; void recfindmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) { int i = minenum(mine, x, y); if (show[x][y] == '*' && i == 0) { show[x][y] = ' '; if (show[x - 1][y] == '*' && (x - 1) > 0 && y > 0)//上 { recfindmine(mine, show, x-1, y); } //if ((x - 1) > 0 && (y - 1) > 0 && show[x - 1][y - 1] == '*')//左上 //{ // recfindmine(mine, show, x-1, y-1); //} //if ((x - 1) > 0 && (y + 1) > 0 && show[x - 1][y + 1] == '*')//右上 //{ // recfindmine(mine, show, x-1, y+1); //} if (show[x + 1][y] == '*' && (x + 1) > 0 && y > 0)//下 { recfindmine(mine, show, x+1, y); } //if ((x + 1) > 0 && (y - 1) > 0 && show[x + 1][y - 1] == '*')//左下 //{ // recfindmine(mine, show, x+1, y-1); //} //if ((x + 1) > 0 && (y + 1) > 0 && show[x + 1][y + 1] == '*')//右下 //{ // recfindmine(mine, show, x+1, y+1); //} if (show[x][y + 1] == '*' && x > 0 && (y + 1) > 0)//右 { recfindmine(mine, show, x, y+1); } if (show[x][y - 1] == '*' && x > 0 && (y - 1) > 0)//左 { recfindmine(mine, show, x, y-1); } } else { show[x][y] = i + '0'; } } //保證第一步不死,把第一步的雷替換成0,再隨機生成一個不是雷的座標改成雷 void firstsafe(char mine[ROWS][COLS], int x, int y) { mine[x][y] = '0'; while (1) { int a = 0; int b = 0; a = rand() % ROW + 1; b = rand() % COL + 1; if (mine[a][b] == '0') { mine[a][b] = '1'; break; } } }
game.h檔案主要內容及功能講解
#include<stdlib.h> #include<stdio.h> #include<time.h> #define ROWS 11 #define COLS 11 #define ROW 9 #define COL 9 #define low 10 void menu(); void setboard(char board[ROWS][COLS], int rows, int cols,char n); void displayboard(char board[ROWS][COLS], int rows, int cols); void putmine(char mine[ROWS][COLS], int rows, int cols); void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols); void recfindmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y); int minenum(char mine[ROWS][COLS], int x,int y); int number(char show[ROWS][COLS]); void firstsafe(char mine[ROWS][COLS], int x, int y);
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45