首頁 > 軟體

c++實現掃雷小遊戲程式碼分享

2022-02-22 13:00:54

分成兩個原始檔和一個標頭檔案

注意:這串程式碼並不完整,不能夠實現當所查座標周圍雷的數量為0時,直接展開周圍座標;

標頭檔案:game.h

#include <stdio.h>


#define count 10 //雷的數量

//定義 行-ROW,列-COL
#define ROW 9
#define COL 9
#define ROWS ROW+2 //多加一些,方便程式碼
#define COLS COL+2

//初始化棋盤,宣告的函數均在game.c中實現
void InitBoard(char board[ROWS][COLS],int rows,int cols);

//列印棋盤
void DisplayBoard(char board[ROW][COL],int row.int col);

//佈置雷
void SetMine(char board[ROW][COLS],int row,int col);

//找雷
void FindMine(char mine[][COLS],char show[][COLS],int row,int col);

第一個原始檔:saolei.c

#include "game.h"  //需要包含和宣告的東西在game.h中完成

void menu()
{ 
  printf("                  n");
  printf("       1.play     n");
  printf("       0.exit     n");
  printf("                  n");
}

void game()
{ 
  // ROW and COL 在game.h中定義
  char mine[ROWS][COLS];  // 地雷埋藏的棋盤
  char show[ROWS][COLS];  // 展示出的棋盤
  //初始化棋盤
  //game()中的函數在game.h中宣告,在game.c中實現
  InitBoard(mine,ROWS,COLS,'0');   //0代表無雷,1代表有雷
  InitBOard(show,ROWS,COLS,'*');
  //列印棋盤
  DisplayBoard(show,ROW,COL);
  //佈置雷
  SetMine(mine,ROW,COL);
  //找雷
  FindMine(mine,show,ROW,COL);
  
}


int main()
{
  srand((unsigned int) time(NULL));//生成亂數
  int input = 0;
  do              //do-while迴圈
  {
    menu();    //(1--play   0--exit)也是do-while迴圈的條件
    printf("請選擇:");
    scanf("%d",&input);
    switch(input)
    { 
    case 1:
        printf("開始遊戲n");
        game();
        break;
     case 0:
        printf("退出遊戲");
        break;
     default:   
        printf("選擇錯誤,請重新輸入");
        break;
    }
  }while(input)
  
  return 0;
}

第二個原始檔:game.c

#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 = 1;i <= row;i++)
  {
    printf("%d"i)
    for(j = 1;j <= col;j++)
    {
      printf(" %c ",board[i][j]);
    }
    printf("n");
  }
  
}

void SetMine(char board[ROW][COL],int row,int col)
{
  int x = 0;
  int y = 0;
  while(count) //count-雷的數量
  {
    x = rand()%row + 1;//因為在1-row中佈置雷,邊緣一排不用,最後為了記錄
    y = rand()%col + 1;//周圍雷的數量方便,同時程式碼方便
    if( board[x][y] == '0')
    {
      board[x][y] = '1';
      count--;
    }
  }
}

//算出周圍雷的個數
int get_mine_count(mine[ROWS][COLS],int row,int col)
{
  int i = 0;
  int j = 0;
  int mine_count = 0;
  for( i = -1;i <= 1; i++ )
  {
    for( j = -1;j <= 1; j++ )
    {
      if( mine[i][j] == '1')
      {
        mine_count++;
      }
    }
  }
  return mine_count;
}

void FindMine(char mine[][COLS],char show[][COLS],int row,int col)
{
  int x = 0;
  int y = 0;
  int ret = 0;//已經查詢過的位置的數量
  while(ret < row * col - count)//當還剩下count的數量時,贏得遊戲
  { 
    printf("請輸入查詢位置下標:");
    scanf("%d%d",&x,&y);
    if(x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if(mine[x][y] == '0')
      {
        //當所查座標的位置不是雷時,將該座標展示成周圍雷的個數
        int c = get_mine_count(mine,ROW,COL);
        mine[x][y] = c + '0';//返回值為int型,陣列為char型,因此+'0'
        ret++;
        DisplayBoard(show,ROW,COL);
      }
      else
      {
        printf("YOU LOSEn");
        break;
      }
    }
    else
    {
      printf("輸入非法,請重新輸入n");
    }
  }
  printf("VICTORYn");  //獲得勝利
}

到此這篇關於c++實現掃雷小遊戲程式碼分享的文章就介紹到這了,更多相關c++實現掃雷小遊戲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com