C語言陣列實現三子棋

狼魔宇發表於2021-10-02

C語言實現三子棋(通過陣列)

  • 需要包含的標頭檔案
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
  • 建立一個全域性陣列
    因為如果陣列大小變化,遊戲規則和實現思路都會有很大的變化,所以不進行巨集定義常量來定義陣列
char board[3][3];
  • 設計主程式框架
    game()函式為遊戲過程框架
int main()
{

	do
	{
		int i = 0;
		printf("1.Start the game\n");
		printf("2.Quit the game\n");
		printf("Please enter your options->");
		scanf("%d", &i);
		switch (i)
		{
			case 1:
				game();    //game()函式為遊戲過程框架
				break;
			case 2:
				return 0;
			default:
				printf("Input error,please enter again!\n");
				break;
		}
	} while(1);
}
  • 設計遊戲過程框架
void game()
{
	initBoard();
	srand((unsigned)time(NULL));    //生成隨機種子,後面需要生成隨機座標
	char temp = ' ';                //定義一個字元變數,用於接收後面判斷函式返回值,用於決定遊戲勝負
	do
	{
		printBoard();           //列印棋盤的函式
		userPlay();             //玩家下棋的函式
		temp = judge();         //判斷遊戲是否分出勝負
		if (temp != ' ')
			break;
		robotPlay();            //電腦下棋的函式
		temp = judge();
	} while (temp == ' ');
	printBoard();
	switch (temp)
	{
		case '@':
			printf("User WIN!\n");
			break;
		case '$':
			printf("Bobot WIN!\n");
			break;
		case '*':
			printf("Dogfall !\n");
			break;
		dafault:
			break;
	}
}
  • 設計棋盤樣式
    有興趣的可以搞的更加花裡胡哨,這裡草草了事,呸,簡單設計一下 哈
//##########
// | | 
//_|_|_
// | | 
//_|_|_
// | |
//##########
  • 列印棋盤
    重點就在這了,棋盤設計的再牛逼,也得能列印出來才行
    這裡棋盤設計的比較簡易,列印起來也比較簡單,關鍵是思路要清晰
void printBoard()
{
	printf("##########\n");
	int i = 0,j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			if (j != 2)
			{
				printf("%c|",board[i][j]);
			}
			else
				printf("%c\n",board[i][j]);

		}
		if (i != 2)
			printf("_|_|_\n");
	}
	printf("##########\n");
}
  • 玩家下棋
    本人習慣用介面程式設計的座標系表示座標,因此下面賦值時橫座標和縱座標倒過來了
void userPlay()
{
	printf("Please enter coordinates->");
	int x = 0,y = 0;
	while(1)
	{
		scanf("%d %d", &x, &y);
		if (x > 0 && x < 4 && y > 0 && y < 4)
		{
			
			if (board[y - 1][x - 1] == ' ')
			{
				board[y - 1][x - 1] = '@';
				break;
			}
			else
				printf("There are chess pieces here,please enter again!->");
		}
		else
			printf("Input error,please enter again!->");
	}
}

  • 電腦下棋
    這裡關鍵是 要生成可行的座標,以及隨機數的生成
void robotPlay()
{
	int i = 0, j = 0;
	while (1)
	{
		i = rand() % 3;
		j = rand() % 3;
		if (board[i][j] == ' ')
		{
			board[i][j] = '$';
			break;
		}
	}

}
  • 判斷遊戲勝負
    這裡就到了最難分析的一部分了
    廢話不多說,直接看程式碼
char judge()
{
	int i = 0, j = 0;
        //判斷兩條對角線    對i j 的值不做帶動,所以放在前面
	if (board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' ')
		return board[i][j];
	if (board[i][j + 2] == board[i + 1][j + 1] && board[i][j + 2] == board[i + 2][j] && board[i][j] != ' ')
		return board[i][j + 2];
        //依次判斷三行、三列
	for (i = 0,j = 0; j < 3; j++)
	{
		if (board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] != ' ')
			return board[i][j];
	}
	for (i = 0,j = 0; i < 3; i++)
	{
		if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] != ' ')
			return board[i][j];
	}
        //判斷棋盤是否滿了(平局)
	for (i = 0; i < 3; i++)
	{
		for (j = 0;j < 3; j++)
		{
			if (board[i][j] == ' ')
				return board[i][j];
		}
	}
        //如果沒出現以上情況,隨便返回一個不同符號,使遊戲繼續進行
	return '*';
	
}

原始碼連結(Github)

相關文章