亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言二維數(shù)組應(yīng)用之掃雷游戲

 更新時(shí)間:2022年06月07日 11:00:45   作者:迷亭君  
這篇文章主要為大家詳細(xì)介紹了C語言二維數(shù)組應(yīng)用之掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言實(shí)現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下

上次用數(shù)組完成了一個(gè)井字棋,接下來用數(shù)組完成一個(gè)簡(jiǎn)易版掃雷。

《掃雷》是一款大眾類的益智小游戲,于1992年發(fā)行。游戲目標(biāo)是在短的時(shí)間內(nèi)根據(jù)格子出現(xiàn)的數(shù)字找出所有非雷格子,同時(shí)避免踩雷,踩到一個(gè)雷即全盤皆輸。

根據(jù)上述定義,我們可知,游戲勝利的要求是:找出所有非雷的格子。

現(xiàn)在我們簡(jiǎn)單梳理一下完成游戲的思路

一、變量定義

1、首次要定義地圖變量,這里注意要定義兩個(gè)二維數(shù)組,一個(gè)用來存放地雷的分布情況,另一個(gè)存放玩家看見的地圖。 

     這里以9*9的地圖為例

     char playerMap[9][9];

     char mineMap[9]9];

     剩下的操作都在這兩個(gè)地圖上進(jìn)行

二、游戲步驟

1、初始化兩張地圖,即

     將玩家所見的地圖初始化為全為草地的樣子(這里用*代表草地);

     將地雷分布地圖用隨機(jī)數(shù)生成10個(gè)地雷,有雷的位置用 '1' 表示,沒有雷的位置用 '0' 表示;

     需注意 (1)、隨機(jī)生成的地雷位置不能超出地圖邊界;

                 (2)、生成地雷的位置在生成前必須沒有地雷;

2、打印地圖給玩家看,這里打印的是玩家地圖 playerMap ;

3、玩家操作,輸入所要揭開的位置坐標(biāo);

     需注意 (1)、需要判斷玩家所輸入的坐標(biāo)是否超界;

                 (2)、需要判斷玩家所輸入的坐標(biāo)是否已經(jīng)被揭開;

4、判斷玩家選擇位置是否是雷,

     若是,則輸出"你輸了",跳到6;

     若不是,更改玩家看見地圖的信息,即顯示玩家所選位置的周圍有幾個(gè)雷,進(jìn)入下一步;

5、打印玩家地圖,即將剛才地圖的更新情況告知玩家;

5、判斷玩家是否勝利(未被揭開的位置的個(gè)數(shù)是否和雷的個(gè)數(shù)一致,一致代表玩家已經(jīng)找出了所有不是雷的位置,玩家勝利);

     若還未勝利,回到3;

     若勝利,則輸入"你贏了",進(jìn)入下一步;

6、打印地雷的分布地圖;

7、游戲結(jié)束。

三、代碼實(shí)現(xiàn)

