版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C++實(shí)現(xiàn)五子棋游戲(注釋版)ChessBoardboard;
//定義了棋盤對象board,思考該對象的構(gòu)造過程
PlayerplayA("aaa",'*');
//玩家aaa的棋子形狀是'*'
playA.attachToBoard(board);//這里將棋盤對象board的地址賦給了playA玩家對象的成員變量指針m_ptBoard??!
PlayerplayB("bbb",'#');
//玩家bbb的棋子形狀是'#'
playB.attachToBoard(board);//這里將棋盤對象board的地址賦給了playB玩家對象的成員變量指針m_ptBoard??!
//這里查看玩家對象的棋盤成員對象指針值是否一致,與board對象地址是否一致!
board.show();
while(1)
{
playA.setChess();//玩家A放下一個(gè)棋子
if(playA.isWin())
//玩家A落棋后自己當(dāng)裁判判斷是否可以結(jié)束戰(zhàn)斗
{
cout"Winer!";break;
}
board.show();
//注意該過程board對象,和AB棋盤對象的內(nèi)容同時(shí)變化
playB.setChess();
//玩家B放下一個(gè)棋子
if(playB.isWin())
//玩家B落棋后自己當(dāng)裁判判斷是否可以結(jié)束戰(zhàn)斗
{
cout"Winer!";break;
}
board.show();//注意該過程board對象,和AB棋盤對象的內(nèi)容同時(shí)變化
}
//getchar();
return1;
}
//ChessBoard.cpp
#include"ChessBoard.h"
ChessBoard::ChessBoard()
for(inti=1;iROW-1;i++)
for(intj=1;jCOL-1;j++)
m_cSquare[i][j]='';
for(intj=0;jj++)
m_cSquare[0][j]=m_cSquare[ROW-1][j]='-';
for(inti=1;ii++)
m_cSquare[i][0]=m_cSquare[i][COL-1]='|';
voidChessBoard::show()
system("cls");
for(inti=0;ii++)
{
for(intj=0;jj++)
coutm_cSquare[i][j]'';
//這里的“''”很重要,這樣才能使屏幕上ROW*COL輸出為方形
coutendl;
}
}
//ChessBoard.h
#pragmaonce
#includeiostream
usingnamespacestd;
#defineROW15
//棋盤行和列定義常數(shù)
#defineCOL15
classChessBoard//棋盤類
public:
charm_cSquare[ROW][COL];
public:
ChessBoard();//構(gòu)造函數(shù)
voidshow();
//棋盤畫圖顯示
};
//player.cpp
#include"Player.h"
boolPlayer::isInChessBoard(intx,inty)
if(xROW-1x0yCOL-1y0)
returntrue;
else
returnfalse;
/*下面是核心代碼:如何判斷五子是否連成線。
這里采用的是以玩家此刻放下的棋子為中心,從四種方向逐個(gè)判斷是否在此方向上連成了線
這里將四個(gè)方向上的判斷都放在一起,避免了四次調(diào)用不同方向上的判斷,
但在for里面放一個(gè)switch有些別扭,可讀性上似乎不好*/
boolPlayer::isLine(intx,inty)
for(intdirec=HORIZON;direc=LEFTTOPTORIGHTBOTTOM;direc++)//四個(gè)方向,權(quán)宜之計(jì)
{
inttempX,tempY,cnt=1;//cnt:連續(xù)排列的同種類的棋子的個(gè)數(shù),達(dá)到五個(gè)則該方贏
for(inti=-4;ii++)
{
if(i==0)continue;//此時(shí)循環(huán)一遍相當(dāng)于什么都沒做
switch(direc)
{
caseHORIZON:
tempX=x;
tempY=y+i;
break;
caseVERTICAL:
tempX=x+i;tempY=y;
break;
caseLEFTBOTTOMTORIGHTTOP:
tempX=x-i;tempY=y+i;
break;
caseLEFTTOPTORIGHTBOTTOM:
tempX=x+i;tempY=y+i;
break;
}
if(isInChessBoard(tempX,tempY)m_ptBoard-m_cSquare[tempX][tempY]==m_chessType)/*判斷關(guān)鍵理解下該句子邏輯*/
cnt++;
else
cnt=0;
if(cnt==5)//五子成線
returntrue;
}
}returnfalse;
voidPlayer::setChess()
cout"請輸入玩家"m_name"的x坐標(biāo)和y坐標(biāo):"endl;
cinm_xm_y;
while(cin.fail()||m_ptBoard-m_cSquare[m_x][m_y]!='')//輸入不是int型變量或者此位置上已有棋子
{
cout"輸入有誤,請?jiān)俅屋斎胪婕?m_name"的x坐標(biāo)和y坐標(biāo):"endl;
cin.clear();
//清除fail狀態(tài)
cin.sync();
//清除緩沖區(qū)
cinm_xm_y;
}
if(isInChessBoard(m_x,m_y))
m_ptBoard-m_cSquare[m_x][m_y]=m_chessType;
boolPlayer::isWin()
returnisLine(m_x,m_y)true:false;
}
//player.h
#pragmaonce
//宏定義四種檢測五子是否連成線的方向,常量定義,也可以考慮使用const或者枚舉類型定義!
#defineHORIZON
0
#defineVERTICAL
1
#defineLEFTBOTTOMTORIGHTTOP2
#defineLEFTTOPTORIGHTBOTTOM3
#include"ChessBoard.h"
#includeiostream
usingnamespacestd;
#includestring
classPlayer
private:
/*私有變量,受保護(hù),不希望被直接訪問,不能訪問嗎?*/
stringm_name;
/*對象棋手名字成員變量*/
charm_chessType;
/*黑白棋變量定義,本案例中*和#定義不同的持子雙方*/
intm_x;
intm_y;
/*下子坐標(biāo)成員變量*/
ChessBoard*m_ptBoard;
/*定義棋盤對象指針*/
public:
Player(stringname,charchessType):m_name(name),m_chessType(chessType),m_ptBoard(NULL){}/*構(gòu)造函數(shù)*/
voidattachToBoard(ChessBoard*ptBoard){m_ptBoard=ptBoard;}/*給成員棋盤對象指針賦值*/
boolisI
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生用品更衣室管理制度
- 衛(wèi)生院行風(fēng)督查制度
- 衛(wèi)生院三病物資管理制度
- 生活區(qū)衛(wèi)生物品管理制度
- 衛(wèi)生院疾病預(yù)防管理制度
- 衛(wèi)生所規(guī)范管理制度
- 養(yǎng)殖場日常衛(wèi)生管理制度
- 幼兒園8項(xiàng)衛(wèi)生管理制度
- 衛(wèi)生所首診負(fù)責(zé)制度
- 衛(wèi)生院新冠病人轉(zhuǎn)診制度
- 箱涵預(yù)制、安裝、現(xiàn)澆施工方案
- 現(xiàn)金日記賬模板(出納版)
- DB34T 1948-2013 建設(shè)工程造價(jià)咨詢檔案立卷標(biāo)準(zhǔn)
- 2024中藥藥渣處理協(xié)議
- 心源性暈厥的查房
- 機(jī)械氣道廓清技術(shù)臨床應(yīng)用專家共識(2023版)解讀
- 壓力性損傷風(fēng)險(xiǎn)評估與管理護(hù)理課件
- 專家解析:渲染,烘托等的區(qū)別課件
- 廣州花城匯UUPARK招商手冊
- 20S517 排水管道出水口
- (完整word)長沙胡博士工作室公益發(fā)布新加坡SM2考試物理全真模擬試卷(附答案解析)
評論
0/150
提交評論