C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷小游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷的具體代碼,供大家參考,具體內(nèi)容如下
聲明
本次掃雷小游戲用多文件來(lái)編寫。首先,要自定義的一個(gè)頭文件 mine.h,里面有掃雷程序里面所需要的頭文件、常量和所有函數(shù)的聲明。其次,創(chuàng)建主函數(shù) test.c,用自己喜歡的方式構(gòu)建一個(gè)游戲的框架,最后,創(chuàng)建自定義函數(shù) mine.c,編寫各項(xiàng)功能。
設(shè)計(jì)思路
1、先寫主函數(shù),理清整個(gè)游戲流程。
int main()
{
int quit = 0;
do{
int select = 0;
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
printf("Game Over ... Again?\n");
break;
case 2:
quit = 1;
printf("Bye ... \n");
break;
default:
printf("Error ... Please Select Again!\n");
break;
}
} while (!quit);
system("pause");
return 0;
}
2、根據(jù)主函數(shù)的需要,先寫菜單函數(shù) Menu(),這個(gè)函數(shù)很簡(jiǎn)單,只需要 printf 就好,菜單的樣子也是自主設(shè)計(jì)。
static void Menu()
{
printf("===========================\n");
printf("| 掃雷 |\n");
printf("| 1.Play |\n");
printf("| 2.Exit |\n");
printf("===========================\n");
printf(" Please Select:");
}
3、編寫Game()函數(shù),在這個(gè)函數(shù)里我們將要實(shí)現(xiàn)掃雷游戲的全部?jī)?nèi)容。也是一樣的,在這個(gè)函數(shù)里先寫一個(gè)大的框架,構(gòu)建需要的函數(shù),然后再根據(jù)我們的需求在 mine.c 里設(shè)計(jì)所有我們需要的自定義函數(shù)。
void Game()
{
srand((unsigned long)time(NULL));
char board[ROW][COL];
char mine[ROW][COL];
InitBoard(board, ROW, COL, ' '); //' '
InitBoard(mine, ROW, COL, '0'); //'0'
SetMine(mine, ROW, COL);
//ShowBoard(board, ROW, COL);
//ShowBoard(mine, ROW, COL);
int count = (ROW - 2)*(COL - 2) - NUM;
do{
system("cls");
int x = 0;
int y = 0;
ShowBoard(board, ROW, COL);
printf("請(qǐng)輸入你要掃的位置-> ");
scanf("%d %d", &x, &y);
if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10]
printf("你輸入的位置是錯(cuò)誤的,請(qǐng)重新輸入...\n");
Sleep(1000);
continue;
}
if (board[x][y] != ' '){
printf("你輸入的位置已經(jīng)被掃過(guò),請(qǐng)重新輸入...\n");
Sleep(1000);
continue;
}
if (mine[x][y] == '0'){
count--;
char num = GetNum(mine, x, y);
board[x][y] = num;
}
else{
printf("你輸入的位置(%d, %d),有雷!\n", x, y);
break;
}
} while (count > 0);
char *result = NULL;
if (count > 0){
result = "** 掃雷結(jié)束, 你被炸死了! **\n";
}
else{
result = "**掃雷結(jié)束,恭喜你,成功啦! **\n";
}
printf("-------------------------------\n");
printf("%s", result);
printf("-------------------------------\n");
ShowBoard(mine, ROW, COL);
}
4、創(chuàng)建雷盤,還需要記錄掃描雷盤。掃雷的面板是通過(guò)定義的宏來(lái)自定義大小。需要注意的是在算某個(gè)坐標(biāo)的周圍有多少個(gè)地雷的時(shí)候需要掃描他周圍8個(gè)格子,所以給二維數(shù)組多定義一圈,讓它們初始化跟內(nèi)圈一樣為‘0',這樣掃描的時(shí)候就不算那些格子了。
void InitBoard(char board[][COL], int row, int col, char elem)
{
int i = 0;
for (; i < row; i++){
int j = 0;
for (; j < col; j++){
board[i][j] = elem;
}
}
}
void ShowBoard(char board[][COL], int row, int col)
{
int i = 1;
printf(" ");
for (; i <= col - 2; i++){
printf(" %-2d|", i);
}
printf("\n");
for (i = 1; i <= col - 2; i++){
printf("%3s", "----");
}
printf("---\n");
for (i = 1; i <= row - 2; i++){
printf("%2d|", i);
int j = 1;
for (; j <= col - 2; j++){
printf(" %-2c|", board[i][j]);
}
printf("\n");
for (j = 1; j <= col - 2; j++){
printf("%3s", "----");
}
printf("---\n");
}
}
char GetNum(char mine[][COL], int x, int y)
{
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + \
mine[x][y - 1] + mine[x][y + 1] + \
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 7 * '0';
}
5、最后我們要一個(gè)函數(shù)來(lái)隨機(jī)擺放地雷的位置,那么就有了SetMine函數(shù)。
void SetMine(char mine[][COL], int row, int col)
{
int n = NUM;
while (n){
int x = rand() % (row - 2) + 1;
int y = rand() % (col - 2) + 1;
if (mine[x][y] == '1'){
continue;
}
mine[x][y] = '1';
n--;
}
}
這里說(shuō)一下,因?yàn)殡S機(jī)所以需要 rand()庫(kù)函數(shù),但是調(diào)用rand之前,要在 Game()中寫一句
srand((unsigned long)time(NULL));
源代碼
mine.h
#ifndef _MINE_H_ #define _MINE_H_ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #pragma warning(disable:4996) #define ROW 10 #define COL 10 #define NUM 10 void Game(); void InitBoard(char board[][COL], int row, int col, char elem); void SetMine(char mine[][COL], int row, int col); void ShowBoard(char board[][COL], int row, int col); char GetNum(char mine[][COL], int x, int y); #endif
mine.c
#include "mine.h"
void InitBoard(char board[][COL], int row, int col, char elem)
{
int i = 0;
for (; i < row; i++){
int j = 0;
for (; j < col; j++){
board[i][j] = elem;
}
}
}
void SetMine(char mine[][COL], int row, int col)
{
int n = NUM;
while (n){
int x = rand() % (row - 2) + 1;
int y = rand() % (col - 2) + 1;
if (mine[x][y] == '1'){
continue;
}
mine[x][y] = '1';
n--;
}
}
void ShowBoard(char board[][COL], int row, int col)
{
int i = 1;
printf(" ");
for (; i <= col - 2; i++){
printf(" %-2d|", i);
}
printf("\n");
for (i = 1; i <= col - 2; i++){
printf("%3s", "----");
}
printf("---\n");
for (i = 1; i <= row - 2; i++){
printf("%2d|", i);
int j = 1;
for (; j <= col - 2; j++){
printf(" %-2c|", board[i][j]);
}
printf("\n");
for (j = 1; j <= col - 2; j++){
printf("%3s", "----");
}
printf("---\n");
}
}
char GetNum(char mine[][COL], int x, int y)
{
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + \
mine[x][y - 1] + mine[x][y + 1] + \
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 7 * '0';
}
void Game()
{
srand((unsigned long)time(NULL));
char board[ROW][COL];
char mine[ROW][COL];
InitBoard(board, ROW, COL, ' '); //' '
InitBoard(mine, ROW, COL, '0'); //'0'
SetMine(mine, ROW, COL);
//ShowBoard(board, ROW, COL);
//ShowBoard(mine, ROW, COL);
int count = (ROW - 2)*(COL - 2) - NUM;
do{
system("cls");
int x = 0;
int y = 0;
ShowBoard(board, ROW, COL);
printf("請(qǐng)輸入你要掃的位置-> ");
scanf("%d %d", &x, &y);
if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10]
printf("你輸入的位置是錯(cuò)誤的,請(qǐng)重新輸入...\n");
Sleep(1000);
continue;
}
if (board[x][y] != ' '){
printf("你輸入的位置已經(jīng)被掃過(guò),請(qǐng)重新輸入...\n");
Sleep(1000);
continue;
}
if (mine[x][y] == '0'){
count--;
char num = GetNum(mine, x, y);
board[x][y] = num;
}
else{
printf("你輸入的位置(%d, %d),有雷!\n", x, y);
break;
}
} while (count > 0);
char *result = NULL;
if (count > 0){
result = "** 掃雷結(jié)束, 你被炸死了! **\n";
}
else{
result = "**掃雷結(jié)束,恭喜你,成功啦! **\n";
}
printf("-------------------------------\n");
printf("%s", result);
printf("-------------------------------\n");
ShowBoard(mine, ROW, COL);
}
test.c
#include "mine.h"
static void Menu()
{
printf("===========================\n");
printf("| 掃雷 |\n");
printf("| 1.Play |\n");
printf("| 2.Exit |\n");
printf("===========================\n");
printf(" Please Select:");
}
int main()
{
int quit = 0;
do{
int select = 0;
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
printf("Game Over ... Again?\n");
break;
case 2:
quit = 1;
printf("Bye ... \n");
break;
default:
printf("Error ... Please Select Again!\n");
break;
}
} while (!quit);
system("pause");
return 0;
}
總結(jié)
總的來(lái)說(shuō),在編寫代碼的時(shí)候還是得有一個(gè)清晰的思路,搭建框架,再細(xì)分其中細(xì)節(jié),需要什么就去編寫什么。代碼很簡(jiǎn)單,但很經(jīng)典,希望對(duì)你有所幫助。
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲
- C語(yǔ)言掃雷游戲的實(shí)現(xiàn)代碼
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小程序
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
- C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Windows系統(tǒng)下使用C語(yǔ)言編寫單線程的文件備份程序
這篇文章主要介紹了Windows系統(tǒng)下使用C語(yǔ)言編寫單線程的文件備份程序,文中給出了實(shí)現(xiàn)的幾個(gè)關(guān)鍵代碼片段,剩下的只要套上main和線程調(diào)用的相關(guān)函數(shù)即可,非常詳細(xì),需要的朋友可以參考下2016-02-02
C/C++實(shí)現(xiàn)string和int相互轉(zhuǎn)換的常用方法總結(jié)
在C++編程中,經(jīng)常需要在字符串(string)和整型(int)之間進(jìn)行轉(zhuǎn)換,本文將詳細(xì)介紹幾種在C和C++中實(shí)現(xiàn)這兩種類型轉(zhuǎn)換的常用方法,有需要的可以參考下2024-01-01
介紹C語(yǔ)言中tolower函數(shù)的實(shí)例
這篇文章主要介紹了介紹C語(yǔ)言中tolower函數(shù)的實(shí)例,本文列出了該函數(shù)的頭文件,功能說(shuō)明等,以及如何使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

