用C語言實現掃雷遊戲

用C語言實現掃雷遊戲,因為代碼會比較多,所以采用多文件的方式,使代碼看起來更好。

一.main.c

在主調函數中首先要提供一個給用戶選擇的界面,在這裡我們假定選擇1為開始遊戲,0為退出遊戲,代碼如下:

函數執行開始,會在顯示框中提示用戶輸入數字,1為進入遊戲,此時會調用Game()函數;0為退出遊戲。其中while循環的作用是當用戶進入界面輸入錯誤(非01)或者完成一把遊戲後繼續彈出選項,隻有當輸入0才將num置為0,退出循環。

二.test.h

此為頭文件,其中包含宏定義和函數的聲明,代碼如下:

#ifndef __TEST_H__//防止頭文件被重復包含
#define __TEST_H__
#define _CRT_SECURE_NO_WARNINGS 1
 
#include <stdio.h>
#include <windows.h>
#define HORI 6//控制數組大小
#define VERT 6//控制數組大小
#define NUM 7//埋雷數量
#define STYLE '#'//初始化時顯示的字符
extern void  Game();
 
#endif

三.test.c

1.有關於掃雷的主要代碼都會寫在這個文件裡。test.c當中必須包含頭文件test.h(因為代碼分塊問題,這裡我沒有寫)。Game()函數調用其他函數,實現整個掃雷過程,不使用二維數組的邊框,原因是如果使用邊框就不好計算周圍雷的個數。system(“cls”)為清屏操作,加上以後的效果就是看起來是在一張圖上掃雷。見以下代碼:

void Game(){
 srand((unsigned long)time(NULL));//生成隨機數種子
 char fake[HORI][VERT];//定義一個二維數組用於顯示給用戶
 char mine[HORI][VERT];//定義一個和上邊大小相同的二維數組用來埋雷
 memset(fake,STYLE , sizeof(fake));//初始化為STYLE
 memset(mine, '0', sizeof(mine));//初始化為字符0
 int count = (HORI - 2)*(VERT - 2) - NUM;//不使用數組邊框,計算出剩餘大小
 Bray(mine,HORI,VERT);//調用函數實現埋雷
 while (count){//一直做循環直到用戶掃雷完成
  Display(fake,HORI,VERT);//顯示二維數組fake
  int x = 0;
  int y = 0;
  printf("Please Enter Your Postion<x,y>#:\n");
  scanf("%d%d", &x, &y);//輸入掃雷坐標
  if (x<1 || x>10 || y<1 || y>10){//輸入非法跳出本次循環繼續下一次
   printf("Please try again:\n");
   continue;
  }
  if (fake[x][y] != STYLE){//輸入非法跳出本次循環繼續下一次
   printf("Please try again:\n");
   continue;
  }
  if (mine[x][y] =='1'){//掃到雷瞭,遊戲結束,跳出while循環,返回到選擇界面
   printf("Game over\n");
   Display(mine, HORI, VERT);
   break;
  }
  fake[x][y] = Digital(mine,x,y);//把數組mine[x][y]旁邊的雷的數量算出來,賦值給fake[x][y];
  count--;//沒碰到雷時,count減一,離成功又近一步
  system("cls");//清屏
 }
}

2..埋雷函數Bray()的實現,把雷設置為字符‘1′,目的是方便計算周圍雷的個數;count此時為埋雷數量,控制while循環次數,可能出現生成隨機數相同,所以將count–放在if語句中,用來防止生成的隨機數位置相同。代碼如下:

void Bray(char arr[][VERT],int hori,int vert){//埋雷,雷為1字符
 int count = NUM;
 while (count){
  int x = rand() % (hori - 2) + 1;
  int y= rand() % (vert - 2) + 1;
  if (arr[x][y] == '0'){
   arr[x][y]='1';
   count--;
  }
 }
};

3..計算周圍雷個數的函數Digital()如下,假如返回值為int型表示雷的個數則:因為數組mine中存放的是字符‘0′(Ascllc碼為48)和字符‘1′(Ascllc碼為49),把以xy為下標的字符一圈加起來在減去8乘以‘0′(字符0)為想要的雷的數量;但是返回值卻是char類型,所以再給式子加上‘0′(字符0)就轉化為所對應的char類型瞭;所以總體為減去7乘以‘0′(字符0)。代碼如下:

char Digital(char arr[][VERT],int x,int y){//返回字符
 return arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + \
  arr[x][y + 1] + arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] - 7 * '0';
};

4.顯示遊戲界面的函數為Display() ,不適用數組邊框,所以ij的起始數字為1,剛好對應數組下標。代碼如下:

void Print(hori){
 printf("  ");
 for (int i = 0; i < hori - 2; i++){
  printf("----");
 }
 printf("\n");//每打印一行後換行
}
void Display(char arr[][VERT],int hori,int vert){//顯示窗口
 printf(" ");//首先打印一個空格,根據具體需要調整
 for (int i = 1; i < hori - 1; i++){//打印出數字1到數組長度減二
  printf("%4d", i);
 }
 printf("\n");//換行
 Print(hori);//首先打印一段橫杠
 for (int i = 1; i < hori - 1; i++){
  printf("%-2d|", i);
  for (int j = 1; j < vert - 1; j++){
   printf("  %c|",arr[i][j]);
  }//打印一行空格加雷的數量加|
  printf("\n");//每打印一行後換行
  Print(hori);//打印橫杠
 }
};

test.c中除瞭Game()函數,其他函數可用static修飾,不用暴露給外部。

做完這些就完成瞭掃雷的代碼,運行效果如下:

此時輸入坐標就可以玩掃雷遊戲瞭。

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

推薦閱讀: