C语言实现三子棋实现

博客介绍了游戏开发相关文件,包含头文件.h,进行游戏所需的源文件.c 用于实现头文件函数,还有运行游戏的源文件.c,这些文件是游戏开发的重要组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件.h

#include<time.h>
#include<stdio.h>
#include<string.h>
#include<Windows.h>

#define ROWS 3			 //控制行的大小
#define COLS 3           //控制列的大小

void Init_board(char arr[ROWS][COLS], int ROW , int COL);        //初始化棋盘
void Display_board(char arr[ROWS][COLS], int ROW , int COL);     //打印棋盘
void Player_move(char arr[ROWS][COLS], int ROW, int COL);		//玩家走
char CheckWin(char arr[ROWS][COLS], int ROW, int COL);			//判断输赢
void Computer_move(char arr[ROWS][COLS],int ROW, int COL);		//电脑走

进行游戏所需要的源文件.c 对头文件的函数进行实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"tic-tac-toe.h"

void Init_board(char arr[ROWS][COLS], int ROW, int COL)        //初始化棋盘
{
	memset(arr, ' ', ROWS*COLS * sizeof(arr[0][0]));           //所有元素变为空
}

void Display_board(char arr[ROWS][COLS], int ROW, int COL)     //打印棋盘
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)								//分行
	{
		for (j = 0; j < COL; j++)							//打印行的第一部分
		{
			printf(" %c ", arr[i][j]);
			if (j < ROW - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < ROW - 1)									//打印行的第二部分
		{
			for (j = 0; j < COL; j++)
			{
				printf("---");
				if (j < COL - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void Player_move(char arr[ROWS][COLS], int ROW, int COL)		//玩家走
{
	int a = 0;
	int b = 0;
	while (1)
	{
		printf("输入坐标 :");
		scanf("%d %d", &a, &b);
		if (a < 1 || a >ROW || b < 1 || b > COL)
		{
			printf("非法坐标");
		}
		if (arr[a - 1][b - 1] != ' ')                          //接收的坐标比实际数组下标大一
		{
			printf("已经有棋子了!");
		}
		if (arr[a - 1][b - 1] == ' ')
		{
			arr[a - 1][b - 1] = '*';
			break;
		}
	}
}

char full_borad(char arr[ROWS][COLS], int ROW, int COL) //判断是否满了
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (arr[i][j] == ' ')						//有空不为满
				return ' ';
		}
	}
	return 'q';
}

char CheckWin(char arr[ROWS][COLS], int ROW, int COL)			//判断输赢  '*'玩家获胜 'q'平局 '#'电脑获胜
{
	int people = 0;
	int computer = 0;
	char full;
	people = ROW_win(arr, ROW, COL, '*');//判断行获胜
	computer = ROW_win(arr, ROW, COL, '#');
	if (people == ROW)
	{
		return '*';
	}

	if (computer == ROW)
	{
		return '#';
	}

	people = COL_win(arr, ROW, COL, '*'); //判断列获胜
	computer = COL_win(arr, ROW, COL, '#');
	if (people == COL)
		return '*';
	if (computer == COL)
		return '#';

	people = Sideways(arr, ROW, COL, '*'); //判断斜右获胜
	computer = Sideways(arr, ROW, COL, '#');
	if (people == COL)
		return '*';
	if (computer == COL)
		return '#';

	people = Sideways2(arr, ROWS, COLS, '*'); //判断斜左获胜
	computer = Sideways2(arr, ROWS, COLS, '#');
	if (people == COLS)
		return '*';
	if (computer == COLS)
		return '#';

	full = full_borad(arr, ROWS, COLS);      //判断是否平局
	if (full == 'q')
		return ' ';

	return 'q';
}

int ROW_win(char arr[ROWS][COLS], int ROW, int COL, char c) //横着获胜返回长度,不然返回0
{
	int count = 0;
	int j = 0;
	int i = 0;
	for (j = 0; j < COLS; j++)
	{
		for (i = 0; i < ROWS; i++)
		{
			if (arr[j][i] == c)
				count++;
		}
		if (count == ROWS)                //判断每一行
			break;
		else
			count = 0;
	}
	return count;
}
int COL_win(char arr[ROWS][COLS], int ROW, int COL, char c) //竖着获胜返回长度,不然返回0
{
	int count = 0;
	int j = 0;
	int i = 0;
	for (j = 0; j < COLS; j++)
	{
		for (i = 0; i < ROWS; i++)
		{
			if (arr[i][j] == c)
				count++;
		}
		if (count == COLS)                  //判断每一列
			break;
		else
			count = 0;
	}
	return count;
}
int Sideways(char arr[ROWS][COLS], int ROW, int COL, char c)//斜着向右下
{
	int count = 0;
	int j = 0;
	int i = 0;
	for (i = 0; i < ROWS; i++)
	{
		if (arr[i][j] == c)
			count++;
		j++;
	}
	if (count != ROWS)
		count = 0;
	return count;
}
int Sideways2(char arr[ROWS][COLS], int ROW, int COL, char c)//斜着向左下
{
	int count = 0;
	int i = ROWS - 1;
	int j = COLS - 1;
	for (i = 0; i > ROWS; i++)
	{
		if (arr[i][j] == c)
			count++;
		j--;
	}
	if (count != ROWS)
		count = 0;
return count;
}

void Computer_move(char arr[ROWS][COLS], int ROW, int COL)		//电脑走
{
	int a = 0;
	int b = 0;
	while (1)
	{
		a = rand() % ROWS;
		b = rand() % COLS;
		if (arr[a][b] == ' ')
		{
			arr[a][b] = '#';
			break;
		}
	}
}

运行游戏的源文件.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"tic-tac-toe.h"

void menu()
{
	printf("*********************************\n");
	printf("*********1   进入游戏    ********\n");
	printf("*********0   退出游戏    ********\n");
	printf("*********************************\n");
}

void tic_tac()
{
	char ret = 0;
	char arr[ROWS][COLS];
	Init_board(arr, ROWS, COLS);          //初始化棋盘
	Display_board(arr, ROWS, COLS);       //打印棋盘
	while (1)
	{
		Player_move(arr, ROWS, COLS);		//玩家走
		Display_board(arr, ROWS, COLS);		//显示棋盘
		ret = CheckWin(arr, ROWS, COLS);	//判断输赢
		if (ret != 'q')
		{
			break;
		}
		Computer_move(arr, ROWS, COLS);		//电脑走
		Display_board(arr, ROWS, COLS);		//显示棋盘
		ret = CheckWin(arr, ROWS, COLS);	//判断输赢
		if (ret != 'q')
		{
			break;
		}
	}
	if (ret == '#')
	{
		printf("电脑获胜\n");
	}
	if (ret == '*')
	{
		printf("玩家获胜\n");
	}
	if (ret == ' ')
	{
		printf("平局");
	}

}

void test()
{
	int number = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		scanf("%d", &number);
		switch (number)
		{
		case 1:
			tic_tac();
			break;
		case 2:
			break;
		default:
			printf("输入错误,重新选择\n");
			break;
		}
	} while (number);
}

int main()
{
	test();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值