c语言三子棋

文章介绍了一个使用C语言编写的三子棋游戏的代码结构,包括游戏逻辑、棋盘初始化、玩家和电脑的下棋功能以及输赢判断。代码分为test.c、game.c和game.h三个部分,通过菜单选择开始游戏,然后轮流进行玩家和电脑的下棋步骤,每次下棋后都会检查是否产生赢家或平局。
摘要由CSDN通过智能技术生成

1.思路讲解

2.注意事项

3.代码实现

思路讲解:首先,由于代码过长,一般将代码分为几个文件,大致分为如下:test.c(测试游戏逻辑),game.c(函数的实现),game.h(函数的声明)。接下来,先大致理清思路:提供菜单进入游戏,创建和初始化棋盘,划分好格子,玩家下棋,判断输赢,电脑下棋,判断输赢。

注意事项:1.棋盘的初始化看作二维数组的初始化,先把每个空给上空格,便于输入

                   2.判断输赢时要充分考虑好各种情况,例如:玩家赢,电脑赢,平局

                   3.电脑要做到随机下棋要使用rand函数,通过时间戳来设计srand

代码展示:

game.h:

#include<stdio.h>
#include<stdlib.h>
#define Hang 4
#define Lie 4
void game();
void InitBoard(board, lie, hang);
void DisplayBoard(board, lie, hang);
char Winer(board, lie, hang);
void Computer(board, lie, hang);
void Player(board, lie, hang);

test.c:

#include"game.h"
void menu()
{
	printf("***********************\n");
	printf("*******1.开始游戏******\n");
	printf("*******0.退出游戏******\n");
		
}
int main()
{
	int input;
	srand((unsigned int)time(NULL));
	menu();
	
	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏");
			break;
		}
		default:
		{
			printf("错误");
			break;
		}
		}
	} while (input);
	return 0;
}

game.c

#include"game.h"
void game()
{
	int l=1;
	char x;
	char board[Lie][Hang];
	printf("开始三子棋游戏\n");
	InitBoard(board, Lie, Hang);//初始化棋盘
	DisplayBoard(board, Lie, Hang);//打印棋盘
	while (l)
	{
		Player(board, Lie, Hang);//玩家下棋
		DisplayBoard(board, Lie, Hang);
		x=Winer(board, Lie, Hang);//每输入一步就要判断一次输赢
		if (x != 'c')
		{
			break;
		}
		Computer(board, Lie, Hang);
		DisplayBoard(board, Lie, Hang);
		x = Winer(board, Lie, Hang);
		if (x != 'c')
		{
			break;
		}
	}
	if (x == '*')
		printf("获胜!!!\n");
	else if (x == '+')
		printf("失败\n");
	else if (x == 'p')
		printf("平局\n");
}
void InitBoard(char board[Lie][Hang], int hang, int lie)
{
	for (int i = 0; i < lie; i++)
	{
		for (int j = 0; j < hang; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void DisplayBoard(char board[Lie][Hang], int lie, int hang)
{
	for (int i = 0; i < lie; i++)
	{
		for (int j = 0; j < hang; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < hang - 1)
				printf("|");
		}
		printf("\n");
		if (i < lie - 1)
		{
			for (int j = 0; j < hang; j++)
			{
				printf("---");
				if (j < hang - 1)
					printf("|");
			}
		}
		printf("\n");
	}
}
void Player(char board[Lie][Hang], int lie, int hang)
{
	int i,j,z=1;
	printf("玩家下棋\n");
	printf("请输入坐标\n");
	scanf("%d %d", &i, &j);
	while(z)
	{
		if (i > lie || j > hang)
		{
			printf("输入错误,请重新输入\n");
			scanf("%d %d", &i, &j);
		}
		else
		{
			if (board[i - 1][j - 1] == '*' || board[i - 1][j - 1] == '+')
			{
				printf("输入错误,请重新输入\n");
				scanf("%d %d", &i, &j);
			}
			else if (board[i - 1][j - 1] == ' ')
				break;
		}
		
	}
	board[i - 1][j - 1] = '*';//这里要注意玩家输入不会以0开始
}
//玩家赢返回*
//电脑赢返回+
//平局返回p
//游戏继续返回c
char Winer(char board[Lie][Hang], int lie, int hang)
{
	int flag = 0;
	for (int i = 0; i < lie; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] ==board[i][2] && board[i][0] != ' ')//判断一行
			return board[i][0];
	}
	for (int i = 0; i < hang; i++)
	{
		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[2][0] != ' ')//判断对角线
		return board[2][0];
	for (int i = 0; i < lie; i++)//判断棋盘内是否还有空格,游戏是否可以继续
	{
		for (int j = 0; j < hang; j++)
		{
			if (board[i][j] == ' ')
				return 'c';
		}
	}
	return 'p';//判断平局
}
void Computer(char board[Lie][Hang], int lie, int hang)//电脑下棋
{
	int x, y;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % lie;
		y = rand() % hang;
		if (board[x][y] == ' ')
			board[x][y] = '+'; break;
		
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sakura&NANA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值