1. 程式人生 > >c語言實現三子棋

c語言實現三子棋

  • 分析 玩法分析:將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了。
  • 思路 遊戲流程:遊戲初始化
    • 棋盤初始化
      1. 棋盤由二位陣列模擬,且初始化陣列
      2. 棋盤列印
    • 玩家下棋
      1. 判斷下棋座標是否越界
      2. 判斷下棋座標是否已經有子
      3. 如果滿足上方條件則在此座標插入棋子,否則重新輸入
    • 電腦下棋
      1. 生成隨機座標數 注意需先隨機種子
      2. 判斷下棋座標是否有子
      3. 如果滿足上方條件則在此座標插入棋子,否則重新隨機座標
    • 判斷勝者 1.判斷每一行,如果每一行的棋子都為一個玩家,且其棋子不為空,則這個玩家勝出 2.判斷每一列,如果每一列的棋子都為一個玩家,且其棋子不為空,則這個玩家勝出 3.判斷對角線,如果對角線的棋子都為一個玩家,且其棋子不為空,則這個玩家勝出 4.如果棋盤下滿了,則為和棋
  • 實現
    1. 定義常量,以及二維陣列
      #define ROW 3
      #define COL 3
      
      char chessboard[ROW][COL];
      
    2. 陣列初始化
      void Init() {
      	for (int row = 0; row < ROW; row++)
      	{
      		for (int col = 0; col < COL; col++)
      		{
      			chessboard[row][col] = ' '; //初始化每個元素都為空格
      		}
      	}
      }
      
    3. 列印棋盤
      void Print() {
      	for (int i = 0; i < ROW; i++)
      	{
      		printf("| %c | %c | %c |\n"
      , chessboard[i][0], chessboard[i][1], chessboard[i][2]); printf("|...|...|...|\n"); } }
    4. 玩家下棋
      void PlayerMove() {
      	int x, y;
      	while (true)
      	{
      		printf("請輸入你下棋的座標!\n");
      		scanf("%d  %d", &x, &y);
      		if (x > ROW - 1 && x < 0 && y > COL - 1 && y < 0)
      		{
      			printf
      ("輸入錯誤!"); continue; } if (chessboard[x][y] == ' ') { chessboard[x][y] = 'O'; break; } else { printf("已經被下過了!"); continue; } } }
    5. 電腦下棋
      void AiMove() {
      
      srand((unsigned int)time(0)); //隨機種子
      
      while (true)
      {
      	int x = rand() % 3;
      	int y = rand() % 3;
      	if (chessboard[x][y] == ' ')
      	{
      		chessboard[x][y] = 'X';
      		break;
      	}
      	else
      	{
      		continue;
      	}
      }
      }
      
    6. 棋盤滿了判斷
      int isFull() {
      	for (int row = 0; row < ROW; row++)
      	{
      		for (int col = 0; col < COL; col++) {
      			if (chessboard[row][col] == ' ')
      			{
      				return 0;
      			}
      		}
      	}
      	return 1;
      }
      
    7. 判斷勝者
      char CheckWinner() {
      	// 行
      	for (int row = 0; row < ROW; row++)
      	{
      		if (chessboard[row][0] == chessboard[row][1]
      			&& chessboard[row][1] == chessboard[row][2]
      			&& chessboard[row][0] != ' ')
      		{
      			return chessboard[row][0];
      		}
      		
      	}
      	// 列
      	for (int col = 0; col < COL; col++)
      	{
      		if (chessboard[0][col] == chessboard[1][col]
      			&& chessboard[1][col] == chessboard[2][col]
      			&& chessboard[0][col] != ' ')
      		{
      			return chessboard[0][col];
      		}
      	}
      	// 對角線
      	if (chessboard[0][0] == chessboard[1][1]
      		&& chessboard[1][1] == chessboard[2][2]
      		&& chessboard[0][0] != ' ')
      	{
      		return chessboard[0][0];
      	}
      	else if (chessboard[0][2] == chessboard[1][1]
      		&& chessboard[1][1] == chessboard[2][0]
      		&& chessboard[0][0] != ' ')
      	{
      		return chessboard[0][2];
      	}
      	else if (isFull())
      	{
      		return 'p';
      	}
      }
      8. 遊戲初始化
      	```
      void gameInit() {
      	char winner;
      	Init();
      	Print();
      	while (true)
      	{	
      		PlayerMove();
      		winner = CheckWinner();
      		AiMove();
      		Print();
      		winner = CheckWinner();
      		if (winner == 'O')
      		{
      			printf("恭喜你!\n");
      			break;
      		}
      		else if (winner == 'X')
      		{
      			printf("恭喜電腦!\n");
      			break;
      		}
      		else if (winner == 'p')
      		{
      			printf("勢均力敵的對手!");
      			break;
      		}
      		continue;
      	}	
      }
      

寫在最後

最近推出了公眾號 coding趣談,一位在讀學生的技術提升之路,為您提供一系列我在學習路上的筆記,經驗,以及感悟。往與君共勉,共同進步! 歡迎大家來關注哦! 在這裡插入圖片描述