???????新人小白的第一篇博客,有什么不好之處望多提意見,
這個掃雷小游戲主要是基于二維陣列,回圈與基本的函式知識等,

本人用的vs2017,在開始上代碼之前還是說一下,兩個源檔案,test主要是雜七雜八的如何玩掃雷游戲等一些界面代碼,主要的游戲實作是在game.c;至于game.h是裝進行宣告實作游戲功能的函式,以及定義一些常量,
廢話實在不會多說,上代碼吧,
test.c :
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"//其他頭檔案都放在game.h里,game.c也需要參考,這就比較方便,(往下看main函式)
void menu()
{
printf("**********************************\n");
printf("********1、enter******************\n");
printf("********0、exit ******************\n");
printf("**********************************\n");
}
void game()//ROWS,COLS,ROW,COL,LEI,在后面會說到,
{
char mine[ROWS][COLS] = { 0 };//創建二維陣列進行用來裝雷與排雷,這里用‘1’表示雷,‘0’放在
//無雷的地方,但是為了避免排雷時顯示周圍有一個雷的時候容易混淆,就一陣列專門放雷(mine),一個
//陣列是給玩家排雷的(player).
char player[ROWS][COLS] = { 0 };
restart(mine,ROWS,COLS,'0');//給陣列進行初始化的,mine都放0,一會再放雷
restart(player, ROWS,COLS,'*');//player都放上'*',表示未知的坐標,等玩家選擇一個坐標,進
//行排雷時候,將'*'替換成雷數,炸死就兩說了
display(player, ROWS, COLS);//將二維陣列列印出來的函式,這里肯定是列印出來player
set(mine, ROW, COL,LEI);//布置雷的函式,其實這里函式與display放反了,但影響不大,玩家開
//始排雷時是在下面,布置雷之后,不會出現太大的問題,
//display(mine, ROWS, COLS);(你當然可以在布置雷之后看一下雷的情況,就如開卷考試哦)
int w = 1;//這個變數主要是為了后面代碼執行,
while (w)//接下來是玩的程序,如果沒有炸死就肯定要重復排雷,直到所有無雷的地點都找到就break
{
int x;//創建兩個儲存坐標的變數,
int y;
printf("請輸入坐標>:\n");//提示玩家輸入坐標,
scanf("%d%d", &x, &y);
if (x <= ROW && y <= COL)//玩家是個神奇的生物,你需要判斷他輸入的坐標是否在陣列范圍內
//如果坐標合法往下就執行,非法就else;
{
if (mine[x][y] == '1')//非常幸運的踩雷了,(因為雷都是放在mine里的,判斷時,找雷時
//得用mine)
{
printf("很抱歉,你被炸死了,\n");
printf("\n");//換行是為了看著好看,要不然列印出來的陣列會變形的,
display(player, ROWS, COLS);
printf("\n");
display(mine, ROWS, COLS);//讓他炸死的明白點,
break;
}
else
{
int i = find(mine, x, y);//輸入的坐標中無雷,用find函式查看周圍的8個坐標中有
//幾個雷,其回傳值就是雷的個數,
player[x][y] = i + '0';//i是一個整形,加上‘0’之后才能變成char,這時再賦予
//player中的同一個坐標,將‘*’變成雷的個數
if (i != 0)//用i判斷周圍雷的個數,如果周圍8個坐標中有雷,那就不需要連爆,將
//player列印出來
{
display(player, ROWS, COLS);
}
else//如果周圍8個坐標中都沒有雷,那就要開始連爆了
{
mid(x, y, mine, ROWS, COLS, player);//這是一個中間過渡函式,里面裝的是
//用來連爆的函式,將兩個陣列都傳過來是為了直接在函式內部進行賦值,排雷之后將爆開的地方直接
//賦值,
display(player, ROWS, COLS);
}
}
}
else
{
printf("坐標出界,請重新輸入,\n");
}
w = is_win(player, '*');//w用來接收判斷輸贏的函式is_win的回傳值,
if (!w)//如果將所有雷的位置都找到了,那就回傳0,所以用!
{
printf("排雷成功!!!\n");
printf("\n");
display(mine, ROWS, COLS);
printf("\n");
display(player, ROWS, COLS);
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));//這個為布雷的亂數函式,
int input = 0;
do//游戲常用回圈do while,
{
menu();//運行這個程式就是要玩游戲,先列印個選單,
printf("請選擇>:(0/1)\n");//1是玩游戲,0是退出,
scanf("%d", &input);//同時input也是回圈的判斷條件,輸入其他東東的時候都不是0,那就再
//來一遍
switch (input)
{
case 1:
printf("游戲開始,\n");
game();//游戲主要的實作函式都在里面
break;
case 0:
printf("退出游戲,\n");
break;
default:
printf("選擇錯誤,請重新選擇,\n");
break;
}
} while (input);
return 0;
}
game.h :
#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9 //創建陣列使用的全域變數,放在這里是為了以后如果想要改變陣列大小,可以方便一些,因
//為傳參時基本都用的他們,一改全改,
#define COL 9
#define ROWS ROW + 2//排雷時在邊界上的坐標是很容易越界的,這是不如擴大一圈范圍,防止越界,并且
//這一圈只是為了防止越界,只放零就好,不要進行其他操作,并且為了兩個陣列坐標
//完全相同,便于賦值等操作,所以也應將player擴大一圈,并周圍放上‘*’
#define COLS COL + 2
#define LEI 10//這是放雷的個數
void restart(char arr[ROWS][COLS],int rows,int cols, char n);
void display(char arr[ROWS][COLS],int rows,int cols);
void set(char arr[ROWS][COLS], int row, int col,int lei);
int find(char arr[ROWS][COLS], int x, int y);
void mid(int x, int y, char arr[ROWS][COLS],int rows,int cols,char pp[ROWS][COLS]);
void a_enlarge(int x, int y,char arr[ROWS][COLS],char pp[ROWS][COLS]);
void b_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS]);
void c_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS]);
void d_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS]);
void e_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS]);
void f_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS]);
void g_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS]);
void h_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS]);
int is_win(char arr[ROWS][COLS], char n);
game.c代碼太長了,就放在另一篇了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298191.html
標籤:其他
