c语言实现简易三子棋

三子棋简介

是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。

c语言实现

由于代码量过大,我把整个程序用了game.h、game.c ,test.c三个文件分别封装函数声明和函数实现以及主函数main。
首先用一个menu函数打印菜单:

void menu()
{`在这里插入代码片`
	printf("#############\n");           
	printf("###0.exit####\n");
	printf("###1.start###\n");
	printf("#############\n");
}

接着就是选择进入游戏或者退出游戏的代码:

```c
int n = 0;
	do
	{
		menu();
		printf("请选择:\n");
		scanf("%d", &n);
		switch (n)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误。\n");
			break;
		}
	} while (n);

接就是创立一个字符数组来作为存放棋子的棋盘(将内容初始化为空格的函数)了,代码如下:

void Initbroad(char broad[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			broad[i][j] = ' ';
		}
	}
}

ps:ROW和COL均是在game.h文件define定义的常量。
然后就是打印棋盘的函数:

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

紧接着就该玩家下棋了,玩家通过输入坐标来下棋。在玩家下棋是会出现下面三种情况:
1.玩家输入的坐标不在棋盘范围内。
2.玩家输入的坐标已有棋子。
以上两种情况皆为不合法的情况。
3.合法的坐标。
于是我们可以用一个死循环来实现玩家下棋,只有当玩家输入的坐标是情况3时,使用break跳出循环。
代码如下:

void player(char broad[ROW][COL], int row, int col)
{
	printf("玩家走。\n");
	int i, j;
	while (1)
	{
		scanf("%d%d", &i, &j);
		if (i>=1 && i <= row && j>=1 && j <= col)
		{
			if (broad[i-1][j-1] == ' ')
			{
				broad[i-1][j-1] = '*';
				break;
			}
			else
				printf("该格子已被占用。\n");
		}
		else
			printf("坐标非法。\n");
	}
}

电脑下棋:
不涉及复制算法,只让电脑生成范围内的随机坐标,但是要注意以下几点
1.在生成的随机坐标在棋盘范围内
解决方法:
用rand函数生成的随机值模上(%)ROW并减去1。
2.坐标没有棋子。
依然使用一个死循环,直到生成的坐标没有棋子,break跳出循环。
代码如下:

void computer(char broad[ROW][COL], int row, int col)
{
	printf("电脑走。\n");
	while (1)
	{
		int i = rand() % row;
		int j = rand() % col;
		if (broad[i][j] == ' ')
		{
			broad[i][j] = '#';
			break;
		}
	}
}

最后一个为判断胜负函数(返回值为char类型):
胜负分为以下三种情况:
1.玩家赢(字符*)
2.电脑赢(字符#)
3.平局(字符p)
而判断胜负的依据为出现3个连续的棋子。
代码如下:

static int is_full(char broad[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (broad[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char checkwin(char broad[ROW][COL], int row, int col)
{
	int i = 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];
	}
	//判断一列是否出现三个棋子
	for (i = 0; i < col; i++)
	{
		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[1][1] != ' ')
		|| (broad[2][0] == broad[1][1] && broad[1][1] == broad[0][2]
		&& broad[1][1] != ' '))
	{
		return broad[1][1];
	}
	//判断是否和棋
	if (is_full(broad,row,col))
	{
		return 'p';
	}
	//当未出现输赢以及和棋,游戏继续。
	return 'c';
}

ps:每一次落子都需判断一次。
整个程序的代码如下:

game.h

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void Initbroad(char broad[ROW][COL],int row,int col);
void display(char broad[ROW][COL],int row,int col);
void player(char broad[ROW][COL], int row, int col);
void computer(char broad[ROW][COL], int row, int col);
char checkwin(char broad[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void Initbroad(char broad[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			broad[i][j] = ' ';
		}
	}
}
void display(char broad[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (j < col - 1)
			{
				printf(" %c |", broad[i][j]);
			}
			else
				printf(" %c \n", broad[i][j]);
		}
			if (i < row - 1)
			{
				printf("---|---|---\n");
			}
	}
}
void player(char broad[ROW][COL], int row, int col)
{
	printf("玩家走。\n");
	int i, j;
	while (1)
	{
		scanf("%d%d", &i, &j);
		if (i>=1 && i <= row && j>=1 && j <= col)
		{
			if (broad[i-1][j-1] == ' ')
			{
				broad[i-1][j-1] = '*';
				break;
			}
			else
				printf("该格子已被占用。\n");
		}
		else
			printf("坐标非法。\n");
	}
}
void computer(char broad[ROW][COL], int row, int col)
{
	printf("电脑走。\n");
	while (1)
	{
		int i = rand() % row;
		int j = rand() % col;
		if (broad[i][j] == ' ')
		{
			broad[i][j] = '#';
			break;
		}
	}
}
static int is_full(char broad[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (broad[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char checkwin(char broad[ROW][COL], int row, int col)
{
	int i = 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];
	}
	for (i = 0; i < col; i++)
	{
		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[1][1] != ' ')
		|| (broad[2][0] == broad[1][1] && broad[1][1] == broad[0][2]
		&& broad[1][1] != ' '))
	{
		return broad[1][1];
	}
	if (is_full(broad,row,col))
	{
		return 'p';
	}
	return 'c';
}

test.c

#define _CRT_SECURE_NO_WARNINGS 
#include"game.h"
void game()
{
	char ret = 0;
	char broad[ROW][COL] = { 0 };
	Initbroad(broad,ROW,COL);
	display(broad, ROW, COL);
	while (1)
	{
		//玩家下
		player(broad, ROW, COL);
		//判断胜负
		ret=checkwin(broad, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
		display(broad, ROW, COL);
		//电脑下
		computer(broad, ROW, COL);
		//判断胜负
		ret = checkwin(broad, ROW, COL);
 		if (ret != 'c')
		{
			break;
		}
		display(broad, ROW, COL);
	}
	display(broad, ROW, COL);
	if (ret == '*')
		printf("玩家赢。\n");
	else if (ret == '#')
		printf("电脑赢。\n");
	else if (ret == 'p')
		printf("平局。\n");

}
void menu()
{
	printf("#############\n");           
	printf("###0.exit####\n");
	printf("###1.start###\n");
	printf("#############\n");
}
int main()
{
	srand((unsigned int)time(NULL));
	int n = 0;
	do
	{
		menu();
		printf("请选择:\n");
		scanf("%d", &n);
		switch (n)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误。\n");
			break;
		}
	} while (n);
	return 0;
}

谢谢你的阅读。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值