一、问题描述

用C语言实现三子棋。

二、基本流程

1.打印菜单选择开始或退出游戏

2.创建一个二维数组作为棋盘并初始化

3.打印棋盘

4.玩家落子“X”代表玩家

5.检验结果

6.电脑落子“O”代表电脑

7.检验结果

8.判断结果

9.回到步骤2

三、步骤

1.菜单界面

1.开始游戏   2.退出游戏

void Menu()
{
	printf("+--------------------+\n");
	printf("|   1.Play   2.Exit  |\n");
	printf("+--------------------+\n");
}
int main()
{
	int select = 0;
	int quit = 0;
	while (!quit){
		Menu();
		printf("Please Select#");
		scanf("%d",&select);
		switch (select){
		case 1:       //选择1进入游戏
			Game();
			break;
		case 2:       //选择2退出游戏
			quit = 1;
			break;
		default:     //输入其他显示出错
			printf("You Enter Error,Try Again!\n");
			break;
		}
	}
	printf("ByeBye!\n");
	system("pause");
	return 0;
}

结果:

三子棋游戏_游戏开发

2.创建棋盘

使用三行三列的二维数组表示,在这里使用宏定义,提高代码的可读性和可维护性。

#define ROW 3
#define COL 3

 
#define WHITE 'X'  //玩家
#define BLACK 'O'  //电脑
#define INIT ' '   
#define DRAW 'D'   //和棋
#define NEXT 'N'   //继续

3.棋盘初始化

INIT表示空格

#define INIT ' '
static void InitBoard(char board[][COL], int row, int col){
	for (int i = 0; i < row; i++){
		for (int j = 0; j < col; j++){
			board[i][j] = INIT;
		}
	}
}


4.打印棋盘

static void ShowBoard(char board[][COL], int row, int col){
	system("cls");
	for (int i = 0; i < col; i++){
		printf(" %4d", i+1);
	}
	printf("\n  +---+----+---+\n");
	for (int i = 0; i < row; i++){
		printf("%-2d", i+1);
		for (int j = 0; j <col; j++){
			printf("|  %c", board[i][j]);
		}
		printf("\n  +---+----+---+\n");
	}
}

结果:

三子棋游戏_游戏开发_02

5.玩家落子

玩家输入行列坐标表示落子,“X”代表玩家。

注意:

1.玩家落子需要在棋盘范围内;

2.玩家要选择棋盘上空的位置落子;

3.如果输入的坐标不对要重新输入。

static void PlayerMove(char board[][COL], int row, int col){
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("Please Enter Position<x,y>#");
		scanf("%d %d", &x, &y);
		if (x<1 || y<1 || x>3 || y>3){     //判断玩家输入的坐标是否满足要求
			printf("Enter Position Error!\n");
			continue;
		}
		if (board[x - 1][y - 1] == INIT){     //判断玩家落子的地方是否为空
			board[x - 1][y - 1] = WHITE;
			break;
		}
		else{
			printf("Position Is Not Empty!\n");
		}
	}
}

6.电脑落子

种一颗随机数种子,让电脑随机生成行列坐标,“O”表示电脑落子。

注意:

1.在数函数中使用srand((unsigned long)time(NULL)),用时间作为随机数种子;

2.电脑要在棋盘空格地方落子;(走到这里,表示一定还有空格,因为在玩家落子之后进行了结果判断,在这里就不需要在判断是否还有空格);

//srand((unsigned long)time(NULL));  种一个随机数种子
static void ComputerMove(char board[][COL], int row, int col){
	while (1){
		int x = rand() % row;  //x取值范围为0到2
		int y = rand() % col;  //y取值范围为0到2
        if (board[x][y] == INIT){    //判断落子点是否为空
			board[x][y] = BLACK;
			break;
		}
	}
}

7.检验结果

1.返回结果:

(1).“X”表示玩家胜;

(2).“O”表示电脑胜;

(3).“D”表示和棋;

(4).“N”表示一盘棋还没下完,继续下棋。

2.判断和棋或者继续

如果数组元素中有空格,表示棋盘没满,继续;如果棋盘满了没分出胜负,和棋。

3.判断电脑或玩家胜

(1).判断所有行

(2).判断所有列

(3).判断两条对角线

static char IsEnd(char board[][COL], int row, int col){
	for (int i = 0; i < row; i++){
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != INIT){
			return board[i][0];   //判断所有行
		}
	}
	for (int j = 0; j < col; j++){
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != INIT)
		{
			return board[0][j];    //判断所有列
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != INIT){
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != INIT){
		return board[0][2];    //判断两条对角线
	}
	for (int i = 0; i < row; i++){
		for (int j = 0; j < col; j++){
			if (board[i][j] == INIT){
				return NEXT;
			}
		}
	}
	return DRAW;
}

玩家胜:

三子棋游戏_游戏开发_03

电脑胜:

三子棋游戏_游戏开发_04

和棋:

三子棋游戏_游戏开发_05

注意:每次玩家落子之后都要判断一下结果,每次电脑落子之后也要判断

四、代码实现

游戏逻辑:

void Game()
{
	char board[ROW][COL];  //创建棋盘
	InitBoard(board, ROW, COL);  //初始化棋盘
 
	srand((unsigned long)time(NULL));  //种随机数种子
	char result = 0;
	while (1){
		ShowBoard(board, ROW, COL);   //显示棋盘
		PlayerMove(board, ROW, COL);   //玩家下
		result = IsEnd(board, ROW, COL);   //判断结果
		if (result != NEXT){
			break;
		}
		ShowBoard(board, ROW, COL);   //显示棋盘
		ComputerMove(board, ROW, COL);   //电脑下
		result = IsEnd(board, ROW, COL);  //判断结果
		if (result != NEXT){
			break;
		}
	}
	ShowBoard(board, ROW, COL);  //显示棋盘
	switch (result){
	case WHITE:
		printf("You Win!\n");
		break;
	case BLACK:
		printf("You Lose!\n");
		break;
	case DRAW:
		printf("You==Computer!\n");
		break;
	default:
		printf("BUG!\n");
		break;
	}
}

那说到这里,一款三子棋游戏就结束了咯!