《五子棋(C++).doc》由会员分享,可在线阅读,更多相关《五子棋(C++).doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、#include #include using namespace std;#define WIDE_AND_LONG 20 /棋盘的长和宽#define NAME_LEN 20 /输入姓名的长度typedef class Gobangpublic:int InitPlayerName(char *, char *);int CheckInput(char,int);int CheckIndexInput(char, char, char);int GetPlayerName();int InitBoard();int WriteBoard(char, char, bool);int Begi
2、nOrNot();int CheckRow();int CheckColumn();int CheckTopLeft();int CheckTopRight();int CheckDownLeft();int CheckDownRight();int CheckDraw();int CheckFinish();int Chess();int ShowBoard();private:char acBoardWIDE_AND_LONGWIDE_AND_LONG;char acPlayerOneNameNAME_LEN;char acPlayerTwoNameNAME_LEN;GOBANG;/初始化
3、姓名的缺省值int GOBANG:InitPlayerName(char *pPlayerOne,char *pPlayerTwo)strcpy(acPlayerOneName,pPlayerOne);strcpy(acPlayerTwoName,pPlayerTwo);return 0;/检查输入姓名时是否含非法字符空格和Tab键int GOBANG:CheckInput(char ch, int iNameLen)if( = ch | t = ch)cout含有非法字符! NAME_LEN - 1)cout输入超出限定长度!= 0 & cRow = 9)iRow = static_cast
4、(cRow - 0);else if(cRow = A & cRow = static_cast(A + WIDE_AND_LONG - 10 - 1)iRow = static_cast(cRow - A) + 10);elseiRow = static_cast(cRow - a) + 10);if(cColumn = 0 & cColumn = 9)iColumn = static_cast(cColumn - 0);else if(cColumn = A & cColumn = static_cast(A + WIDE_AND_LONG - 10 - 1)iColumn = stati
5、c_cast(cColumn - A) + 10);elseiColumn = static_cast(cColumn - a) + 10);if(+ != acBoardiRowiColumn)cout此处已有棋子!endl;return -1;if(!bJudge)acBoardiRowiColumn = static_cast(1);elseacBoardiRowiColumn = static_cast(2);return 0;/检查坐标输入是否合法int GOBANG:CheckIndexInput(char cRow,char cSeparator,char cColumn)if(
6、!cRow | !cSeparator | !cColumn)return -1;if(!(cRow = 0 & cRow = A & cRow = static_cast(A + WIDE_AND_LONG - 10 - 1) | (cRow = a & cRow = static_cast(a + WIDE_AND_LONG - 10 - 1)return -1;if( != cSeparator & t != cSeparator & , != cSeparator)return -1;if(!(cColumn = 0 & cColumn = A & cColumn = static_c
7、ast(A + WIDE_AND_LONG - 10 - 1) | (cColumn = a & cColumn = static_cast(a + WIDE_AND_LONG - 10 - 1)return -1;return 0;/获取玩家的昵称int GOBANG:GetPlayerName()fflush(stdin);char cTemp = 0;int iNameLen = 0;cout是否自己定义昵称?是(Y),否(任意键):;cTemp = getch();coutendl;if(y != cTemp) & (Y != cTemp)return 0;fflush(stdin);
8、memset(acPlayerOneName,0,sizeof(acPlayerOneName);memset(acPlayerTwoName,0,sizeof(acPlayerTwoName);cout请玩家一输入昵称:;while(n != (cTemp = getchar()if(-1 = CheckInput(cTemp,iNameLen)fflush(stdin);cout请玩家一输入昵称:;continue;acPlayerOneNameiNameLen = cTemp;iNameLen+;if(0 = iNameLen)strcpy(acPlayerOneName,玩家一);iN
9、ameLen = 0;fflush(stdin);cout请玩家二输入昵称:;while(n != (cTemp = getchar()if(-1 = CheckInput(cTemp,iNameLen)fflush(stdin);cout请玩家二输入昵称:;continue;acPlayerTwoNameiNameLen = cTemp;iNameLen+;if(0 = iNameLen)strcpy(acPlayerTwoName,玩家一);return 0;/初始化棋盘int GOBANG:InitBoard()int iRow = 0;int iColumn = 0;for(iRow
10、= 0; iRow WIDE_AND_LONG; iRow+)for(iColumn = 0; iColumn WIDE_AND_LONG; iColumn+)acBoardiRowiColumn = +;return 0;/检查棋盘横向是否存在五子连珠int GOBANG:CheckRow()int iRow = 0;int iColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 0; iRow WIDE_AND_LONG; iRow +)while(iColumn WIDE_AND_LONG)if(static_
11、cast(1) = acBoardiRowiColumn)iPlayerOneLen +;iPlayerTwoLen = 0;else if(static_cast(2) = acBoardiRowiColumn)iPlayerTwoLen +;iPlayerOneLen = 0;elseiPlayerTwoLen = 0;iPlayerOneLen = 0;iColumn +;if(iPlayerOneLen = 5)return 1;if(iPlayerTwoLen = 5)return 2;iPlayerOneLen = 0;iPlayerTwoLen = 0;iColumn = 0;r
12、eturn 0;/检查棋盘竖向是否存在五子连珠int GOBANG:CheckColumn()int iRow = 0;int iColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iColumn = 0; iColumn WIDE_AND_LONG; iColumn +)while(iRow WIDE_AND_LONG)if(static_cast(1) = acBoardiRowiColumn)iPlayerOneLen +;iPlayerTwoLen = 0;else if(static_cast(2) = acBoard
13、iRowiColumn)iPlayerTwoLen +;iPlayerOneLen = 0;elseiPlayerTwoLen = 0;iPlayerOneLen = 0;iRow +;if(iPlayerOneLen = 5)return 1;if(iPlayerTwoLen = 5)return 2;iPlayerOneLen = 0;iPlayerTwoLen = 0;iRow = 0;return 0;/检查棋盘左上方(包括对角线)是否存在五子连珠int GOBANG:CheckTopLeft()int iRow = 0;int iTempRow = 0;int iColumn = 0
14、;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 4; iRow = 0)if(static_cast(1) = acBoardiTempRowiColumn)iPlayerOneLen +;iPlayerTwoLen = 0;if(iPlayerOneLen = 5)return 1;else if(static_cast(2) = acBoardiTempRowiColumn)iPlayerTwoLen +;iPlayerOneLen = 0;if(iPlayerTwoLen = 5)return 2;elseiPlayerTw
15、oLen = 0;iPlayerOneLen = 0;iTempRow -;iColumn +;iPlayerOneLen = 0;iPlayerTwoLen = 0;iColumn = 0;return 0;/检查棋盘右上方(包括对角线)是否存在五子连珠int GOBANG:CheckTopRight()int iRow = 0;int iColumn = 0;int iTempColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iColumn = 0; iColumn WIDE_AND_LONG - 4; iColumn +
16、)iTempColumn = iColumn;while(iTempColumn WIDE_AND_LONG)if(static_cast(1) = acBoardiRowiTempColumn)iPlayerOneLen +;iPlayerTwoLen = 0;if(iPlayerOneLen = 5)return 1;else if(static_cast(2) = acBoardiRowiTempColumn)iPlayerTwoLen +;iPlayerOneLen = 0;if(iPlayerTwoLen = 5)return 2;elseiPlayerTwoLen = 0;iPla
17、yerOneLen = 0;iRow +;iTempColumn +;iPlayerOneLen = 0;iPlayerTwoLen = 0;iRow = 0;return 0;/检查棋盘左下方(不包括对角线)是否存在五子连珠int GOBANG:CheckDownLeft()int iRow = 0;int iTempRow = 0;int iColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 1; iRow WIDE_AND_LONG - 4; iRow +)iTempRow = iRow;while(iTem
18、pRow WIDE_AND_LONG)if(static_cast(1) = acBoardiTempRowiColumn)iPlayerOneLen +;iPlayerTwoLen = 0;if(iPlayerOneLen = 5)return 1;else if(static_cast(2) = acBoardiTempRowiColumn)iPlayerTwoLen +;iPlayerOneLen = 0;if(iPlayerTwoLen = 5)return 2;elseiPlayerTwoLen = 0;iPlayerOneLen = 0;iTempRow +;iColumn +;i
19、PlayerOneLen = 0;iPlayerTwoLen = 0;iColumn = 0;return 0;/检查棋盘右下方(不包括对角线)是否存在五子连珠int GOBANG:CheckDownRight()int iRow = 0;int iTempRow = 0;int iColumn = WIDE_AND_LONG - 1;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 1; iRow WIDE_AND_LONG - 4; iRow +)iTempRow = iRow;while(iTempRow WIDE_AND_LO
20、NG)if(static_cast(1) = acBoardiTempRowiColumn)iPlayerOneLen +;iPlayerTwoLen = 0;if(iPlayerOneLen = 5)return 1;else if(static_cast(2) = acBoardiTempRowiColumn)iPlayerTwoLen +;iPlayerOneLen = 0;if(iPlayerTwoLen = 5)return 2;elseiPlayerTwoLen = 0;iPlayerOneLen = 0;iTempRow +;iColumn -;iPlayerOneLen = 0
21、;iPlayerTwoLen = 0;iColumn = WIDE_AND_LONG - 1;return 0;/检查是否平局int GOBANG:CheckDraw()int iRow = 0;int iColumn = 0;for(iRow = 0; iRow WIDE_AND_LONG; iRow+)for(iColumn = 0; iColumn WIDE_AND_LONG; iColumn+)if(+ = acBoardiRowiColumn)return 1;return 0;/检查是否达到结束的条件(五子连珠或平局)int GOBANG:CheckFinish()int iJud
22、geRow = 0;int iJudgeColumn = 0;int iJudgeTopLeft = 0;int iJudgeTopRight = 0;int iJudgeDownLeft = 0;int iJudgeDownRight = 0;int iJudgeDraw = 0;iJudgeRow = CheckRow();iJudgeColumn = CheckColumn();iJudgeTopLeft = CheckTopLeft();iJudgeTopRight = CheckTopRight();iJudgeDownLeft = CheckDownLeft();iJudgeDow
23、nRight = CheckDownRight();iJudgeDraw = CheckDraw();if(1 = iJudgeRow | 1 = iJudgeColumn | 1 = iJudgeTopLeft | 1 = iJudgeTopRight | 1 = iJudgeDownLeft | 1 = iJudgeDownRight)cout恭喜玩家acPlayerOneName获胜!endl;return 1;if(2 = iJudgeRow | 2 = iJudgeColumn | 2 = iJudgeTopLeft | 2 = iJudgeTopRight | 2 = iJudge
24、DownLeft | 2 = iJudgeDownRight)cout恭喜玩家acPlayerTwoName获胜!endl;return 1;if(0 = iJudgeDraw)cout平局!endl;return 1;return 0;/显示棋盘到控制台int GOBANG:ShowBoard()int iRow = 0;int iColumn = 0;system(cls);cout ;for(iRow = 0; iRow WIDE_AND_LONG; iRow+)if(9 iRow)coutstatic_cast(A + iRow - 10) ;elsecoutiRow ;coutend
25、l;for(iRow = 0; iRow WIDE_AND_LONG; iRow+)if(9 iRow)coutstatic_cast(A + iRow - 10) ;elsecoutiRow ;for(iColumn = 0; iColumn WIDE_AND_LONG; iColumn+)coutacBoardiRowiColumn ;coutendl;return 0;/开始下棋int GOBANG:Chess()bool bJudge = false;while(1)char cRow = 0;char cSeparator = 0;char cColumn = 0;char cTem
26、p = 0;int iLen =1;fflush(stdin);if(!bJudge)cout请acPlayerOneName输入对应的行和列(格式: a,3 或 a 3 或 a 3):;elsecout请acPlayerTwoName输入对应的行和列(格式: a,3 或 a 3 或 a 3):;while(n != (cTemp = getchar()if(iLen 3)cout输入有误!endl;fflush(stdin);if(!bJudge)cout请acPlayerOneName输入对应的行和列(格式: a,3 或 a 3 或 a 3):;elsecout请acPlayerTwoNa
27、me输入对应的行和列(格式: a,3 或 a 3 或 a 3):;iLen = 1;continue;if(1 = iLen)cRow = cTemp;else if(2 = iLen)cSeparator = cTemp;elsecColumn = cTemp;iLen+;if(-1 = CheckIndexInput(cRow,cSeparator,cColumn)cout输入有误!endl;continue;if(-1 = WriteBoard(cRow,cColumn,bJudge)continue;ShowBoard();if(1 = CheckFinish()BeginOrNot(
28、);bJudge = !bJudge;return 0;/判断游戏结束后玩家是否选择继续还是退出int GOBANG:BeginOrNot()char cTemp = 0;cout是否继续?是(Y),退出(任意键):;fflush(stdin);cTemp = getch();if(y = cTemp | Y = cTemp)InitBoard();ShowBoard();Chess();elseexit(0); /程序的出口return 0;int main()GOBANG gobang;memset(&gobang,0,sizeof(GOBANG);gobang.InitPlayerName(玩家一,玩家二);gobang.GetPlayerName();gobang.InitBoard();gobang.ShowBoard();gobang.Chess();return 0;