1. 程式人生 > 程式設計 >C++實現一個掃雷小遊戲

C++實現一個掃雷小遊戲

本文例項為大家分享了C++實現掃雷小遊戲的具體程式碼,供大家參考,具體內容如下

目前的版本是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){//附近的雷數 
 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); //最大可能防止隨機數重複 
 if(a[c][k]!=10000){
  a[c][k]=10000;
 }
 else jie++;
 } //將雷隨機分配 
 if(a[0][0]!=10000){ //開始四個角的數值分配,左上 
 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; //到這邊四個角的賦值全部結束 
 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;
 } //結束四條邊的分配 
 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;
 }
 } //基本數量分配結束 
} 
void qianYan(){
 cout<<"歡迎使用掃雷遊戲,遊戲規則如下:\n";
 cout<<"1.本遊戲規格可以選擇,雷數可以自定義\n";
 cout<<"2.本遊戲中的-代表還沒有掃到的地方,0-9的數字代表正常掃雷中的數字(0特殊,表示掃雷中的什麼東西也沒有的一格),*代表已經標記的雷,在標記的地方被掃到的時候自動取消標記\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<<"請輸入雷數(推薦雷數計算:規格長*寬/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<<"是否需要標記雷(是輸入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<<"標記錯誤:標記了已經掃到的不是雷的格子\n";
  cout<<"是否需要標記雷(是輸入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<<"顯示行數和列數,找起來方便\n";
 cout<<"修復了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<<"列標記錯誤\n"; 
 } 
 } 
 system("pause");
 return 0;
}
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。