【C语言】锻炼应对大型代码的能力(三子棋)

这篇文章的目的不是为了教大家怎么写三子棋这个游戏的代码,而是为了锻炼大家写大型代码的能力,以便在以后的学习中写这种大型代码不至于无从下手。本人学习C语言的时间也不是太长,所以要有什么地方写的不对欢迎在评论里留言,我会马上进行修正。好了废话不多说咱们马上开始。

分析编程对象

首先要分析三子棋的游戏机制,如果不了解游戏机制是根本写不出来的,游戏机制如下:
这个游戏首先要有一个井字棋盘如图1-1。


该游戏是回合制游戏,必须要有两个玩家才可以进行,两方使用不同的棋子,当其中一方的三个棋子构成一条直线则该玩家胜利,当棋盘下满没有任何一方胜利时,则判定平局。图解如下:

在这里插入图片描述
此外已经被占领的位置无法再继续下棋。
以上就是三子棋的全部游戏机制。

编写代码

实现游戏的开始和退出:

首先要创建一个菜单,如下图:
在这里插入图片描述
这样可以让我们知道怎么开始或者退出游戏。
我们还要考虑当玩完一把游戏后,要继续弹出此菜单,来让我们选择游戏是否继续。所以我们menu这个函数放在循环里,因为这个函数要至少运行一次所以我们选择do-while。
在这里插入图片描述
接下来我们要对input进行判断,当input=1,则游戏开始,当input=0,这游戏退出,当input及不等于1,也不等于0,则输入错误,重新输入。
在这里插入图片描述
我们可以运行一下,看看运行结果:
在这里插入图片描述
现阶段完整的代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu()
{
	printf("*******************************\n");
	printf("******       1.play      ******\n");
	printf("******       0.exit      ******\n");
	printf("*******************************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", & input);
		switch (input)
		{
		case 1:
			printf("玩游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

实现游戏的所有功能

接下来要创建一个存放游戏功能的函数,游戏的所有功能都将在这个函数里面完成。
在这里插入图片描述
在这里插入图片描述
如果要玩这个游戏我们需要一个3X3的棋盘,所以我们需要一个二位数组来存储棋盘数据,为了方便观看还需要打印一个棋盘,实现井字棋盘要用到两个符号"-“,”|"。具体形状如下:
在这里插入图片描述
下面我们来编写这个代码:
我们先创建一个头文件game.h和一个源文件game.c,game.c是用来存放执行游戏功能函数的源文件,我可以把所有的函数声明和头文件都放在game.h里面,这样我们只需要在需要使用game.c里面函数的源文件里面的最上面添加game.h就可以了,这里创建game.c 不是什么都没有,如果把所用的程序都放在还有主函数的源文件里代码太多,不方便调试,也不美观

在这里插入图片描述
下面我们要给存储棋盘数据的二维数组初始化
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里的二维数组之所以不用arr[3][3]是有原因的,如果有一天你要打印10X10的棋盘,使用这种写法那就需要花大部分时间去改,而按照我这种写法具有通用性,只需要改一下ROW和COL的值就可以了
初始化完成,接下来打印棋盘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行结果如下
在这里插入图片描述
有了棋盘就要让玩家和电脑能够在这个棋盘里下棋,接下来完成这个代码
玩家下棋的代码:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
电脑下棋的代码如下:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为只是锻炼大家以后编写大型代码的能力,所以电脑并不是那么智能。
查看运行结果
在这里插入图片描述
接下来判断输赢和平局
在这里插入图片描述
在这里插入图片描述
最终的运行结果

在这里插入图片描述
以上就是这篇博客的所有内容,感谢大家的观看。
三子棋完整代码如下

//头文件game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
//棋盘的大小
#define ROW 3
#define COL 3
//初始化函数
void InitArr(char arr[ROW][COL], int, int);
//打印棋盘
void DisplayBoard(char arr[ROW][COL], int, int);
//玩家走
void PlayerMove(char arr[ROW][COL], int, int);
//电脑走
void BotMove(char arr[ROW][COL], int, int);
//判断哪方获胜
char IsWin(char arr[ROW][COL], int, int, char);

-------------------------------------------------------------------------------------------


//游戏执行函数的源文件game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//棋盘数据初始化
void InitArr(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
//打印棋盘
void DisplayBoard(char arr[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 ", arr[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}
//玩家走
void PlayerMove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入下棋的坐标:>");
		scanf("%d %d", &x, &y);
		if (arr[x - 1][y - 1] == ' ')
		{
			arr[x - 1][y - 1] = '*';
			printf("玩家走\n");
			break;
		}
		else

		{
			printf("该坐标已被占用\n");
		}
	}
}
//电脑走
void BotMove(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
		//产生随机的横坐标
		int x = rand() % row;
		//产生随机的纵坐标
		int y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			printf("电脑走\n"); 
			break;
		}
	}
}
//判断输赢
char IsWin(char arr[ROW][COL], int row, int col, char set)
{
	int i = 0;
	int count = 0;
	//判断两个对角线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]
		&& arr[1][1] != ' ')
		return set;
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]
		&& arr[1][1] != ' ')
		return set;
	//判断列
	for (i = 0; i < col; i++)
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i]
			&& arr[1][i] != ' ')
		{
			return set;
		}
		
	}
	//判断行
	for (i = 0; i < row; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2]
			&& arr[i][1] != ' ')
		{
			return set;
		}
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] != ' ')
				count++;
		}
	}
	//判断是否平局
	if (count == row * col)
		return 'Q';
	//判断游戏是否继续
	else
		return 'C';
	
}




------------------------------------------------------------------------------------------




//含有主函数的源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("*******************************\n");
	printf("******       1.play      ******\n");
	printf("******       0.exit      ******\n");
	printf("*******************************\n");
}
void game()
{
	char flag = 0;
	//存储棋盘数据
	char arr[ROW][COL] = { 0 };
	//初始化数据
	InitArr(arr, ROW, COL);
	//打印棋盘
	DisplayBoard(arr,ROW,COL);
	while (1)
	{
		//玩家走
		PlayerMove(arr, ROW, COL);
		//打印棋盘
		DisplayBoard(arr,ROW,COL);
		//判断输赢
		flag = IsWin(arr, ROW, COL,'*');
		if (flag != 'C')
		{
			break;
		}
		//电脑走
		BotMove(arr, ROW, COL);
		//打印棋盘
		DisplayBoard(arr,ROW,COL);
		//判断输赢
		flag = IsWin(arr, ROW, COL,'#');
		if (flag != 'C')
		{
			break;
		}
	}
	if (flag == '*')
		printf("玩家胜利\n");
	else if (flag == '#')
		printf("电脑胜利\n");
	else if (flag == 'Q')
		printf("平局\n");
}
int main()
{
	//设置电脑下棋的随机坐标
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		//游戏菜单
		menu();
		printf("请选择:>");
		scanf("%d", & input);
		//判断是否继续游戏
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

罗!伯!特!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值