摘要:展示雷盤和初始化雷盤不一樣,展示雷盤只需要用即可,并不需要將都展示出來,只是為了我們更好的計算掃雷的位置周圍的雷的數(shù)量。
目錄
3、代碼實現(xiàn)(分函數(shù)呈現(xiàn))
通過C語言實現(xiàn)簡單的掃雷小游戲,由于創(chuàng)作者水平有限,未在該游戲中實現(xiàn)圖形化界面,同時在真正掃雷游戲中點一個位置成功掃雷多個坐標的功能也未實現(xiàn),功能較為簡單,敬請原諒!
程序分為test.c、game.c兩個源文件和game.h一個頭文件。
test.c:主函數(shù)接口引入。
game.c:游戲的相關(guān)函數(shù)實現(xiàn)。
game.h:頭文件引入、函數(shù)聲明。
void test(){ srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請輸入->"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲!/n"); break; } } while (input);}int main(){ test(); return 0;}
分析:
1.主函數(shù)中引入了隨機種子,生成隨機數(shù)來方便后續(xù)的雷的生成
2.在通過menu()菜單呈現(xiàn)后,通過switch進行接口接入,當用戶輸入1時可以進行游戲,當用戶輸入0時即退出游戲。
3.總體是通過do while循環(huán)實現(xiàn)的,但巧妙的利用了將用戶輸入的數(shù)據(jù)填入while后面的括號中,即當用戶輸入0時while條件判斷失敗,游戲就終止。
異常處理:
在switch中雖然沒有通過default可以進行異常處理,但當用戶輸入只要不為0的數(shù)據(jù)時,循環(huán)仍舊自動進行,在輸入非0和非1的數(shù)據(jù)后,程序會要求玩家進行重新輸入,會再次進入循環(huán),實際上就已經(jīng)相當于另類的異常處理。
void game(){ char mine[ROWS][COLS] = { 0 };//存取放置好雷的信息的雷盤 char show[ROWS][COLS] = { 0 };//存取展示給用戶的信息的雷盤 Init_board(mine, ROWS, COLS, "0");//初始化雷盤 Init_board(show, ROWS, COLS, "*");//初始化展示的雷盤 Set_mine(mine, ROW, COL,EASY_COUNT);//埋雷 Display_board(show, ROW, COL);//展示想要展示雷盤 Find_mine(mine, show, ROWS, COLS);//排雷游戲開始}
分析:
1.為什么要建立兩個雷盤?第一個雷盤是我們用來初始化雷的,即埋雷的,第二個雷盤是用來顯示給玩家的,即顯示玩家在哪個位置排雷了,并且以這個位置為中心的3*3的格子里有多少雷,也許大家會問,一個雷盤不好嗎?一個雷盤當然也沒有問題,但兩個雷盤能夠更好的對后續(xù)操作進行更好的處理,特別是我們在計算以我們要掃的格子為中心3*3范圍內(nèi)有多少雷時,第一個雷盤我們初始化了為1*11,這樣是為了我們更好的計算我們要掃的位置處周圍有多少雷。
給大家展示一下兩個雷盤:
?左邊的雷盤為埋好雷的雷盤,右邊的雷盤為呈現(xiàn)給玩家的雷盤。
2、初始化的第一個雷盤(11*11),我們將其全部都初始化為0,在后續(xù)的埋雷的過程中,將雷的位置的數(shù)據(jù)賦值為1,初始化展示的雷盤是將所有的位置的數(shù)據(jù)初始化為字符"*",后面我們排雷后將其賦值為我們排的地方的周圍存在的雷的數(shù)量。
3.展示雷盤和初始化雷盤不一樣,展示雷盤只需要用9*9即可,并不需要將11*11都展示出來,11*11只是為了我們更好的計算掃雷的位置周圍的雷的數(shù)量。
void Init_board(char board[ROWS][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++) { board[i][j] = set; } }}
分析:
雷盤初始化函數(shù)并不復(fù)雜,簡單的運用for循環(huán)即可,需要注意的是,我們要根據(jù)初始化的雷盤不同在函數(shù)的最后一個參數(shù)的位置填入不同的字符。
void Display_board(char board[ROWS][COLS], int row, int col){ int i = 0; int j = 0; for (i = 0; i <=row; i++) { printf("%d ", i); } printf("/n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("/n"); }}
分析:
1.該展示函數(shù)中,第一個for循環(huán)是為了顯示出列坐標來,方便玩家后續(xù)進行輸出想要掃雷的坐標。
2.內(nèi)層for循環(huán)前面的printf("%d",i)是為了顯示出橫坐標來坐標來。
3.需要注意的是不要忘了換行操作!
4.展示函數(shù)從1到9展示即可,因為不需要展示0下標和10下標的,這兩個下標只是為了我們方便計算周圍雷的數(shù)量,因為我們不需要考慮邊緣位置的特殊性。
void Set_mine(char mine[ROWS][COLS], int row, int col,int count){ while (count) { int x = rand() % 9 + 1; int y = rand() % 9 + 1; if (mine[x][y] == "0") { mine[x][y] = "1"; count--; } }}
分析:
1.這個函數(shù)中count為我們想要埋雷的數(shù)量,每成功埋一個雷,count就會減1,當count為0時,埋雷全部結(jié)束,此時也將跳出循環(huán)。
2.這個函數(shù)中我們在生成雷的位置時之所以要+1的原因是因為,在前面我們開辟的是一個11*11的雷盤,我們想要埋雷的位置或者說我們想要在數(shù)組中對應(yīng)的埋雷的位置是1到9,而對8取模得到的結(jié)果范圍為0到8,加1之后為1到9。
3.為什么要將雷的位置的數(shù)據(jù)賦值為1?是為了在后面計算周圍雷得數(shù)量,即將周圍坐標的數(shù)據(jù)加起來即可得到周圍雷的數(shù)量之和。
void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols){ int x = 0; int y = 0; int win = 0; while (win < (rows - 2) * (cols - 2) - EASY_COUNT) { printf("請輸入你要排查的坐標:"); scanf("%d %d", &x, &y); if (x > ROW || x<0 || y>COL || y < 0) { printf("輸入錯誤,請重新輸入!/n"); } else { if (mine[x][y] == "1") { printf("很遺憾,你被炸死了!/n"); Display_board(mine, ROW, COL); break; } else { show[x][y] = count_num(mine, x, y)+"0"; Display_board(show, ROW, COL); win++; } } } if (win == (rows - 2) * (cols - 2) - EASY_COUNT) { printf("排雷成功!/n"); }}static int count_num(char mine[ROWS][COLS], int x, int y){ return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x + 1][y - 1] + mine[x + 1][y + 1] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x][y - 1]-8*"0";}
分析:
1.while后面的括號的意義:就是當我們掃完全部的雷后就跳出循環(huán)并通過后面的if條件進行判斷是否將雷完全掃完,如果掃完就輸出掃雷成功。
2.在輸入坐標后,有兩個分支,第一個分支就是如果坐標對應(yīng)的位置是1,即雷,就會顯示掃雷失敗,,如果不是雷,就跳轉(zhuǎn)到定義的count_num()計算該坐標周圍雷的數(shù)量,該函數(shù)的實現(xiàn)就是將周圍坐標所存儲的值相加,減去8*‘0’,至于為什么需要減去字符0呢?因為我們在開辟雷盤時定義的數(shù)據(jù)類型是字符型,此處通過計算得到的數(shù)據(jù)是整型,減去‘0’之后得到的數(shù)據(jù)即為字符型真正對應(yīng)的整型,后面存入要展示的雷盤時加上‘0’,也是為了將其由整型轉(zhuǎn)換為字符型,方便存入雷盤中。
#include
#include #include #define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10void menu();//菜單函數(shù)聲明void game();//游戲主初始化函數(shù)聲明void Init_board(char board[ROWS][COLS], int rows, int cols, char ch);//初始化函數(shù)聲明void Set_mine(char mine[ROWS][COLS], int row, int col,int count);//埋雷函數(shù)聲明void Display_board(char board[ROWS][COLS], int row, int col);//展示函數(shù)聲明void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);//掃雷函數(shù)聲明 分析:
ROW即為雷盤的真正行數(shù),COL即為雷盤的真正列數(shù),EASY_COUNT即為雷的數(shù)量,如果大家想要提高游戲的難度,可以通過改變ROW、COL、EASY_COUNT即可。
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"http://游戲函數(shù)void game(){ char mine[ROWS][COLS] = { 0 };//存取放置好雷的信息的雷盤 char show[ROWS][COLS] = { 0 };//存取展示給用戶的信息的雷盤 Init_board(mine, ROWS, COLS, "0");//初始化雷盤 Init_board(show, ROWS, COLS, "*");//初始化展示的雷盤 Set_mine(mine, ROW, COL,EASY_COUNT);//埋雷 Display_board(show, ROW, COL);//展示想要展示雷盤 Find_mine(mine, show, ROWS, COLS);//排雷游戲開始}void test(){ srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請輸入->"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲!/n"); break; } } while (input);}int main(){ test(); return 0;}
#pragma once#include
#include #include #define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10void menu();//菜單函數(shù)聲明void game();//游戲主初始化函數(shù)聲明void Init_board(char board[ROWS][COLS], int rows, int cols, char ch);//初始化函數(shù)聲明void Set_mine(char mine[ROWS][COLS], int row, int col,int count);//埋雷函數(shù)聲明void Display_board(char board[ROWS][COLS], int row, int col);//展示函數(shù)聲明void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);//掃雷函數(shù)聲明
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"http://菜單void menu(){ printf("***********************/n"); printf("******* 1.play ******/n"); printf("******* 0.exit ******/n"); printf("***********************/n");}//初始化函數(shù)void Init_board(char board[ROWS][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++) { board[i][j] = set; } }}//展示函數(shù)void Display_board(char board[ROWS][COLS], int row, int col){ int i = 0; int j = 0; for (i = 0; i <=row; i++) { printf("%d ", i); } printf("/n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("/n"); }}//埋雷函數(shù)void Set_mine(char mine[ROWS][COLS], int row, int col,int count){ while (count) { int x = rand() % 9 + 1; int y = rand() % 9 + 1; if (mine[x][y] == "0") { mine[x][y] = "1"; count--; } }}//掃雷函數(shù)void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols){ int x = 0; int y = 0; int win = 0; while (win < (rows - 2) * (cols - 2) - EASY_COUNT) { printf("請輸入你要排查的坐標:"); scanf("%d %d", &x, &y); if (x > ROW || x<0 || y>COL || y < 0) { printf("輸入錯誤,請重新輸入!/n"); } else { if (mine[x][y] == "1") { printf("很遺憾,你被炸死了!/n"); Display_board(mine, ROW, COL); break; } else { show[x][y] = count_num(mine, x, y)+"0"; Display_board(show, ROW, COL); win++; } } } if (win == (rows - 2) * (cols - 2) - EASY_COUNT) { printf("排雷成功!/n"); }}static int count_num(char mine[ROWS][COLS], int x, int y){ return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x + 1][y - 1] + mine[x + 1][y + 1] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x][y - 1]-8*"0";}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/123071.html
摘要:新人小白的第一篇博客,有什么不好之處望多提意見。這個掃雷小游戲主要是基于二維數(shù)組,循環(huán)與基本的函數(shù)知識等。請輸入坐標提示玩家輸入坐標。換行是為了看著好看,要不然打印出來的數(shù)組會變形的。用來接收判斷輸贏的函數(shù)的返回值。 ???????新人小白的第一篇博客,有什么不好之處望多提意見。 ? ? ?...
摘要:設(shè)計實現(xiàn)掃雷游戲大致思路創(chuàng)建文件想法實現(xiàn)設(shè)計一個函數(shù),實現(xiàn)建議菜單循環(huán)和分支選擇游戲選項創(chuàng)造一個掃雷版面版面的大小最后是要可控的如何存放雷和版面的信息呢考慮排查雷時候的思路,我們要判斷該位置周圍個格子里面是否有雷初始化 ...
摘要:條消息語言入門三子棋語言實現(xiàn)詳細版的博客博客條消息語言入門三子棋語言實現(xiàn)詳細版的博客博客我們將雷盤初始化為統(tǒng)一的符號。 目錄 1.原理簡介 2.分布目標及代碼實現(xiàn) 3.總結(jié) 1.原理簡介 ?首先我們需要一個空的雷盤,在其中隨機埋入十枚雷,當我們排這顆雷時,若此位置為雷,則游戲失敗,若不...
摘要:每成功排一次雷,我們都要展示雷盤當場上剩下的格子數(shù)等于雷數(shù)時,游戲勝利,玩家踩雷時,游戲結(jié)束,所以我們這是一個判斷輸贏的函數(shù)。 前言:寫完三子棋后,慢慢地熟悉了這種...
摘要:作者時間網(wǎng)站地址摘要語言實現(xiàn)我們小時候玩過的掃雷游戲,最近看到了一些掃雷游戲的簡單實現(xiàn),但是總有功能上的缺失,玩起來不那么的原汁原味,因此我增加了一些新功能確保玩家首次排雷一定不會炸死。 ...
閱讀 984·2021-11-23 09:51
閱讀 3470·2021-11-22 12:04
閱讀 2716·2021-11-11 16:55
閱讀 2920·2019-08-30 15:55
閱讀 3221·2019-08-29 14:22
閱讀 3351·2019-08-28 18:06
閱讀 1240·2019-08-26 18:36
閱讀 2126·2019-08-26 12:08