溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現(xiàn)簡易的掃雷游戲

發(fā)布時間:2021-11-15 09:05:45 來源:億速云 閱讀:122 作者:小新 欄目:開發(fā)技術

這篇文章給大家分享的是有關C語言如何實現(xiàn)簡易的掃雷游戲的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

具體內容如下

C語言如何實現(xiàn)簡易的掃雷游戲

在正式講內容之前先說一說掃雷游戲的規(guī)則

游戲規(guī)則很簡單,點擊方格,如果是地雷,游戲失敗,找到所有地雷游戲勝利

C語言如何實現(xiàn)簡易的掃雷游戲

.剛開始需要碰運氣,只要點開一個區(qū)域,就可以正式開始了。

C語言如何實現(xiàn)簡易的掃雷游戲

3.根據(jù)現(xiàn)有情況,判斷出一定有雷的位置。

C語言如何實現(xiàn)簡易的掃雷游戲

4.進一步計算,因為“2”右邊的“1”已經有從屬的雷了,所以右邊的“2”的正下方沒有雷,因此可以判斷出左邊有兩顆雷,滿足兩個“2”。

C語言如何實現(xiàn)簡易的掃雷游戲

5.紅圈表明的“1”已經有一顆確定的雷了,這時只需要把鼠標放在“1”上,按住右鍵不放,再點一下左鍵,“1”周圍的其他方塊就全被點開了。這個小技巧對于提升速度非常有幫助。

C語言如何實現(xiàn)簡易的掃雷游戲

6.左上角的“1”旁邊必須有一顆雷,可能在紅圈圈住的兩個塊中,目前還無法確定。但是不論在兩個中的哪一個,都從屬于“3”,因此“3”周圍已經有了三顆雷,“3”左下角的方塊可以確定沒有雷。

C語言如何實現(xiàn)簡易的掃雷游戲

7.紅圈框住的位置肯定有一顆雷,因為“3”周圍必須有三顆雷。不論在兩個中的哪一個,都從屬于“3旁邊的“2”,這樣“2”就滿足兩顆雷的條件了。因此“2”左下角的塊是沒有雷的。

C語言如何實現(xiàn)簡易的掃雷游戲

8.這樣一來,“3”下面的兩個塊可以確定都是有雷的。

C語言如何實現(xiàn)簡易的掃雷游戲

9.把這些有雷的地方標出來,就打開了一片新天地。

C語言如何實現(xiàn)簡易的掃雷游戲

10.再根據(jù)現(xiàn)有的條件把確定有雷的地方表明,點開其他的地方。這時我們發(fā)現(xiàn)剛才左上角遺留的問題解決了。

C語言如何實現(xiàn)簡易的掃雷游戲

11.重復上面的各種方法,不斷推理出,最后就能完成掃雷

C語言如何實現(xiàn)簡易的掃雷游戲

好了,規(guī)則已經講完了,現(xiàn)在來說一說怎么實現(xiàn)的吧:

首先還是得創(chuàng)建三個文件夾,分別為game.c 游戲需要的具體函數(shù)的實現(xiàn) game.h (所要用的頭文件)test.c(游戲的邏輯,菜單,以及函數(shù)順序調用)。

首先看一下test.c:

游戲大概的邏輯就是布置雷,把棋盤打印出來,然后玩家自己掃雷,這部分代碼不是很難理解

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
 char mine[ROWS][COLS] = { 0 };//存放布置雷的信息 0無雷 1有雷
 char show[ROWS][COLS] = { 0 };//展示給用戶看并且存放排查出的雷的信息
 
 InitBoard(mine, ROWS, COLS, '0');
 InitBoard(show, ROWS, COLS, '*');
 
 //布置雷
 SetMine(mine, ROW, COL);
 //打印棋盤
 //DisplayBoard(mine, ROW, COL);
 DisplayBoard(show, ROW, COL);
 //排雷
 FindMine(mine,show, ROW, COL);
}
//游戲菜單界面
void menu()
{
 printf("************\n");
 printf("***1.開始***\n");
 printf("***0.退出***\n");
 printf("************\n");
}
//選擇玩或不玩
void test()
{
 int input = 0;   
 srand((unsigned int)time(NULL));
 do
 {
  menu();
  printf("請選擇->;");
  scanf_s("%d", &input);
  switch (input)
  {
  case 1:
   //掃雷
   game();
   break;
  case 0:
   printf("%d\n",input);
   printf("即將退出游戲\n");
   break;
  default:
   printf("輸入錯誤,請重新輸入:\n");
   break;
  }
 } while (input);
}
int main(void)
{
 test();
 return 0;
}

