五子棋c++代码_C++大作业赏析

2023-11-04

- 清小C -

C++大作业赏析

——如何完成一篇优秀的C++大作业

苦恼C++大作业的同学快点进来看看!(小声)

五子棋设计

五子棋是大家最为熟悉双人对弈的棋类游戏之一,

只要任意行、列、斜线连成五子即可获胜。

上个学期中,陈昊柯同学的大作业实现了五子棋,

不但能够双人对战,而且实现了五子棋AI,能人机对战。

我们一起来欣赏陈同学的大作业吧。

在开始之前,

我们先来看下运行实例吧!

1. 首先运行程序,进入主页

debee1caaed8054215605d1446680d55.png

2. 输入1,则进入了人-人对战界面

f547dc7cdc4e8788a819e4dc72d8514f.png

3. 输入2,则进入了人-机对战界面

5b5208d73a3086357a989697335ce67f.png

4. 如果五子棋太难,我们可以选择输入4,玩更简单的井字棋

c9796812c7d10d8756e890600a7d599a.png

类的设计

- PART ONE -

(1) 五子棋类:trial

92ad827e7d8e68aae803981792faf2aa.png

我们可以看到,

整个类的设计稍显复杂,

所有函数都被封装在一个类中。

在此基础上,小编稍作修改,

把一个类拆成多个类。

小编觉得这种风格,代码可读性或可更好:

91c8e3dfc2cf3ba347bffbc904d8bff0.png

/ / / / / / /

287a7f04dca6c72d1363e067d014be84.png

/ / / / / / /

da42180cb9f7ab5928a19c25aaab33a4.png

分成了五个类:

判断胜负:judge,打印界面:print,控制落子:play

人-人对战:pp_play,人-机对战:pc_play

其中pp_play类和pc_play类又由play类继承得到

——————————————————

(2) 类数据成员说明

Public:

  Over: 用于判断游戏的结束(1为结束,0为继续);

  Mode:用来选择游戏模式(1为人-人对战,2为人机对战,3为载入上次游戏);

  Again:用来选择是否重新游戏(1为返回主页并选择是否继续游戏,2为直接退出游戏);

  Zong,heng:分别用来传递横坐标与纵坐标。

Private:

  char chessmove[15][15]:决定网格中是填补“X”、“O”还是“ ”,也就是控制落子。

  int flag:用来确定该哪个玩家落子了(每次使用flag后flag都会加1,然后每次通过判断flag%2是0还是1来确定玩家)。

  int player:用来标记玩家。

  int victory:用来确定游戏是否有人实现了“五子”连续(0为无人胜利,1为玩家1胜利,2为玩家2胜利)。

  int point_chess[15][15]:在人机对战的时候负责给棋盘里的格子计分(每个点的默认得分都是0分)。

(3)类函数成员说明

1)printboard函数

  printboard函数的主要功能是打印棋盘。当游戏没有分出胜者的时候,每次printboard函数被调用的时候都会借助for循环把棋盘打印出来,最重要的是把新落的子打印在棋盘上,起到一个刷新的作用。

2)clearscreen函数

  借用C++标准库头文件stdlib.h中的system("cls")函数进行清屏。在每次玩家或者电脑确认落子之后,通过clearscreen将控制台上面所有信息清除,方便之后的打印。

3)homepage函数

  homepage函数的只要作用就是显示程序的主界面,用于选择游戏模式。并且,当一局游戏结束之后,如果选择“继续游戏”,那么程序会再次调用homepage函数,并且让玩家再自由选择游戏类型。

4)restart函数

  restart函数可以用来选择是返回首页继续游戏,还是直接退出程序。

5)rowvic,columevic,diagonal函数

  可以分别判断行、列和对角线(与副对角线)上是否有五个连续相连的棋子。

6)pp_play函数

  pp_play函数负责人-人对战的落子,两位玩家交替落子。

7)pc_play函数

  pc_play函数负责人-机对战中的落子,在后面的算法设计中会详细介绍。

8)point_initialize函数

  point_initialize函数的主要作用就是在每次落子之后将棋盘上每一个点的分值清零,方便再次落子时的打分。

9)chess_initialize函数

  chess_initialize函数用于同时给chessmove[ ][ ],point_chess[ ][ ]矩阵进行初始化,这个函数只在游戏最开始的时候使用一次。

10)save函数

  save函数可以把即时的落子情况(chessmove[ ][ ]),以及当时的游戏模式(mode)和玩家(flag)存储起来(三者分别存放在三个文件中)。在每次有人落子之后都会调用save函数,这样当游戏突然非正常关闭的时候可以保证游戏数据不会丢失。

11)read函数

  read函数可以把save函数存储的数据提取出来再分别赋予他们对应的数据成员,这样游戏可以从上次退出的地方完全相同的继续进行。

关键点说明

- PART TWO -

(1) char chessmove[15][15]

五子棋需要什么?

首先当然是一个空白的棋盘,不同的两种棋子 棋盘的输出是简单的,简单的for循环嵌套就能实现这点 但关键的就是如何实现放置棋子这一操作, 当然我们要求这一操作尽可能的简洁 陈同学在他的大作业中很巧妙地实现了这一步, 他注意到我们改变的其实是棋盘格子的状态,

格子有几种状态呢?

其实就是三种:“空白”,“A类棋子”,“B类棋子”。 所以他定义了一个15*15的字符数组char chessmove[15][15],来表示棋盘格子的状态。(选的棋盘是15*15) 因此下棋操作就是改变数组中相应元素的状态。

下图分别是:

字符数组的初始化,

棋盘的输出以及输出棋盘实例

425444254bf4e486fee706e5e9d248ec.png

/ / / / / / /

1c1e0e5cba1c25f490a68814abdc6c9f.png

/ / / / / / /

12062e208be7367fd8bbbb4aa2962eab.png

——————————————————

(2)人-机对战的设计

在设计如何让电脑合理落子的时候,这位同学主要运用到的就是打分的算法,而设计的只要思路是“稳住防守,相互靠近,伺机反击”。

“所谓打分的算法就是借助矩阵point_chess[i][j]给棋盘上每一个点赋予其一个特定的分数,这个分数由其周围黑白子的分布形势确定,通过筛选出分值最高的点即可在一定程度上比较合理的为计算机选择一个落子点。”

1. 防守“打分”

(1)每个已经被“X”或者“O”占据的点都直接赋为-10000000分,确保这个点永远不可能被选为最大值点;

(2)每一个“X”周围紧贴的8个点都+100分;

(3)每个方向“X”的“活二”形式的两端的点都+1000分;

(4)每个方向的“X_X”形式,其中间的点都会+2000分。这个点的分数比上面的“活二”分数高的原因是因为”X_X”形式比较容易被用来构建“三三”所以需要重点防守;

(5)每个方向上的“XXX”形式,其两端的端点都+8000分。但是,由于“XXX”可能是“活三”也可能是“死三”,所以仅仅这样赋值对于棋型的考虑其实是不充分的;

(6)每个方向上的“OXXX”或者“XXXO”其另一端都会-8000分,这是因为这就构成了“死三”,死三的价值就比“活三”差了很多;

(7)每个方向上的“X_XX”或者“XX_X”,其中间的空点都会被赋予+6000分,但是这个情况也没有考虑一端被封堵的情况;

(8)为了进一步完善上述的棋型,每个方向上的“OX_XX”或者“XX_XO”,其中间的字都会被-7000分,这是因为这个点除了完成“冲四”之外,没有别的作用,比较容易为计算机落子带来迷惑性;

(9)每一个方向上的“XXXX”其两端都会+10000分,此点的赋值很高是因为这个点是无论如何都要封堵的,不然就输了。

2. 进攻打分

(1)每一个“O”周围紧挨的8个点都会被+500分,这就在一定程度上保证了这些“O”在有条件的时候会尽可能紧贴,事实上将“O”周围几周的点都可以赋予加分,但是工作量实在是太大了;

(2)每一个方向上的“OO”两端都会被+1000分;

(3)每一个方向上的“O_O”其中间的点都+5000分;

(4)每一个方向上的“OOO”,其两端都会被+6000分;

(5)每一个方向上的“XOOO”,即“死三”,其两端都会被-5000分;

(6)每一个方向上的“OOOO”都会被+100000分,因为落这个子就赢了。

下图是部分源代码实现:

6ea34df92c02d2c7ac68e1044f8769f4.png

/ / / / / / /

b700f1b604f182c2031e491a787154cb.png

小结

- PART THREE -

陈昊柯同学的C++大作业很好地体现了C++支持面向对象的方法这一特点,其中充分运用了类、对象、数组、指针、字符串等知识要点,这也反映着陈同学对C++各个知识点的牢固掌握。希望所有完成C++大作业,或者正在编写的同学们,在将来能够如同陈同学所说:“真真正正的通过编程解决一些在学习专业知识时遇到的实际问题!”。

PS:写完代码不要忘了

程序设计说明书、用户手册和总结报告哦!

E.N.D

文字|张帅

排版|张帅

大作业作者|陈昊柯 2020春季学期

校阅|刘政宁 姚炫熔

指导老师|李超

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

五子棋c++代码_C++大作业赏析 的相关文章

  • 线程的同步与互斥

    线程的同步与互斥 互斥 当一个公共资源同一时刻只能被一个进程或线程使用 多个进程或线程不能同时使用公共资源 如 当线程A在使用打印机时 其他线程都需要等待 同步 两个或两个以上的进程或线程在运行过程中协同步调 按预定的先后次序运行 如 A任
  • RK3588 烧写固件

    首先先安装驱动DriverInstall 上电 配置串口调试工具 一般使用MobaXterm rk3588 波特率1500000 串口软件有信息打印说明成功 进行下一步操作 升级固件里 选固件 选择updata img文件 再点升级 串口软
  • 【微信小程序】解决微信小程序textarea层级过高穿透问题

    先来张完美的效果图 说下遇到的问题 之前做过的一个项目改版碰到的病例上传页面发布按钮上一版本是在底部放置的 这一版改为了顶部固定 由于上传页面顶部有两个textarea输入框所以问题就产出了 之前使用的button和view标签布的局页面上
  • 2020浙江省赛(ZJCPC)赛后总结

    引言 2020注定是特殊的一年 其时间线受疫情影响 本该在上半年举办的活动全部放到了下半年 虽然能够在2020结束前能够举办已经很感谢主办方 然后10 17就在线上参加了2020浙江省大学生程序设计大赛 得益于参加过计量大学的模拟赛以及省赛
  • 【博客687】k8s informer的list-watch机制剖析

    k8s informer的list watch机制剖析 1 list watch场景 client go中的reflector模块首先会list apiserver获取某个资源的全量信息 然后根据list到的rv来watch资源的增量信息
  • python中object的用法_【Python】【基础知识】【内置函数】【object的使用方法】

    原英文帮助文档 classobject Return a new featureless object object is a base for all classes It has the methods that are common
  • 【笔记】CPU的结构和功能(一)

    一 CPU的结构 1 CPU的功能 2 CPU结构框图 3 CPU的寄存器 用户可见寄存器 控制和状态寄存器 4 控制单元和中断系统 二 指令周期 1 指令周期的基本概念 2 指令周期的数据流 取指周期数据流 间址周期的数据流 执行周期的数
  • 命令计算机执行指定的操作,计算机如何执行一条机器指令

    计算机如何执行一条机器指令 计算机如何执行一条机器指令 文章目录指令运行过程 微程序控制基本概念 几个周期区别 寻址方式 指令运行过程 在上篇我们谈到 计算机处理一段程序 就会将程序翻译成机器指令 然后执行完成相应的任务 执行指令的过程分为
  • 为什么Python没有main函数?

    作者 豌豆花下猫 来源 Python猫 ID python cat 众所周知 Python中没有所谓的main函数 但是网上经常有文章提到 Python的main函数 和 建议编写main函数 其实 可能他们是想模仿真正的main函数 但是
  • AD18的覆铜技巧

    AD18的覆铜技巧 设置覆铜的安全距离 从工具中选择覆铜管理器 设置覆铜的安全距离 进入设计 规则 创建一个新的Clearance如下图 从工具中选择覆铜管理器 从Create NEW polygon from 中选择Board Outli
  • 37.cuBLAS开发指南中文版--cuBLAS中的Level-2函数her()

    2 6 20 cublasher cublasStatus t cublasCher cublasHandle t handle cublasFillMode t uplo int n const float alpha const cuC
  • Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available产生原因

    在项目部署时需要将代码打包放到服务器上 打包的时候报了如下的错误 但是在idea上却是能正常运行的 java lang IllegalStateException Failed to load ApplicationContext at o
  • OpenGL学习——第十课:纹理映射(1)实例

    这里使用第九课中的Texture h和Texture cpp来实现对一个正方体的六面的纹理效果 需要注意的代码就是相关纹理映射的部分 1 代码部分省去了Texture h和Texture cpp 因此运行时候需要先把这两个加入到工程目录下
  • 猿创征文

    猿创征文 国产数据库之在k8s环境下部署RadonDB MySQL集群 一 RadonDB MySQL介绍 1 RadonDB MySQL简介 2 RadonDB MySQL的应用场景 3 RadonDB MySQL核心功能 4 Radon
  • 用Python求三角形面积

    题目描述 三角形面积 SQRT S S a S b S c 其中S a b c 2 a b c为三角形的三边 定义两个带参的宏 一个用来求area 另一个宏用来求S 写程序 在程序中用带实参的宏名来求面积area 输入 a b c三角形的三
  • esp32 怎么分配freertos 堆栈大小_spiffs 文件系统在esp32中的应用

    spiffs 介绍 SPIFFS 是一个开源文件系统 用于 SPI NOR flash 设备的嵌入式文件系统 支持磨损均衡 文件系统一致性检查等功能 spiffs 源码地址 github com spiffs 特点 而我们知道乐鑫的esp3
  • Qss之QTabWidget美化

    直接上代码吧 QTabWidget QTabWidget pane border none QTabWidget tab bar left 5px QTabBar tab background gray border 2px solid C
  • 内核内存回收原理简介

    页框回收与交换 概念 内核在为进程服务的过程中会分配大量的页 但是这些页对应的虚拟地址在进程的生命周期里一直会被断断续续的访问 所以当内核同时为大量进程服务时 内存终究会耗尽 所有页框回收就是在内核未耗尽内存之前 因为回收与交换也会使用内存
  • LinkWeChat 私域管理平台基于企业微信的开源 SCRM

    LinkWeChat 是国内首个基于企业微信的开源 SCRM 在集成了企微强大的开放能力的基础上 进一步升级拓展灵活高效的客户运营能力及多元化精准营销能力 让客户与企业之间建立强链接 帮助企业提高客户运营效率 强化营销能力 拓展盈利空间 是

随机推荐

  • 绘制流程图的基本规则

    流程图可以简单地描述一个过程 是对过程 算法 流程的一种图像表示 在技术设计 交流及商业简报等领域有广泛的应用 流程图可分为 数据流程图和作业流程图 1 程序流程图的作用 程序流程图的作用程序流程图的作用程序流程图的作用 程序流程图是人们对
  • 优秀个人技术博客

    优秀个人技术博客 作为一个程序员 我们经常需要去网络上寻找大量的参考资料以解决当前遇到的问题 就应用型需求问题几乎都不可避免的会被许多不同地域不同时间的开发者遇到 这类问题可以直接通过前人的解决方案来进行自我消化病指导解决我们遇到的问题 但
  • CSS让DIV上下左右居中的方法

    示例 一个父div w 100 h 400px 中有一个子div w 100px h 100px 让其上下左右居中 1 使用varticle align属性 理念 利用表格单元格的居中属性 步骤 1 父div外层配置一个div 同时设置为表
  • 音频属性相关:声道、采样率、采样位数、样本格式、比特率

    不仅限于FFmpeg 音频采样所得的PCM都含有三个要素 声道 channel 采样率 sample rate 样本格式 sample rate 声道 当人听到声音时 能对声源进行定位 那么通过在不同的位置设置声源 就可以造就出更好的听觉感
  • MPEG压缩编码的视频基本流 - MATLAB实现

    MPEG压缩编码的视频基本流 MATLAB实现 视频压缩是一种广泛应用于数字媒体领域的技术 它可以有效地减少视频文件的大小 同时保持较高的视觉质量 其中 MPEG Moving Picture Experts Group 压缩编码标准是一种
  • web前端技术笔记(一)html简介及常用标签、页面布局

    今天是星期二 h1 一级标题 h1 h2 二级标题 h2 h3 三级标题 h3 h4 四级标 h4
  • 嵌入式课程结业总结

    我大学学的专业就是计算机 之前就接触过c c 等计算机语言 在大学期间 上课的方式就是老师在讲台上讲 学生在书本上划重点 做笔记等 很少有实操的机会 学的东西基本都停留在理论状态 独立敲代码的能力基本没有 来到华清之后 刚开始的预科C的课程
  • Mapbox Sprite精灵图生成

    出处 ATtuing 博客园 https www cnblogs com ATtuing p 9273391 html 1 什么是sprite文件 sprite 文件主要是将一堆小图生成一种大图的方法 并且将每张小图的位置信息保存下来 方便
  • python拯救爱情

    题目描述 小艺酱走到一个花之占卜店中 店员小Q看到小艺酱可怜的样子 允许小艺酱免费占卜一次 花瓣占卜 1 一瓣 在一起 一瓣 不在一起 开始的花瓣表示 在一起 2 直到最后一个花瓣落地游戏结束 3 可以选择多朵花 选择撕一朵花就必须撕完 输
  • 使用JQuery快速高效制作网页交互特效 第十一章 蔚蓝网项目

    样式 global css charset utf 8 CSS Document margin 0px padding 0px font size 12px line height 20px color 333 ul li ol h1 dl
  • contenteditable属性将标签变为可编辑状态,可用于在线编辑修改文本

    1 概述 html 中大部分标签都是不可以编辑的 但是添加了contenteditable属性之后 标签会变成可编辑状态 同时可以触发 input事件 输入内容变化时触发 focus事件 获取焦点时触发 blur事件 失去焦点时触发 2 示
  • WebVirtMgr新建KVM虚拟机

    WebVirtMgr新建KVM虚拟机 一 登录WebVirtMgr 二 KVM节点配置 1 链接qemu相关命令 2 删除宿主机容器的默认网络 三 创建网络 1 关闭NetworkManager 2 创建网桥 3 使用命令行创建网桥 4 创
  • 浮动的特性与清除

    浮动的特性与清除 浮动 float 可以改变元素标签默认的排列方式 最典型的是可以让多个块级元素一行内排列显示 在css中 任何元素都可以浮动 在布局的时候是非常有用的 浮动特性 浮动元素会脱离标准流 脱标 浮动元素会一行内显示并且元素顶部
  • jpg和png通道数上的区别

    JPEG jpg 和PNG png 是两种常见的图像格式 它们在通道数上有一些区别 1 JPEG图像的通道数 JPEG图像通常用于存储彩色图像 具有3个通道 红色 绿色和蓝色 表示RGB颜色模式 每个通道存储相应颜色的强度值 以生成彩色图像
  • C# WinForm 设置DataGridView选中指定行

    int rowIndex 3 指定行号 this dgvInGoodsInfo Rows rowIndex Selected true this dgvInGoodsInfo CurrentCell this dgvInGoodsInfo
  • 阿里云OSS 图片处理api(custom)

    首先放个阿里云OSS图片处理接口文档 阿里云官方地址 OSS 图片处理接口文档 我们有时会抱怨用户上传的图文中图片文件大了 假如说3M的图片 导致生成的网页打开速度慢 怎么办呢 问题分析 网页打开慢是因为网页资源下载的那张图片下载慢 只要能
  • LoadRunner中的WebTours单独配置,及页面空白展示解决方案

    1 从loadrunner12安装包中提取文件 提取strawberry perl文件整个文件夹 webtours文件整个文件 或者去官网下载 我觉得下载太慢就到安装包中直接提取 2 拷贝strawberry perl webtours到一
  • golang中关于channel中的for range遍历操作

    note channel中若要使用for range进行遍历操作 channel必须首先要进行关闭操作的 例一 func main wg Add 2 write make chan int 5 read make chan int 5 go
  • canvas 动态背景粒子特效 直接拿走

  • 五子棋c++代码_C++大作业赏析

    清小C C 大作业赏析 如何完成一篇优秀的C 大作业 苦恼C 大作业的同学快点进来看看 小声 五子棋设计 五子棋是大家最为熟悉双人对弈的棋类游戏之一 只要任意行 列 斜线连成五子即可获胜 上个学期中 陈昊柯同学的大作业实现了五子棋 不但能够