C语言数组第十课---------------三子棋-------数组经典练手题

作者前言

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id:老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂

_______________________________________________________

______________________________________________________________________

目录

        三子棋

                分析

                代码

   

_________________________________________________________

知识小插曲

1.sizeof 是操作符,计算占用内存的大小,单位是字节,计算的是,计算的对象是什么类型都行,

2.strlen是库函数,统计字符串的个数,计算的是\0之前出现的字符个数

小小解说

在上一篇博文中我简单的介绍了数组的创建和使用,也大概的介绍了数组名的作用,下面我们就来写一写这个数组的经典练习,

三子棋

分析

首先,我们玩游戏的时候都会有一个游戏界面,界面里面有菜单,那么我们玩三子棋也必须有菜单,

void meun()
{
	printf("********   三子棋  *******\n");
	printf("**************************\n");
	printf("********   0.exit  *******\n");
	printf("********   1.play  *******\n");
	printf("**************************\n");

}

这里就是菜单函数.

然后初始化一个数组,默认设计成空格

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

下面我们就要打印一下九空格

我们可以分为几步,进行打印

void my_Carving_a_chessboard(char arr1[][COL], int row, int col)
{
	int i = 0;
	printf("-------------\n");
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("| ");
			printf("%c ", arr1[i][j]);
		}
		printf("|\n");
		printf("-------------\n");
	}
}

当我们设计好这些后,就是玩家该下棋了,下棋要注意坐标,数组的范围,以及玩家的所想,下面我来代码演示

玩家和电脑下棋:

在这个过程中我们要知道玩家下过的地方电脑和玩家不能再下,电脑下给地方也一样,如果小可爱熟悉下棋,机会发现下棋者赢最快至少总共要下5个棋子,但为了让小可啊明白我这里就不做出这个判断了,

代码如下:

//电脑下棋
void comp_paly_chess(char arr1[][COL], int row, int col)
{
	
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (arr1[x][y] == ' ')
		{
			arr1[x][y] = '*';
			break;
		}
	}
	
	

}

void paly_chess(char arr1[][COL], int row, int col)
{
	//玩家下棋
	int x ;
	int y ;
	int num = 0;
	
	while (1)
	{
		printf("玩家请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (arr1[x - 1][y - 1] = ' ' && (x >= 1 && x <= 3) && (y >= 1 && y <= 3))
		{
			arr1[x - 1][y - 1] = '#';
			//判断谁赢了
			num = is_win(arr1, ROW, COL);
			if (num)
			{
				break;
			}
			int flat = 0;
			// 判断是否是平局
			for (x = 0; x < row; x++)
			{
				for (y = 0; y < col; y++)
				{
					if (arr1[x][y] == ' ')
					{
						flat++;
					}
				}

			}
			if (!flat)
			{
				printf("平局\n");
				break;
			}
			
			//电脑下棋
			comp_paly_chess(arr1, ROW, COL);
			my_Carving_a_chessboard(arr1, ROW, COL);
			
			//判断谁赢了
			is_win(arr1, ROW, COL);
			if (num)
			{
				break;
			}
		}
		else
		{
			printf("输入不符合要求,请重新输入\n");
		}
	}
	
	
}

每下一步我都会判断一次,这样的效率很低,这里为了让大家理解就不做判断了

判断谁赢

代码:

int  is_win(char arr1[][COL], int row, int col)
{
	//行胜
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr1[i][j] == '#')
				count++;
			else if (arr1[i][j] == '*')
				count1++;

		}
		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}
			

	}

	//列胜
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr1[j][i] == '#')
				count++;
			else if (arr1[j][i] == '*')
				count1++;

		}
		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}


	}

	//对角
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		
		
		if (arr1[i][i] == '#')
			count++;
		else if (arr1[i][i] == '*')
			count1++;

		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}
	}

	//斜角
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		for (j = col - 1; j >= 0; j--)
		{
			if (arr1[i][j] == '#')
				count++;
			else if (arr1[i][j] == '*')
				count1++;

		}
		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}


	}
	return 0;
}

