




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C++應(yīng)用實(shí)現(xiàn)簡易五子棋游戲本文實(shí)例為大家分享了C++實(shí)現(xiàn)簡易五子棋游戲位的具體代碼,供大家參考,具體內(nèi)容如下
在實(shí)現(xiàn)五子棋小游戲時(shí),首先應(yīng)該分為棋盤和玩家,我們先定義兩個(gè)類:chessboard、player。分別提供棋盤的構(gòu)造和玩家及游戲規(guī)則的確定。下面我們看下代碼:
chessboard.h:對(duì)棋盤chessboard類型進(jìn)行定義
#ifndef_CHESSBOARD_H_
#define_CHESSBOARD_H_
#includeiostream
usingnamespacestd;
classChessBoard
//棋盤
public:
enum{ROW=31,COL=31};
//整個(gè)棋盤所占的行數(shù)和列數(shù)
charcSquare[ROW+1][COL+1];
//定義一個(gè)字符數(shù)組,用來打印棋盤
public:
ChessBoard();
//棋盤構(gòu)造函數(shù)
voidshow();
//棋盤的顯示
~ChessBoard(){}
//析構(gòu)函數(shù)
#endif
chessboard.cpp
#includeiostream
#includecstdlib
#include"chessboard.h"
usingnamespacestd;
//構(gòu)造函數(shù)
ChessBoard::ChessBoard()
for(inti=1;i=ROW-2;i+=2){
//將棋盤隔行放入‘-'.
for(intj=1;j=COL-2;j+=2){
cSquare[i][j]='';
cSquare[i][j+1]='|';
cSquare[i+1][j]='-';
cSquare[i+1][j+1]='-';
}
}
//圍出棋盤的四周
for(intj=0;jCOL;j++)
cSquare[0][j]=cSquare[ROW-1][j]='-';
for(inti=0;iROW;i++)
cSquare[i][0]=cSquare[i][COL-1]='|';
//空處棋盤落子空間
cSquare[ROW][0]='';
cSquare[0][COL]='';
//在最后以行打印出行、列下標(biāo)0,1,2...A,B,C...
for(inti=1;ii+=2){
cSquare[i][COL]=i/2+48;
cSquare[i+1][COL]='';
cSquare[ROW][i]=i/2+48;
cSquare[ROW][i+1]='';
}
for(intj=21;jCOL;j+=2){
cSquare[ROW][j]=j/2+55;
cSquare[ROW][j+1]='';
}
for(intj=21;jROW;j+=2){
cSquare[j][COL]=j/2+55;
cSquare[j+1][COL]='';
}
voidChessBoard::show()
system("clear");
//清除緩存區(qū)數(shù)據(jù)
//顯示棋盤
for(inti=0;i=ROW;++i){
for(intj=0;j=COL;++j)
coutcSquare[i][j]'';
coutendl;
}
}
player.h:定義player類
#ifndef_PLAYER_H_
#define_PLAYER_H_
#includeiostream
#includestring
#include"chessboard.h"
usingnamespacestd;
classPlayer
private:
stringm_name;
charm_ChessType;
intm_x;
intm_y;
ChessBoard*m_ptBoard;
public:
enum{ROW=31,COL=31};
Player():m_name("no_name"),m_ChessType(''),m_x(0),m_y(0),m_ptBoard(NULL){}
voidattachToBoard(ChessBoard*ptBoard){m_ptBoard=ptBoard;}
boolisInChessBoard(intx,inty)const;
//棋子是否羅在棋盤內(nèi)
boolHisLine(intx,inty)const;
//判斷水平方向是否連夠5個(gè)棋子
boolVisLine(intx,inty)const;
//判斷豎直方向是否連夠5個(gè)棋子
boolLtoBottomisLine(intx,inty)const;
//判斷自左上角到右下角是否連夠5個(gè)棋子
boolLtoTopisLine(intx,inty)const;
//判斷子右上角到左下角是否連夠5個(gè)棋子
boolisWin()const;
//是否贏
stringWinName()const{returnm_name;}
//贏者姓名
voidSetInfo(intno);
voidSetChess();
//把玩家所選的符號(hào)放進(jìn)所選為值
~Player(){}
#endif
player.cpp:
#includeiostream
#includecstdlib
#include"player.h"
usingnamespacestd;
boolPlayer::isInChessBoard(intx,inty)const
if(xROW-1x0yCOL-1y0)
returntrue;
else
returnfalse;
voidPlayer::SetInfo(intno)
cout"PleaseNo."no"inputyourname(qtoquit):\n";
getline(cin,m_name);
if("q"==m_name){
cout"ByeBye!"endl;
exit(-1);
}
//如果鍵盤輸入有錯(cuò)誤,清楚錯(cuò)誤標(biāo)志和環(huán)中去,重新輸入用戶名稱
while(!cin){
cin.clear();
cin.ignore(2048,'\n');
//1024清除緩存區(qū)數(shù)據(jù)
cout"PleaseNo."no"inputyournameagin(qtoquit):"endl;
getline(cin,m_name);
if("q"==m_name){cout"ByeBye!"endl;exit(-1);}
}
cout"Hello!"this-m_name":PleaseChooseYourChessType'*'or'#':"endl;
cinm_ChessType;
cin.get();
//如果用戶輸入q,則退出程序
if('q'==m_ChessType){cout"ByeBye"endl;exit(-1);}
//如果鍵盤輸入有誤,或者用戶輸入的棋子團(tuán)不屬于預(yù)其設(shè)的*或#,則要求用戶重新輸入
while(!cin||(m_ChessType!='*'m_ChessType!='#')){
cin.clear();
cin.sync();
cout"Hello!"this-m_name":PleaseChooseYOurChessType'*'or'#'(qtoquit):\n";
cinm_ChessType;
cin.get();
if('q'==m_ChessType){cout"ByeBye!"endl;exit(-1);}
}
//提示用戶輸入落子的坐標(biāo),并判斷是否坐標(biāo)在棋盤上,并把當(dāng)前玩家選擇的棋子圖案字符,填充進(jìn)當(dāng)前輸入的坐標(biāo)
voidPlayer::SetChess()
charx;
chary;
coutthis-m_name":PleaseinputPosition(x,y)ofyourChess.(-,-)toquit"endl;
cinxy;
if('-'==x'-'==y){
cout"ByeBye!"endl;
exit(-1);
}
#if1
if(x='0'x='9'){
m_x=(int)x-48;
}elseif(isupper(x)){
m_x=(int)x-55;
}elseif(islower(x)){
x=toupper(x);
m_x=(int)x-55;
}
if(y='0'y='9'){
m_y=(int)y-48;
}elseif(isupper(y)){
m_y=(int)y-55;
}elseif(islower(y)){
y=toupper(y);
m_y=(int)y-55;
}
m_x=m_x+(1*m_x+1);
m_y=m_y+(1*m_y+1);
#endif
//如果鍵盤數(shù)據(jù)有錯(cuò)誤或者輸入的坐標(biāo)已經(jīng)存在其他棋子
while(!cin||m_ptBoard-cSquare[m_x][m_y]!=''){
cin.clear();
cin.ignore(1024,'\n');
coutthis-m_name":PleaseInputPosition(x,y)ofYourChess.(-,-)toquit"endl;
cinxy;
//根據(jù)所輸入進(jìn)來的行、列角標(biāo)找出相應(yīng)的落子位置,并將操作玩家所對(duì)應(yīng)的棋子符號(hào)填充到該位置(不區(qū)分大小寫)
if('-'==x'-'==y){
cout"ByeBye!"endl;
exit(-1);
}
if(x='0'x='9'){
m_x=(int)x-48;
}elseif(isupper(x)){
m_x=(int)x-55;
}elseif(islower(x)){
x=toupper(x);
m_x=(int)x-55;
}
if(y='0'y='9'){
m_y=(int)y-48;
}elseif(isupper(y)){
//cout"m_y"m_yendl;
m_y=(int)y-55;
//cout"m_y"m_yendl;
}elseif(islower(y)){
y=toupper(y);
m_y=(int)y-55;
}
m_x=m_x+(1*m_x+1);
m_y=m_y+(1*m_y+1);
}
//填充進(jìn)當(dāng)前輸入的坐標(biāo)對(duì)應(yīng)的棋盤的二維數(shù)組單元中
if(isInChessBoard(m_x,m_y)){
m_ptBoard-cSquare[m_x][m_y]=m_ChessType;
}
//判斷是否在水平方向上形成5子連線
boolPlayer::HisLine(intx,inty)const
intnum=0;
for(inti=-8;ii+=2){
if(isInChessBoard(x,y+i)m_ptBoard-cSquare[x][y+i]==m_ChessType){
num++;
if(num==5)
returntrue;
}
else
num=0;
}
returnfalse;
//判斷是否在垂直方向上滿足5子連線
boolPlayer::VisLine(intx,inty)const
intnum=0;
for(inti=-8;ii+=2){
//如果當(dāng)前坐標(biāo)統(tǒng)一行的其他坐標(biāo)在棋盤上,且其他坐標(biāo)的圖案和當(dāng)前玩家的棋子圖案相同,計(jì)數(shù)器雷家
if(isInChessBoard(x+i,y)m_ptBoard-cSquare[x+i][y]==m_ChessType){
num++;
//連續(xù)同一行有5個(gè)坐標(biāo)點(diǎn)的圖案相同時(shí),滿足贏棋的條件
if(num==5)
returntrue;
}
else
num=0;
}
returnfalse;
//判斷是否在自左上角到右下角的方向上滿足5子連線
boolPlayer::LtoBottomisLine(intx,inty)const
intnum=0;
for(inti=-8;ii+=2){
//如果當(dāng)前坐標(biāo)沿自左上角到右下角的對(duì)角線方向的其他
if(isInChessBoard(x+i,y+i)m_ptBoard-cSquare[x+i][y+i]==m_ChessType){
num++;
if(num==5)
returntrue;
}
else
num=0;
}
returnfalse;
//判斷是否在自左下角到右上角的方向上滿足5子連線
boolPlayer::LtoTopisLine(intx,inty)const
intnum=0;
for(inti=-8;ii+=2){
if(isInChessBoard(x-i,y+i)m_ptBoard-cSquare[x-i][y+i]==m_ChessType){
num++;
if(num==5)
returntrue;
}
else
num=0;
}
returnfalse;
boolPlayer::isWin()const
return(HisLine(m_x,m_y)||VisLine(m_x,m_y)||LtoBottomisLine(m_x,m_y)||LtoTopisLine(m_x,m_y))true:false;
}
game.cpp:
#includeiostream
#include"player.h"
#include"chessbo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 經(jīng)濟(jì)法概論深度解析試題及答案
- 設(shè)計(jì)院業(yè)務(wù)拓展與客戶維護(hù)策略
- 2025年市政工程考生心得試題及答案
- 農(nóng)資供應(yīng)鏈管理采購合作合同書
- 歷史文化遺產(chǎn)保護(hù)與文化旅游開發(fā)試題集
- 公共管理案例分析練習(xí)冊
- 生物化學(xué)分子基礎(chǔ)概念題庫及解析
- 珠寶首飾行業(yè)設(shè)計(jì)大賽試題
- 藥品進(jìn)口代理協(xié)議
- 2025年經(jīng)濟(jì)師備考方法分享試題及答案
- VDA6.3-2023版培訓(xùn)教材課件
- GB/T 17791-2017空調(diào)與制冷設(shè)備用銅及銅合金無縫管
- 換熱器檢修施工綜合方案
- 羅氏C8000使用操作說明
- 融資融券策略課件
- 單層鋼結(jié)構(gòu)廠房施工組織設(shè)計(jì)方案
- 項(xiàng)目盡職調(diào)查清單模板
- 唯物主義和經(jīng)驗(yàn)批判主義研讀課件
- 環(huán)境保護(hù)和水土保持保證體系框圖
- 眼部健康檢測與分析課件
- 專業(yè)碩士學(xué)位論文修改報(bào)告(二)
評(píng)論
0/150
提交評(píng)論