C/C++小游戏---三子棋

 个人主页:

仍有未知等待探索_洛谷刷题,小项目,数据结构-CSDN博客

专题分栏---小项目

小项目_仍有未知等待探索的博客-CSDN博客

目录

一、绪论  

二、讲解

1.打印棋盘函数

2.对棋盘进行初始化函数

 3.玩家、电脑下棋函数

3.1玩家下棋

3.2电脑下棋

4.判断输赢

三、总代码


一、绪论  

        顾名思义和五子棋一样,连成3个子即为胜利。那么我们如何写呢?有什么思路呢?

        首先你要是想玩,是不是需要先有一个棋盘,那么我们就需要打印棋盘;是不是还需要存数据呢?就需要用到数组;未初始化的数组存的是随机值,那么我们需要对其进行初始化;电脑下棋和玩家下棋的过程;判断是否赢了的条件。

        由以上可得所需要的函数:1.打印棋盘函数、2.对棋盘进行初始化函数、3.玩家、电脑下棋函数、4.判断输赢函数

二、讲解

1.打印棋盘函数

         三子棋的棋盘,怎么打印呢?第一种就是通过printf函数进行打印,第二种是用循环(找到这个棋盘重复的地方),但是要是光打印棋盘的话,怎么实现玩家下棋的时候在棋盘上实时的出现落子呢?那么我们就需要配合二维数组来进行打印:

void print(char arr[ROW][COL], int row, int col)
{
	int i, j;
	for (j = 0; j < col; j++)
	{
		//一行
		i = 0;
		while (i < row - 1)
		{
			printf(" %c |",arr[i][j]);
			i++;
		}
		printf(" %c ", arr[i][j]);
		printf("\n");
		if (j < col - 1)
		{
			i = 0;
			while (i < row - 1)
			{
				printf("---|");
				i++;
			}
			printf("---");
			printf("\n");
		}
	}
}

2.对棋盘进行初始化函数

初始化很简单,遍历赋初值即可,对于字符型二维数组而言,未初始化的时候里面存了随机值,会影响打印的棋盘,那么我们对二维数组进行赋值为‘ ’(一个空格) 即可。

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

 3.玩家、电脑下棋函数

3.1玩家下棋

把棋盘看作是一个直角坐标系,通过玩家进行输入坐标的方式来完成下棋,并在玩家下棋的位置进行展示,并且最重要的是需要判断玩家输入的坐标是否超出了棋盘,下棋的位置是否被占。

void Player_p(char arr[ROW][COL], int row, int col)
{
	printf("玩家下:>\n");
	int i, j;
	scanf("%d%d", &i, &j);
	while (i > row || i<1 || j>col || j < 1)
	{
		printf("坐标非法,请重输:\n");
		scanf("%d%d", &i, &j);
	}
	while (arr[j-1][i-1] == '#'|| arr[j - 1][i - 1] == '*')
	{
		printf("坐标已被占用,请重新输入:\n");
		scanf("%d%d", &i, &j);
	}
	arr[j-1][i-1] = '*';
}

3.2电脑下棋

电脑通过产生随机数的方式来产生坐标,也需要判断输入的坐标是否超出了棋盘,下棋的位置是否被占。

产生随机数的函数:srand(time(NULL));   rand();---<stdlib.h> <time.h>

(rand这一个函数就能产生随机值,但每次产生的一样,所以需要配合srand、time函数进行使用)

void Computer_p(char arr[ROW][COL], int row, int col)
{
	printf("电脑下:>\n");
	int i, j;
	srand(time(0));
	i = rand() % row ;
	j = rand() % col ;
	while (arr[i][j] == '*'|| arr[i][j] == '#')
	{
		i = rand() % row + 1;
		j = rand() % col + 1;
	}
	arr[i][j] = '#';
}

4.判断输赢

三子棋的判断输赢的方式就是看有没有连成三个子的。三个子可以横向,可以竖向,也可以斜向,需要把每种情况均考虑清楚。

