三子棋小游戏

        大家好,在这里我将手把手教大家写一个三子棋的小游戏,话不多说让我们走起来。


前言

首先,在开始写代码之前让我们简单了解一下三子棋的游戏规则

在一个九宫格中,横竖对角三子成线方为胜利。

然后让我们建立两个源文件和一个头文件

我这边用的是vs2019

 test.c用于设计运行逻辑

game.c用于存放主要程序

game.h存放头文件与声明

提示:本文涉及rand函数的使用,若没有使用过请提前查阅资料!


一、主体设计

        游戏那就应该有着开始与结束,首先写一个可视化选择窗口。

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

有了选择下面设计每个选择的对应响应

int mian()
{
	int i;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &i);
		switch ()
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("选择错误,请重新选择!\n");
			break;
		}

	}
	while(i)
}

好了前戏到这里就没了,下面上正菜( •̀ ω •́ )✧

二、主要程序

1.棋盘设计输出与初始化

下棋怎么能没有棋盘呢

可以看到棋盘整个有九个格子伤心左右都有线给隔开

下面让我们按照这个格式来简单写个代码

那么让我们来看一下效果 

 可以看见这不是我们想要的效果

那么我们只需要给数组的每一个元素都给空格是不是就行了呢

在这之前我们还可以想到 一个问题,这个是三行三列,要是多一行一列是不是需要该很多东西。

那么让我们小改一下再看一下程序结果

 在这边我宏定义了一个COW和COL如果我们需要改动棋盘大小直接在这里修改就行

那么既然数据改了我们的棋盘打印也要做出相应改变

大家可以开动脑筋想想这该改,想好了可以看看我的代码,看看和你的有什么区别吧

void display_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//数据
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[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");

	}
}

一个自定义函数完成了数组的赋值也可以说是初始化工作

2.落子与显示

前面棋盘已经完成了,那我们就要开始想我是怎么开始玩这个游戏了

        怎么下?

我们用了二维数组,这个问题就很好解决了,代码走起

void play(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋:");
	while(1)
	{
		printf("请选择要落子的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)//非相关专业行列习惯1开始
		{
			if (board[x - 1][y - 1] = ' ')//考虑坐标上有没有子
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已被占用,请重新选择!");
			}
		}
		else
		{
			printf("该坐标不合法,请重新选择!");
		}
	}
}

我们自己可以下棋了

下面就是给自己找个对手了,继续代码走起

void computer_play(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑落子:>\n");
	while (1)
	{
		x = rand() % row;//用随机生成数然后抹除,保证不会超出边界
		y = rand() % col;
		if (board[x - 1][y - 1] == ' ')
		{
			board[x - 1][y - 1] = '#';
			break;
		}
	}

}

可以看见电脑已经可以随机落子了,但是我们成立一条线还是没有赢,所以我们还需要一个可以让判断输赢的程序段,让我们走起

//判断棋盘是否满了
int is_man(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)//判断行
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&& board[i][0]!=' ')
			return board[i][0];
	}
	for (i = 0; i < col; 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];

	if (is_man(board, row, col) == 1)//另外用一个函数来判断棋盘是否下满
	{
		return 'P';
	}
	else
		return'K';
}
void game()
{
	int a;
	char board[ROW][COL] = {0};
	init_board(board, ROW, COL);//初始化棋盘
	display_board(board, ROW, COL);//答应棋盘

	while (1)
	{
		play(board, ROW, COL);//玩家下棋
		display_board(board, ROW, COL);
		a = is_win(board, ROW, COL);//判断是否有人赢了
		if (a != 'K')
			break;

		computer_play(board, ROW, COL);//电脑下棋
		display_board(board, ROW, COL);
		a = is_win(board, ROW, COL);
		if (a != 'K')
			break;
	}
	if (a == '*')
	{
		printf("玩家赢!\n");
	}
	if (a == '#')
	{
		printf("玩家赢!\n");
	}
	if (a == 'P')
	{
		printf("平局!\n");
	}
}

可以看见已经可以判断输赢

如果你已经做到了这一步,那么你就掌握了三子棋


总结


以上就是本次要讲的内容,简单的介绍了设计思路,其实在很多方面还有待改进,如果是4*4的棋盘怎么判断输赢、怎么加强电脑的智能,这就需要大家在下面多多尝试。

感谢每一个观看本篇文章的朋友,欢迎大家提供思路和想法以供参考。

若文章内容存在侵权请联系修改删除 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值