C++、easyx组合的界面版五子棋(适合新手) |
您所在的位置:网站首页 › 怎样画一个游戏图 › C++、easyx组合的界面版五子棋(适合新手) |
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里面了,大家点击下载即可。 `` |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |