井字棋
該游戲為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;//棋盤下滿,退出游戲
}
以上就是該小游戲的主要程序了,僅供分享學習用
游戲源碼
本文來自博客園,作者:EricsT,轉載請注明原文鏈接:http://www.rzrgm.cn/EricsT/p/19043321

浙公網安備 33010602011771號