C++、easyx组合的界面版五子棋(适合新手)

您所在的位置:网站首页 怎样画一个游戏图 C++、easyx组合的界面版五子棋(适合新手)

C++、easyx组合的界面版五子棋(适合新手)

2024-07-05 15:43:34| 来源: 网络整理| 查看: 265

C++、easyx组合的五子棋界面版(适合新手)

点击进入五子棋控制台版本

文章目录 C++、easyx组合的五子棋界面版(适合新手)前言效果图一、游戏规则二、实现逻辑1.绘制棋盘2.落子2.1 鼠标坐标的获取2.2 绘制棋子 三、输赢判定算法四、其他小细节1.音效2.悔棋 源代码以及素材

前言

贴主大概什么水平呢?目前大二,C++学完了STL(会用函数)、数据结构、C++ primer看了一半。大概就这样的水平2333。相信大部分人跟我一样,对于C++很迷茫,我们不像Java,调个自带GUI就可以实现界面了,我们需要调用第三方库。C++图形库有很多,这里以easyx为例,讲解一下如何实现五子棋界面版。

效果图

在这里插入图片描述

一、游戏规则

哈哈哈哈很简单呀,五个字相连,就可以判定谁赢谁输了√ 1.黑棋先 2.五子相连,游戏结束。 3.相较于控制台版本 新增了悔棋功能。

二、实现逻辑

接下来就跟着我的思路一起来学习一下如何写这样一个程序叭!

1.绘制棋盘

控制台版本我们是严格计算过之后,通过cout竖线和横线来完成棋盘绘制的。 那么在图形版本里面,我们easyx提供了相应的绘图函数。 通过翻阅easyx官网的帮助文档:绘图方法 我们可以用一下代码实现:

void draw_chessboard() { setlinecolor(BLACK); for (int i = 0; i // 初始化图形窗口 initgraph(640, 480); MOUSEMSG m; // 定义鼠标消息 while(true) { // 获取一条鼠标消息 m = GetMouseMsg(); switch(m.uMsg) { case WM_MOUSEMOVE: // 鼠标移动的时候画红色的小点 putpixel(m.x, m.y, RED); break; case WM_LBUTTONDOWN: // 如果点左键的同时按下了 Ctrl 键 if (m.mkCtrl) // 画一个大方块 rectangle(m.x-10, m.y-10, m.x+10, m.y+10); else // 画一个小方块 rectangle(m.x-5, m.y-5, m.x+5, m.y+5); break; case WM_RBUTTONUP: return 0; // 按鼠标右键退出程序 } } // 关闭图形窗口 closegraph(); }

我们清晰的知道:m.x和m.y就是鼠标当前位置的横纵坐标 switch负责判断鼠标当前状态,是按下,还是按下弹起等等。 知道原理后,我们就可以这样写:

MOUSEMSG m; // 鼠标类 从easyx.h里面调用 m = GetMouseMsg(); switch (m.uMsg) { case WM_LBUTTONDOWN: cout chess_pos[y_sim][x_sim] = 'b'; fillcircle(x_sim * unit, y_sim * unit, chess_r); step++; } break; }

这里就有人有疑问了:我明明已经从鼠标类里面获取到横纵坐标的位置了,为什么还要搞个x_sim呢? 首先,我们落子,是不是必须要落到棋盘的十字点上?对吧,我们不能哪里都下棋,那不就乱套了。 所以这里通过小公式,计算出了当前坐标下,最近一个十字点的位置,并且提供了一个误差范围。 计算好落点后,我们还得判断一下。 1.当前点有没有下过棋子?也就是当前点对应的数组内是不是“ ”(空格)? 2.当前点是否在棋盘内 满足这两个条件后,我们就可以落子了。 将数组内的值替换成对应棋子的颜色“b”“w,然后绘制棋子。 这里依旧是easyx的绘制方法,详见文档。

三、输赢判定算法

到这里,基本上一个图形界面就成型了。 我们接下来要考虑游戏规则了。 如何判定胜利? 网上有很多好方法,甚至还有KMP的。 这里我用一个炒鸡炒鸡通俗易懂的方法来写如何判定输赢。 首先:赢的条件是,当前落点,其横纵坐标,以及两个斜方向上有包含它并且与它连续相同的五个棋子。 上代码:

int Judge(int x, int y) // 五连子判断 { //横向 cnt = 0; for (int i = 0; i for (int j = 1; j if (chess_pos[i][y] == chess_pos[x][y]) { for (int j = 1; j next_x++; next_y--; cnt++; } next_x = x - 1; next_y = y + 1; while (next_x > -1 && next_y next_x--; next_y--; cnt++; } next_x = x + 1; next_y = y + 1; while (next_x PlaySound(TEXT("chess.wav"), NULL, SND_FILENAME | SND_ASYNC); }

如何使用详见其他博主的playsound详解。

2.悔棋

悔棋思路: 将上一步坐标对应的数组重新置为“ ”。 调用easyx的clearcircle()函数清除当前绘制的棋子。 代码:

if (_kbhit()) { // 当键盘按下R键 执行悔棋 char input = _getch(); if (input == 'r') { step--; regret(x_sim,y_sim); } } void regret(int x_sim,int y_sim) // 悔棋函数 { chess_pos[y_sim][x_sim] = ' '; // 如果悔棋 先将棋子坐标重置 clearcircle(x_sim * unit, y_sim * unit, chess_r); //再清除原来绘制的圆 }

值得一提的是,由于easyx的问题,清除绘图后,会出现这个情况: 在这里插入图片描述 大家可能会是其他颜色。 这是由于清除的时候直接把背景图案也给清除了,这个暂时想不到什么解决办法,有好方法的评论区可以留言。

源代码以及素材

代码和素材我放Github里面了,大家点击下载即可。

``



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