【c语言五子棋】自定义类型五子棋/井字棋:胜负判断

2023-11-04

一、算法思路

由于五子棋规则比较简单,我们可以胜负判断分为以下几个方面分别判断:

1:横向判断

2,竖向判断

3.斜向判断(从左下到右上)

4.斜向判断(从左上到右下)

二、算法原理(算法来源)

参考字符串匹配的处理方法,具体可以参考::从头到尾彻底理解KMP - Chris_z - 博客园 (cnblogs.com)

1.MP算法:即暴力寻找子串(胜利串),时间复杂度为O(M*N)n为文本串m为模板串

2.KMP算法:一种优化算法,时间复杂度为O(M+N),由于涉及数据不多所以可以暂时不考虑使用(主要是因为还不会)

3.【扩展】BM算法

4.【扩展】Sunday算法

5.c++自带strstr()

原理如下:(以7x7棋盘的4子棋为例)

1.局部扫描判定:(以“落子”标记为最近一次落的子)

以每次落子位置作为基准点,对其可能胜利的所有位置进行扫描。这种方法比每次落子时,对整个棋盘扫描效率更高

如图所示

 2.扫描方法:块扫描

把获胜连子数(四子棋,即4)打包扫描,进行行和列的扫描

 横向扫描如图所示,竖向同理

四个为一组打包,假设一组里都是同色棋子,则判断胜利,否则继续扫描,直至扫完成排/列

此处处理并不复杂,代码一看就懂

斜向扫描需要对子进行处理:分为左下到右上(/)和左上到右下(\)

当落子如图所示,则不需要进行/扫描,得出四个角都无需判断,直接跳过(进行\判断)

运行结果:

二、代码实现

总判断:

int win(int positionx, int positiony, int length, int winrule)
{
	if (ifwina(positionx, positiony, length, winrule) == 9999 || ifwinb(positionx, positiony, length, winrule) == 9999 || ifwinc(positionx, positiony, length, winrule) == 9999 || ifwind(positionx, positiony, length, winrule) == 9999)return 1;
	if (ifwina(positionx, positiony, length, winrule) == 10000 || ifwinb(positionx, positiony, length, winrule) == 10000 || ifwinc(positionx, positiony, length, winrule) == 10000 || ifwind(positionx, positiony, length, winrule) == 10000)return 2;
	int flag = 1;
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < length; j++)
		{
			if (map[i][j] == 0) flag = 0;
		}
	}
	if (flag) return 3;
	return 0;
}

横向判断:

//横向判断
int ifwina(int positionx, int positiony, int length, int winrule)
{
	int whitewin = 0, blackwin = 0, score = 0;			//记录连续落子个数
	for (int i = 0; i < length - winrule + 1; i++)
	{
		whitewin = 0, blackwin = 0;
		for (int k = 0; k < winrule; k++)
		{
			if (wh[positionx][i + k] == 1)whitewin += 1;
			if (bl[positionx][i + k] == 1)blackwin += 1;
		}
		if (ifwin(whitewin, blackwin, winrule) == 1)return 9999;
		else if (blackwin > score)score = blackwin;
	}
	return score;
}

竖向判断:

//竖向判断
int ifwinb(int positionx, int positiony, int length, int winrule)
{
	int whitewin = 0, blackwin = 0, score = 0;
	for (int i = 0; i < length - winrule + 1; i++)
	{
		whitewin = 0, blackwin = 0;
		for (int k = 0; k < winrule; k++)
		{
			if (wh[i + k][positiony] == 1)whitewin++;
			if (bl[i + k][positiony] == 1)blackwin++;
		}
		if (ifwin(whitewin, blackwin, winrule) == 1)return 9999;
		else if (blackwin > score)score = blackwin;
	}
	return score;
}

斜向判断:

//然后斜向判断:从左上扫到右下
int ifwinc(int positionx, int positiony, int length, int winrule)
{
	int whitewin = 0, blackwin = 0,score = 0;			//记录连续落子个数
	int start = fabs(positionx - positiony);
	int scan = length - winrule + 1 - (fabs(positionx - positiony));

	if (scan <= 0)return 0;

	for (int i = 0; i < scan; i++)
	{
		whitewin = 0, blackwin = 0;
		//扫左下部分
		if (positionx > positiony)
			for (int j = 0; j < winrule; j++)
			{
				if (wh[start + i + j][i + j] == 1)whitewin++;
				if (bl[start + i + j][i + j] == 1)blackwin++;
			}
		//扫右上部分
		else
			for (int j = 0; j < winrule; j++)
			{
				if (wh[i + j][start + i + j] == 1)whitewin++;
				if (bl[i + j][start + j + i] == 1)blackwin++;
			}
		if (ifwin(whitewin, blackwin, winrule) == 1)return 9999;
		else if (blackwin > score)score = blackwin;
	}
	return score;
}
//最后斜向判断:从左下扫到右上
int ifwind(int positionx, int positiony, int length, int winrule)
{
	int whitewin = 0, blackwin = 0,score=0;
	int start, scan;

	if (positionx + positiony >= length-1)
	{
		start = positionx + positiony - length + 1;		//y的开始值
		scan = positionx + positiony - length + 2;
	}
	else
	{
		start = positionx + positiony;			//x的开始值
		scan = positionx + positiony - length + 2;
	}

	for (int i = 0; i < scan; i++)
	{
		whitewin = 0, blackwin = 0;
		//扫左下部分
		if (positionx + positiony >= length)
			for (int j = 0; j < winrule; j++)
			{
				if (wh[length - 1 - j - i][start + j + i] == 1)whitewin++;
				if (bl[length - 1 - j - i][start + j + i] == 1)blackwin++;
			}
		//扫右上部分
		else
			for (int j = 0; j < winrule; j++)
			{
				if (wh[start + j + i][length - 1 - j - i] == 1)whitewin++;
				if (bl[start + j + i][length - 1 - j - i] == 1)blackwin++;
			}

		if (ifwin(whitewin, blackwin, winrule) == 1)return 9999;
		else if (blackwin > score)score = blackwin;
	}
	return score;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【c语言五子棋】自定义类型五子棋/井字棋:胜负判断 的相关文章

  • Flutter:如何在 Web 视图中启用手势?

    我想在 Flutter 中通过捏合和张开来放大我的网页视图页面 我在网上做了一些研究 我在某处发现了这个 虽然 WebView Android 和 UIWebView iOS 内置了捏合和缩放功能 但它们需要 打开 在Android中 插件
  • Linq 是如何工作的(在幕后)?

    我正在考虑为 Lua 制作类似 Linq 的东西 并且我大致了解 Linq 的工作原理 但想知道是否有一篇好文章 或者是否有人可以解释 C 如何使 Linq 成为可能 注意 我的意思是在幕后 比如它如何生成代码绑定等等 而不是最终用户语法
  • 使用 LINQ 和 C# 的随机数组

    我在 MSDN 杂志上读到一篇关于使用LINQ 中的枚举类 http msdn microsoft com en us magazine cc700332 aspx生成随机数组 本文使用 VB NET 我不能立即确定 C 中的等效项是什么
  • 在 ASP.NET 中将多个字段绑定到列表框

    我对 ASP NET 尤其是 LINQ 和 SQL 还很陌生 假设我有一个表 员工 其中包含 姓氏 名字 和 ID 字段 我想将其绑定到列表框 我希望列表框显示其内容 例如 LASTNAME FIRSTNAME 并且我希望每个项目的值为 I
  • C#无循环方式将字符串拆分为多维数组或锯齿状数组

    如何在不循环的情况下将字符串拆分为多维数组或锯齿状数组 我看到一个代码片段 其中有人使用文件流执行此操作 但我不知道如何使其适用于我的字符串 我的字符串类似于1 2 3 1 4 1并可以分为ID Qty 这是我看到的代码 string li
  • Android WebView 在最新更新到 v90.0.4430.82 时渲染内容时崩溃

    WebView更新v90 0 4430 82 在 WebView 内渲染内容似乎存在一些问题 加载正常 但在屏幕上显示却不行 看起来这是随机的 但却是一致的 有些 URL 渲染得很好 但其他 URL 在渲染时会不断导致应用程序崩溃 在此更新
  • 更新后 LINQ to SQL 返回旧数据

    我有一个使用 LINQ to SQL 连接到数据库的应用程序 我在获取 LINQ to SQL 返回正确的新更新数据时遇到问题 发生的情况是 我更改了 UI 上的字段 LINQ to SQL 生成更新语句 并将新数据存储在数据库中 但是 此
  • Android:带有链接突出显示的Webview

    我正在 android 上使用 WebView 似乎无法弄清楚如何使库存浏览器中出现的橙色突出显示出现在我的 webview 上 为了更清楚地说明这一点 让我举个例子 在 Android 浏览器中 如果您单击链接 图像 视频 它将显示一个覆
  • Android - 如何在运行时生成的 HTML 数据中加载外部 javascript 文件?

    我有一个包含 HTML 数据的 WebView 数据是在运行时生成的 我的应用程序的一个主要功能是突出显示该 HTML 数据的某些部分 我用 javascript 尝试过这个 Override public View onCreateVie
  • 将定界转换为固定宽度的最佳方法

    转换此值的最佳方法是什么 FirstName LastName Title BirthDate HireDate City Region Nancy Davolio Sales Representative 1948 12 08 1992
  • Android 中的 MathJAX

    我正在尝试在 Android 的网络视图中显示数学公式 我已将代码编写在单独的 html 文件中 并使用以下代码来显示公式 String data inputStreamToString1 myWebView loadData data t
  • Android webview 允许使用当前 Android Studio 访问相机

    我一直在尝试在我的网络视图上制作一个简单的输入按钮来访问相机和文件 我读过的解决方案各不相同 只有几行代码 没有解释它们到我在 Android Studio 中下载并打开的盲 github 项目链接 Os Fileup 等 的位置 并且它们
  • Linq to XML - 更新/更改 XML 文档的节点

    我有 2 个问题 1 我已经开始使用 Linq to XML 我想知道是否可以通过 Linq 更改 XML 文档 我的意思是 有没有类似的东西 XDocument xmlDoc XDocument Load sample xml updat
  • 为什么我无法在 WebView (UWP) 中打开外部浏览器中的链接?

    我正在开发一个即将完成的 Web 应用程序 该应用程序有一个本地 Web 应用程序 其中有一些链接 我想在外部浏览器 Edge Chrome 等 中打开它们 我的代码分为 3 部分 1 Windows运行时组件 using System u
  • 输出字段值相同的记录

    该主题可能会重复 我在不同的场景下询问这个话题 https stackoverflow com questions 64150691 select records which the values of the field are the
  • ANDROID:Webview 和 httpclient 之间共享会话

    我的 WebView 中实际上有一个记录的会话 但我也使用 httpclient 从网络发送和获取数据 我在互联网上看到不可能获取WebView的内容 所以我需要使用我的httpclient从Web服务获取数据 问题是这个Web服务使用会话
  • 在 Android Webview 中加载 Angular JS 网站的问题

    大家好我正在尝试加载GTV http gtvqa com Android WebView 中 它在移动浏览器中加载得很好 但在 webview 中则不行 这是我的代码 WebView theWebPage new WebView this
  • 在 Android webview 中禁用地址栏

    如何从 WebView 中禁用和隐藏地址栏 没有地址栏WebView 如果你认为你有一个WebView 然后您看到一个地址栏 那不是您的WebView 相反 您正在查看浏览器应用程序 最有可能的是 您告诉的 URLWebView加载进行了重
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • 如何使用 Linq-to-SQL 而无需生成所有类?

    我以前从未在应用程序中使用过 Linq to Sql 但我使用 LinqPad 开发查询 只是想将其粘贴到我的代码中 事情没那么简单 我猜我需要一个DataContext处理连接 但我仍然收到错误 因为视图名称无法识别 Do I have使

随机推荐

  • 如何在十分钟内插入1亿条记录到Oracle数据库?

    这里提供一种方法 使用 APPEND 提示 使得十分钟内插入上亿数据成为可能 Create table create table TMP TEST CHAS LEE f01 VARCHAR2 20 f02 NUMBER 10 not nul
  • XSS-Game level 5

    第五关过滤了
  • Java学完SSM后很迷茫,接下来该学哪些呢?

    没必要跟着别人的学习路线图走 你要清楚你的目的是找工作 写过很多次大学的四年安排 今天这篇专门写给大四即将找工作的同学 一 找什么工作 首先分析自己想干什么 以题注说的是Java为主 那么起码要知道找一个Java开发的工作需要什么能力 基本
  • postgresql 中的COALESCE()函数使用小技巧

    这篇文章主要介绍了postgresql 中的COALESCE 函数使用小技巧 具有很好的参考价值 希望对大家有所帮助 一起跟随小编过来看看吧 场景 存在一个用户白名单表 提供了此用户的用户名和地区信息 判断此用户是否在此白名单表中 如 姓名
  • Spring Boot 获取接口调用者的IP

    需求 我们实现一个登陆功能时 可能会有需要记录登陆者IP的需求 用于系统安全分析或账户来源分析 当然还有更多应用场景 工具类如下 来源于网络 已兼容K8S 代理的情况 import org slf4j Logger import org s
  • 树莓派解决 vim 编辑器中文乱码问题

    目录 1 问题由来 2 乱码问题演示 3 解决方案 4 问题解决 1 问题由来 我们用树莓派做项目的时候经常需要在电脑编写程序代码 然后再把代码移植进树莓派进行运行 我们用电脑编写程序的时候避免不了都会写很多中文注释 当我们把 file c
  • 【BEV Review】论文 Delving into the Devils of Bird’s-eye-view 2022-9 笔记

    背景 一般来说 自动驾驶车辆的视觉传感器 比如摄像头 安装在车身上方或者车内后视镜上 无论哪个位置 摄像头所得到的都是真实世界在透视视图 Perspective View 下的投影 世界坐标系到图像坐标系 这种视图与人类的视觉系统很类似 因
  • 表单数据自动封装到javaBean中

    页面表单数据的自动封装到javaBean中 先定义一个Bean类 package com test public class Bean private String name private Integer sex public Strin
  • AD19铺铜操作

    1 在Keep OUT层沿板子边缘画出板子形状 2 PCB设计界面右上角 设置 PCB Editor General 勾选 铺铜修改后自动重铺 3 铺铜之前 打一些过孔 连接板子上下两层 双层板 并设置为GND网络 右边Properties
  • 复制文件夹所有内容 和 删除整个文件夹的2个函数

    选择自 hycapril 的 Blog 实现一个静态方法将指定文件夹下面的所有内容copy到目标文件夹下面 如果目标文件夹为只读属性就会报错 April 18April2005 In STU public static void CopyD
  • keil4 破解心得

    keil4 破解心得 Obj STM32 FD SDCard MP3 axf error L6047U The size nb 在编译时出现 Obj STM32 FD SDCard MP3 axf error L6047U The size
  • bes2300之环境搭建(一)

    目录 环境搭建 sdk文件结构介绍 编译 烧录 配置烧录选项 选择端口 启动升级 简单使用 环境搭建 安装编译工具链 gcc arm none eabi 4 9 2014q4 20141203 win32 exe make 3 81 exe
  • GPIO工作模式

    参考链接 STM32 STM32F4 GPIO八种模式及工作原理详解 Z小旋 CSDN博客 stm32io口的八种工作模式 GPIO 即通用I O 输入 输出 端口 是STM32可控制的引脚 STM32芯片的GPIO引脚与外部设备连接起来
  • [备忘]域用户登陆出现“此工作站和主域间的信任关系失败”错误解决方法

    症状 登陆域用户 出现错误 此工作站和主域间的信任关系失败 并无法登陆 解决方案 1 使用本地用户登录 更改当前 域 为 工作组 如默认的WORKGROUP等 并输入具有域管理权限的用户名 密码 随后此电脑上的 域 将会被删除 2 重启电脑
  • Flink入门看完这篇文章就够了

    文章目录 第一章 概述 第一节 什么是Flink 第二节 Flink特点 第三节 Flink应用场景 第四节 Flink核心组成 第五节 Flink处理模型 流处理和批处理 第六节 流处理引擎的技术选型 拓展 什么是最多一次 最少一次和仅一
  • 算法基础之数组理论

    算法基础之数组理论 1 前言 2 数组基础定义 3 数组增删改查 3 1基本功能 3 2添加元素 3 3查询和修改元素 3 4包含 搜索和删除元素 3 5其他 3 6检验 4 动态数组及其时间复杂度 4 1动态数组的实现 4 2增删改查时间
  • 阿里云通义千问向全社会开放,近期将开源更大参数规模大模型

    9月13日 阿里云宣布通义千问大模型已首批通过备案 并正式向公众开放 广大用户可登录通义千问官网体验 企业用户可以通过阿里云调用通义千问API 通义千问在技术创新和行业应用上均位居大模型行业前列 IDC最新的AI大模型评估报告显示 通义千问
  • 【YModem】YModem串口IAP升级例程+YModem串口工具

    目录 YModem协议传输的过程 IAP例程 YModem串口工具 YModem技术手册 手把手教你如何实现自动固件更新 YModem协议是由XModem协议演变而来的 每包数据可以达到1024字节 是一个非常高效的文件传输协议 Ymode
  • ChatGPT多场景应用之基本应用

    人工智能 AI 无疑是近年来最流行和最先进的技术之一 生成式 AI模型正在促进众多任务 实现效率和自动化 目前 ChatGPT是风靡互联网的主要生成人工智能模型 据 Similar Web 称 自 2022 年 11 月发布以来 其访问量已
  • 【c语言五子棋】自定义类型五子棋/井字棋:胜负判断

    一 算法思路 由于五子棋规则比较简单 我们可以胜负判断分为以下几个方面分别判断 1 横向判断 2 竖向判断 3 斜向判断 从左下到右上 4 斜向判断 从左上到右下 二 算法原理 算法来源 参考字符串匹配的处理方法 具体可以参考 从头到尾彻底