接下來是game.h:

我將所使用到的函數(shù)和代碼段都寫入了代碼里應該不難理解

#pragma once
#include<stdio.h>
#include<time.h>
#include<Windows.h>
 
#define ROW 9//打印出來的棋盤大小
#define COL 9//打印出來的棋盤大小
 
#define ROWS ROW+2//實際棋盤大小,為了防止越界
#define COLS COL+2//實際棋盤大小,為了防止越界
 
#define EASY_COUNT 10//簡單模式10個雷然后根據(jù)自己的需要調整大小
 
//初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盤
void DisplayBoard(char mine[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
//找雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

接下來是game.c:

掃雷游戲有一個功能是,點開一個位置,如果周圍都沒有雷的話就會展開那一片,我們這里用遞歸來實現(xiàn):

//將棋盤展開的函數(shù)
void Open(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)
{
 int n = get_mine_count(mine, x, y);
 if (n != 0)
 {
  show[x][y] = '0' + n;
 }
 else if (show[x][y] != ' ')
 {
  show[x][y] = ' ';
  int i = 0;
  for (i = x - 1; i <= x + 1; i++)
  {
   int j = 0;
   for (j = y - 1; j <= y + 1; j++)
   {
    Open(mine, show, i, j);
   }
  }
 }
 else
 {
  return;
 }
}

完整代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化棋盤:全部為'*'
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
 int i = 0;
 int j = 0;
 for (i = 0; i < rows; i++)
 {
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}
// 顯示應該給用戶顯示的界面‘*'
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 for (i = 0; i <= row; i++)
 {
  printf("%d|", i);
 }
 printf("\n");
 for (i = 0; i < 10; i++)
 {
  printf("-|");
 }
 printf("\n");
 for (i = 1; i <= row; i++)
 {
  printf("%d|", i );
  for (j = 1; j <= col; j++)
  {
   printf("%c|", board[i][j]);
  }
  printf("\n");
  for (j = 0; j <col+1; j++)
  {
   printf("-|");
 
  }
  printf("\n");
 }
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
 int count = EASY_COUNT;
 while (count)
 {
  int x = rand() % row + 1;
  int y = rand() % col + 1;
  if (board[x][y] == '0')
  {
   board[x][y] = '1';
   count--;
  }
 }
}
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
 return mine[x + 1][y] +
  mine[x - 1][y] +
  mine[x][y + 1] +
  mine[x][y - 1] +
  mine[x - 1][y - 1] +
  mine[x - 1][y + 1] +
  mine[x + 1][y - 1] +
  mine[x + 1][y + 1] -
  8 * '0';
}
//將棋盤展開的函數(shù)
void Open(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)
{
 int n = get_mine_count(mine, x, y);
 if (n != 0)
 {
  show[x][y] = '0' + n;
 }
 else if (show[x][y] != ' ')
 {
  show[x][y] = ' ';
  int i = 0;
  for (i = x - 1; i <= x + 1; i++)
  {
   int j = 0;
   for (j = y - 1; j <= y + 1; j++)
   {
    Open(mine, show, i, j);
   }
  }
 }
 else
 {
  return;
 }
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 while (1)
 {
  printf("請輸入你要查詢的坐標->");
  scanf("%d%d", &x, &y);
  Sleep(500);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
   if ('1' == mine[x][y])
   {
    printf("很遺憾,你無了\n");
    Sleep(500);
    DisplayBoard(mine, row, col);
    break;
   }
   else
   {
    //計算坐標x,y周圍有幾個雷
    Open(mine,show,x,y);
    DisplayBoard(show, row, col);
   }
  }
  else
  {
   printf("輸入坐標非法,無法排雷,請重新輸入\n");
  }
 
  int i = 0;
  int j = 1;
  int flag = 0;
  for (i = 1; i <= row; i++)
  {
   for (j = 1; j <= col; j++)
   {
    if (show[i][j] == '*')
    {
     flag++;
    }
   }
  }
  if (flag == EASY_COUNT)//棋盤全部展開后掃描玩家找的雷的個數(shù)是否復合實際雷的個數(shù)
  {
   printf("恭喜你,你贏了!\n");
   DisplayBoard(mine, row, col);
   break;
  }
 }
 
 
}

感謝各位的閱讀!關于“C語言如何實現(xiàn)簡易的掃雷游戲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI