c语言练习 三子棋

基于YOLOv8和PaddlepaddleOCR的微信截图聊天记录提取 本文提出了一种基于YOLOv8和PaddleOCR的微信聊天记录提取方法。首先使用YOLOv8n模型分割出聊天气泡(针对深浅色模式分别训练),通过合成数据集增强模型鲁棒性,召回率达0.995。随后采用PP-OCRv5进行文本识别,利用坐标匹配将气泡内文本送入识别队列,短长文本平均置信度分别>0.98和>0.95。文中特别强调了PaddleOCR不同版本的输出格式差异及适配方案,建议使用3.0+版本。该方法有效解决了直接OCR识别易受干扰的问题,通过气泡分割+文本定位的两阶段策略显著提升了识别准确 阅读详情

本部分包含数组练习题三子棋。

test.c-三子棋的测试

game.c-三子棋的实现

game.h-三子棋的函数声明

代码部分:

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3
//初始化二维数组
void InitArr(char arr[ROW][COL],int row,int col);
//打印棋盘
void PrintArr(char arr[ROW][COL], int row, int col);
//玩家走
void PlayerMove(char arr[ROW][COL], int row, int col);
//电脑走
void AiMove(char arr[ROW][COL], int row, int col);
//判断输赢
//玩家赢返回--'x'
//电脑赢返回--'o'
//平局返回--'c'
//继续游戏返回--'g'
char isWin(char arr[ROW][COL], int row, int col);
char isFull(char arr[ROW][COL], int row, int col);

game.c

#include"game.h"
//初始化二维数组
void InitArr(char arr[ROW][COL], int row,int col)
{
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < col;j++)
		{
			arr[i][j] = ' ';
		}
	}
}
//打印棋盘
void PrintArr(char arr[ROW][COL], int row, int col)
{
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < col+1;j++)
		{
			printf("+");
			if(j<col)
			printf("---");
		}
		printf("\n");
		for (int j = 0;j < col+1;j++)
		{
			printf("|");
			if (j < col )
			printf(" %c ", arr[i][j]);
		}
		printf("\n");
	}
	for (int j = 0;j < col + 1;j++)
	{
		printf("+");
		if (j < col)
			printf("---");
	}
	printf("\n");
}
//玩家走
void PlayerMove(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = 0;
		int y = 0;
		printf("玩家输入:");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= ROW && y > 0 && y <= COL)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = 'x';
				break;
			}
			else
			{
				printf("已被占用,请重下\n");
			}
		}
		else
		{
			printf("下错了,请重下\n");
		}
	}
}
//电脑走
void AiMove(char arr[ROW][COL], int row, int col)
{
	printf("电脑走\n");

	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'o';
			break;
		}
	}
}
//判断输赢
char isWin(char arr[ROW][COL], int row, int col)
{
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < col;j++)
		{
			//一行有三个
			if (arr[i][j] == arr[i][j + 1] && arr[i][j + 1] == arr[i][j + 2] && arr[i][j + 1] != ' ')
			{
				return arr[i][j];
			}
			//一列有三个
			else if (arr[i][j] == arr[i + 1][j] && arr[i + 1][j] == arr[i + 2][j] && arr[i + 1][j] != ' ')
			{
				return arr[i+1][j];
			}
			//斜杆有三个
			else if (arr[i][j] == arr[i + 1][j + 1] && arr[i + 1][j + 1] == arr[i + 2][j + 2] && arr[i + 1][j + 1] != ' ')
			{
				return arr[i+1][j+1];
			}
			else if (arr[i][j] == arr[i - 1][j - 1] && arr[i - 1][j - 1] == arr[i - 2][j - 2] && arr[i - 1][j - 1] != ' ')
			{
				return arr[i-1][j-1];
			}
		}
	}
	//平局			
	return isFull(arr, ROW, COL);
}

char isFull(char arr[ROW][COL], int row, int col)
{
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < col;j++)
		{
			if (arr[i][j] == ' ')
				return 'g';
		}
	}
	return 'c';
}

test.c

#include"game.h"

void menu()
{
	printf("*********************\n");
	printf("****  1.开始游戏 ****\n");
	printf("****  0.退出游戏 ****\n");
	printf("*********************\n");
}

void game()
{
	//创建二维数组
	char arr[ROW][COL];
	//初始化二维数组
	InitArr(arr,ROW,COL);
	//打印棋盘
	PrintArr(arr,ROW,COL);
	char ret = 0;
	while (1)
	{
		//玩家走
		PlayerMove(arr, ROW, COL);
		PrintArr(arr, ROW, COL);
		ret=isWin(arr, ROW, COL);
		if (ret != 'g')
			break;
		//电脑走
		AiMove(arr, ROW, COL);
		PrintArr(arr, ROW, COL);
		ret=isWin(arr, ROW, COL);
		if (ret != 'g')
			break;
	}
	if (ret == 'x')
		printf("玩家胜利\n");
	else if (ret == 'o')
		printf("电脑胜利\n");
	else if (ret == 'c')
		printf("平局\n");
}

int main()
{
	//数组练习题
	//三子棋
	int input = 0;
	srand((unsigned int)time(NULL));

	do 
	{
		menu();
		printf("请输入>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋游戏开始:\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入无效,请重新输入\n");
			break;
		}
	} while (input);
	
}

笔记:

  • 数组
    • 5.1 概述
      • 所谓数组,就是一个集合,里面存放了相同类型的数据元素
      • 特点1:数组中的每个数据元素都是相同的数据类型
      • 特点2:数组是由连续的内存位置组成的
      • 例图:

    • 5.2 一维数组
      • 5.2.1 一维数组定义方式
        • 一维数组定义的三种方式:
          • 数据类型 数组名[ 数组长度 ];
          • 数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
          • 数据类型 数组名[ ] = { 值1,值2 ...};
        • 图示:

        • 注意:如果在初始化数据的时候,没有全部填写完,会用0来填补剩余数据+数组长度必须是常量
        • 总结1:数组名的命名规范与变量名命名规范一致,不要和变量重名
        • 总结2:数组中下标是从0开始索引
      • 5.2.2 一维数组数组名
        • 一维数组名称的用途:
          • 1.可以统计整个数组在内存中的长度
          • 2.可以获取数组在内存中的首地址
        • 注意:数组名是常量,因此不可以赋值
        • 总结1:直接打印数组名,可以查看数组所占内存的首地址
        • 总结2:对数组名进行sizeof,可以获取整个数组占内存空间的大小
      • 5.2.3 冒泡排序
        • 作用: 最常用的排序算法,对数组内元素进行排序
          • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
          • 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
          • 重复以上的步骤,每次比较次数-1,直到不需要比较
    • 5.3 二维数组
      • 二维数组就是在一维数组上,多加一个维度。
      • 5.3.1 二维数组定义方式
        • 二维数组定义的四种方式:
          • 数据类型 数组名[ 行数 ][ 列数 ];
          • 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
          • 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
          • 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};
        • 建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性
        • 总结:在定义二维数组时,如果初始化了数据,可以省略行数
      • 5.3.2 二维数组数组名
        • 二维数组名称的用途:
          • 1.查看二维数组所占内存空间
          • 2.获取二维数组首地址
    • 5.4 数组&函数
      • 传递数组给函数
        • 可以通过指定不带下标(索引)的数组名来传递一个指向数组的指针
        • 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址
        • 数组作为参数的三种方式
          • 1.形式参数是一个指针:void myFunction(int *param)
          • 2.形式参数是一个已定义大小的数组:void myFunction(int param[10])
          • 3.形式参数是一个未定义大小的数组:void myFunction(int param[])
      • 从函数返回数组
        • C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。
        • 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数。
          • 例子:int * myFunction()
定位精度再突破!Inner-MPDIoU让YOLOv11边界框回归更精准 Inner-MPDIoU 凭借辅助边框与最小点距离的双机制创新,彻底解决了传统 IoU 损失在边界框回归上的精度瓶颈。本教程从原理到代码实现,再到工业场景适配,完整呈现了其在 YOLOv11 中的集成路径。只需简单修改两处核心脚本,你的目标检测模型就能在边界框定位精度上实现跨越式提升——无论是学术研究中的指标突破,还是工业场景下的精细检测需求,Inner-MPDIoU 都能成为你攻克边界框回归难题的利器。现在就动手尝试,让你的检测模型在定位精度上再上一个台阶吧。 阅读详情

相关推荐

使用.NET 免费开源包ViewFaceCore做一个人脸识别并注册的功能,没有比我更全的

本文介绍了一个基于WinForm的免费人脸识别系统实现方案。系统使用AForge和ViewFaceCore库,支持从USB或电脑自带摄像头采集图像,具备人脸注册和快速识别功能。硬件方面仅需普通摄像头,软件依赖多个NuGet包(如AForge.Video、ViewFaceCore等)。界面包含视频显示、图像预览和功能按钮控件,后台采用SQLServer存储用户面部特征数据。核心代码展示了人脸检测、特征提取和多线程处理逻辑,通过ViewFaceCore实现高效识别。系统具有识别速度快、准确率高的特点,适合Win

一个靠“吃代码”长大的程序猿,专治各种“Bug 饥饿症”。 817

C语言编程练习,三子棋

编程记录,关于B站上鹏哥C语言课程中的练习记录 记录内容:C语言实现三子棋游戏(数组的应用)

LoveQR1的博客 2624

jmeter5.4.1 使用案例

