C语言三子棋

三子棋

今天我花了好长时间按做这个三子棋,希望大家能够喜欢,有兴趣朋友可以下载玩玩

话不多说,源码呈上
代码分为三个文件,一个是test.c测试文件,一个是game.h头文件,最后一个是game.h文件

game.h
game.h头文件负责的是重要函数的声明,在我们写大型项目时,如果只用一个文件去写代码时,很容易混乱,而且不易修改维护。
采用多文件的形式,逻辑清晰,便于维护。头文件就是把构成程序重要的函数声明,宏,等实现,其他文件只要调用它就可以
使用它,其他文件加上#include"头文件名就可以了。

#ifndef GAME.H
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

#define ROW 4
#define COL 4


void InitBroad(char broad[ROW][COL], int, int);//声明Map
void Display_Borad(char broad[ROW][COL], int, int);//声明棋盘函数
void ComputerMove(char broad[ROW][COL], int, int);//电脑移动
void PlayerMove(char broad[ROW][COL], int, int);//玩家移动

char Is_win(char broad[ROW][COL], int, int);//根据返回值来判断输赢
int is_Fill(char broad[ROW][COL], int, int);
#endif // !GAME.H

game.c
我们都知道函数有声明和定义,我们在game.h文件中函数声明,在game.c文件中函数定义(实现)。
当然你也可以在game.h中完成函数实现,用一个文件完成函数的实现。这样也可以达到我们的目的,但是我给你讲一个好处,你就明白为什么要这样写,我们都知道库函数吧,库函数里面的函数特别好用,例如:printf();scanf()等,我们甚至不用管它里面如何实现的,只要会用就行,同理,当你以后成为大佬,牛逼的时候,你也可以写一个库,如果你写的库特别好用,是可以赚钱的,这时候你得把你写的库给被人介绍,说明,这时候,你可以把库的头文件给别人,因为头文件里面只有函数的声明,没有实现,别人就不会知道你重要源码,这样既保证了自己的知识产权,又方便别人使用。-----嘿嘿,说了好多废话.
总之,game.c文件对game.h文件声明的函数进行实现。

#include"game.h"

void InitBroad(char broad[ROW][COL], int row, int col)
{
	memset(&broad[0], ' ', row * col * sizeof(broad[0][0]));
}

