C语言学习1——n子棋的实现

本文介绍了一个基于C语言的三子棋游戏实现方案。利用二维数组存储棋盘信息,并通过函数实现棋盘初始化、打印等功能。游戏支持玩家与电脑对战,并能判断胜负。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 、前言

本次的游戏基于二维数组,使用二维数组实现棋盘内棋子信息的存储。游戏界面如下:运行截图
游戏实现代码附在文末~

二、三子棋

2.1 大体构想过程

1.进入游戏

首先在测试文档中构想出大体框架:

int cho  = 0;					//记录用户的选择
	do{
		menu();
		scanf("%d",&cho);
		switch (cho){
		case 0:break;  			//退出游戏
		case 1:game();break;	//开始游戏
		default:printf("wrong! please scanf again");break;
		}
	}while(cho);

首先打印游戏菜单,然后根据玩家的选择进入相应函数。

2.选择开始游戏

选择开始游戏后的流程构想我是一步一步完善的:

  1. 首先想到要在游戏开始前为玩家打印一下棋盘,于是编写了pri_chess() 棋盘打印函数
  2. 后来在打印的时候发现需要对棋盘数组进行初始化,于是编写了init_chess() 棋盘初始化函数
  3. 打印完棋盘后就开始下棋啦,在这里设置的是玩家先手,所以首先编写了peo_do() 玩家下棋函数。随后编写了com_do() 电脑端下棋函数。
  4. 在下棋的过程中要判断棋盘是否下满了,所以编写了check_chess() 棋盘检查函数
  5. 最后,下棋的时候肯定要判断输赢啦,所以编写了win_chess() 判断输赢函数

3.选择退出游戏

直接break 结束函数运行。

2.2具体代码实现

以上就是整个项目实现的流程了,下面看具体的函数实现叭~

1.棋盘初始化函数

void init_chess(char arr[ROW][COL],char c,int row,int col)
{
//在这个函数中传入字符c,可以在调用时自己选择初始化数组内容
	int i = 0,j = 0;
	for(i=0;i<row;i++)	
		for(j=0;j<col;j++)		
			arr[i][j] = c;			
}

2.棋盘打印函数

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

3.棋盘检查函数

int check_chess(char arr[ROW][COL],int row,int col)
{//检查是否下满
	int i = 0,j = 0;
	for(i=0;i<row;i++)	
		for(j=0;j<col;j++)	
			if(arr[i][j] == ' ')
				return 1;
	return 0;
}

4.玩家下棋函数

void peo_do(char arr[ROW][COL],int row,int col)
{
	int i = 0,j = 0;
	do{
		printf("请输入落子行列->");
		scanf("%d %d",&i,&j);
		if(i > row | j > col|arr[i-1][j-1] != ' ')
			printf("wrong!\n");
	}while(i > row | j > col);
	
	arr[i-1][j-1] = '*';
}

5.电脑端下棋函数

void com_do(char arr[ROW][COL],int row,int col)
{
	int i = rand()%row;
	int j = rand()%col;
	while(arr[i][j] != ' ')
	{
		i = rand()%row;
		j = rand()%col;					
	}
	arr[i][j] = '#';
}

6.判断输赢函数

int win_chess(char arr[ROW][COL],int row,int col)
{
	int i = 0,j = 0;

	//判断每行是否相等
	for(i=0;i<row;i++)
	{
		for(j=0;j<col-1;j++)
			if(arr[i][j] != arr[i][j+1])
				break;
		if(arr[i][j] != ' '&j==row-1)
			return (int)arr[i][j];
	}
	//判断每列是否相等
	for(j=0;j<col;j++)
	{
		for(i=0;i<row-1;i++)
			if(arr[i][j] != arr[i+1][j])
				break;
		if(arr[i][j] != ' '&i==row-1)
			return (int)arr[i][j];
	}
	//判断对角
	for(i=0,j=0;i<row-1,j<col-1;i++,j++)
	{
		if(arr[i][j] != arr[i+1][j+1])
			break;
		if(arr[i][j] != ' '&i==row-2)
			return (int)arr[i][j];
	}
	for(i=0,j=col-1;i<row-1,j>0;i++,j--)
	{
		if(arr[i][j] != arr[i+1][j-1])
			break;
		if(arr[i][j] != ' '&i==row-2)
			return (int)arr[i][j];
	}
	return 0;
}

三、有感

今天尝试编写了三子棋(井字棋),后来又对其进行了扩展,实现了n子棋。
在这次练习中进一步了解了

  1. #define 用法的印象~
  2. 随机函数 srand() 的使用
  3. 二维数组的使用

该游戏的实现还存在以下不足:

  1. 游戏界面简陋
  2. 电脑端下棋的算法粗糙,有待改进

四、代码链接

码云仓库链接~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值