char iswin(char arr[ROW][COL], int row, int col)
{
	// #电脑赢
	// *玩家赢
	// q平局
	// c继续
	if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2])
		return arr[0][0];
	else if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2])
		return arr[0][0];
	else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2])
		return arr[1][0];
	else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2])
		return arr[2][0];
	else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0])
		return arr[0][2];
	else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0])
		return arr[0][0];
	else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1])
		return arr[0][1];
	else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2])
		return arr[0][2];
	int count = 0;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			if (arr[i][j] != ' ')
				count++;
	if (count < row * col)
		return 'c';
	else if (count == row * col)
		return 'q';
}

我不会那种高深的判断方法,如果有会的,请指点指点我!

三、总代码

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void print(char arr[ROW][COL], int row, int col);
void Initboard(char arr[ROW][COL], int row, int col);
void Computer_p(char arr[ROW][COL], int row, int col);
void Player_p(char arr[ROW][COL], int row, int col);
char iswin(char arr[ROW][COL], int row, int col);
int main()
{
	char arr[ROW][COL];
	//初始化棋盘
	Initboard(arr, ROW, COL);
	//棋盘打印
	print(arr, ROW, COL);
	//下棋
	while (1)
	{
		//电脑下棋#
		Computer_p(arr, ROW, COL);
		print(arr, ROW, COL);
		//判断输赢
		if (iswin(arr, ROW, COL) == '#')
		{
			printf("电脑赢\n");
			break;
		}
		if (iswin(arr, ROW, COL) == 'q')
		{
			printf("平局\n");
			break;
		}
		//玩家下棋*
		Player_p(arr, ROW, COL);
		print(arr, ROW, COL);
		//判断输赢
		if (iswin(arr, ROW, COL) == '*')
		{
			printf("玩家赢\n");
			break;
		}
		if (iswin(arr, ROW, COL) == 'q')
		{
			printf("平局\n");
			break;
		}
	}
	return 0;
}
//   |   |   
//---|---|---
//   |   |   
//---|---|---
//   |   |
void print(char arr[ROW][COL], int row, int col)
{
	int i, j;
	for (j = 0; j < col; j++)
	{
		//一行
		i = 0;
		while (i < row - 1)
		{
			printf(" %c |",arr[i][j]);
			i++;
		}
		printf(" %c ", arr[i][j]);
		printf("\n");
		if (j < col - 1)
		{
			i = 0;
			while (i < row - 1)
			{
				printf("---|");
				i++;
			}
			printf("---");
			printf("\n");
		}
	}
}
void Initboard(char arr[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			arr[i][j] = ' ';
}
void Computer_p(char arr[ROW][COL], int row, int col)
{
	printf("电脑下:>\n");
	int i, j;
	srand(time(0));
	i = rand() % row ;
	j = rand() % col ;
	while (arr[i][j] == '*'|| arr[i][j] == '#')
	{
		i = rand() % row + 1;
		j = rand() % col + 1;
	}
	arr[i][j] = '#';
}
void Player_p(char arr[ROW][COL], int row, int col)
{
	printf("玩家下:>\n");
	int i, j;
	scanf("%d%d", &i, &j);
	while (i > row || i<1 || j>col || j < 1)
	{
		printf("坐标非法,请重输:\n");
		scanf("%d%d", &i, &j);
	}
	while (arr[j-1][i-1] == '#'|| arr[j - 1][i - 1] == '*')
	{
		printf("坐标已被占用,请重新输入:\n");
		scanf("%d%d", &i, &j);
	}
	arr[j-1][i-1] = '*';
}
char iswin(char arr[ROW][COL], int row, int col)
{
	// #电脑赢
	// *玩家赢
	// q平局
	// c继续
	if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2])
		return arr[0][0];
	else if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2])
		return arr[0][0];
	else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2])
		return arr[1][0];
	else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2])
		return arr[2][0];
	else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0])
		return arr[0][2];
	else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0])
		return arr[0][0];
	else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1])
		return arr[0][1];
	else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2])
		return arr[0][2];
	int count = 0;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			if (arr[i][j] != ' ')
				count++;
	if (count < row * col)
		return 'c';
	else if (count == row * col)
		return 'q';
}

谢谢大家支持!

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

仍有未知等待探索

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

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

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

打赏作者

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

抵扣说明:

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

余额充值