三子棋游戏

目录

一、问题描述

二、基本流程

三、步骤

  1. 菜单界面
  2. 创建棋盘
  3. 棋盘初始化
  4. 打印棋盘
  5. 玩家落子
  6. 电脑落子
  7. 检验结果

四、代码实现

一、问题描述

用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");
	}
}

结果:

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;
}

玩家胜:

电脑胜:

和棋:

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

四、代码实现

游戏逻辑:

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;
	}
}

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怎样让大排不硬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值