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

C語言模擬實現掃雷游戲

 更新時間:2021年01月26日 11:23:18   作者:Skyline-sjc  
這篇文章主要為大家詳細介紹了C語言模擬實現掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

掃雷是Windows系統的經典游戲,下文將利用c語言實現這個經典的小游戲。本版本程序添加了炸彈標記功能。但由于作者水平實現較為死板,此處留坑待以后學習后改進。

Part 1主函數部分:

此部分主要提供用戶界面,不同程序均可利用:

int main()
{
 srand((unsigned int)time(NULL));
 int input = 0;
 do
 {
 menu();
 printf("請選擇:>\n");
 scanf("%d", &input);
 switch (input)
 {
 case 1:
  printf("游戲開始!\n");
  game();
  break;
 case 0:
  printf("退出游戲!\n");
  break;
 default:
  printf("輸入錯誤,請重新輸入!\n");
  break;
 }
 } while (input);
 return 0;
}

Part 2 函數部分:

我們來思考一下函數的組成:

void menu();//實現主函數中菜單
void game();//游戲的核心函數
void InitBoard(char board[ROWS][COLS], int row, int col, char set);//初始化掃雷盤
void DisplayBoard(char board[ROWS][COLS], int row, int col);//可視化掃雷盤
void SetMine(char mine[ROWS][COLS], int row, int col, int count);//設置雷盤
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int count);//尋找雷區(qū)(用戶尋找雷)
int CountMine(char board[ROWS][COLS], int x, int y);//統計周圍雷的數量
void show_recusion(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);//實現點擊一下的擴大化應用
int checkwin(char mine[ROWS][COLS], int row, int col);//檢查是否獲勝

Part 3 整體實現:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASY_COUNT 10
void menu();
void game();
void InitBoard(char board[ROWS][COLS], int row, int col, char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char mine[ROWS][COLS], int row, int col, int count);
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int count);
int CountMine(char board[ROWS][COLS], int x, int y);
void show_recusion(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
int checkwin(char mine[ROWS][COLS], int row, int col);
int main()
{
 srand((unsigned int)time(NULL));
 int input = 0;
 do
 {
 menu();
 printf("請選擇:>\n");
 scanf("%d", &input);
 switch (input)
 {
 case 1:
  printf("游戲開始!\n");
  game();
  break;
 case 0:
  printf("退出游戲!\n");
  break;
 default:
  printf("輸入錯誤,請重新輸入!\n");
  break;
 }
 } while (input);
 return 0;
}
void menu()
{
 printf("****************\n");
 printf("*****1.play*****\n");
 printf("*****0.exit*****\n");
 printf("****************\n");
}
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
 int i = 0, j = 0;
 for (i = 0; i < row; i++)
 {
 for (j = 0; j < col; j++)
 {
  board[i][j] = set;
 }
 }
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)//打印棋盤時 注意人性化設計便于讀取坐標
{
 int i = 0, j = 0;
 printf("-------------掃雷游戲---------------\n");
 for (i = 0; i <= col; 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");
 }
 printf("-------------掃雷游戲---------------\n");
}
void SetMine(char mine[ROWS][COLS], int row, int col, int count)
{
 while (count >= 1)
 {
 int x = rand() % row + 1;
 int y = rand() % col + 1;
 if (mine[x][y] == '0')
 {
  mine[x][y] = '1';
  count--;
 }
 }
}
int CountMine(char board[ROWS][COLS], int x, int y)
{
 int i = 0, j = 0;
 int sum = 0;
 for (i = x - 1; i <= x + 1; i++)
 {
 for (j = y - 1; j <= y + 1; j++)
 {
  sum += board[i][j];
 }
 }
 return sum - 9 * '0';//巧妙利用1 0設計,將字符串轉化為整型輸出
}
void show_recusion(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
 int i = 0, j = 0;

 for (i = x - 1; i <= x + 1; i++)
 {
 for (j = y - 1; j <= y + 1; j++)
 {
  if (show[i][j] != ' ' && i >= 1 && i <=ROW && j >= 1 && j <=COL)
  {
  int temp = CountMine(mine, i, j);
  show[i][j] = temp + '0';
  if (show[i][j] == '0')
  {
   show[x][y] = ' ';
   show_recusion(mine, show, i, j);//遞歸實現掃雷的擴展
  }
  }
 }
 }
}
int checkwin(char show[ROWS][COLS], int row, int col)
{
 int i = 0, j = 0;
 int count = row * col - EASY_COUNT;
 for (i = 1; i <= row; i++)
 {
 for (j = 0; j <= col; j++)
 {
  if (show[i][j] != '*' && show[i][j] != 'B')
  {
  count--;//遍歷檢查是否全部非雷區(qū)已被判斷
  }
 }
 }
 if (count == 0)
 {
 return 1;
 }
 else
 {
 return 0;
 }
}
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int count) //
{
 while (1)
 {
 int input = 0;
 printf("******1 標記雷區(qū) *****\n");//實現掃雷中的標記功能
 printf("******2 輸入坐標 *****\n");//實現掃雷中的輸入功能
 scanf("%d", &input);
 if(input==1){
  printf("請輸入要選擇的坐標:>\n");
  int x, y;
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
  if (show[x][y] == '*')
  {
   show[x][y] = 'B';
   DisplayBoard(show, ROW, COL);
  }
  else
  {
   printf("非法輸入!請重新輸入!\n");
  }
  }
  else
  {
  printf("請重新輸入!\n");
  }
 }
 else if(input==2)
 {
  printf("請輸入要選擇的坐標:>\n");
  int x, y;
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
  if (show[x][y] == '*' || show[x][y]=='B')
  {
   if (mine[x][y] == '1')
   {
   printf("boom!很遺憾您輸了!\n");
   break;
   }
   else
   {
   show[x][y] = CountMine(mine, x, y) + '0';
   if (show[x][y] == '0')
   {
    show[x][y] = ' ';
    show_recusion(mine, show, x, y);
   }
   DisplayBoard(show, row, col);
   if (checkwin(show, ROW, COL) == 1)
   {
    printf("恭喜您獲勝了!\n");
    break;
   }
   }
  }
  else
  {
   printf("重復輸入!請重新輸入!\n");
  }
  }
  else
  {
  printf("請重新輸入!\n");
  }
 }else{
  printf("輸入錯誤!\n");
 }
 }
}
void game()
 {
 char mine[ROWS][COLS];
 char show[ROWS][COLS];
 InitBoard(mine, ROWS, COLS, '0');
 InitBoard(show, ROWS, COLS, '*');
 // DisplayBoard(mine, ROW, COL); //此處代碼為測試用
 DisplayBoard(show, ROW, COL);
 SetMine(mine, ROW, COL, EASY_COUNT);
 // DisplayBoard(mine, ROW, COL); //此處代碼為測試用
 // DisplayBoard(show, ROW, COL);//此處代碼為測試用
 FindMine(show, mine, ROW, COL, EASY_COUNT);
}