这里我是根据上图是行和列对角一一判断的,有很多重复的代码,但这样可以让小可爱们能理解,

 下面我分享一下全部代码

头文件.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3



//游戏
void game();
//数组初始化
void my_initialization(char arr1[][COL], int row, int col);
//雕刻棋盘
void my_Carving_a_chessboard(char arr1[][COL], int row, int col);
//玩家和电脑下棋
void paly_chess(char arr1[][COL], int row, int col);
//电脑下棋
void comp_paly_chess(char arr1[][COL], int row, int col);

三子棋函数.c

#include "三子棋.h"
void game()
{
	char arr1[ROW][COL];
	//数组初始化
	my_initialization(arr1, ROW, COL);
	// 雕刻棋盘
	my_Carving_a_chessboard(arr1, ROW, COL);
	//打印棋盘
	//my_print_chess(arr1, ROW, COL);
	//电脑下棋
	//comp_paly_chess(arr1, ROW, COL);
	//玩家下棋和电脑下棋
	paly_chess(arr1, ROW, COL);

}

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

void my_Carving_a_chessboard(char arr1[][COL], int row, int col)
{
	int i = 0;
	printf("-------------\n");
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("| ");
			printf("%c ", arr1[i][j]);
		}
		printf("|\n");
		printf("-------------\n");
	}
}
//电脑下棋
void comp_paly_chess(char arr1[][COL], int row, int col)
{
	
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (arr1[x][y] == ' ')
		{
			arr1[x][y] = '*';
			break;
		}
	}
	
	

}

void paly_chess(char arr1[][COL], int row, int col)
{
	//玩家下棋
	int x ;
	int y ;
	int num = 0;
	
	while (1)
	{
		printf("玩家请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (arr1[x - 1][y - 1] = ' ' && (x >= 1 && x <= 3) && (y >= 1 && y <= 3))
		{
			arr1[x - 1][y - 1] = '#';
			//判断谁赢了
			num = is_win(arr1, ROW, COL);
			if (num)
			{
				break;
			}
			int flat = 0;
			// 判断是否是平局
			for (x = 0; x < row; x++)
			{
				for (y = 0; y < col; y++)
				{
					if (arr1[x][y] == ' ')
					{
						flat++;
					}
				}

			}
			if (!flat)
			{
				printf("平局\n");
				break;
			}
			
			//电脑下棋
			comp_paly_chess(arr1, ROW, COL);
			my_Carving_a_chessboard(arr1, ROW, COL);
			
			//判断谁赢了
			is_win(arr1, ROW, COL);
			if (num)
			{
				break;
			}
		}
		else
		{
			printf("输入不符合要求,请重新输入\n");
		}
	}
	
	
}
int  is_win(char arr1[][COL], int row, int col)
{
	//行胜
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr1[i][j] == '#')
				count++;
			else if (arr1[i][j] == '*')
				count1++;

		}
		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}
			

	}

	//列胜
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr1[j][i] == '#')
				count++;
			else if (arr1[j][i] == '*')
				count1++;

		}
		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}


	}

	//对角
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		
		
		if (arr1[i][i] == '#')
			count++;
		else if (arr1[i][i] == '*')
			count1++;

		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}
	}

	//斜角
	for (i = 0; i < row; i++)
	{
		int count = 0;
		int count1 = 0;
		int j = 0;
		for (j = col - 1; j >= 0; j--)
		{
			if (arr1[i][j] == '#')
				count++;
			else if (arr1[i][j] == '*')
				count1++;

		}
		if (count == 3)
		{
			printf("玩家胜利\n");
			return 1;
		}
		else if (count1 == 3)
		{
			printf("电脑胜利\n");
			return 2;
		}


	}
	return 0;
}

三子棋模板

