最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年06月16日 09:24:36   作者:技術(shù)新人王小明  
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

1. 規(guī)則

隨便點(diǎn)一個(gè)格子,會(huì)有一塊,上面的數(shù)字就代表數(shù)字周圍八個(gè)格子會(huì)有幾個(gè)雷,是1他周圍就只有1個(gè)雷,2就有兩個(gè)雷······;
最終任務(wù)就是點(diǎn)開所有沒有雷的格子,則取得更好的分?jǐn)?shù),如果點(diǎn)開的格子是雷,則游戲結(jié)束。

2. 編寫思路

2.1 編寫選擇界面

同上個(gè)小游戲一樣,首先編寫選擇界面,輸入1為開始游戲,輸入2則退出游戲。

void Menu()
{
 printf("##########################\n");
 printf("##   1:Play    2:Exit   ##\n");
 printf("##########################\n");
 printf("請(qǐng)輸入# ");
}

2.2 編寫執(zhí)行程序

執(zhí)行程序需要檢測(cè)點(diǎn)開的格子(這里輸入的方式為輸入坐標(biāo))周圍的八個(gè)格子有多少個(gè)雷,并在該格子上顯示雷的個(gè)數(shù)。

int GetMines(char mine[][COL], int row, int col, int x, int  y)
{
 return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + \
  mine[x][y - 1] + mine[x][y + 1] + \
  mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}

2.3 編寫設(shè)置雷的個(gè)數(shù)

宏定義雷的個(gè)數(shù)為NUMS(NUMS 20);然后隨機(jī)排布雷的位置。

void SetMines(char mine_board[][COL], int row, int col)
{
 int count = NUMS;  //設(shè)置雷
 while (count){
  int x = rand() % 10 + 1;
  int y = rand() % 10 + 1;
  if (mine_board[x][y] == '0'){
   mine_board[x][y] = '1';
   count--;
  }
 }
}

2.4 游戲界面的設(shè)置

以二維數(shù)組的方式設(shè)置游戲界面,這里實(shí)際設(shè)置的界面為12x12的格子界面,在前面宏定義行為12(ROW 12)列為12(COL 12);但是顯示為10x10的界面,為方便用戶輸入坐標(biāo),在行和列的前面分布標(biāo)上數(shù)字。

static void ShowLine(int nums)
{
 printf("---");
 for (int i = 0; i < nums; i++){
  printf("-");
 }
 printf("\n");
}
void ShowBoard(char show_board[][COL], int row, int col)
{
 printf(" ");
 for (int i = 1; i < row - 1; i++){   //行的數(shù)字
  printf("  %2d", i);
 }
 printf("\n");
 ShowLine(2 * col + col + 4);//這里傳入的參數(shù)是由于‘-'占位原因,可以根據(jù)自己實(shí)際界面調(diào)整;
 for (int i = 1; i < row - 1; i++){ //列的數(shù)組
  printf("%2d|", i);
  for (int j = 1; j < col - 1; j++){
   printf(" %c |", show_board[i][j]);
  }
  printf("\n");
  ShowLine(2 * col + col + 4);
 }
}

2.5 游戲邏輯的編寫

在編寫游戲邏輯的時(shí)候,首先傳入我們?cè)O(shè)置的游戲棋盤;由于棋盤以二維數(shù)組方式設(shè)置,所以在使用前需要初始化,所以我們用memset來快速設(shè)置。
將展示前的棋盤空位都設(shè)置為 *,然后將游戲使用的棋盤空位設(shè)置為 0;
生成隨機(jī)雷的個(gè)數(shù),將其傳入棋盤,設(shè)置雷;剩余空格的個(gè)數(shù)用count來表示;
開始游戲邏輯,輸入棋盤,傳入用戶輸入的坐標(biāo),然后檢測(cè)用戶輸入的坐標(biāo)是否越界;越界則提示用戶輸入越界,需要重新輸入;如果沒越界則游戲繼續(xù)進(jìn)行,檢測(cè)用戶輸入的坐標(biāo)是否已經(jīng)點(diǎn)開,如果點(diǎn)開則提示用戶重新輸入;然后判斷點(diǎn)開的是不是雷,如果是游戲結(jié)束,如果不是游戲繼續(xù),直到所有空格都點(diǎn)開count=0結(jié)束循環(huán);
如果剩余空格count不為0游戲結(jié)束,則說明踩到雷;否則說明雷全被排完,然后向用戶展示所有雷的分布范圍。

