栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言实现三子棋

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言实现三子棋

C语言实现三子棋 1. 题目要求

用c语言实现三子棋小游戏(人机对弈)

2. 题目分析
  1. 创建并打印菜单
  2. 创建并初始化棋盘
  3. 打印棋盘
  4. 玩家下棋
  5. 电脑下棋
  6. 判断输赢,并展示结果
3. 代码实现 1)展示菜单
void menu()
{
	printf(" ------------------------------n");
	printf("|                              |n");
	printf("|     1. game     0. exit      |n");
	printf("|                              |n");
	printf(" ------------------------------n");
}
2) 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';//可下棋位置初始化为空格
		}
	}
}
3) 打印棋盘
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			//打印列分隔符
			if (j < col-1)
			{
				printf("|");
			}
		}
		printf("n");
		//打印行分隔符
		if (i < row-1)
		{
			printf("---|---|---n");
		}
	}
}
4) 玩家下棋
//玩家下棋 用“O”表示
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;//横坐标
	int y = 0;//纵坐标
	printf("玩家下棋:");
	scanf("%d%d", &x, &y);
	if (x > 0 && x <= row && y > 0 && y <= col)
	{	
		if (board[x - 1][y - 1] == ' ')
		{
			board[x - 1][y - 1] = 'O';
		}
		else
		{
			printf("非法输入n");
			PlayerMove(board, row, col);
		}
	}
	else
	{
		printf("非法输入n");
		PlayerMove(board, row, col);
	}
}
5)电脑下棋
//电脑下棋  用“X”表示  版本1
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	while (1)
	{
	//IsFull函数在 6)判断胜负 中有说明
		int flag = IsFull(board, row, col);//判断是否有位置可下  0--有
		if (flag == 0)
		{
			//电脑下棋
			int x = rand() % row;
			int y = rand() % col;
			if (board[x][y] == ' ')
			{
				board[x][y] = 'X';
				break;
			}
		}
	}
}
6) 判断胜负
char IsWin(char board[ROW][COL], int row, int col)
{
	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][0] == board[i][2]&&board[i][0]!=' ')
			return board[i][0];
	}
	//列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[0][j] == board[2][j]&&board[0][j]!=' ')
			return board[0][j];
	}
	//对角线
	if (board[0][0] == board[1][1] && board[2][2]==board[1][1] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1]!=' ')
		return board[1][1];
	//判断棋盘是否满
	if (IsFull(board, row, col))
		return 'y';//满了
	return 'n';//未满,继续
}
4. 程序演示 1)菜单展示

2)打印棋盘

3)玩家获胜

4)电脑获胜

5)平局

5. 源代码
#define _CRT_SECURE_NO_WARNINGS

//使用宏定义,便于更改游戏阶数,增加代码的灵活性
#define ROW 3//行数
#define COL 3//列数

#include
#include
#include

//----函数声明-------
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
//判断棋盘是否已满
int IsFull(char board[ROW][COL], int row, int col);

void menu()
{
	printf(" ------------------------------n");
	printf("|                              |n");
	printf("|     1. game     0. exit      |n");
	printf("|                              |n");
	printf(" ------------------------------n");
}
//----结束函数声明------

//进行游戏
void game()
{	
	char board[ROW][COL] = { 0 };
	char ret = 0;
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	//下棋
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'n')
		{
			//打印最后的棋盘
			DisplayBoard(board, ROW, COL);
			break;
		}

		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'n')
			break;
	}	
	if (ret == 'O')
		printf("玩家获胜n");
	else if (ret == 'X')
		printf("电脑获胜n");
	else if (ret == 'y')
		printf("平局n");
}

int main()
{
	srand((unsigned)time(NULL));//要产生随机值,用时间戳
	
	int input = 0;//输入选项
	do
	{
		//打印菜单
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("游戏开始n");
			game();
			break;
		case 0:
			printf("游戏已退出n");
			break;
		default:
			printf("无效输入n");
			break;
		}
		system("pause");
		system("cls");
	} while (input);

	return 0;
}

//---函数实现------
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			//打印列分隔符
			if (j < col-1)
			{
				printf("|");
			}
		}
		printf("n");
		//打印行分隔符
		if (i < row-1)
		{
			printf("---|---|---n");
		}
	}
}

//玩家下棋 O
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;//横坐标
	int y = 0;//纵坐标
	printf("玩家下棋:");
	scanf("%d%d", &x, &y);
	if (x > 0 && x <= row && y > 0 && y <= col)
	{	
		if (board[x - 1][y - 1] == ' ')
		{
			board[x - 1][y - 1] = 'O';
		}
		else
		{
			printf("非法输入n");
			PlayerMove(board, row, col);
		}
	}
	else
	{
		printf("非法输入n");
		PlayerMove(board, row, col);
	}
}
//棋盘是否已满
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;//未满
		}
	}
	return 1;//已满
}
//电脑下棋  X  版本1
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	while (1)
	{
		int flag = IsFull(board, row, col);//判断是否有位置可下  0--有
		if (flag == 0)
		{
			//电脑下棋  随机位置下棋
			int x = rand() % row;
			int y = rand() % col;
			if (board[x][y] == ' ')
			{
				board[x][y] = 'X';
				break;
			}
		}
	}
}

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][0] == board[i][2]&&board[i][0]!=' ')
			return board[i][0];
	}
	//列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[0][j] == board[2][j]&&board[0][j]!=' ')
			return board[0][j];
	}
	//对角线
	if (board[0][0] == board[1][1] && board[2][2]==board[1][1] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1]!=' ')
		return board[1][1];
	//判断棋盘是否满
	if (IsFull(board, row, col))
		return 'y';//满了
	return 'n';//未满,继续
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849220.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号