jmeter主要用于接口压力测试,模拟海量请求并发访问接口 1.下载jmeter https://jmeter.apache.org/download_jmeter.cgi 2.启动jemter 双击即可 3.配置jmeter 1.先更改语言 2.创建线程组 配置线程执行规划 3.创建http请求默认值 4.创建http请求 5.创建http信息头管理器 指定 Content-Type:application/json 6.创建响应断言 7.创建察看结果数 直接点击 执行 按.

SpringHASh的博客 1222

C语言练习——三子棋

C语言编写简单的三子棋

YT54936543的博客 1332

Win10下YOLOv8环境搭建避坑指南:从CUDA 11.6到cuDNN配置全流程

本文详细介绍了在Windows 10系统下搭建YOLOv8环境的完整流程,包括CUDA 11.6和cuDNN的配置步骤,以及常见问题的解决方案。通过硬件准备、软件安装、环境验证和性能优化等环节,帮助开发者高效完成YOLOv8环境配置,提升目标检测项目的开发效率。

defi6farmer的博客 224

AI应用工程师面试指南与参考答案

摘要:AnkerAI应用工程师职位面向2024/25届毕业生,要求计算机相关专业背景,强调工程实现与技术探索能力。岗位职责包括全栈开发、AI技术整合(如大模型、图像识别)、团队AI赋能及系统优化。职位更看重编程实践能力(Python/Java等)和学习潜力,而非单纯算法知识。成功候选人将参与智能化产品开发,获得导师指导和技术成长机会。面试准备应聚焦项目经验展示、业务需求理解和技术解决方案能力,通过结构化回答和实操案例体现工程思维与创新潜力。

郑伟强dev的专栏 410

C语言二维数组练习-三子棋

【代码】C语言二维数组练习-三子棋。

weixin_71243777的博客 147

我的PCB设计经验总结及最容易犯错的100例之二B07

本文总结了PCB设计中的常见错误及解决方法。作者通过记录自身及他人的设计失误,系统归纳了高频、隐蔽且致命的问题,如电容中间穿线、高速信号跨分割、锐角布线等。重点提出从错误中提炼规律,建立分类案例库,并开发自动化检查工具的方法。案例涵盖高速信号处理、电源设计、EMC防护等关键领域,强调通过原理理解和实践验证提升设计质量。文章建议工程师建立个人错误数据库,从被动纠错升级为主动预防,最终形成系统化的设计方法论,提高PCB一次成功率。

启芯硬件的博客 83

C语言练习-三子棋

三子棋主要是在学习C语言中,运用到数组和函数及各种循环嵌套的综合小项目,跟着B站老师的学习,在复盘过程中还是会发现一些很巧妙的点,可以运用到以后的编程项目上,由此把他记录下来,也是为了能够复习和更好地理解这个小项目。

weixin_62585968的博客 918

Python爬虫实战:利用Scrapy+Playwright高效爬取TED演讲数据

在当今信息爆炸的时代,TED演讲作为全球知名的思想传播平台,汇聚了各领域顶尖人才的精彩分享。对于数据分析师、研究人员或内容创作者来说,获取TED演讲的完整数据集具有重要价值。本文将详细介绍如何使用Python中最先进的爬虫技术组合——Scrapy框架配合Playwright浏览器自动化工具,高效爬取TED演讲的完整数据。传统爬虫技术在处理现代动态网页时面临诸多挑战,而本文将展示如何利用最新工具解决这些问题。

2201_76125261的博客 205

《QGIS快速入门与应用基础》191:渐变区间设置(等间隔/分位数)

深入解析QGIS中渐变符号化的核心环节——渐变区间设置,重点对比等间隔与分位数两种主流模式的原理与应用。作者指出,90%的渐变效果问题源于区间设置不当,强调必须先分析数据分布特征(通过统计面板查看直方图、极值等)再选择匹配模式。等间隔模式适用于均匀分布数据(如海拔、温度),将数值范围均等划分;分位数模式则针对偏态数据(如GDP、人口),保证每个区间要素数量相等。文章通过界面示意图、效果对比图和操作步骤详解,指导读者根据数据类型选择合适区间模式,并提醒常见避坑要点:社会经济数据禁用等间隔、分类数不超过8类。

LuckyHanMo的博客 318

【C语言】三子棋练习

首先,在编程之前,要创建头文件和相应的.c文件 其中,game.h文件用于写入所有要用的头文件,实现三子棋游戏的所有函数的声明和宏常量的定义。 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void InitBoard(char board[ROW][COL], int row, int col); //棋盘的初始化 void print_board(c

LumosJ 241

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【C语言入门】数组练习之《三子棋》-> 《多子棋》

数组练习从《三子棋》到《多子棋》,让你的数组更加的熟练~~

欢迎来到我的博客,有问题可以联系:luoshuaishuai2001@163.com 772

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C语言综合练习之实现三子棋

