C++實(shí)現(xiàn)五子棋游戲(注釋版)_第1頁
C++實(shí)現(xiàn)五子棋游戲(注釋版)_第2頁
C++實(shí)現(xiàn)五子棋游戲(注釋版)_第3頁
C++實(shí)現(xiàn)五子棋游戲(注釋版)_第4頁
C++實(shí)現(xiàn)五子棋游戲(注釋版)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論