C語言實現(xiàn)掃雷游戲源代碼
本文實例為大家分享了C語言實現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
此次掃雷中我們以9乘以9的表格為例,后期可自動調(diào)動
主要思路:建立兩個11乘以11的表格,分別為布雷和排雷后的表格,其中我們以字符1表示此處有雷,字符0表示此處無雷,在布雷時我們用時間函數(shù)布置隨機的10個雷(具體多少個雷可自行選擇),在另一個表格中顯示出所選位置周圍雷的個數(shù)
建立11*11的表格是因為便于統(tǒng)計四條邊上位置周圍含雷的個數(shù)
用vs建立頭文件game.n和兩個源文件game.c和test.c
(先分開講解,在文章最后有三個文件的整體顯示)
在頭文件中的聲明有
#include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY 10
time.h和stdlib.h 文件是time.h的庫函數(shù)
ROW表示行,COL表示列,ROWS表示11列,COLS表示11行,EASY表示(簡單程度)雷有10個
首先在test.c文件中建立主函數(shù)
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//實現(xiàn)游戲的過程
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤,請重新選擇\n");
break;
}
} while (input);
return 0;
}
其中 srand((unsigned int)time(NULL)) 是為了能夠在使用rand函數(shù)時每次產(chǎn)生不同的隨機數(shù)
其中包含兩個函數(shù),分別為菜單函數(shù)menu()和實現(xiàn)游戲的函數(shù)game()
菜單函數(shù)為
void menu()
{
printf("************************\n");
printf("***** 1.play *********\n");
printf("***** 0.exit *********\n");
printf("************************\n");
}
主函數(shù)中整形input為輸入的數(shù)字,1進行游戲,0退出游戲
進行的游戲函數(shù)為
void game()
{
//創(chuàng)建棋盤對應(yīng)的數(shù)組
char mine[ROWS][COLS];//布置好的雷的信息
char show[ROWS][COLS];//排查出雷的信息
//初始化棋盤
initboard(mine, ROWS, COLS, '0');
initboard(show, ROWS, COLS, '*');
//打印棋盤
//displayboard(mine, ROW, COL);
displayboard(show, ROW, COL);
//布置雷
setmine(mine, ROW, COL, EASY);
//displayboard(mine, ROW, COL);
//排雷
finemine(mine, show, ROW, COL);
}
1、創(chuàng)建棋盤
在游戲函數(shù)中我們首先創(chuàng)建兩個11乘以11的棋盤,布置雷的棋盤為mine[ROWS][COLS],在玩家面前顯示的棋盤為show[ROWS][COLS]
2、初始化棋盤
在布置雷的棋盤中全部填寫字符0,在玩家顯示的棋盤面前全部填寫為字符*,
頭文件中聲明
//初始化棋盤 void initboard(char board[ROWS][COLS], int rows, int cols,char set);
game.c中具體寫出函數(shù)
void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
3、打印棋盤
頭文件聲明
//打印棋盤 void displayboard(char board[ROWS][COLS], int row, int col);
game.c中具體寫出函數(shù)
//打印棋盤
void displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
printf("-----------掃雷游戲-------------\n");
for (i = 0; i <= col; 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");
}
printf("-----------掃雷游戲-------------\n");
}
4、布置雷
將mine函數(shù)布置出雷
頭文件
//布置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count);
count為計數(shù)器,計算布置雷的個數(shù),初始值為EASY,在頭文件中設(shè)置為10
game.c中的函數(shù)
//布置雷
void setmine(char mine[ROWS][COLS], int row, int col, int count)
{
while (count)
{
int x = rand() % row + 1; //模9為0到8
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
rand函數(shù)產(chǎn)生隨機數(shù),模上row(9)后的數(shù)為0到8,加上1為1到9的數(shù),棋盤本為11*11,但我們填充雷在1~9行,1到9列
5、排雷并且在玩家面前顯示出棋盤
頭文件
//排雷 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c中的函數(shù)
//統(tǒng)計x,y坐標(biāo)周圍雷的個數(shù)
int getmine(char mine[ROWS][COLS], 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] - 8 * '0';
}
//排雷+打印排雷后的棋盤
void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
while (win<ROW*COL-EASY)
{
printf("請輸入要排查雷的坐標(biāo):>");
int x, y;
scanf("%d%d", &x, &y);
//坐標(biāo)合法性
//坐標(biāo)是不是雷,不是雷,統(tǒng)計周圍雷的個數(shù)
if (x >= 1 && x <= row&&y >= 1 &&y <= col)
{
if (mine[x][y]=='1')
{
printf("很遺憾,你被炸死了\n");
displayboard(mine, row, col);
break;
}
else
{
//坐標(biāo)不是雷,統(tǒng)計雷的個數(shù)
int count = getmine(mine, x, y);
show[x][y] = count+'0';//數(shù)字加上字符0為字符數(shù)字,轉(zhuǎn)化為字符數(shù)字,因為打印的為字符
displayboard(show, row, col); //打印排雷后的棋盤
win++;
}
}
else
{
printf("坐標(biāo)非法,重新輸入!\n");
}
}
if (win == ROW*COL - EASY)
{
printf("恭喜你,排雷成功\n");
displayboard(mine, row, col);
}
}
win為已排查出非雷的個數(shù)
判斷非雷位置周圍8個位置有雷的個數(shù)只需要將周圍8個位置中的字符相加再減去8個0的ascll值,因為8個位置中有雷的位置即為字符1,將8個位置的字符相加轉(zhuǎn)化為實際的數(shù)字,即為雷的個數(shù),當(dāng)排除出的非雷的個數(shù)為ROWSCOLS-EASY(99-10)時,即掃雷成功
game.h中完整文件為
#include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY 10 //初始化棋盤 void initboard(char board[ROWS][COLS], int rows, int cols,char set); //打印棋盤 void displayboard(char board[ROWS][COLS], int row, int col); //布置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count); //排雷 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c中完整文件為
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//初始化棋盤
void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, 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, j = 0;
printf("-----------掃雷游戲-------------\n");
for (i = 0; i <= col; 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");
}
printf("-----------掃雷游戲-------------\n");
}
//布置雷
void setmine(char mine[ROWS][COLS], int row, int col, int count)
{
while (count)
{
int x = rand() % row + 1; //模9為0到8
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
//統(tǒng)計x,y坐標(biāo)周圍雷的個數(shù)
int getmine(char mine[ROWS][COLS], 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] - 8 * '0';
}
//排雷+打印排雷后的棋盤
void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
while (win<ROW*COL-EASY)
{
printf("請輸入要排查雷的坐標(biāo):>");
int x, y;
scanf("%d%d", &x, &y);
//坐標(biāo)合法性
//坐標(biāo)是不是雷,不是雷,統(tǒng)計周圍雷的個數(shù)
if (x >= 1 && x <= row&&y >= 1 &&y <= col)
{
if (mine[x][y]=='1')
{
printf("很遺憾,你被炸死了\n");
displayboard(mine, row, col);
break;
}
else
{
//坐標(biāo)不是雷,統(tǒng)計雷的個數(shù)
int count = getmine(mine, x, y);
show[x][y] = count+'0';//數(shù)字加上字符0為字符數(shù)字,轉(zhuǎn)化為字符數(shù)字,因為打印的為字符
displayboard(show, row, col); //打印排雷后的棋盤
win++;
}
}
else
{
printf("坐標(biāo)非法,重新輸入!\n");
}
}
if (win == ROW*COL - EASY)
{
printf("恭喜你,排雷成功\n");
displayboard(mine, row, col);
}
}
test.c完整文件為
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("************************\n");
printf("***** 1.play *********\n");
printf("***** 0.exit *********\n");
printf("************************\n");
}
void game()
{
//創(chuàng)建棋盤對應(yīng)的數(shù)組
char mine[ROWS][COLS];//布置好的雷的信息
char show[ROWS][COLS];//排查出雷的信息
//初始化棋盤
initboard(mine, ROWS, COLS, '0');
initboard(show, ROWS, COLS, '*');
//打印棋盤
//displayboard(mine, ROW, COL);
displayboard(show, ROW, COL);
//布置雷
setmine(mine, ROW, COL, EASY);
//displayboard(mine, ROW, COL);
//排雷
finemine(mine, show, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//實現(xiàn)游戲的過程
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤,請重新選擇\n");
break;
}
} while (input);
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言的可變參數(shù)函數(shù)實現(xiàn)詳解
某些情況下我們希望函數(shù)的參數(shù)個數(shù)可以根據(jù)需要確定,因此c語言引入可變參數(shù)函數(shù)。典型的可變參數(shù)函數(shù)的例子有printf()、scanf()等,下面我就開始講解2021-08-08

