用C語言實現掃雷遊戲
用C語言實現掃雷遊戲,因為代碼會比較多,所以采用多文件的方式,使代碼看起來更好。
一.main.c
在主調函數中首先要提供一個給用戶選擇的界面,在這裡我們假定選擇1為開始遊戲,0為退出遊戲,代碼如下:
函數執行開始,會在顯示框中提示用戶輸入數字,1為進入遊戲,此時會調用Game()函數;0為退出遊戲。其中while循環的作用是當用戶進入界面輸入錯誤(非0或1)或者完成一把遊戲後繼續彈出選項,隻有當輸入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),把以x,y為下標的字符一圈加起來在減去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() ,不適用數組邊框,所以i和j的起始數字為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。