学习QT的过程中,为了加深自己的一些基础操作,也为了想装x,就自己写了一个五子棋小游戏,目前界面没写完整,游戏主题部分可以玩。
五子棋游戏主要的操作有三个。
第一:

void MainWindow::paintEvent(QPaintEvent *)  //使用绘图事件时需要添加时间函数在h文件下面
{QPainter p(this);//创建Qpainter类型并指定绘图背景QPen pen; //创建画笔,用于设置绘图的线的粗细颜色和一些风格QBrush brush;pen.setWidth(4);  //制定宽度p.setPen(pen); //告诉p用画笔来画图p.drawPixmap(0,0,this->width(),this->height(),QPixmap(":/new/prefix1/5c8a2a67967b8.jpg")); //设置窗口背景]grand_x=width()/25;     //记录横向每一格子的宽度,,分25格子grand_y=height()/15;   //记录纵向每一格子宽度start_x=grand_x;       //记录期盼绘制横向起始坐标start_y=grand_y;       //记录期盼纵向起始坐标for(int i=0;i<= 23;i++)   //循环绘制竖线{p.drawLine(start_x+i*grand_x,start_y,start_x+i*grand_x,13*start_y+grand_y);  //起始坐标加上每一次循环后格子de宽度}for(int i=0;i<=13;i++)   //横线{p.drawLine(start_x,start_y+i*grand_y,23*grand_x+start_x,start_y+i*grand_y);}brush.setStyle(Qt::SolidPattern);if(chess_x>=0&&click_x<24&&chess_y>=0&&chess_y<14)           //绘制下子标记点{brush.setColor(Qt::white);p.setBrush(brush);p.drawEllipse((start_x+grand_x*chess_x)-7,(start_y+grand_y*chess_y)-7, 14, 14);}/*绘制棋子 */for(int i=0;i<=23;i++)for(int j=0;j<=13;j++){if((game->gameMapVec[i][j]==1))   //绘制棋子{p.setPen(QColor(Qt::black));     //画黑点p.setBrush(QBrush(Qt::black));point_x=(start_x+grand_x*i)-15;point_y=(start_y+grand_y*j)-15;p.drawEllipse(point_x,point_y,33,33);// p.end();/*第一个参数是x坐标,第二个是圆的y坐标注意:这里的xy不是指圆心坐标,而是指圆点起点坐标,从屏幕左上角(0.0)算起第三个参数是圆点宽度第四个是高度可以根据三四各参数来绘制椭圆或者圆*/
}if((game->gameMapVec[i][j]==-1))   //绘制棋子{p.setPen(QColor(Qt::white));     //画白点p.setBrush(QBrush(Qt::white));point_x=(start_x+grand_x*i)-15;point_y=(start_y+grand_y*j)-15;p.drawEllipse(point_x,point_y,33,33);}}}

上述函数实现的功能就是绘制棋盘,棋子,和下棋标记。

当鼠标移动时,坐标会跟着移动,判断鼠标当前坐标,动态绘制除下棋标记,当鼠标出发按压事件后,在此处绘制一个棋子。
第二:

void MainWindow::mouseMoveEvent(QMouseEvent *event)    //鼠标按压事件
{int x=event->x();   //定义变量来获取鼠标每次按下后的坐标值int y=event->y();if(x>=start_x/2&&x<=start_x+23.5*grand_x&&y>=start_y/2&&y<=start_y*13.5+grand_y)  //保证棋子落在棋盘内部,在外部的无效{chess_x=(x-start_x/2)/(grand_x);   //保证鼠标点击区域的坐标是十字线,(未优化)chess_y=(y-start_y/2)/(grand_y);//qDebug() << chess_x<< chess_y;update();//更新整个界面,(为显示新的棋子的图像)}else{chess_x=-1;    //棋盘的坐标,为了防止出错,初始化-1chess_y=-1;}}

上述代码实现了如下功能:
1,捕获鼠标移动时的坐标,并判断是否在棋盘内。
2,若果在棋盘内,就同过处理,让鼠标在某一个棋盘十字附近的时候,让坐标直接等于棋盘的格子相应的坐标。比如左上角第一个就是(0,0),这样,棋盘在我们眼里相当于一个二维数组。具体处理过程,程序里面有注释。
第三:

int gamemode::Jude_win()
{int situ_1[5][5]=   {{1,1,1,1,1},           {0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};int situ_2[5][5]= {{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0}};int situ_3[5][5]=  {{1,0,0,0,0},{0,1,0,0,0},{0,0,1,0,0},{0,0,0,1,0},{0,0,0,0,1}};int situ_4[5][5]= {{0,0,0,0,1},{0,0,0,1,0},{0,0,1,0,0},{0,1,0,0,0},{1,0,0,0,0}};int situ_5[5][5]=  {{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,1}};int situ_6[5][5]=  {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{1,1,1,1,1}};for(int i=0;i<=19;i++)for(int j=0;j<=9;j++){int cnt=0;for(int x=0;x<=4;x++)for(int y=0;y<=4;y++){cnt=cnt+situ_1[x][y]*gameMapVec[i+x][j+y];   //if(cnt==5){return 1;}if(cnt==-5){return -1;}}cnt=0;for(int x=0;x<=4;x++)for(int y=0;y<=4;y++){cnt=cnt+situ_2[x][y]*gameMapVec[i+x][j+y];if(cnt==5){return 1;}if(cnt==-5){return -1;}}cnt=0;for(int x=0;x<=4;x++)for(int y=0;y<=4;y++){cnt=cnt+situ_3[x][y]*gameMapVec[i+x][j+y];if(cnt==5){return 1;}if(cnt==-5){return -1;}}cnt=0;for(int x=0;x<=4;x++)for(int y=0;y<=4;y++){cnt=cnt+situ_4[x][y]*gameMapVec[i+x][j+y];if(cnt==5){return 1;}if(cnt==-5){return -1;}}cnt=0;for(int x=0;x<=4;x++)for(int y=0;y<=4;y++){cnt=cnt+situ_5[x][y]*gameMapVec[i+x][j+y];if(cnt==5){return 1;}if(cnt==-5){return -1;}}cnt=0;for(int x=0;x<=4;x++)for(int y=0;y<=4;y++){cnt=cnt+situ_6[x][y]*gameMapVec[i+x][j+y];if(cnt==5){return 1;}if(cnt==-5){return -1;}}cnt=0;}return 0;}

上述代码是用来判断输赢的。学过图像处理的都知道卷积操作。五子连珠就是相当于用一个5x5的模板去扫描整个棋盘。
在这之前,我用和一个二维数组保存下棋的情况。初始化数组为0.(没有棋子),当触发鼠标按压事件的的时候,如果黑色,标记为1,白色为-1.那么用上述六中情况可以包括所有五子连一起的情况。
ps:刚开始用了四中情况。米子一样的四个模板。但是这样,边界就扫描不到。

人机对战还没有加进去。
如果有大佬愿意一起开发,可以给它加一个开始页面,加人机挑战,甚至可以写如tcp协议,局域网玩。
源码上传至csnd,注释很详细,欢迎下载相互学习。

QT实现五子棋小游戏相关推荐

  1. C3—Qt实现五子棋小游戏(二)2021.11.08

    Qt实现五子棋小游戏(二) qt实现五子棋(一) 步骤: 第二大步是创建主界面将绘制界面和界面元素的初始化分开逻辑更为清晰.所谓界面是指frame.背景.标题.界面大小等内容:界面元素是指例如为com ...

  2. qt实现的五子棋小游戏(Qpainter)

    这个其实很简单,首先绘制棋盘.然后绘制棋子的位置. 绘制棋盘 绘制棋盘就是一个15条横线和15条竖线组成的棋盘. QPainter painter(this);painter.setRenderHin ...

  3. QT5-星际穿越主题五子棋小游戏

    最近在探索QT,刚好以前会点CSS,自制了一个星际穿越主题五子棋小游戏,Windows环境的,作为初学阶段的小总结. 游戏背景音乐:Cornfield Chase (听了汉斯寂寞的曲子,才看的电影,现 ...

  4. Python五子棋小游戏源代码,支持人机对战和局域网对战两模式

    Python五子棋小游戏源代码,支持人机对战和局域网对战两模式,程序运行截图: 核心程序代码 WuZi.py ''' Function:五子棋小游戏-支持人机和局域网对战 Author:Charles ...

  5. Java编写的五子棋小游戏

    看书的时候看到一个不完整的Java编写的一个五子棋小游戏,为了恢复一下编程能力刚刚把这个小程序完成了. 实现的功能很简单,两人对下五子棋,程序自动回判断输赢.在ubuntu下搞得,没有装什么高端的输入 ...

  6. 简单的5*5,五子棋小游戏

    使用C语言简单的实现棋盘为5*5的五子棋小游戏,以下为源代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

  7. php 设计五子棋游戏,基于js+canvas实现五子棋小游戏

    本文实例为大家分享了js+canvas实现五子棋小游戏的具体代码,供大家参考,具体内容如下 效果展示: 源码展示: 五子棋 * { margin: 0; padding: 0; } body { ma ...

  8. 基于 Blazor 开发五子棋小游戏

    今天是农历五月初五,端午节.在此,祝大家端午安康! 端午节是中华民族古老的传统节日之一.端午也称端五,端阳.此外,端午节还有许多别称,如:午日节.重五节.五月节.浴兰节.女儿节.天中节.地腊.诗人节. ...

  9. java 五子棋项目_Java项目如何实现五子棋小游戏

    Java项目如何实现五子棋小游戏 发布时间:2020-07-21 14:53:06 来源:亿速云 阅读:77 作者:小猪 小编这次要给大家分享的是Java项目如何实现五子棋小游戏,文章内容丰富,感兴趣 ...

最新文章

  1. C++ 判断字符串是否为空
  2. 关于spring aop Advisor排序问题
  3. java与与短路与_Java中短路运算符与逻辑运算符示例详解
  4. 企业推广渠道——百度知道
  5. 交换函数swap的三种实现方法
  6. [ATF]-ATF makefile的导读
  7. spring和mybatis整合:使用xml方式
  8. ROS2学习(十一).ROS概念 - 命令行工具的使用
  9. 深度访谈Amazon员工与HR:华裔因pip跳楼背后(图)
  10. 用python偷偷给班级群女同学的颜值进行排名,排最后的大姐说开学要打爆我
  11. Python函数进阶
  12. 做开发很久了 Remoting 一直没有碰过,正好最近的项目上面用,就拿出来给大家看看
  13. Windows 7 SP1相关资源下载
  14. 【学习笔记】特殊数论函数求和
  15. MATLAB矩阵行列
  16. Svchost.exe 程序占用CPU高
  17. Java实例项目之英尺转换
  18. 曾经我创办了个公司,然后被投资人踢出去了......
  19. 低功耗基础概念——ICG(Intergrated Clock Gating)
  20. 【Java案例】购书系统(超详细)

热门文章

  1. 【如何使用Excel实现包含关系】
  2. 经典算法——筛选法求素数(素数筛选)
  3. 如何在Python中将数字文件存储在数据库中
  4. ip地址转换数字函数 iton_字符串IP地址转换成IP数值函数
  5. 使用Altium Designer绘制一个STM32系统的电路原理图
  6. mac下修改文件的md5值
  7. 凯立德导航地图文件的作用分项说明(转帖留存)
  8. 【MySQL】MySQL复制原理与主备一致性同步工作原理解析(原理篇)(MySQL专栏启动)
  9. FlashBuilder(Eclipse)的颜色风格插件
  10. coreos 安装 mysql_技术|手把手教你在 CoreOS 上构建你的第一个应用