动态

详情 返回 返回

井字棋 - 动态 详情

該遊戲為c語言寫的練手小遊戲

大致分為兩部分:

  • 菜單顯示
  • 遊戲部分

主程序

首先加載菜單

image

用户選擇人機或者雙人,進入遊戲函數

選擇退出時,退出程序

選擇不合法選項時,再次加載菜單供用户選擇

菜單代碼

/**
 * @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;
}

遊戲部分

首先加載棋盤

然後讓用户輸入位置座標

判斷座標合法性

判斷遊戲狀態:輸贏及繼續狀態

加載棋盤

棋盤設置如下:

image

此處我設置了一個全局變量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

Add a new 评论

Some HTML is okay.