該遊戲為c語言寫的練手小遊戲
大致分為兩部分:
- 菜單顯示
- 遊戲部分
主程序
首先加載菜單

用户選擇人機或者雙人,進入遊戲函數
選擇退出時,退出程序
選擇不合法選項時,再次加載菜單供用户選擇
菜單代碼
/**
* @brief 菜單函數
*
* @return 無返回值
*
* @code
* Menu();
* @endcode
*/
void Menu()
{
printf("******************************\n");
printf("****** 井字棋 ******\n");
printf(" 1.人機練習 2.雙人對弈 3.退出 \n");
printf("******************************\n\n\n");
}
主程序代碼
/**
* @brief 程序入口
*
* @return 返回0
*
*/
int main(void)
{
int chChoose = 0;//存儲用户選項
char isError = 0;//提示類別:0常規提示,1錯誤提示,默認值為0
srand((unsigned)time(NULL));
while (1)
{
memcpy(m_ChessboardArr, m_ChessboardArr_ori, sizeof(m_ChessboardArr));
Menu();//顯示菜單
if (!isError)
printf("請輸入你的選擇:");
else
printf("輸入錯誤,請重新輸入:");
isError = 0;//在用户重新輸入選項時,該值恢復默認值
scanf("%d", &chChoose);//用户輸入選項
switch (chChoose)
{
case 1://人機練習
Game(1);
break;
case 2://雙人對弈
Game(2);
break;
case 3://退出
printf("即將退出遊戲");
Sleep(500);
return 0;
default:
isError = 1;
}
}
return 0;
}
遊戲部分
首先加載棋盤
然後讓用户輸入位置座標
判斷座標合法性
判斷遊戲狀態:輸贏及繼續狀態
加載棋盤
棋盤設置如下:

此處我設置了一個全局變量m_ChessboardArr來作為棋盤數組,其默認值為{ { ' ', ' ', ' ' }, { '_', '_', '_' }, { '_', '_', '_' } };
加載棋盤時,我是一行一行的加載
加載棋盤的代碼
void ShowChessboard()
{
for (int i = 2; i >= 0; --i)
printf("%c|%c|%c\n", m_ChessboardArr[i][0], m_ChessboardArr[i][1], m_ChessboardArr[i][2]);//一次加載一行
}
提示用户輸入位置座標
此處直接用printf以及scanf函數來提示用户輸入
判斷座標合法性
- 座標不超過棋盤大小
- 座標是默認值,即沒有玩家在此處下棋
滿足以上兩點,則座標合法
座標不超過棋盤大小
if ((x > 3) || (y > 3))
{
isError = 1;
continue;
}
座標是默認值
if (('*' == m_ChessboardArr[x - 1][y - 1]) || ('O' == m_ChessboardArr[x - 1][y - 1]))
{
isError = 2;
continue;
}
判斷遊戲狀態
- 判斷每行是否一致
- 判斷每列是否一致
- 判斷對角線是否一致
如若有一個是一致的,且不是默認值,則有玩家贏得遊戲
還需判斷棋盤是否下滿,如若下滿則是平局
如若以上情況都不滿足,則繼續遊戲
代碼
/**
* @brief 判斷棋盤情況
*
*
* @param m_ChessboardArr 棋盤數組
* @return 返回1是玩家1贏;返回2是玩家2贏;返回3是未分勝負,繼續遊戲;返回0是棋盤下滿,兩人平局,遊戲結束
*
* @code
* int iResult = Judge();
* @endcode
*/
int Judge()
{
//判斷每行每列情況
for (int i = 0; i < 3; ++i)
{
if ((m_ChessboardArr[i][1] == m_ChessboardArr[i][0]) && (m_ChessboardArr[i][1] == m_ChessboardArr[i][2]))//判斷每一行是否一致
{
if ('*' == m_ChessboardArr[i][1])//為*則是一號玩家獲勝
return 1;
if ('O' == m_ChessboardArr[i][1])//為O則是二號玩家獲勝
return 2;
//否則就是默認值,代表沒有玩家在該處下棋
}
if ((m_ChessboardArr[1][i] == m_ChessboardArr[0][i]) && (m_ChessboardArr[1][i] == m_ChessboardArr[2][i]))//判斷每一列是否一致
{
if ('*' == m_ChessboardArr[1][i])//為*則是一號玩家獲勝
return 1;
if ('O' == m_ChessboardArr[1][i])//為O則是二號玩家獲勝
return 2;
//否則就是默認值,代表沒有玩家在該處下棋
}
}
//判斷對角線情況
if (((m_ChessboardArr[1][1] == m_ChessboardArr[0][1]) && (m_ChessboardArr[1][1] == m_ChessboardArr[2][2])) ||
((m_ChessboardArr[1][1] == m_ChessboardArr[0][2]) && (m_ChessboardArr[1][1] == m_ChessboardArr[2][0])))//判斷對角線是否一致
{
if ('*' == m_ChessboardArr[1][1])//為*則是一號玩家獲勝
return 1;
if ('O' == m_ChessboardArr[1][1])//為O則是二號玩家獲勝
return 2;
//否則就是默認值,代表沒有玩家在該處下棋
}
//判斷棋盤是否下滿
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
if ((m_ChessboardArr[i][j] != '*') && (m_ChessboardArr[i][j] != 'O'))//棋盤不為玩家值,即棋盤為默認值,則代表沒有下滿,還需繼續遊戲
return 3;
}
}
return 0;//棋盤下滿,退出遊戲
}
以上就是該小遊戲的主要程序了,僅供分享學習用
遊戲源碼
https://gitee.com/EricsT/game/tree/master/Tic-Tac-Toe