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

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

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

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

1. 規(guī)則

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

2. 編寫思路

2.1 編寫選擇界面

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

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

2.2 編寫執(zhí)行程序

執(zhí)行程序需要檢測點開的格子(這里輸入的方式為輸入坐標)周圍的八個格子有多少個雷,并在該格子上顯示雷的個數(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ù)

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

void SetMines(char mine_board[][COL], int row, int col)
{
 int count = NUMS;  //設置雷
 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ù)組的方式設置游戲界面,這里實際設置的界面為12x12的格子界面,在前面宏定義行為12(ROW 12)列為12(COL 12);但是顯示為10x10的界面,為方便用戶輸入坐標,在行和列的前面分布標上數(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ù)自己實際界面調(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ù)組方式設置,所以在使用前需要初始化,所以我們用memset來快速設置。
將展示前的棋盤空位都設置為 *,然后將游戲使用的棋盤空位設置為 0;
生成隨機雷的個數(shù),將其傳入棋盤,設置雷;剩余空格的個數(shù)用count來表示;
開始游戲邏輯,輸入棋盤,傳入用戶輸入的坐標,然后檢測用戶輸入的坐標是否越界;越界則提示用戶輸入越界,需要重新輸入;如果沒越界則游戲繼續(xù)進行,檢測用戶輸入的坐標是否已經(jīng)點開,如果點開則提示用戶重新輸入;然后判斷點開的是不是雷,如果是游戲結束,如果不是游戲繼續(xù),直到所有空格都點開count=0結束循環(huán);
如果剩余空格count不為0游戲結束,則說明踩到雷;否則說明雷全被排完,然后向用戶展示所有雷的分布范圍。

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("請輸入位置# ");
  scanf("%d %d", &x, &y);
  if (x<1 || x>10 || y<1 || y>10){
   printf("輸入越界,請重新輸入!\n");
   continue;
  }
  if (show_board[x][y] != '*'){//證明位置被排過了
   printf("該位置已被排除,請重新輸入!\n");
   continue;
  }
  if (mine_board[x][y] == '1'){//沒點到雷
   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 設定游戲開始or退出

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

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("輸入有誤,請重新輸入\n");
  }
 }
 system("pause");
 return 0;
}

3. 匯總代碼

然后將上述代碼整合起來,匯總如下:

#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("請輸入# ");
}
void SetMines(char mine_board[][COL], int row, int col)
{
 int count = NUMS;  //設置雷
 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("請輸入位置# ");
  scanf("%d %d", &x, &y);
  if (x<1 || x>10 || y<1 || y>10){
   printf("輸入越界,請重新輸入!\n");
   continue;
  }
  if (show_board[x][y] != '*'){//證明位置被排過了
   printf("該位置已被排除,請重新輸入!\n");
   continue;
  }
  if (mine_board[x][y] == '1'){//沒點到雷
   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("輸入有誤,請重新輸入\n");
  }
 }
 system("pause");
 return 0;
}

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

相關文章

  • 使用C語言計算長方體的表面積和體積

    使用C語言計算長方體的表面積和體積

    這篇文章主要給大家介紹了關于如何使用C語言計算長方體的表面積和體積的相關資料,在C語言中,我們可以使用乘法運算符(*)來進行乘法運算,并將結果保存在一個變量中,需要的朋友可以參考下
    2023-10-10
  • 基于Matlab圖像處理的公路裂縫檢測實現(xiàn)

    基于Matlab圖像處理的公路裂縫檢測實現(xiàn)

    隨著公路的大量投運,公路日常養(yǎng)護和管理已經(jīng)成為制約公路運營水平提高的瓶頸,特別是路面狀態(tài)采集、檢測維護等工作更是對傳統(tǒng)的公路運維模式提出了挑戰(zhàn)。這篇文章主要介紹了如何通過Matlab圖像處理實現(xiàn)公路裂縫檢測,感興趣的可以了解一下
    2022-02-02
  • C語言報錯Use of Uninitialized Variable的原因及解決方案

    C語言報錯Use of Uninitialized Variable的原因及解決方案

    Use of Uninitialized Variable是C語言中常見且危險的錯誤之一,它通常在程序試圖使用一個未初始化的變量時發(fā)生,本文將詳細介紹Use of Uninitialized Variable的產(chǎn)生原因,提供多種解決方案,并通過實例代碼演示如何有效避免和解決此類錯誤,需要的朋友可以參考下
    2024-06-06
  • C++中一維數(shù)組與指針的關系詳細總結

    C++中一維數(shù)組與指針的關系詳細總結

    以下是對C++中一維數(shù)組與指針的關系進行了詳細的總結介紹,需要的朋友可以過來參考下
    2013-09-09
  • VC++實現(xiàn)的OpenGL線性漸變色繪制操作示例

    VC++實現(xiàn)的OpenGL線性漸變色繪制操作示例

    這篇文章主要介紹了VC++實現(xiàn)的OpenGL線性漸變色繪制操作,結合實例形式分析了VC++基于OpenGL進行圖形繪制的相關操作技巧,需要的朋友可以參考下
    2017-07-07
  • C++實現(xiàn)單鏈表的構造

    C++實現(xiàn)單鏈表的構造

    這篇文章主要為大家詳細介紹了C++實現(xiàn)單鏈表的構造,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言、C++中的union用法總結

    C語言、C++中的union用法總結

    這篇文章主要介紹了C語言、C++中的union用法總結,本文講解了什么是union、C中使用union、當union遇到對象等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 在C語言中比較兩個字符串是否相等的方法

    在C語言中比較兩個字符串是否相等的方法

    這篇文章主要介紹了在C語言中比較兩個字符串是否相等的方法,分別介紹了strcmp()函數(shù)和strcasecmp()函數(shù),注意功能區(qū)分,需要的朋友可以參考下
    2015-08-08
  • 圖的鄰接表存儲表示示例講解

    圖的鄰接表存儲表示示例講解

    這篇文章主要介紹了圖的鄰接表存儲表示,大家參考使用
    2013-11-11
  • C語言數(shù)據(jù)結構深入探索順序表

    C語言數(shù)據(jù)結構深入探索順序表

    大家好,今天給大家?guī)淼氖琼樞虮恚矣X得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進行學習數(shù)據(jù)結構的人帶來一些幫助,或者是已經(jīng)學過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧
    2022-05-05

最新評論