c语言三子棋详解

思路:
1. 定义并初始化二维数组(初始化数组一定要用{})
2. 打印棋盘
3. 玩家落子
判断游戏是否达到结束条件
提示玩家输入落子坐标
判断玩家落子是否合法
给二维数组赋值,即落子
4. 电脑落子
判断是否到达结束条件
用随机数给电脑赋值坐标
判断电脑落子是否合法
给二维数组赋值,即落子
5. 执行步骤3

#define _CRT_SECURE_NO_WARNINGS//宏定义
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3//定义棋盘的横行数
#define COL 3//定义棋盘的纵行数
int ChessBoard[ROW][COL] = { ' '};//定义二维数组,并对其初始化
void PrintBoard()
{	//打印棋盘
	for (int row = 0; row < ROW; ++row)
	{
		printf("-------------\n");
		printf("| %c | %c |  %c|\n",ChessBoard[row][0],ChessBoard[row][1],ChessBoard[row][2]);
		if (row ==2)
		{
			printf("-------------\n");
		}
	}
}
char CheckEnd()//检查游戏是否可以结束
{
	//横行相等
	for (int row = 0; row < ROW; ++row)
	{
		if (ChessBoard[row][0] == ChessBoard[row][1] && ChessBoard[row][0]
			== 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[2][col]
			== ChessBoard[0][col] && ChessBoard[0][col] != ' ')
		{
			return ChessBoard[0][col];
		}
	}
	//两条对角线各自相等
	if (ChessBoard[0][0] == ChessBoard[1][1] && ChessBoard[0][0] 
		== ChessBoard[2][2] && ChessBoard[0][0] != ' ')
	{
		return ChessBoard[0][0];//返回给函数此时相等的字符
	}
	if (ChessBoard[2][0] == ChessBoard[1][1] && ChessBoard[1][1] 
		== ChessBoard[0][2] && ChessBoard[1][1] != ' ')
	{
		return ChessBoard[1][1];
	}
	//判断是否和棋
	for (int row=0; row < ROW; row++)
	{
		for (int col=0; col < COL; ++col)
		{
			if (ChessBoard[row][col] != ' ')
			{
				goto a;
			}
		}
		if (ChessBoard[2][2] != ' ')
		{
			return 'q';
		}
	}
	a:;

}

void PlayerMove()//玩家下子
{
	while (1)//设置循环如果用户输入不符合,再次输入
	{
		printf("请玩家落子:(x y)\n");
		int row;
		int col;
		scanf("%d %d", &row, &col);
		if (ChessBoard[row][col] == 'c' || ChessBoard[row][col] == 'p')
		{							//玩家输入位置不能与输入的重叠
			printf("您输入的地方有子,请重新输入\n");
			continue;//如果重合就跳过这次,从函数入口在循环
		}
		if (row<0 || row>ROW - 1 || col<0 || col>COL - 1)
		{			//判断用户输入是否超越边界
			printf("非法输入,请重新输入\n");
			continue;
		}
		ChessBoard[row][col] = 'p';//给二维数组赋值,即玩家下子
		char n = CheckEnd();//调用CheckEnd函数判断是否结束
		if (n =='p')     //将它的返回值赋给n
		{
			printf("玩家获胜\n");
		}
		if (n == 'c')
		{
			printf("菜鸡,电脑都打不过\n");
		}
		if (n == 'q')
		{
			printf("平局\n");
		}
		break;//用户输入完成跳出循环
	}
}
void ComputerMove()//电脑下子
{
	while (1)//设置循环使下子完成
	{
		char n = CheckEnd();
		//srand((unsigned int)time(NULL));//随机数生成器,使程序每打开一次,随机数就会发生变化
		int row = rand() % 3;//取0-2之间的整数
		int col = rand() % 3;
		if (ChessBoard[row][col] == 'p' || ChessBoard[row][col] == 'c')
		{					//保证成功下子
			continue;
		}
		ChessBoard[row][col] = 'c';//给数组赋值,即电脑下子
		
		if (n == 'p')
		{
			printf("玩家获胜\n");
		}
		if (n == 'c')
		{
			printf("菜鸡,电脑都打不过\n");
		}
		if (n == 'q')
		{
			printf("平局\n");
		}
		break;
	}
}
int main()
{
	while (1)
	{
		PrintBoard();
		PlayerMove();
		ComputerMove();
		int n = CheckEnd();
		if (n == 'p' || n == 'c')
		{    //返回值若是这2个说明已经有一方结束了
			break;//跳出循环,停止玩家,电脑循环下子
		}
	}

	system("pause");
}

结果
在这里插入图片描述


版权声明:本文为Electronic_rest原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。