c语言实现更加简洁的三子棋(包括源代码)

目录

1.游戏的环境设置

        1.1 搭建游戏环境

2.游戏的框架搭建

        2.1 实现游戏的初始化界面
        2.2 test函数的定义
        2.3 打印游戏菜单的menu函数的定义
        2.4 游戏算法的实现(game函数的定义)

3.游戏中的各函数的实现

        3.1 定义一个二维数组用于存储棋盘信息
        3.2 初始化数组
        3.3 定义函数用于打印数组
        3.4 定义函数用于玩家下棋
        3.5 定义函数用于电脑下棋
        3.6定义函数用于胜负的判断
        3.7定义函数用于平局的判断

4.源代码

        4.1 头文件game1.h
        4.2 源文件game1.c
        4.3 源文件test.c

 --------------------------------------------------------------------------------------------------------------------------------

1,新建一个头文件用于声明函数和设置常量,新建两个源文件,用于定义函数和实现整个游戏的算法。

2 , 实现游戏的各种功能和算法逻辑

        2.1 实现游戏的初始化界面

#define _CRT_SECURE_NO_WARNINGS//如果你用的是vscode则需要写这段代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
	test();//整个游戏的实现
	return 0;
}

        2.2  test函数的定义

void test()
{
	(unsigned int)time(NULL);//设置随机数
	int input = 0;
	do
	{
		menu();//游戏菜单的打印
		printf("请选择:>");
		scanf("%d", &input);
		system("cls");//执行系统的清除命令
		switch (input)//进行选择 1.进行游戏 0.退出游戏
		{
		case 1:
			game();//游戏算法的实现
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("无效数字,请重新选择\n");
			break;
		}
	} while (input);
}

        2.3 打印游戏菜单的menu函数的定义

void menu()
{
	printf("   **********************\n");
	printf("   ***1. play  0. exit***\n");
	printf("   **********************\n");
}

        2.4 游戏算法的实现(game函数的定义)

void game()
{
	//存储棋盘信息
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	//下棋
	int ret = 0;
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);//玩家下棋
		DisplayBoard(board, ROW, COL);//打印棋盘
		//玩家胜负判断
		ret = DecideResult(board, ROW, COL);//胜负判断函数
		if (ret == '*')
		{
			printf("玩家获胜\n");
			break;
		}
		ret = IsFull(board, ROW, COL);//平局判断函数
		if (ret == 2)
		{
			printf("平局\n");
			break;
		}
		system("cls");//系统清除命令,优化游戏
		//电脑下棋
		ComputerMove(board, ROW, COL);//电脑下棋
		DisplayBoard(board, ROW, COL);//打印棋盘
		//电脑胜负判断
		ret = DecideResult(board, ROW, COL);
		if (ret == '#')
		{
			printf("电脑获胜\n");
			break;//跳出循环
		}
	}
}

 

 3.  解释game()函数的实现及其中的函数定义

        3.1  首先定义一个二维数组用于存储棋盘信息

char board[ROW][COL] = { 0 };

        3.2 在头文件game1.h中声明一个函数初始化该数组并在源文件game1.c中定义该函数

void InitBoard(char board[ROW][COL], int row, int col);//声明函数
void InitBoard(char board[ROW][COL], int row, int col)//定义函数
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';//使该数组中的每个元素都为‘ ’
		}
	}
}

        3.3 上步中我们初始化了该数组中的每个元素,那么这步我们应该定义一个函数用于打印该数组