void Display_Borad(char broad[ROW][COL], int row, int col)
{
//	system("cls");
	int i = 0;
	int j = 0;

	for (i = 0; i < row; i++)
	{


		for (j = 0; j < col; j++)
		{
			printf(" %c ", broad[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}

	}
	
}

void ComputerMove(char broad[ROW][COL], int row, int col)
{
	int ret1 = rand() % ROW;
	int ret2 = rand() % COL;
	while (1)
	{
		if (broad[ret1][ret2] == ' ')
		{
			broad[ret1][ret2] = 'X';
			break;
		}
	}
}

void PlayerMove(char broad[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	while (1)
	{
		printf("请输入坐标>");
		scanf_s("%d%d", &i, &j);
		if ((i >= 1 && i <= ROW) && (j >= 1 && j <= COL))
		{
			if (broad[i - 1][j - 1] == ' ')
			{
				broad[i - 1][j - 1] = 'Y';//A代表玩家输入
				break;
			}
			else
				printf("被占用,请重新输入!\n");
		}
		else
		{
			printf("错误输入!\n");
		}

	}
}

char Is_win(char broad[ROW][COL], int row, int col)
{
	
#if 0

	int i = 0, j = 0;

	for (i = 0; i < ROW; i++)
	{
		if (broad[i][0] == broad[i][1] && broad[i][1] == broad[i][2] && broad[i][0] != ' ')
			return broad[i][0];
		if (broad[0][i] == broad[1][i] && broad[1][i] == broad[2][i] && broad[0][i] != ' ')
			return broad[0][i];
	}
	if (broad[0][0] == broad[1][1] && broad[1][1] == broad[2][2] && broad[i][0] != ' ')
		return broad[0][0];
	if (broad[0][2] == broad[1][1] && broad[1][1] == broad[2][0] && broad[i][0] != ' ')
		return broad[1][1];
	if (is_Fill(broad, ROW, COL) == 1)
	{
		return 'P';
	}
	return ' ';

#elif 1

	int i = 0, j = 0;
	int count1 = 0;//计数器1
	int count2 = 0;//计数器2
	//这是判断行列赢得情况
	for (i = 0; i < row; i++)
	{
		count1 = 0;
		count2 = 0;
		for (j = 0; j < col; j++)
		{

			if (broad[i][j] == ' ')//如果是空的话,跳出
				break;
			if (broad[i][j] == 'X')
				count1++;
			if (broad[i][j] == 'Y')
				count2++;
			if (count1 == col)
				return 'X';
			if (count2 == col)
				return 'Y';
		}
	}
	//这是判断数列赢得情况
	for (i = 0; i < row; i++)
	{
		count1 = 0;
		count2 = 0;
		for (j = 0; j < col; j++)
		{
			if (broad[j][i] == ' ')//如果是空的话,跳出
				break;
			if (broad[j][i] == 'X')
				count1++;
			if (broad[j][i] == 'Y')
				count2++;
			if (count1 == col)
				return 'X';
			if (count2 == col)
				return 'Y';
		}
	}
	//这是对角线形式赢得情况
	count1 = 0;
	count2 = 0;
	for (i = 0; i < row; i++)
	{
		if (broad[i][i] == ' ')//如果是空的话,跳出
			break;
		if (broad[i][i] == 'X')
			count1++;
		if (broad[i][i] == 'Y')
			count2++;
		if (count1 == col)
			return 'X';
		if (count2 == col)
			return 'Y';
	}

	//这是对角线形式赢得情况
	count1 = 0;
	count2 = 0;
	for (i = 0; i < row; i++)//col=3
	{
		if (broad[i][col - 1 - i] == ' ')//如果是空的话,跳出
			break;
		if (broad[i][col - 1 - i] == 'X')
			count1++;
		if (broad[i][col - 1 - i] == 'Y')
			count2++;
		if (count1 == col)
			return 'X';
		if (count2 == col)
			return 'Y';
	}



	//这是判断平局得情况
	if (is_Fill(broad, ROW, COL) == 1)
	{
		return 'P';
	}
	//这是继续的情况
	return ' ';


#endif //0
}

int is_Fill(char broad[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (broad[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

test.c
上面两个文件就像积木,里面有好多你做好的积木(函数),这个文件就是你这个艺术家拼接的过程,把积木(函数)用你的智慧做出你想要的工艺品。
test.c是主函数main()存在的文件,我们都知道所有程序的入口和出口都是main()函数的。main()就是拼接的过程。

/*
	三子棋
*/

#include"game.h"


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

void game()
{
	int ret = 0;
	char broad[ROW][COL] = { 0 };
	InitBroad(broad, ROW, COL);
	Display_Borad(broad, ROW, COL);//打印棋盘
	while (1)
	{
		system("cls");
		printf("\n电脑走>\n");
		ComputerMove(broad, ROW, COL);//电脑移动
		Display_Borad(broad, ROW, COL);
		ret = Is_win(broad, ROW, COL);
		if (ret != ' ')
			break;

		printf("\n玩家走>\n");
		PlayerMove(broad, ROW, COL);//玩家移动
		Display_Borad(broad, ROW, COL);
		ret = Is_win(broad, ROW, COL);
		if (ret != ' ')
			break;

	}

	if (ret == 'X')
		printf("电脑赢!\n");
	else if (ret == 'Y')
		printf("玩家赢!\n");
	else if (ret == 'P')
		printf("平局!\n");
	(broad, ROW, COL);//打印棋盘
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//设置种子

	do
	{
		menu();//菜单

		printf("请输入>");
		scanf_s("%d", &input);

		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;

		default:
			printf("错误输入!\n");
			break;
		}


	} while (input != 0);

	system("pause");
	return 0;
}

好了,就分享到这了,
愿对你有帮助的你能收获,没有帮助的睡一觉忘掉。
希望能帮助到你,嘿嘿,随后我会上传扫雷
如果代码有什么错误,希望您能指点,您的点滴指点就是对我最大的鼓励。
共同学习,共同交流,共同进步。
祝福您每天幸福快乐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值