C++實現(xiàn)一個掃雷小游戲
更新時間:2020年03月17日 11:49:45 作者:weixin_42657959
這篇文章主要為大家詳細介紹了C++實現(xiàn)一個掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++實現(xiàn)掃雷小游戲的具體代碼,供大家參考,具體內(nèi)容如下
目前的版本是0.98版本,可以提出增加新功能意見哦
代碼如下:
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
long long int c,dev,m,k,cnt,d,e,jie=10,z,abc,n,b[1000][1000],a[1000][1000],cc,cd,ce,def; //c是隨機行,k是隨機列
bool flag=0;
bool check_lei(){ //用于游戲停止
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(b[i][j]==999||b[i][j]==5000) def++;
}
}
return (def==abc)?false:true;
}
void check(int d,int e){//附近的雷數(shù)
if(d<0||d>=n||e<0||e>=m){
ce++;
return;
}
if(a[d][e]==10000){
ce++;
return;
}
if(b[d][e]!=999&&b[d][e]!=5000) return;
b[d][e]=a[d][e];
if(b[d][e]!=0){
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
if(d+i<0||d+i>=n||e+i<0||e+i>=m){
ce++;
continue;
}
if(b[d+i][e+i]==5000) continue;
if(b[d+i][e+j]!=999) continue;
if(a[d+i][e+j]==10000){
ce++;
continue;
}
if(ce<=5){
b[d+i][e+j]=a[d+i][e+j];
ce++;
}
}
}
return ;
}
if(cd>n/2) return;
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
check(d+i,e+j);
}
}
cd++;
}
void buZhi(){
system("cls"); //清屏
srand(time(NULL)); //時間種子
for(int i=0;i<jie;i++){
c=rand()%n;
k=rand()%m;
Sleep(1); //最大可能防止隨機數(shù)重復(fù)
if(a[c][k]!=10000){
a[c][k]=10000;
}
else jie++;
} //將雷隨機分配
if(a[0][0]!=10000){ //開始四個角的數(shù)值分配 ,左上
if(a[0][1]==10000) cnt++;
if(a[1][1]==10000) cnt++;
if(a[1][0]==10000) cnt++;
a[0][0]=cnt;
}
cnt=0;
if(a[n-1][m-1]!=10000){ //右下
if(a[n-1][m-2]==10000) cnt++;
if(a[n-2][m-2]==10000) cnt++;
if(a[n-2][m-1]==10000) cnt++;
a[n-1][m-1]=cnt;
}
cnt=0;
if(a[0][m-1]!=10000){ //右上
if(a[1][m-1]==10000) cnt++;
if(a[1][m-2]==10000) cnt++;
if(a[0][m-2]==10000) cnt++;
a[0][m-1]=cnt;
}
cnt=0;
if(a[n-1][0]!=10000){ //左下
if(a[n-2][1]==10000) cnt++;
if(a[n-1][1]==10000) cnt++;
if(a[n-2][0]==10000) cnt++;
a[n-1][0]=cnt;
}
cnt=0; //到這邊四個角的賦值全部結(jié)束
for(int i=1;i<n;i++){ //開始四條邊的分配,上邊
if(a[0][i]!=10000){
if(a[1][i]==10000) cnt++;
if(a[1][i+1]==10000) cnt++;
if(a[1][i-1]==10000) cnt++;
if(a[0][i+1]==10000) cnt++;
if(a[0][i-1]==10000) cnt++;
a[0][i]=cnt;
}
cnt=0;
}
for(int i=1;i<m;i++){ //左邊
if(a[i][0]!=10000){
if(a[i][1]==10000) cnt++;
if(a[i+1][1]==10000) cnt++;
if(a[i-1][1]==10000) cnt++;
if(a[i+1][0]==10000) cnt++;
if(a[i-1][0]==10000) cnt++;
a[i][0]=cnt;
}
cnt=0;
}
for(int i=1;i<m;i++){ //右邊
if(a[i][n-1]!=10000){
if(a[i-1][n-1]==10000) cnt++;
if(a[i+1][n-1]==10000) cnt++;
if(a[i][n-2]==10000) cnt++;
if(a[i-1][n-2]==10000) cnt++;
if(a[i+1][n-2]==10000) cnt++;
a[i][n-1]=cnt;
}
cnt=0;
}
for(int i=1;i<n;i++){ //下邊
if(a[m-1][i]!=10000){
if(a[m-2][i]==10000) cnt++;
if(a[m-2][i+1]==10000) cnt++;
if(a[m-2][i-1]==10000) cnt++;
if(a[m-1][i+1]==10000) cnt++;
if(a[m-1][i-1]==10000) cnt++;
a[m-1][i]=cnt;
}
cnt=0;
} //結(jié)束四條邊的分配
for(int i=1;i<n-1;i++){
for(int j=1;j<m-1;j++){
if(a[i][j]!=10000){
if(a[i-1][j]==10000) cnt++;
if(a[i-1][j-1]==10000) cnt++;
if(a[i-1][j+1]==10000) cnt++;
if(a[i][j-1]==10000) cnt++;
if(a[i][j+1]==10000) cnt++;
if(a[i+1][j]==10000) cnt++;
if(a[i+1][j-1]==10000) cnt++;
if(a[i+1][j+1]==10000) cnt++;
a[i][j]=cnt;
}
cnt=0;
}
} //基本數(shù)量分配結(jié)束
}
void qianYan(){
cout<<"歡迎使用掃雷游戲,游戲規(guī)則如下:\n";
cout<<"1.本游戲規(guī)格可以選擇,雷數(shù)可以自定義\n";
cout<<"2.本游戲中的-代表還沒有掃到的地方,0-9的數(shù)字代表正常掃雷中的數(shù)字(0特殊,表示掃雷中的什么東西也沒有的一格),*代表已經(jīng)標(biāo)記的雷,在標(biāo)記的地方被掃到的時候自動取消標(biāo)記\n";
cout<<"3.請輸入行和列代表正常游戲中的點選\n";
system("pause");
system("cls");
cout<<"請輸入長(>2):";
cin>>n;
while(n>1000||n<=2){
cout<<"長不合法,請重新輸入";
cin>>n;
}
cout<<"請輸入寬(>2):";
cin>>m;
while(m>1000||m<=2){
cout<<"寬不合法,請重新輸入";
cin>>m;
}
cout<<"請輸入雷數(shù)(推薦雷數(shù)計算:規(guī)格長*寬/10四舍五入,這樣可以達到比較好的效果)";
cin>>abc;
while(abc>n*m||abc<=0){
cout<<"輸入不合法,請重新輸入";
cin>>abc;
}
jie=abc;
buZhi();
}
void saoLei(){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
b[i][j]=999;
while(check_lei()){
def=0;
dev=1;
ce=0;
cd=0;
cout<<" ";
for(int i=0;i<m;i++)
cout<<i+1<<' ';
cout<<'\n';
for(int i=0;i<n;i++){
if(dev>9)
cout<<dev<<' ';
else
cout<<dev<<" ";
for(int j=0;j<m;j++){
if(b[i][j]!=999&&b[i][j]!=5000)
cout<<b[i][j]<<' ';
else if(b[i][j]==999)
cout<<"- ";
else
cout<<"* ";
}
cout<<'\n';
dev++;
}
def=0;
if(!check_lei()) break;
cout<<"請輸入行和列:";
cin>>d>>e;
while(d>n||e>m||d<0||e<0){
cout<<"輸入不合法,請重新輸入";
cin>>d>>e;
}
if(a[d-1][e-1]!=10000) check(d-1,e-1);//b[d-1][e-1]=a[d-1][e-1];
else {
cout<<"失敗";
flag=1;
return;
}
cout<<"是否需要標(biāo)記雷(是輸入1,不是輸入2)?";
cin>>z;
while(z==1){
cout<<"請輸入行和列:";
cin>>d>>e;
while(d>n||e>m||d<0||e<0){
cout<<"輸入不合法,請重新輸入";
cin>>d>>e;
}
if(b[d-1][e-1]==999){
b[d-1][e-1]=5000;
}
else cout<<"標(biāo)記錯誤:標(biāo)記了已經(jīng)掃到的不是雷的格子\n";
cout<<"是否需要標(biāo)記雷(是輸入1,不是輸入2)?";
cin>>z;
}
system("pause");
system("cls");
cout<<"加載中";
Sleep(300);
cout<<".";
Sleep(300);
cout<<".";
Sleep(300);
cout<<".";
system("cls");
def=0;
}
}
int main(){
cout<<"2.2.0版本新增功能:\n";
cout<<"顯示行數(shù)和列數(shù),找起來方便\n";
cout<<"修復(fù)了2.1.0游戲贏不了的問題\n";
system("pause");
system("cls");
qianYan();
saoLei();
if(flag==0) cout<<"太棒了\n";
else cout<<"很遺憾\n";
system("pause");
cout<<"雷圖如下:\n";
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]==10000)
cout<<"*"<<' ';
else cout<<a[i][j]<<' ';
}
cout<<'\n';
}
cout<<'\n';
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if (b[i][j]==5000&&a[i][j]!=10000) cout<<"第"<<i+1<<"行第"<<j+1<<"列標(biāo)記錯誤\n";
}
}
system("pause");
return 0;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配的相關(guān)資料,需要的朋友可以參考下2017-05-05
C語言數(shù)據(jù)結(jié)構(gòu)與算法之單鏈表
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。本文將為大家介紹C語言中單鏈表的基本概念與讀取數(shù)據(jù)元素,需要的可以參考一下2021-12-12
C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹的實現(xiàn)
了解搜索二叉樹是為了STL中的map和set做鋪墊,我們所熟知的AVL樹和平衡搜索二叉樹也需要搜索二叉樹的基礎(chǔ)。本文將詳解如何利用C++實現(xiàn)搜索二叉樹,需要的可以參考一下2022-05-05
C++實現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了C++實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12

