基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲
掃雷游戲的實(shí)現(xiàn),必須要考慮其中包含的功能。
首先是在游戲開(kāi)始時(shí)的初始界面,規(guī)定用戶輸入1則游戲開(kāi)始,輸入2則游戲結(jié)束,再去創(chuàng)建兩個(gè)二維數(shù)組,一個(gè)存放用戶看到的界面,一個(gè)存放埋雷的雷盤(pán),在進(jìn)行初始化兩個(gè)二維數(shù)組,用戶界面展示為一個(gè)10*10的界面,首行和首列存儲(chǔ)'0'-'9',給用戶直觀的可以尋找想要搜索的元素,雷區(qū)初始化為' 0 ',用戶界面初始化為'?'。
在進(jìn)行雷位置的初始化,使用數(shù)字幀表示,用 數(shù)字幀%9+1 得到一個(gè)1-9的數(shù)字,可以取得一個(gè)[1-9][1-9]的坐標(biāo),建立一個(gè) i == 0 ,i是小于等于10的, 創(chuàng)建一個(gè)循環(huán)次數(shù)為10的循環(huán),在判斷此坐標(biāo)是否為' 0 ',若是' 0 ',則將其賦為'1',在進(jìn)行i++ ,再將如果不是'0',則直接退出本次循環(huán),直到1==10,則循環(huán)中止,一共在其中埋10顆雷。
接下來(lái)用戶輸入想要搜索的坐標(biāo),因?yàn)?*9的雷盤(pán)一共有81個(gè)元素,其中存在10顆雷,所以如果搜索71個(gè)元素都沒(méi)有雷,則可以判定掃雷成功,所以創(chuàng)建一個(gè)71次的循環(huán),如果為71的話,則游戲成功,每次掃雷的時(shí)候,需要將用戶看到界面的此次掃雷位置賦為此位置周圍雷的數(shù)量,,則創(chuàng)建一個(gè)函數(shù),此函數(shù)返回值為雷盤(pán)上對(duì)應(yīng)的坐標(biāo)周圍存的元素-8*'0',得到一個(gè)數(shù)字,再將此數(shù)字進(jìn)行+'0',將其轉(zhuǎn)為字符型;傳入用戶界面的對(duì)應(yīng)坐標(biāo).在進(jìn)行下次循環(huán).如果循環(huán)次數(shù)為71是,則判定掃雷成功。
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> #include<string.h> #define Row 11 #define Col 11 #define Rows 10 #define Cols 10 void print() { printf("**************************************\n"); printf("************1.開(kāi)始游戲****************\n"); printf("************2.退出游戲****************\n"); printf("**************************************\n"); } //初始化棋盤(pán) void init(char board[Row][Col], char c) { for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { board[i][j] = c; } } } //打印用戶看到的界面 void printboard(char board[Row][Col]) { for (int i = 0; i < Rows; i++) { printf("%d ", i); } printf("\n"); for (int i = 1; i < Rows; i++) { printf("%d ", i); for (int j = 1; j < Cols; j++) { printf("%c ", board[i][j]); } printf("\n"); } } //打印雷盤(pán) void print_mineboard(char board[Row][Col]) { for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { printf("%c ", board[i][j]); } printf("\n"); } } //初始化10個(gè)雷的位置 void set_mine(char mine_board[Row][Col]) { int i = 0; do { int row = rand() % 9 + 1; int col = rand() % 9 + 1; if (mine_board[row][col] == '0') { mine_board[row][col] = '1'; i++; } else { continue; } } while (i <= 10); } int player_enter(char board[Row][Col],int x,int y) { //返回雷子數(shù)量 return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] - 8 * '0'; } //游戲函數(shù) void game() { char human_board[Row][Col]; char mine_board[Row][Col]; //2.初始化兩個(gè)棋盤(pán) char one = '?'; char two = '0'; init(human_board, one); init(mine_board, two); //3.棋盤(pán)2 雷的位置初始化 set_mine(mine_board); //4.打印棋盤(pán) printf("\n"); //5.玩家輸入坐標(biāo)位置 for (int i = 1; i <= 71; i++) { printboard(human_board); int x = 0; int y = 0; printf("請(qǐng)輸入你要尋找的坐標(biāo)(x,y):"); scanf("%d %d", &x, &y); //判斷坐標(biāo)是否正確 if (x > 0 && x < 10 && y>0 && y < 10 && human_board[x][y] == '?') { //判斷坐標(biāo)處是否有雷 if (mine_board[x][y] == '1') { printf("你被炸死了!\n"); //給他死個(gè)明白 print_mineboard(mine_board); break; } else { //輸出雷子數(shù)量 human_board[x][y] = player_enter(mine_board, x, y) + '0'; system("cls"); } } else { printf("坐標(biāo)有誤,請(qǐng)重新輸入!\n"); i--; } if (i == 71) { printf("你真牛逼,這都能贏!\n"); } } } int main() { srand((unsigned int)time(0)); //1.創(chuàng)建登錄界面 print(); int i = 0; //用戶選擇接下來(lái)的操作 while (1) { int choose = 0; if (i == 0) { printf("請(qǐng)選擇你接下來(lái)想要進(jìn)行的操作:"); i++; } else { printf("還要玩嗎?\n"); printf("1 yes 2 no\n"); } scanf("%d", &choose); if (choose == 1) { game(); } else { if (choose == 2) { break; } else { printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n"); continue; } } } return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Eclipse中C++連接mysql數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了Eclipse中C++連接mysql數(shù)據(jù)庫(kù) ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06c++動(dòng)態(tài)內(nèi)存管理詳解(new/delete)
作為一名編程初學(xué)者,通常學(xué)習(xí)中,發(fā)生內(nèi)存錯(cuò)誤是件非常麻煩的事情,下面這篇文章主要給大家介紹了關(guān)于c++動(dòng)態(tài)內(nèi)存管理new/delete的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03C++實(shí)現(xiàn)小型復(fù)數(shù)計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)小型復(fù)數(shù)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06C語(yǔ)言編程中實(shí)現(xiàn)二分查找的簡(jiǎn)單入門實(shí)例
這篇文章主要介紹了C語(yǔ)言編程中實(shí)現(xiàn)二分查找的簡(jiǎn)單入門實(shí)例,需要的朋友可以參考下2015-12-12深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文件數(shù)
本篇文章是對(duì)linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文件數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++使用鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
這篇文章主要介紹了C++使用鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語(yǔ)言Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)
iniparser是針對(duì)INI文件的解析器。ini文件則是一些系統(tǒng)或者軟件的配置文件。本文就來(lái)介紹一下如何利用Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)吧2023-03-03