C++實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
本文實(shí)例為大家分享了C++實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲的具體代碼,供大家參考,具體內(nèi)容如下
頭文件Mine_Sweep.h
#include <iostream> #include <ctime> #include <cstdlib> #include <algorithm> #include <queue> #include <Windows.h> using namespace std; typedef pair<int, int> P; const int M = 10; const int N = 10; void InitGame(int A[M][N]);//初始化游戲 void Map(int A[M][N], int Static[M][N]);//地圖 void Result(int A[M][N]);//游戲結(jié)果 int IfSafety(int A[M][N],int x,int y);//周圍是否有地雷 void Operate(int A[M][N],int Static[M][N], int x, int y); //操作產(chǎn)生的影響 void Welcome(); //歡迎界面 void GameOver(); //結(jié)束界面 void gotoxy(int x, int y); //指針位置 void color(int c); //改變顏色
實(shí)現(xiàn)部分
#include"Mine_Sweep.h"
void InitGame(int A[M][N])
{
//從右開(kāi)始順時(shí)針->右(1,0)右上(1,1)上(0,1)左上(-1,1)左(-1,0)左下(-1,-1)下(0,-1)右下(1,-1)
int Sign[8][2] = { {1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1} };
int count = 0;//產(chǎn)生M個(gè)不同隨機(jī)數(shù)
int Random; //隨機(jī)數(shù)1-100
int x, y; //橫縱坐標(biāo)
srand(unsigned(time(NULL)));
//清空
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
A[i][j] = 0;
//把M個(gè)雷安放好
while (count < M)
{
Random = rand() % 100 + 1;
x = Random / 10; //轉(zhuǎn)換為X
y = Random - 10 * x; //轉(zhuǎn)換為Y
if (A[x][y] == 0) //地雷設(shè)為-1,無(wú)地雷設(shè)為0,1,2...
{
A[x][y] = -1;
count++;
}
}
//構(gòu)建一個(gè)虛擬的地圖即增加外圍[M][N]->[M+2][N+2]目的是為了讓邊界和內(nèi)部的處理方式一樣
int Virtual[M + 2][N + 2] = { 0 };
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
Virtual[i + 1][j + 1] = A[i][j];//所有元素向下向右移動(dòng)1格
}
}
//計(jì)算每個(gè)地方的地雷分布情況
for (int i = 1; i <= M; i++)
{
for (int j = 1; j <= N; j++)
{
int flag = 0;
//如果是地雷
if (Virtual[i][j] == -1)
continue; //跳過(guò)
for (int k = 0; k < 8; k++)
{
if (Virtual[i + Sign[k][0]][j + Sign[k][1]]==-1)
flag++;
}
A[i-1][j-1] = flag;
}
}
}
void Map(int A[M][N],int Static[M][N])
{
system("cls");
Welcome();
//地雷用※表示,數(shù)字用123...,未翻開(kāi)用■ Static[M][N]用于儲(chǔ)存狀態(tài)0表示未翻開(kāi),1表示翻開(kāi)
for (int i = 0; i < M; i++)
{
cout << "\t\t\t\t\t"<<" ";
for (int j = 0; j < N; j++)
{
if (Static[i][j] == 0)
cout << "■";
else
{
if (A[i][j] == -1)
{
cout << "※";
}
else
{
if (IfSafety(A, i, j))
cout << "□";
else
cout <<" " <<A[i][j];
}
}
}
cout << endl;
}
}
void Operate(int A[M][N], int Static[M][N],int x,int y)//貪心算法
{
queue<P> que;//隊(duì)列
//從右開(kāi)始順時(shí)針->右(1,0)右上(1,1)上(0,1)左上(-1,1)左(-1,0)左下(-1,-1)下(0,-1)右下(1,-1)
int Sign[8][2] = { {1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1} };
if (A[x][y] == -1) //如果翻到地雷,游戲結(jié)束
{
Result(A); //顯示結(jié)果
GameOver(); //游戲結(jié)束
exit(0);
}
Static[x][y] = 1;//翻開(kāi)
que.push(P(x, y));
while (que.size()) {
P p = que.front();
que.pop();
if(!IfSafety(A, p.first, p.second))
continue; //如果周圍有炸彈,繼續(xù)遍歷隊(duì)列
for (int i = 0; i < 8; i++) {
int nx = p.first + Sign[i][0];
int ny = p.second + Sign[i][1];
if (0 <= nx && nx < M && 0 <= ny && ny < N && Static[nx][ny] == 0) {
que.push(P(nx, ny));
Static[nx][ny] = 1;//翻開(kāi)
}
}
}
}
void Result(int A[M][N])
{
for (int i = 0; i < M; i++) {
cout << "\t\t\t\t\t";
for (int j = 0; j < N; j++)
cout << A[i][j]<<" ";
cout << endl;
}
}
int IfSafety(int A[M][N],int x, int y)
{
//從右開(kāi)始順時(shí)針->右(1,0)右上(1,1)上(0,1)左上(-1,1)左(-1,0)左下(-1,-1)下(0,-1)右下(1,-1)
int Sign[8][2] = { {1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1} };
int Virtual[M + 2][N + 2] = { 0 };
x = x + 1;//虛擬坐標(biāo)
y = y + 1;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
Virtual[i + 1][j + 1] = A[i][j];//所有元素向下向右移動(dòng)1格
}
}
//計(jì)算每個(gè)地方的地雷分布情況
for (int k = 0; k < 8; k++)
{
if (Virtual[x + Sign[k][0]][y + Sign[k][1]] == -1)
return 0;
}
return 1;
}
void Welcome()
{
cout << "\t\t\t\t\t\t掃雷游戲"<<endl<<endl;
cout << "\t\t\t\t===========================================" << endl << endl;
gotoxy(40, 3);
for (int i = 0; i < M; i++)
{
//畫(huà)x軸坐標(biāo)
cout << " " << i + 1;
}
for (int j = 0; j < M; j++)
{
//畫(huà)Y軸坐標(biāo)
gotoxy(38, 4+j);
cout << j + 1<<endl;
}
gotoxy(0, 4);
}
void GameOver()
{
cout << "\t\t\t\t游戲結(jié)束,你輸了" << endl;
getchar();
getchar();
}
void gotoxy(int x, int y)
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
主函數(shù)
#include"Mine_Sweep.h"
int main()
{
int A[M][N], x, y, Static[M][N] = { 0 };
color(13);
InitGame(A);
cout << "\n\n\n\t\t游戲說(shuō)明:" << "你需要在不點(diǎn)錯(cuò)雷的情況下盡可能快的將所有的雷都標(biāo)記出來(lái)\n";
cout << "\t\t你點(diǎn)出了一個(gè)數(shù)字,是1,就說(shuō)明它周圍的8的格子里有1個(gè)雷,是2就有兩個(gè)雷,是3就有三個(gè)雷···" << endl;
cout<< "\t\t但如果你標(biāo)記錯(cuò)了雷,那就會(huì)boom!游戲結(jié)束。"<<endl;
cout << "\t\t請(qǐng)先輸入橫坐標(biāo),再輸入縱坐標(biāo) eg: 1 2" << endl;
cout << "\t\t回車鍵開(kāi)始,祝你好運(yùn)!" << endl;
getchar();
color(15);
while (1)
{
int flag = 1;
Map(A, Static);
cout << "\t\t\t\t請(qǐng)輸入要翻開(kāi)的坐標(biāo):";
cin >> x >> y;
while (x <= 0 || x > M || y <= 0 || y > N)
{
cout << "\t\t\t\t超出范圍,請(qǐng)重新輸入要翻開(kāi)的坐標(biāo):" ;
cin >> x >> y;
}
Operate(A, Static, x-1, y-1);
}
return 0;
}
運(yùn)行效果




更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言JNI的動(dòng)態(tài)注冊(cè)詳解
這篇文章主要介紹了JAVA JNI的動(dòng)態(tài)注冊(cè),這里提供簡(jiǎn)單實(shí)例代碼,需要的朋友可以參考下,小編覺(jué)得寫(xiě)的還不錯(cuò),希望能給你帶來(lái)幫助2021-08-08
c++ 子類構(gòu)造函數(shù)初始化及父類構(gòu)造初始化的使用
這篇文章主要介紹了c++ 子類構(gòu)造函數(shù)初始化及父類構(gòu)造初始化的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說(shuō)明
這篇文章主要介紹了C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
c++詳細(xì)講解構(gòu)造函數(shù)的拷貝流程
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對(duì)象時(shí),是使用同一類中之前創(chuàng)建的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象??截悩?gòu)造函數(shù)通常用于:通過(guò)使用另一個(gè)同類型的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象。?復(fù)制對(duì)象把它作為參數(shù)傳遞給函數(shù)。復(fù)制對(duì)象,并從函數(shù)返回這個(gè)對(duì)象2022-05-05
C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

