您好,登錄后才能下訂單哦!
本文實例為大家分享了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; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。