#define _CRT_SECURE_NO_WARNINGS
#define MAX_ROW 9
#define MAX_COL 9
#define MAX_MINE_NUM 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
?
//菜單函數(shù)
int menu(){
?? ?printf("--------------\n");
?? ?printf("1.開始游戲\n");
?? ?printf("2.退出游戲\n");
?? ?printf("--------------\n");
?? ?int choice = 0;
?? ?scanf("%d", &choice);
?? ?return choice;
}
?
//初始化兩張地圖
void initMap(char playerMap[MAX_ROW][MAX_COL],
?? ?char mineMap[MAX_ROW][MAX_COL]){
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?playerMap[row][col] = '*';
?? ??? ?}
?? ?}
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?mineMap[row][col] = '0';
?? ??? ?}
?? ?}
?? ?//隨機(jī)生成10個(gè)雷
?? ?int mineNum = 0;
?? ?while (mineNum<MAX_MINE_NUM){
?? ??? ?int row = rand() % 9;
?? ??? ?int col = rand() % 9;
?
?? ??? ?if (mineMap[row][col] == '0'){
?? ??? ??? ?mineMap[row][col] = '1';
?? ??? ??? ?mineNum++;
?? ??? ?}
?? ?}
}
?
//打印地圖
void printMap(char theMap[MAX_ROW][MAX_COL]){
?? ?printf(" ?|");
?? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ?printf("%d |", col);
?? ?}
?? ?printf("\n");
?? ?printf("--+--+--+--+--+--+--+--+--+--+\n");
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?printf("%d ", row);
?? ??? ?printf("|");
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?printf("%c |", theMap[row][col]);
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?printf("--+--+--+--+--+--+--+--+--+--+\n");
?? ?}
}
?
?
//改變玩家所見地圖信息
void updateMapInfor(char playerMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL],int row, int col){
?? ?//定義所選位置周圍的地雷的個(gè)數(shù)
?? ?int numOfMine = 0;
?? ?for (int r = row - 1; r <= row + 1; r++){
?? ??? ?for (int c = col - 1; c <= col + 1; c++){
?? ??? ??? ?if (r >= 0 && r < MAX_ROW
?? ??? ??? ??? ?&&c >= 0 && c < MAX_COL
?? ??? ??? ??? ?&&mineMap[r][c] == '1'){
?? ??? ??? ??? ?numOfMine++;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?playerMap[row][col] = numOfMine + '0';
}
?
?
//玩家操作,
//返回值代表玩家所選位置是否是雷
//是雷返回1,不是雷返回0
int playDo(char playerMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]) {
?? ?printf("輸入橫縱坐標(biāo)選擇沒有雷的位置,(橫 縱)\n");
?? ?int row = 0;
?? ?int col = 0;
?? ?while (1){
?? ??? ?scanf("%d %d", &row, &col);
?? ??? ?if (playerMap[row][col] == '*'
?? ??? ??? ?&&row >= 0 && row < MAX_ROW
?? ??? ??? ?&&col >= 0 && col < MAX_COL) {
?? ??? ??? ?//被選位置未被揭開,且被選位置沒有越界
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?printf("您的位置輸入有誤,可能存在如下問題\n");
?? ??? ?printf("1.位置選擇越界\n2.所選位置已經(jīng)被揭開\n");
?? ??? ?printf("請(qǐng)您重新輸入位置\n");
?? ?}
?? ?//判斷是不是雷,如果是
?? ?if (mineMap[row][col] == '1'){
?? ??? ?return 1;
?? ?}
?? ?else{//否則(不是雷)更新地圖信息
?? ??? ?updateMapInfor(playerMap, mineMap, row, col);
?? ??? ?return 0;
?? ?}
?? ?
}
?
//判斷玩家是否勝利(所有雷是否已經(jīng)被找完),返回值為1代表勝利,0代表還未勝利
//判斷方法為,檢查玩家地圖上未揭起的位置是否和雷的個(gè)數(shù)相等
//(可揭起的一定不是雷,未揭起的可能是雷)
//若未揭起的個(gè)數(shù)大于雷的個(gè)數(shù)說明游戲還未結(jié)束
int isWin(char playerMap[MAX_ROW][MAX_COL]){
?? ?//玩家地圖中草坪的個(gè)數(shù),也就是未揭起位置的個(gè)數(shù),初始化為0
?? ?int numOfGrass = 0;
?? ?for (int row = 0; row < MAX_ROW; row++){
?? ??? ?for (int col = 0; col < MAX_COL; col++){
?? ??? ??? ?if (playerMap[row][col] == '*'){
?? ??? ??? ??? ?numOfGrass++;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?if (numOfGrass == MAX_MINE_NUM){
?? ??? ?return 1;
?? ?}
?? ?return 0;
}
?
void game(){
?? ?//玩家看見的地圖
?? ?char playerMap[MAX_ROW][MAX_COL];
?? ?//埋雷地圖
?? ?char mineMap[MAX_ROW][MAX_COL];
?? ?//1.初始化兩張地圖,
?? ?//一張玩家看見的map1,草地全用*表示
?? ?//一張地雷地圖map2,地雷的位置隨機(jī)生成,有雷為1,沒雷為0
?? ?initMap(playerMap, mineMap);
?? ?//2.打印map1
?? ?printMap(playerMap);
?? ?//TODO
?? ?//printMap(mineMap);
?? ?while (1){
?? ??? ?//3.玩家操作,輸入坐標(biāo)
?? ??? ?//判斷玩家選擇的位置是否是雷
?? ??? ?//若是則跳出循環(huán)結(jié)束
?? ??? ?if (playDo(playerMap, mineMap) == 1){
?? ??? ??? ?printf("你輸了\n");
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?//判斷所有雷是否已經(jīng)被找完
?? ??? ?//是,則游戲勝利
?? ??? ?if (isWin(playerMap)==1){
?? ??? ??? ?printf("你贏了\n");
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?//否,則繼續(xù)游戲
?? ??? ?//4.打印map1
?? ??? ?printMap(playerMap);
?? ?}
?? ?//5.判斷游戲是否結(jié)束,否回到3
?? ?//6.是,游戲結(jié)束,打印地雷位置圖
?? ?printMap(mineMap);
}
?
int main(){
?? ?//菜單,1.開始游戲 ? 2.退出游戲
?? ?int choice = 0;
?? ?srand((unsigned int)time(0));
?? ?while (1){
?? ??? ?choice = menu();
?? ??? ?if (choice == 1){
?? ??? ??? ?game();
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?else if (choice == 2){
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?else{
?? ??? ??? ?printf("您的輸入有誤,請(qǐng)重新輸入\n");
?? ??? ?}
?? ?}
?? ?system("pause");
?? ?return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++全密碼生成的實(shí)現(xiàn)代碼

    C++全密碼生成的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C++全密碼生成的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C語言實(shí)現(xiàn)掃雷游戲

    C語言實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    C++簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    RPC是遠(yuǎn)程調(diào)用系統(tǒng)簡(jiǎn)稱,它允許程序調(diào)用運(yùn)行在另一臺(tái)計(jì)算機(jī)上的過程,就像調(diào)用本地的過程一樣。本文將用C++簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊,感興趣的可以了解一下
    2023-04-04
  • C++右值引用問題解決

    C++右值引用問題解決

    本文主要介紹了C++右值引用問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作

    C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作

    這篇文章主要介紹了C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Qt實(shí)現(xiàn)網(wǎng)易云音樂進(jìn)度條效果

    Qt實(shí)現(xiàn)網(wǎng)易云音樂進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)網(wǎng)易云音樂進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 利用Matlab繪制一個(gè)可愛的南瓜燈

    利用Matlab繪制一個(gè)可愛的南瓜燈

    這篇文章主要為大家介紹了如何利用Matlab繪制一個(gè)可愛的南瓜燈!文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-02-02
  • 常用的C++標(biāo)準(zhǔn)庫頭文件小結(jié)

    常用的C++標(biāo)準(zhǔn)庫頭文件小結(jié)

    C++標(biāo)準(zhǔn)庫定義了一系列函數(shù)、宏和對(duì)象,以實(shí)現(xiàn)跨團(tuán)隊(duì)、跨平臺(tái)的高效且具有卓越性能的標(biāo)準(zhǔn)化 C++ 代碼, 本文介紹常用的C++標(biāo)準(zhǔn)庫頭文件,需要的朋友可以參考下
    2023-11-11
  • C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法

    C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法,簡(jiǎn)單說明了哈夫曼樹的原理,并結(jié)合具體實(shí)例形式分析了C++實(shí)現(xiàn)哈夫曼樹的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • C++中vector迭代器失效問題詳解

    C++中vector迭代器失效問題詳解

    vector是向量類型,它可以容納許多類型的數(shù)據(jù),如若干個(gè)整數(shù),所以稱其為容器,這篇文章主要給大家介紹了關(guān)于C++中vector迭代器失效問題的相關(guān)資料,需要的朋友可以參考下
    2021-11-11

最新評(píng)論