void Game()
{
 char show_board[ROW][COL];
 char mine_board[ROW][COL];
 memset(show_board, '*', sizeof(show_board));
 memset(mine_board, '0', sizeof(mine_board));
 srand((unsigned long)time(NULL));

 SetMines(mine_board, ROW, COL);
 int count = (ROW - 2)*(COL - 2) - NUMS;
 int x = 0;
 int y = 0;
 do{
  ShowBoard(show_board, ROW, COL);
  printf("請(qǐng)輸入位置# ");
  scanf("%d %d", &x, &y);
  if (x<1 || x>10 || y<1 || y>10){
   printf("輸入越界,請(qǐng)重新輸入!\n");
   continue;
  }
  if (show_board[x][y] != '*'){//證明位置被排過了
   printf("該位置已被排除,請(qǐng)重新輸入!\n");
   continue;
  }
  if (mine_board[x][y] == '1'){//沒點(diǎn)到雷
   break;
  }
  int num = GetMines(mine_board, ROW, COL, x, y);
  show_board[x][y] = num + '0';
  count--;

 } while (count > 0);
 if (count > 0){
  printf("you loss!\n");
 }
 else{
  printf("you win!\n");
 }
 printf("你輸了,下面是雷區(qū)的分布\n");
 ShowBoard(mine_board, ROW, COL);
 printf("play again? \n");
}

2.6 設(shè)定游戲開始o(jì)r退出

這里設(shè)定如果用戶輸入的為1,則開始游戲;輸入2 則直接退出,如果輸入其他數(shù)字則提升用戶輸入錯(cuò)誤。

int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 2:
   quit = 1;
   break;
  default:
   printf("輸入有誤,請(qǐng)重新輸入\n");
  }
 }
 system("pause");
 return 0;
}

3. 匯總代碼

然后將上述代碼整合起來,匯總?cè)缦拢?/p>

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<windows.h>

#pragma warning(disable:4996)

#define ROW 12
#define COL 12
#define NUMS 20

void Menu()
{
 printf("##########################\n");
 printf("##   1:Play    2:Exit   ##\n");
 printf("##########################\n");
 printf("請(qǐng)輸入# ");
}
void SetMines(char mine_board[][COL], int row, int col)
{
 int count = NUMS;  //設(shè)置雷
 while (count){
  int x = rand() % 10 + 1;
  int y = rand() % 10 + 1;
  if (mine_board[x][y] == '0'){
   mine_board[x][y] = '1';
   count--;
  }
 }
}
int GetMines(char mine[][COL], int row, int col, int x, int  y)
{
 return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + \
  mine[x][y - 1] + mine[x][y + 1] + \
  mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}

static void ShowLine(int nums)
{
 printf("---");
 for (int i = 0; i < nums; i++){
  printf("-");
 }
 printf("\n");
}

void ShowBoard(char show_board[][COL], int row, int col)
{
 printf(" ");
 for (int i = 1; i < row - 1; i++){   //行的數(shù)字
  printf("  %2d", i);
 }
 printf("\n");
 ShowLine(2 * col + col + 4);

 for (int i = 1; i < row - 1; i++){ //列的數(shù)組
  printf("%2d|", i);
  for (int j = 1; j < col - 1; j++){
   printf(" %c |", show_board[i][j]);
  }
  printf("\n");
  ShowLine(2 * col + col + 4);
 }
}
void Game()
{
 char show_board[ROW][COL];
 char mine_board[ROW][COL];
 memset(show_board, '*', sizeof(show_board));
 memset(mine_board, '0', sizeof(mine_board));
 srand((unsigned long)time(NULL));

 SetMines(mine_board, ROW, COL);
 int count = (ROW - 2)*(COL - 2) - NUMS;
 int x = 0;
 int y = 0;
 do{
  ShowBoard(show_board, ROW, COL);
  printf("請(qǐng)輸入位置# ");
  scanf("%d %d", &x, &y);
  if (x<1 || x>10 || y<1 || y>10){
   printf("輸入越界,請(qǐng)重新輸入!\n");
   continue;
  }
  if (show_board[x][y] != '*'){//證明位置被排過了
   printf("該位置已被排除,請(qǐng)重新輸入!\n");
   continue;
  }
  if (mine_board[x][y] == '1'){//沒點(diǎn)到雷
   break;
  }
  int num = GetMines(mine_board, ROW, COL, x, y);
  show_board[x][y] = num + '0';
  count--;

 } while (count > 0);
 if (count > 0){
  printf("you loss!\n");
 }
 else{
  printf("you win!\n");
 }
 printf("你輸了,下面是雷區(qū)的分布\n");
 ShowBoard(mine_board, ROW, COL);
 printf("play again? \n");
}

int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 2:
   quit = 1;
   break;
  default:
   printf("輸入有誤,請(qǐng)重新輸入\n");
  }
 }
 system("pause");
 return 0;
}

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

相關(guān)文章

  • C語(yǔ)言小游戲之簡(jiǎn)易版三子棋(棋盤可自由擴(kuò)展)

    C語(yǔ)言小游戲之簡(jiǎn)易版三子棋(棋盤可自由擴(kuò)展)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋游戲,還可以自由擴(kuò)展棋盤大小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++驅(qū)動(dòng)bash的實(shí)現(xiàn)代碼

    C++驅(qū)動(dòng)bash的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++驅(qū)動(dòng)bash的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • c語(yǔ)言 字符串的拼接和分割實(shí)例

    c語(yǔ)言 字符串的拼接和分割實(shí)例

    今天小編就為大家分享一篇c語(yǔ)言 字符串的拼接和分割實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 平衡二叉樹的實(shí)現(xiàn)實(shí)例

    平衡二叉樹的實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了平衡二叉樹的實(shí)現(xiàn)實(shí)例,需要的朋友可以參考下
    2014-02-02
  • C++中const的實(shí)現(xiàn)機(jī)制深入分析

    C++中const的實(shí)現(xiàn)機(jī)制深入分析

    C語(yǔ)言以及C++語(yǔ)言中的const究竟表示什么?其具體的實(shí)現(xiàn)機(jī)制又是如何實(shí)現(xiàn)的呢?本文將對(duì)這兩個(gè)問題進(jìn)行一些分析,需要了解的朋友可以參考下
    2012-12-12
  • C++操作MySQL的實(shí)現(xiàn)示例

    C++操作MySQL的實(shí)現(xiàn)示例

    這篇文章主要介紹了C++操作MySQL的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 基于C語(yǔ)言打造高效便捷的通訊錄管理系統(tǒng)

    基于C語(yǔ)言打造高效便捷的通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何基于C語(yǔ)言打造高效便捷的通訊錄管理系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 利用C語(yǔ)言編寫“剪刀石頭布”小游戲

    利用C語(yǔ)言編寫“剪刀石頭布”小游戲

    這篇文章主要給大家介紹了關(guān)于如何利用C語(yǔ)言編寫“剪刀石頭布”小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法

    C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法

    這篇文章主要介紹了C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下
    2014-10-10
  • c語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)文件 r/w 操作方法

    c語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)文件 r/w 操作方法

    由于在 C 語(yǔ)言中 '\' 一般是轉(zhuǎn)義字符的起始標(biāo)志,故在路徑中需要用兩個(gè) '\' 表示路徑中目錄層次的間隔,也可以使用 '/' 作為路徑中的分隔符,本文重點(diǎn)給大家介紹用c語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)文件 r/w 操作方法,感興趣的朋友一起學(xué)習(xí)吧
    2021-05-05

最新評(píng)論

喀喇| 玛沁县| 团风县| 杂多县| 永年县| 开封县| 石林| 杭锦旗| 榆中县| 榆社县| 和顺县| 嘉定区| 长岛县| 富顺县| 十堰市| 大冶市| 诸暨市| 肃宁县| 万载县| 调兵山市| 自贡市| 谷城县| 大洼县| 鄂伦春自治旗| 新蔡县| 新乡市| 枣庄市| 仁化县| 衡南县| 黄石市| 麻江县| 丘北县| 刚察县| 抚顺市| 贺兰县| 宜章县| 阿拉善盟| 湖北省| 鹤峰县| 余干县| 嘉善县|