<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言實現掃雷遊戲的具體程式碼,供大家參考,具體內容如下
掃雷遊戲是在一個指定的二維空間裡,隨機佈置雷,把不是雷的位置都找出來,在你點一個位置的時候它會顯示它周圍全部雷的個數,根據這個線索去找 ,會更容易贏。
檔名 作用
clear_mine.h 三子棋的函數宣告,標頭檔案宣告等
clear_mine.c 三子棋函數介面的實現
main.c 三子棋函數測試功能
1、用兩個2維陣列儲存掃雷資訊,一個用來設定雷,另一個用來展示看不見的雷,並把周圍的雷的個數統計出來展示。
2、也就是當在排查雷輸入座標的時候要使用這個兩個陣列,這個座標位置在設定雷的陣列裡面如果不是雷,就統計它周圍雷個數放在另一個陣列裡面進行顯示。直到我們排查排查 ROW乘COL-雷個數次,即可勝利
3、這裡面最重要的怎樣在方格位置上是顯示個數,用字元是最方便的,不是雷的初始化為字元0,是雷放字元置為1。當一個位置上不是雷把他周圍8個的字元加起來-去8*字元0就是有多少個雷的個數。再把雷的個數轉化為字元放在視覺化數位裡面顯示,只需要個數加上字元0即可。
(一)、建立menu選單函數
void menu() { printf("########### 1、遊戲開始 ##########n"); printf("########### 2、退出 ##############n"); }
(二)、用switch語句去建立game遊戲開始函數和退出功能
void game() { //用2個棋盤即兩個2維陣列,一個進行放雷另一個進行展示棋盤資訊 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; Init(mine,ROWS,COLS,'0');//先把放雷的陣列初始化為字元0 Init(show,ROWS, COLS, '*');//再把棋盤資訊初始化為字元* set_mine(mine, ROW, COL );//放置雷 show1(show, ROW, COL);//展示棋盤資訊 clear_mine(mine, show, ROW, COL);//排查雷 } int main() { int insert = 0; srand((unsigned int)time(NULL)); do{ menu(); printf("請選擇:"); scanf("%d", &insert); switch (insert) { case 1: game(); break; case 2: printf("退出遊戲"); break; default: printf("請重新輸入"); break; } } while (insert); }
(三)、在void game()函數裡面建立上層呼叫框架
(1)、初始化棋盤並視覺化棋盤
1、建立兩個陣列一個mine陣列,一個是show陣列並初始化,把它們分別置為字元0和字元*。然後建立一個列印棋盤函數以便呈現我們眼前。我們先呼叫Init和show1函數來看一下列印效果。
2、需要注意的是我們用二維陣列列印兩個棋盤,我們就是要列印9x9的棋盤?答案不是,因為我們在設計演演算法時需要統計座標周圍8個方位的個數,假如要統計邊界周圍雷的個數,那麼就會有陣列越界的問題,那麼我們就需要在9×9的基礎上加2,這些元素我們不列印,心裡有數就行。
void Init(char a[][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for(i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { a[i][j] = set; } } } void show1(char a[][COLS], int row, int col) { int i = 0; int j = 0; for (j = 0; j <col+1; j++) { printf("%d ", j); } printf("n"); for (i = 1; i < row+1; i++) { printf("%d ", i); for (j= 1; j <col+1; j++) { printf("%c ", a[i][j]); } printf("n"); } ; }
(2)、設定雷
這一步我門要去設定雷,就在剛剛我們初始化的mine陣列裡面去放隨機雷,這個雷我們可以指定大小 我們定義宏,以便可以方便改。當然我們要現在測試函數main裡面設定一個亂數生成器。然後再set_mine函數設定rand函數生成隨機座標。我們雷置為字元1,以便我更好計算。如圖程式碼:
void set_mine(char mine[][COLS], int row, int col) { int i = 0; int j = 0; int x = 0; int y = 0; int count = mine_count;//雷的個數 while (count) { x = rand() % row + 1;//生成一到0的數 y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }
(3)、展示棋盤資訊
展示棋盤資訊是剛才我們初始化的show函數裡面 放的都是字元*,在這裡就呼叫一次來開始玩遊戲,進行第一次掃雷。
如圖效果:
(4)、排查雷
1、這一步是遊戲的核心,進行排查雷,要輸入座標就要先考慮它的合法性。
2、要要考慮他是否被排查過 也就是去重性。
3、在進行判斷這個座標在mine陣列裡面是否是字元1,如果是遊戲結束,反之則把他周圍的雷數統計出來給show陣列,再呼叫show1來顯示。
4、最一步判斷排雷是否成功,只要排了ROW*COL-雷個數次,說明排雷成功。
void clear_mine(char mine[][COLS], char show[][COLS], int row, int col) { int x = 0; int y = 0; int count = 0; while (count = row*col - mine_count) { printf("請輸入座標:"); scanf("%d %d", &x, &y); if (x >= 1&& x <= row && y >= 1 && y <= col) { if (show[x][y] == '*') { if (mine[x][y] != '1') { int count1 = 0; count1 = round_mineCount(mine, x, y); show[x][y] = count1 + '0'; show1(show, row, col); count--; } else { printf("踩到雷,遊戲結束n"); show1(mine, row, col); break; } } else { printf("已經被排查n"); } } else { printf("座標非法,請重新輸入n"); } if (count == 0) { printf("排雷成功"); show1(mine, row, col); } } } //t統計雷的個數,八個方向 int round_mineCount(char mine[][COLS],int x,int y) { return ( mine[x - 1][y] + mine[x + 1][y] + mine[x][y - 1] + mine[x][y + 1] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0'); }
main.c
#include"clear_mine.h" void menu() { printf("########### 1、遊戲開始 ##########n"); printf("########### 2、退出 ##############n"); } void game() { //用2個棋盤即兩個2維陣列,一個進行放雷另一個進行展示棋盤資訊 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; Init(mine,ROWS,COLS,'0');//先把放雷的陣列初始化為字元0 Init(show,ROWS, COLS, '*');//再把棋盤資訊初始化為字元* set_mine(mine, ROW, COL );//放置雷 show1(show, ROW, COL);//展示棋盤資訊 clear_mine(mine, show, ROW, COL);//排查雷 } int main() { int insert = 0; srand((unsigned int)time(NULL)); do{ menu(); printf("請選擇:"); scanf("%d", &insert); switch (insert) { case 1: game(); break; case 2: printf("退出遊戲"); break; default: printf("請重新輸入"); break; } } while (insert); }
clear_mine.h
#pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define mine_count 10//設定雷的個數 #define count2 row*col-Count void Init(char a[][COLS], int rows,int cols, char set);//初始化棋盤 void set_mine(char mine[][COLS], int row, int col);//設定雷 void show1(char a[][COLS], int row, int col);//展示棋盤資訊 void clear_mine(char mine[][COLS], char show[][COLS], int row, int col);// 排查雷 int round_mineCount(char mine[][COLS], int row, int col);//統計一個位置周圍的雷的個數
clear_mine.c
#include"clear_mine.h" void Init(char a[][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for(i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { a[i][j] = set; } } } void show1(char a[][COLS], int row, int col) { int i = 0; int j = 0; for (j = 0; j <col+1; j++) { printf("%d ", j); } printf("n"); for (i = 1; i < row+1; i++) { printf("%d ", i); for (j= 1; j <col+1; j++) { printf("%c ", a[i][j]); } printf("n"); } ; } void set_mine(char mine[][COLS], int row, int col) { int i = 0; int j = 0; int x = 0; int y = 0; int count = mine_count; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } void clear_mine(char mine[][COLS], char show[][COLS], int row, int col) { int x = 0; int y = 0; int count = 0; while (count = row*col - mine_count) { printf("請輸入座標:"); scanf("%d %d", &x, &y); if (x >= 1&& x <= row && y >= 1 && y <= col) { if (show[x][y] == '*') { if (mine[x][y] != '1') { int count1 = 0; count1 = round_mineCount(mine, x, y); show[x][y] = count1 + '0'; show1(show, row, col); count--; } else { printf("踩到雷,遊戲結束n"); show1(mine, row, col); break; } } else { printf("已經被排查n"); } } else { printf("座標非法,請重新輸入n"); } if (count == 0) { printf("排雷成功"); show1(mine, row, col); } } } int round_mineCount(char mine[][COLS],int x,int y) { return ( mine[x - 1][y] + mine[x + 1][y] + mine[x][y - 1] + mine[x][y + 1] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y + 1]-8*'0'); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援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