void DisplayBoard(char board[ROW][COL],int row, int col);//声明函数
void DisplayBoard(char board[ROW][COL], int row, int col)//定义函数
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (int k = 0; k < col; k++)
			{
				printf("---");
				if (k < col - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}

函数运行结果:

        3.4 接下来就是下棋过程中的函数实现,首先是玩家下棋,该函数的实现

void PlayerMove(char board[ROW][COL], int row, int col);//声明玩家下棋函数

        然后就是玩家下棋函数的定义实现

void PlayerMove(char board[ROW][COL], int row, int col)//定义函数
{
	printf("玩家走:>\n");
	while (1)
	{
		int x = 0, y = 0;
		printf("请输入要下的坐标:> \n");
		printf("x = ");
		scanf("%d", &y);
		printf("y = ");
		scanf("%d", &x);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断x,y坐标是否合法
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;//跳出循环
			}
			else
			{
				printf("该坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

    3.5  玩家下完之后则轮到了电脑下棋,电脑下棋我们需要定义一个随机数,并通过随机数来实现电脑下棋

       

(unsigned int)time(NULL);//设置随机数
void ComputerMove(char board[ROW][COL], int row, int col);//声明电脑下棋的函数
void ComputerMove(char board[ROW][COL], int row, int col)//定义电脑下棋的函数
{
	int x = 0, y = 0;
	while (1)
	{
		x = rand() % row;//生成0到row之间的随机数
		y = rand() % col;//生成0到col之间的随机数
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

 

        3.6 每次下完棋后无论是玩家下还是电脑下都需要定义一个函数用于判断是否有三个棋子连成一条线,也就是胜负的判断

        所以我们需要定义一个函数用于判断胜负

char DecideResult(char board[ROW][COL], int row, int col);//声明函数

       胜负判断我们需要判断是否有三个连续的棋子,包括横竖三列和对角线的判断

char DecideResult(char board[ROW][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] != ' ')
		{
			return board[i][0];
		}
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//对角线判断
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')
	{
		return board[2][0];
	}
	else
		return 0;
}

 判断之后可以用一个元素来接收返回值,并判断是玩家赢还是电脑赢,因为一方胜利以后该游戏就会结束,所以需要在每次玩家下棋后和电脑下棋后都进行一次判断

ret = DecideResult(board, ROW, COL);//接收返回值
if (ret == '*')//判断返回值
{
	printf("玩家获胜\n");
	break;
}
if(ret == '#')
{
    printf("电脑获胜\n");
    break;
}

        3.7 除了胜负的判断以外,还有平局这种情况的判断,因此我们还需要写一个函数用于判断是否平局的这种情况

char IsFull(char board[ROW][COL], int row, int col);//声明函数

 定义该函数的时候我们可以设定两个返回值,若为1则继续进行游戏,若为2则说明是平局

char IsFull(char board[ROW][COL], int row, int col)//定义函数
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 1;
			}
		}
	}
	return 2;
}

同时在game()函数中我们可以用一个元素来接收返回值并判断游戏是否继续进行

ret = IsFull(board, ROW, COL);//平局判断
if (ret == 2)
{
	printf("平局\n");
	break;
}
system("cls");

最后的system函数用于优化该游戏的表达

到此我们的游戏便全部完成了。

 

4.源代码

        4.1 头文件game1.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<time.h>
#include <stdlib.h>
//设置常量
#define ROW 3
#define COL 3
//声明函数
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 DecideResult(char board[ROW][COL], int row, int col);
char IsFull(char board[ROW][COL], int row, int col);

    4.2 源文件game1.c

#include "game1.h"
//定义函数
//初始化
void InitBoard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (int k = 0; k < col; k++)
			{
				printf("---");
				if (k < col - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("玩家走:>\n");
	//判断x,y坐标的合法性并记录x,y
	while (1)
	{
		int x = 0, y = 0;
		printf("请输入要下的坐标:> \n");
		printf("x = ");
		scanf("%d", &y);
		printf("y = ");
		scanf("%d", &x);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	while (1)
	{
		x = rand() % row;//生成0到row之间的随机数
		y = rand() % col;//生成0到col之间的随机数
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
//胜负判断
//玩家赢 '*'
//电脑赢 '#'
char DecideResult(char board[ROW][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] != ' ')
		{
			return board[i][0];
		}
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//对角线判断
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')
	{
		return board[2][0];
	}
	else
		return 0;
}
//平局判断
char IsFull(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 1;
			}
		}
	}
	return 2;
}

 4.3源文件test.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game1.h"
void menu()
{
	printf("   **********************\n");
	printf("   ***1. play  0. exit***\n");
	printf("   **********************\n");
}
//游戏的整个算法实现
void game()
{
	//存储棋盘信息
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	//下棋
	int ret = 0;
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//玩家胜负判断
		ret = DecideResult(board, ROW, COL);
		if (ret == '*')
		{
			printf("玩家获胜\n");
			break;
		}
		ret = IsFull(board, ROW, COL);//平局判断
		if (ret == 2)
		{
			printf("平局\n");
			break;
		}
		system("cls");
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//电脑胜负判断
		ret = DecideResult(board, ROW, COL);
		if (ret == '#')
		{
			printf("电脑获胜\n");
			break;
		}
	}
}

void test()
{
	(unsigned int)time(NULL);//设置随机数
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		system("cls");
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("无效数字,请重新选择\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值