#include "三子棋.h"
void menu(void)
{
	printf("********      三子棋       ******\n");
	printf("*********************************\n");
	printf("********      0.exit       ******\n");
	printf("********      1.paly       ******\n");
	printf("*********************************\n");

}
int main()
{
	srand((unsigned)time(NULL));
	int input = 0;

	
	do
	{
		menu();
		printf("你已经在游戏界面,请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("你的输入不符合规则,请重新输入\n");
		}
		


	} while (input);




	return 0;
}

总结:

三子棋的思路:

第一步游戏界面

第二步:打印棋盘

第三步:玩家和电脑对弈

这三步概纳了三子棋的主要思路,有不懂的小可爱可以私聊我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/65192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】带你图文结合深入栈和队列,并具体分步实现

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我们继续来学习初阶数据结构的内容&#xff0c;今天我们要讲的是栈与队列部分的内容&#xff0c;这篇博客先讲栈&#xff0c;队列我们放到下次再讲 好了&#xff0c;废…

PY32F003 FLASH

了解py32芯片的flash内容&#xff0c;对于py32进行api升级有更好的了解的操作 //uiOffset 0(4MHz), 1(8MHz), 2(16MHz), 3(22.12MHz), 4(24MHz) void SetFlashParameter(uint32_t uiOffset) {WRITE_REG(FLASH->KEYR, FLASH_KEY1);WRITE_REG(FLASH->KEYR, FLASH_KEY2); …

解决Error running XXXApplicationCommand line is too long.报错

测试IDEA版本&#xff1a;2019.2.4 &#xff0c;2020.1.3 文章目录 一. 问题场景二. 报错原因2.1 为什么命令行过长会导致这种问题? 三. 解决方案3.1 方案一3.2 方案二 一. 问题场景 当我们从GitHub或公司自己搭建的git仓库上拉取项目代码时&#xff0c;会出现以下错误 报错代…

PHP8的循环控制语句-PHP8知识详解

我们在上一节讲的是条件控制语句&#xff0c;本节课程我们讲解循环控制语句。循环控制语句中&#xff0c;主要有for循环、while循环、do...while循环和foreach循环。 在编写代码时&#xff0c;经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务&#xff0c;而不是…

GWJDN-400型2MHZ自动平衡高温介电温谱仪

GWJDN-400型2MHZ自动平衡高温介电温谱仪 GWJDN-400型2MHZ自动平衡高温介电温谱仪 关键词&#xff1a;介电常数&#xff0c;高温介电&#xff0c;自动平衡 主要功能&#xff1a; 材料介电常数测试仪 半导体材料的介电常数、导电率和C-V特性液晶材料:液晶单元的介电常数、弹性…

新能源汽车交流充电桩控制主板的功能维度

新能源汽车交流充电桩控制主板的功能维度 交流充电桩主板是电动汽车充电站的关键组件&#xff0c;它负责控制充电过程&#xff0c;保护设备和电网免受电动汽车充电的冲击。它具有控制、保护、检测、报警和记录等功能&#xff0c;可以有效地控制充电过程&#xff0c;保证交流充电…

dueling network原理和实现

算法原理&#xff1a; Q ( s , a ; θ , α , β ) V ( s ; θ , β ) ( A ( s , a ; θ , α ) − max ⁡ a ′ ∈ ∣ A ∣ A ( s , a ′ ; θ , α ) ) . \begin{gathered}Q(s,a;\theta,\alpha,\beta)V(s;\theta,\beta)\left(A(s,a;\theta,\alpha)-\max_{a\in|\mathcal{A}…

文件或目录损坏且无法读取

如上图报错&#xff0c;我们直接用cmd命令输入【CHKDSK C: /F】然后回车 电脑重启后可以了&#xff0c;希望能帮助各位小伙伴

知识付费系统开发:构建高效智能的付费内容平台

随着数字化时代的来临&#xff0c;知识付费正迅速崭露头角&#xff0c;为知识创作者和求知者带来了全新的商机。在这个背景下&#xff0c;开发一款高效智能的知识付费系统成为了一项重要的任务。本文将深入探讨如何基于Python编程语言和相关技术构建一个智能的知识付费内容平台…

