宁波网站建设流程有哪些wordpress做相册
宁波网站建设流程有哪些,wordpress做相册,花桥做网站,国外手机模板网站推荐目录 思路
框架编辑
读取操作
数据操作
绘制画面
游戏的数据结构
用二维数组来模拟棋盘格 赢的情况 平局情况 Code
代码细节部分 #xff08;1#xff09;初始化棋盘格 #xff08;2#xff09; 初始化棋子类型编辑 事件处理部分 落子 框架内代码的完善 数据处…目录 思路
框架编辑
读取操作
数据操作
绘制画面
游戏的数据结构
用二维数组来模拟棋盘格 赢的情况 平局情况 Code
代码细节部分 1初始化棋盘格 2 初始化棋子类型编辑 事件处理部分 落子 框架内代码的完善 数据处理框架代码的完善
检查是否赢了 函数 绘制图形框架代码的完善
绘制棋盘网格函数
绘制棋子 函数
绘制提示信息 函数 DBUG
优化
代码托管
三子棋/Test.cpp · 孙鹏宇/孙鹏宇的第一个仓库 - 码云 - 开源中国 (gitee.com) 思路
我们遵循先框架后思路得的思路
框架 首先是读取操作:
读取操作
读取鼠标单击之后的信息 接下来是数据操作:
数据操作
我们只需要对游戏胜负进行判断
胜的清空:一条线三颗棋子都一样
平的情况:棋格全部填满还未分出胜负。
游戏结束时使用弹出告诉玩家游戏结果,然后退出主循环。 绘制画面
我们使用line函数绘制一个3*3的棋盘格: x玩家时使用line函数对角线画两个线轮到O玩家落子时时使用cirlce函数画个圆: 游戏的数据结构
用二维数组来模拟棋盘格
棋盘内容为字符串初始化为‘- 赢的情况
我们对赢得情况进行穷举:
一共有八种 平局情况
如果9个网格均被棋子填满却没有获胜的一方那么就是平局
Code
写代码同样遵循先框架再细节的原则:
我们先把上面的内容转化为代码 框架:
#includeeasyx.h
#includeiostream
using namespace std;//处理数据// //检测玩家是否赢了
bool Checkwin(char str)
{}
//检测是否平局
bool Checkavg(char str)
{}//绘制图像
//
//绘制棋盘格
void DrawBorad()
{}
//绘制棋子
void DrawPiece()
{}
//绘制提示信息
void DrawTipText()
{}
int main()
{initgraph(60,600);//绘制窗口bool flag true;//退出主循环的标识列ExMessage msg;//存储消息BeginBatchDraw();//渲染缓冲区//主循环while (flag){//读取操作while(peekmessage(msg))//读取消息{//读取到的细节如何处理稍息再说}cleardevice();//清屏//重新绘图DrawBorad();DrawPiece();DrawTipText();FlushBatchDraw();//刷新缓冲区}EndBatchDraw();//刷新缓冲区return 0;
}
代码细节部分
如果 x玩家赢了我们可以用MessageBox()函数弹出了一个框显示x玩家赢了: 代码如下: 同样的O玩家获胜的情况和平局的情况也写一下: 设置两个全局
1初始化棋盘格
2 初始化棋子类型 事件处理部分
用msg来表示鼠标的位置: 怎么把鼠标的位置映射到数组下标呢我们绘制的棋盘格的大小为600x600分成三等份之后每个格子的大小为200x200 所以我们求横坐标可以有这样一个公式:代码为: 落子
1首先判断是否可以落子 (2) 落完子之后要切换下次落子的棋子类型 框架内代码的完善
把之前只写了框架没写实现的函数补全: 数据处理框架代码的完善
检查是否赢了 函数
按照我们之前列的八种赢的情况写
Checkavg()函数
用两个for循环来遍历棋盘格中每一个元素如果还有空格没有落子就返回false代表没有平局最后如果没有返回false说明平局了返回true: 绘制图形框架代码的完善
绘制棋盘网格函数
棋盘格的网格其实就是四条线:
我们可以通过图形绘制相关函数-line函数来绘制: 首先棋盘格总大小是600x600每个小格子是200x200: 绘制棋子 函数
1绘制棋子首先用二维数组遍历一下棋盘如果要落的棋子是O那就在棋格中间画圆。
2棋盘中心的求法一个小格子长宽200x200中心坐标为左上角坐标100
3画圆的方法 4当棋子为x时就按小格子对角线画两条线 5对角线点求法:如下图6画对角线的方法:
7如果不是O或者那就什么都不用做。
8代码: 绘制提示信息 函数
适用settextcolor函数将提示文本设高亮: outtextxy()函数用来在窗口指定位置输出提示信息 code: DBUG
这样三子棋基本功能就做好了但是有bug
1闪退
2闪退过程中可以看见我们画的棋盘发现棋盘网格线条错位
原因
1绘制棋盘时手误 2闪退的原因是我们在判断是否平局用的else没设条件此刻没输值就直接平局了只要不是O‘x’就直接平局了这显示不是我们要的我们想要的是棋盘满了还没赢才平局因此我们应该引用checkagv函数。 修改 修改完之后运行
发现有两个错误
1鼠标左键不用点击就可以落子
2落子位置和我们鼠标落点位置不配置 鼠标左键不用点击就可以落子的原因
应该选择ExMessage的WM_LBUTTONDOWN表实列我选成第一个了: 落子位置不配置的原因:
1切换棋子类型应该包含在可以落子的前提下如果不能落子也就没必要切换棋子类型了:
修改之后
(2)
二维数组是按照横纵坐标系的 但是我们的窗口确是纵横坐标系: 错误 修改: 交互功能正常但是渲染功能有问题最后一颗棋子不会显示: 原因:
我们把重新绘图放在判断胜负的后面当玩家赢了的时候会执行flagfale此时会执行重新绘图。
当再次循环时flag因为false所以退出循环。也就是绘图只执行了一次一闪而过。 我们把绘图放到胜负判断之前,这样即便是不再进入循环也是最后一次落子的下一次绘图不会显示而最后一次落子的绘图会显示在当前窗口。 正常运行: 优化
当我们的程序跑起来之后查看任务管理器发现我们的程序消耗内存空间特别大;
这是因为计算机在执行while循环时特别快我们编写的主循环在顷刻间已经被执行了成千上万次。
因此为了不避免的销毁我们可以使用sleep函数使循环休眠几毫秒。
我们可以在主循环开头写一个开始数获取GetTickCount(),主循环结束位置写一个结尾数获取GetTickCount()函数。
通过计算 二者落差 可以得到 该主循环实际运行所需要的 毫秒数简称实需数。
如果我们想在60帧率下刷新那么就让1000/601616为我们的期望值。
如果 实需数 期望值,说明不用休眠。
否则实需数-期望值 休眠数。 代码托管 三子棋/Test.cpp · 孙鹏宇/孙鹏宇的第一个仓库 - 码云 - 开源中国 (gitee.com)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86706.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!