Part 4 總結:

掃雷及三子棋 為C語言數組知識、條件語句、函數知識的綜合應用,更多的體現了設計程序的合理性和嚴謹性,即合理設計搭建函數。相比于五子棋需要更多算法知識,掃雷相對較為容易,但依然有很多細節(jié)有待優(yōu)化。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++ min/max_element 函數用法詳解

    C++ min/max_element 函數用法詳解

    這篇文章主要介紹了C++ min/max_element 函數用法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • VC List Control控件如何刪除選中的記錄實例詳解

    VC List Control控件如何刪除選中的記錄實例詳解

    這篇文章主要介紹了VC List Control控件如何刪除選中的記錄實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • c++隱式類型轉換示例分享

    c++隱式類型轉換示例分享

    這篇文章主要介紹了c++隱式類型轉換的二個示例,需要的朋友可以參考下
    2014-03-03
  • C語言超詳細講解指向函數的指針

    C語言超詳細講解指向函數的指針

    C語言程序在編譯后,每個函數都有一個首地址(也就是函數第一條指令的地址),這個地址稱為函數的指針??梢远x指向函數的指針變量,使用指針變量間接調用函數
    2022-07-07
  • Visual Studio 如何創(chuàng)建C/C++項目問題

    Visual Studio 如何創(chuàng)建C/C++項目問題

    這篇文章主要介紹了Visual Studio 如何創(chuàng)建C/C++項目問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言 bind()函數案例詳解

    C語言 bind()函數案例詳解

    這篇文章主要介紹了C語言 bind()函數案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • 使用C++描繪心形

    使用C++描繪心形

    本文給大家分享的是一個使用c++繪制心形的代碼,雖然情人節(jié)已經過去了,但是只要有心,天天都是情人節(jié)~~哈哈,讓那些說程序猿都是木頭的人去死吧。
    2015-03-03
  • C/C++根據年月日計算星期幾(蔡勒公式篇)

    C/C++根據年月日計算星期幾(蔡勒公式篇)

    這篇文章主要給大家介紹了關于C/C++根據年月日計算星期幾(蔡勒公式篇)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C/C++利用原生套接字抓取FTP數據包

    C/C++利用原生套接字抓取FTP數據包

    這篇文章主要為大家詳細介紹了如何基于原始套接字的網絡數據包捕獲與分析工具,通過實時監(jiān)控網絡流量,實現抓取流量包內的FTP通信數據,需要的小伙伴可以參考下
    2023-12-12
  • 基于C語言實現隨機點名器(附源碼)

    基于C語言實現隨機點名器(附源碼)

    這篇文章主要為大家詳細介紹如何基于C語言實現一個簡單的隨機點名器,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
    2022-07-07

最新評論

呼玛县| 神池县| 中卫市| 虞城县| 宁南县| 闻喜县| 内乡县| 获嘉县| 遂昌县| 临桂县| 壤塘县| 红桥区| 澳门| 怀柔区| 随州市| 玉林市| 锡林浩特市| 成安县| 锡林郭勒盟| 黎川县| 二连浩特市| 永新县| 静安区| 宝丰县| 蒙自县| 苍梧县| 阿拉善右旗| 寻甸| 明光市| 佛山市| 德庆县| 张家界市| 平遥县| 德江县| 海阳市| 台南县| 高尔夫| 牙克石市| 汶川县| 本溪市| 锡林浩特市|