Excel表格(一)

1.单一栏的宽度和高度设置 2.大标题的跨栏居中 3.让单元格内的文字------自动适应 4.序号递增 5.货币符号 6.日期格式的选择 选到单元格&#xff0c;选中对应的日期格式 7.自动求和的计算 然后在按住回车键即可求出当前行的金额 点击自动求和 8.冻结表格栏 9.排序 1.单栏排序 …

python接口自动化之自动发送测试报告邮件

前言 ​ SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;也就是简单邮件传输协议&#xff0c;是一种提供可靠且有效电子邮件传输的协议。python的smtplib模块就提供了一种很方便的途径发送电子邮件&#xff0c;它对smtp协议进行了简单的封装。 ​ python发邮件主…

【数据结构】“单链表”的练习题

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【云原生】kubectl命令的详解

目录 一、陈述式资源管理方式1.1基本查看命令查看版本信息查看资源对象简写查看集群信息配置kubectl自动补全node节点查看日志 1.3基本信息查看查看 master 节点状态查看命名空间查看default命名空间的所有资源创建命名空间app删除命名空间app在命名空间kube-public 创建副本控…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动该地区金融平等

流支付正在成为一种全新的支付形态&#xff0c;Zebec Protocol 作为流支付的主要推崇者&#xff0c;正在积极的推动该支付方案向更广泛的应用场景拓展。目前&#xff0c;Zebec Protocol 成功的将流支付应用在薪酬支付领域&#xff0c;并通过收购 WageLink 将其纳入旗下&#xf…

clickhouse断电重启故障解决方案

业务场景 公司的一个日志系统用到了clickhouse。一线运维反映说有个生产环境因为异常断电造成服务器重启。在执行日志系统的启动脚本时&#xff0c;一直报clickhouse启动不起来&#xff0c;日志系统无法使用。 问题排查 通过阅读启动脚本代码&#xff0c;以及启动日志系统&a…

比特鹏哥5-数组【自用笔记】

比特鹏哥5-数组【自用笔记】 1.数组的概念2.一维数组的创建和初始化创建的语句结构初始化的语句结构 3.一维数组的使用数组的下标&#xff1a;从0开始&#xff0c;n个数组&#xff0c;最后一个的下标是n-1 4.一维数组在内存中的存储5.sizeof计算数组元素个数可以计算元素个数并…

农业大数据可视化平台,让农业数据更直观展现!

农业大数据可视化平台是指利用大数据技术和可视化工具&#xff0c;对农业领域的数据进行收集、整理、分析和展示的平台。它可以帮助农业从业者更好地理解和利用农业数据&#xff0c;提高农业生产效率和决策水平。 农业大数据可视化平台通常具有以下特点和功能&#xff1a; 数据…

利用Arthas+APM监控进行Java性能深度定位

大家可能都用过APM监控&#xff0c;包括开源的Skywalking、商用的卓豪&#xff08;ZOHO&#xff09;ManageEngine APM应用性能监控、以及云监控产品如听云&#xff08;Server监控&#xff09;&#xff0c;这些APM监控产品大大方便了我们实时监控应用性能&#xff0c;并实现性能…

Unity限制在一个范围内移动

Unity限制在一个范围内移动 这个例子中&#xff0c;我们学习Vector3.ClampMagnitude的用法&#xff0c;限制小球在范围内移动。 在地图上放了一个小球&#xff0c;让他移动&#xff0c;但是不想让他掉下去&#xff0c;限制在一个球星范围内&#xff0c;就好像绳子拴住了一样&…

论文阅读---《Unsupervised ECG Analysis: A Review》

题目 无监督心电图分析一综述 摘要 电心图&#xff08;ECG&#xff09;是检测异常心脏状况的黄金标准技术。自动检测心电图异常有助于临床医生分析心脏监护仪每天产生的大量数据。由于用于训练监督式机器学习模型的带有心脏病专家标签的异常心电图样本数量有限&#xff0c;对…