C++實(shí)現(xiàn)一個(gè)掃雷小游戲
本文實(shí)例為大家分享了C++實(shí)現(xiàn)掃雷小游戲的具體代碼,供大家參考,具體內(nèi)容如下
目前的版本是0.98版本,可以提出增加新功能意見(jiàn)哦
代碼如下:
#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是隨機(jī)行,k是隨機(jī)列 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)); //時(shí)間種子 for(int i=0;i<jie;i++){ c=rand()%n; k=rand()%m; Sleep(1); //最大可能防止隨機(jī)數(shù)重復(fù) if(a[c][k]!=10000){ a[c][k]=10000; } else jie++; } //將雷隨機(jī)分配 if(a[0][0]!=10000){ //開(kāi)始四個(gè)角的數(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; //到這邊四個(gè)角的賦值全部結(jié)束 for(int i=1;i<n;i++){ //開(kā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.本游戲中的-代表還沒(méi)有掃到的地方,0-9的數(shù)字代表正常掃雷中的數(shù)字(0特殊,表示掃雷中的什么東西也沒(méi)有的一格),*代表已經(jīng)標(biāo)記的雷,在標(biāo)記的地方被掃到的時(shí)候自動(dòng)取消標(biāo)記\n"; cout<<"3.請(qǐng)輸入行和列代表正常游戲中的點(diǎn)選\n"; system("pause"); system("cls"); cout<<"請(qǐng)輸入長(zhǎng)(>2):"; cin>>n; while(n>1000||n<=2){ cout<<"長(zhǎng)不合法,請(qǐng)重新輸入"; cin>>n; } cout<<"請(qǐng)輸入寬(>2):"; cin>>m; while(m>1000||m<=2){ cout<<"寬不合法,請(qǐng)重新輸入"; cin>>m; } cout<<"請(qǐng)輸入雷數(shù)(推薦雷數(shù)計(jì)算:規(guī)格長(zhǎng)*寬/10四舍五入,這樣可以達(dá)到比較好的效果)"; cin>>abc; while(abc>n*m||abc<=0){ cout<<"輸入不合法,請(qǐng)重新輸入"; 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<<"請(qǐng)輸入行和列:"; cin>>d>>e; while(d>n||e>m||d<0||e<0){ cout<<"輸入不合法,請(qǐng)重新輸入"; 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<<"請(qǐng)輸入行和列:"; cin>>d>>e; while(d>n||e>m||d<0||e<0){ cout<<"輸入不合法,請(qǐng)重新輸入"; cin>>d>>e; } if(b[d-1][e-1]==999){ b[d-1][e-1]=5000; } else cout<<"標(biāo)記錯(cuò)誤:標(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ù),找起來(lái)方便\n"; cout<<"修復(fù)了2.1.0游戲贏不了的問(wèn)題\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)記錯(cuò)誤\n"; } } system("pause"); return 0; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配的相關(guān)資料,需要的朋友可以參考下2017-05-05C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之單鏈表
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。本文將為大家介紹C語(yǔ)言中單鏈表的基本概念與讀取數(shù)據(jù)元素,需要的可以參考一下2021-12-12C++工廠方法之對(duì)象創(chuàng)建型模式詳解
這篇文章主要為大家詳細(xì)介紹了C++對(duì)象創(chuàng)建型模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表的接口
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表的接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C++數(shù)據(jù)結(jié)構(gòu)之搜索二叉樹(shù)的實(shí)現(xiàn)
了解搜索二叉樹(shù)是為了STL中的map和set做鋪墊,我們所熟知的AVL樹(shù)和平衡搜索二叉樹(shù)也需要搜索二叉樹(shù)的基礎(chǔ)。本文將詳解如何利用C++實(shí)現(xiàn)搜索二叉樹(shù),需要的可以參考一下2022-05-05C++小知識(shí):不要節(jié)約代碼行數(shù)
今天小編就為大家分享一篇關(guān)于C++小知識(shí):不要節(jié)約代碼行數(shù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01C語(yǔ)言數(shù)據(jù)輸入與輸出實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)輸入與輸出實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06