用C語言實現(xiàn)掃雷游戲
用C語言實現(xiàn)掃雷游戲,因為代碼會比較多,所以采用多文件的方式,使代碼看起來更好。
一.main.c
在主調(diào)函數(shù)中首先要提供一個給用戶選擇的界面,在這里我們假定選擇1為開始游戲,0為退出游戲,代碼如下:
函數(shù)執(zhí)行開始,會在顯示框中提示用戶輸入數(shù)字,1為進(jìn)入游戲,此時會調(diào)用Game()函數(shù);0為退出游戲。其中while循環(huán)的作用是當(dāng)用戶進(jìn)入界面輸入錯誤(非0或1)或者完成一把游戲后繼續(xù)彈出選項,只有當(dāng)輸入0才將num置為0,退出循環(huán)。
二.test.h
此為頭文件,其中包含宏定義和函數(shù)的聲明,代碼如下:
#ifndef __TEST_H__//防止頭文件被重復(fù)包含 #define __TEST_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <windows.h> #define HORI 6//控制數(shù)組大小 #define VERT 6//控制數(shù)組大小 #define NUM 7//埋雷數(shù)量 #define STYLE '#'//初始化時顯示的字符 extern void Game(); #endif
三.test.c
1.有關(guān)于掃雷的主要代碼都會寫在這個文件里。test.c當(dāng)中必須包含頭文件test.h(因為代碼分塊問題,這里我沒有寫)。Game()函數(shù)調(diào)用其他函數(shù),實現(xiàn)整個掃雷過程,不使用二維數(shù)組的邊框,原因是如果使用邊框就不好計算周圍雷的個數(shù)。system("cls")為清屏操作,加上以后的效果就是看起來是在一張圖上掃雷。見以下代碼:
void Game(){ srand((unsigned long)time(NULL));//生成隨機(jī)數(shù)種子 char fake[HORI][VERT];//定義一個二維數(shù)組用于顯示給用戶 char mine[HORI][VERT];//定義一個和上邊大小相同的二維數(shù)組用來埋雷 memset(fake,STYLE , sizeof(fake));//初始化為STYLE memset(mine, '0', sizeof(mine));//初始化為字符0 int count = (HORI - 2)*(VERT - 2) - NUM;//不使用數(shù)組邊框,計算出剩余大小 Bray(mine,HORI,VERT);//調(diào)用函數(shù)實現(xiàn)埋雷 while (count){//一直做循環(huán)直到用戶掃雷完成 Display(fake,HORI,VERT);//顯示二維數(shù)組fake int x = 0; int y = 0; printf("Please Enter Your Postion<x,y>#:\n"); scanf("%d%d", &x, &y);//輸入掃雷坐標(biāo) if (x<1 || x>10 || y<1 || y>10){//輸入非法跳出本次循環(huán)繼續(xù)下一次 printf("Please try again:\n"); continue; } if (fake[x][y] != STYLE){//輸入非法跳出本次循環(huán)繼續(xù)下一次 printf("Please try again:\n"); continue; } if (mine[x][y] =='1'){//掃到雷了,游戲結(jié)束,跳出while循環(huán),返回到選擇界面 printf("Game over\n"); Display(mine, HORI, VERT); break; } fake[x][y] = Digital(mine,x,y);//把數(shù)組mine[x][y]旁邊的雷的數(shù)量算出來,賦值給fake[x][y]; count--;//沒碰到雷時,count減一,離成功又近一步 system("cls");//清屏 } }
2..埋雷函數(shù)Bray()的實現(xiàn),把雷設(shè)置為字符‘1',目的是方便計算周圍雷的個數(shù);count此時為埋雷數(shù)量,控制while循環(huán)次數(shù),可能出現(xiàn)生成隨機(jī)數(shù)相同,所以將count--放在if語句中,用來防止生成的隨機(jī)數(shù)位置相同。代碼如下:
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..計算周圍雷個數(shù)的函數(shù)Digital()如下,假如返回值為int型表示雷的個數(shù)則:因為數(shù)組mine中存放的是字符‘0'(Ascllc碼為48)和字符‘1'(Ascllc碼為49),把以x,y為下標(biāo)的字符一圈加起來在減去8乘以‘0'(字符0)為想要的雷的數(shù)量;但是返回值卻是char類型,所以再給式子加上‘0'(字符0)就轉(zhuǎn)化為所對應(yīng)的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.顯示游戲界面的函數(shù)為Display() ,不適用數(shù)組邊框,所以i和j的起始數(shù)字為1,剛好對應(yīng)數(shù)組下標(biāo)。代碼如下:
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(" ");//首先打印一個空格,根據(jù)具體需要調(diào)整 for (int i = 1; i < hori - 1; i++){//打印出數(shù)字1到數(shù)組長度減二 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]); }//打印一行空格加雷的數(shù)量加| printf("\n");//每打印一行后換行 Print(hori);//打印橫杠 } };
test.c中除了Game()函數(shù),其他函數(shù)可用static修飾,不用暴露給外部。
做完這些就完成了掃雷的代碼,運行效果如下:
此時輸入坐標(biāo)就可以玩掃雷游戲了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題(典型問題)
這篇文章主要介紹了關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題,是一個非常典型的問題,本文通過實例舉例給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-02-02C語言數(shù)據(jù)結(jié)構(gòu)之中綴樹轉(zhuǎn)后綴樹的實例
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之中綴樹轉(zhuǎn)后綴樹的實例的相關(guān)資料,需要的朋友可以參考下2017-08-08