首先创建一个空项目,再在项目中创建三个文件,分别是test.c game.c game.h ,用来主文件的运行,函数的定义,函数的声明,在每个文件分别添加相应代码。本项目涵盖知识点为:C语言基本定义及输入输出,数组坐标,函数的声明与定义。实现结果如下,文件完整版上传在主页。利用C语言实现简易人机三子棋。...

liudalili_的博客 716

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C语言练习项目:三子棋

用C语言实现三子棋小游戏

weixin_53067483的博客 240

数组练习——三子棋(c语言)

仅供个人学习记录

weixin_53996189的博客 2399

c语言小练习11-三子棋

三子棋游戏 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<time.h> #include<stdlib.h> #define MAX_ROW 3 #define MAX_COL 3 int Memu1() { printf("------...

weixin_43428447的博客 167

C语言新手入门练习之三子棋

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。 使用C语言代码来完成三子棋首先我们需要建立三个文件,分别是两个源文件test.c、game.c,和一个头文件game.h。 然后我们需要在test.c里面建立游戏需要的目录。 菜单建立完,我们需要建立主函数,来让游戏的选项可以运行起来。 还需要建立棋盘。 需要在game.c里.

达斯米奇的博客 1193

C语言数组基础练习-三子棋

三子棋游戏 三子棋游戏是对我们C语言数组基础知识的简单考察,项目本生不算太难,不过对于基础不是很好的人来说中间打印棋盘的时候还是会被绕进去 首先我们新建一个工程文件project1每一个C语言程序都有唯一的一个main函数 那接下来我们就创建一个名为test.c的文件来储存我们的主程序 我们不难想到既然是一个游戏那他肯定就会包含很多的自定义函数,为了这些代码在后期能更好的看出来,方便后期的维护,那我们是不是得把他们分别装在另一个 文件夹里面 这样也会是我们的代码看起来更有逻辑,那么我们就创建一个名为gam

若离风技术博客 3032

C语言--11.三子棋练习

我们的C语言已经了解了数组的基础知识,下面我们将进行两个小项目,三子棋与扫雷,来对我们的数组与前面所学的知识做一个小的综合复习,加深印象 三子棋小游戏 在我们编写小游戏之前,我们首先需要对这个小游戏进行一个整体的框架性认识; 首先:大家应该都玩过三子棋,在九宫格中先完成三子连珠的那一方取得胜利,而今天,我们对三子棋进行两个模式的完成,人机对战or双人对战,因为我们还未接触到鼠标windows图形编程方面的知识,所以我们使用键盘对于小游戏进行操作 三子棋小游戏设计流程(自顶而下的设计方式): 基础准

平生的小铺子 391

初识C语言练习学习笔记 三子棋游戏

练习自用

weixin_71085457的博客 1158

C语言练习题~三子棋小游戏

三子棋小游戏 游戏描述:如图,建立一个3*3的数组," * “代表玩家下棋,” # "代表电脑下棋 当横三行或竖三行或斜对角线率先出现三个相同的字符,判断电脑或者玩家赢 当棋盘满且不满足条件1的就是平局 当棋盘不满且不满足1的就继续下棋 整个游戏分为三个文件,分别是主函数源文件,游戏源文件和头文件。 主函数源文件: #include "game.h" void menu() { printf("*****************************\n"); printf("**

yttfzsn的博客 295

C语言练习——三子棋小游戏

内容 1.游戏需求 2.设计思路 3.代码实现 *1.游戏需求 *2.设计思路 *3.代码实现

weixin_47921628的博客 243

C语言小游戏,三子棋游戏(适合初学者练习)

三子棋代码 **本代码使用vs2019编译 所以使用了scanf_s(懂得都懂) 如果使用别的编译器请注意将起改为scanf #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3//宏定义行数为3 ROW为行,LIE为列(不会列的英文) #define LIE 3//宏定义列数为3,也可以改为大棋盘,但要更改游戏机制 void aBoard(char board[ROW

qq_59708493的博客 7634

三子棋作业练习-C语言

完整程序 //test.c #define _CRT_SECURE_NO_WARNINGS 1 //测试三子棋游戏 #include "game.h" void menu() { printf("******************************\n"); printf("*********1.play 0.exit******\n"); printf("******************************\n"); } void game() { char ret

qq_43672559的博客 169

C语言数组练习:三子棋超详细讲解√

while (1)//玩家下棋//判断输赢if (ret!//电脑下棋//判断输赢if (ret!printf("玩家赢啦\n");printf("电脑赢了\n");elseprintf("平局\n");

Lumos_yyyx的博客 551
上一篇: c语言基础笔记10
下一篇: c语言练习 落雷游戏
Ohrkaninchen
博客等级 码龄5年 18粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Ohrkaninchen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值