QT实现的人机对战五子棋

QT实现的人机对战五子棋,支持双人模式和AI模式。界面简洁,操作方便。

部分代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMouseEvent>
#include<QPainter>
#include<math.h>
#include<QMessageBox>
#include<QTimer>
#include<QPushButton>
#include"settingdialog.h"MainWindow::MainWindow(QWidget *parent)//窗口一创建就调用的构造: QMainWindow(parent), ui(new Ui::MainWindow)
{//设置窗口大小setFixedSize(MARGIN*2+BLOCK_SIZE*BOARD_GRAD_SIZE,MARGIN*2+BLOCK_SIZE*BOARD_GRAD_SIZE);//宽和高,左右边界+棋子大小*尺寸/*   QAction *actionPVE = new QAction("Person VS Computer", this);connect(actionPVE, SIGNAL(triggered()), this, SLOT(initPVEGame()));gameMenu->addAction(actionPVE);*/setMouseTracking(true);initGame();//开始游戏
}
MainWindow::~MainWindow()
{delete ui;
}void MainWindow::paintEvent(QPaintEvent *event)//实现绘制方法
{QPainter painter(this);//绘制棋盘painter.setRenderHint(QPainter::Antialiasing,true);//抗锯齿for(int i=0;i<BOARD_GRAD_SIZE+1;i++)//15行有16条线,所以+1{//从左到右,第i+1条竖线painter.drawLine(MARGIN+BLOCK_SIZE*i,MARGIN,MARGIN+BLOCK_SIZE*i,size().height()-MARGIN);//起始坐标和终点坐标x1,y1 x2,y2!//从上到下,第i+1条横线painter.drawLine(MARGIN,MARGIN+BLOCK_SIZE*i,size().width()-MARGIN,MARGIN+BLOCK_SIZE*i);}//绘制选中点QBrush brush;brush.setStyle(Qt::SolidPattern);//不透明//绘制落子标记(防止鼠标出框越界)if(clickPosRow>0&&clickPosRow<BOARD_GRAD_SIZE&&clickPosCol>0&&clickPosCol<BOARD_GRAD_SIZE&&game->mygameMap[clickPosRow][clickPosCol]==0){if(game->playerFlag)brush.setColor(Qt::black);elsebrush.setColor(Qt::white);painter.setBrush(brush);painter.drawRect(MARGIN+BLOCK_SIZE*clickPosCol-MARK_SIZE/2,MARGIN+BLOCK_SIZE*clickPosRow-MARK_SIZE/2,MARK_SIZE,MARK_SIZE);}//绘制棋子for(int i=0;i<BOARD_GRAD_SIZE;i++){for(int j=0;j<BOARD_GRAD_SIZE;j++){if(game->mygameMap[i][j]==1){brush.setColor(Qt::black);painter.setBrush(brush);painter.drawEllipse(MARGIN+BLOCK_SIZE*j-CHESS_R,MARGIN+BLOCK_SIZE*i-CHESS_R,CHESS_R*2,CHESS_R*2);}else if(game->mygameMap[i][j]==-1){brush.setColor(Qt::white);painter.setBrush(brush);painter.drawEllipse(MARGIN+BLOCK_SIZE*j-CHESS_R,MARGIN+BLOCK_SIZE*i-CHESS_R,CHESS_R*2,CHESS_R*2);}}}//判断输赢if(clickPosRow>0&&clickPosRow<BOARD_GRAD_SIZE&&clickPosCol>0&&clickPosCol<BOARD_GRAD_SIZE&&(game->mygameMap[clickPosRow][clickPosCol]==1||game->mygameMap[clickPosRow][clickPosCol]==-1)){if(game->isWin(clickPosRow,clickPosCol)&&game->gameStatus==PLAYING){game->gameStatus=WIN;QString str;if(game->mygameMap[clickPosRow][clickPosCol]==1)str="黑棋";else if(game->mygameMap[clickPosRow][clickPosCol]==-1)str="白棋";QMessageBox::StandardButton bthValue =QMessageBox::information(this,"五子棋对战",str+"胜利!!");//重置游戏状态,否则容易死循环if(bthValue==QMessageBox::Ok){game->startGame(game_type);game->gameStatus=PLAYING;//重置游戏}}}
}void MainWindow::initGame()
{//初始化游戏模型game = new GameModel;SettingDialog dlg;if(dlg.Accepted)if(dlg.exec() == QDialog::Accepted){if(dlg.model == 0){initPersonGame();}else{initAIGame();}}else{initPersonGame();}
}void MainWindow::initPersonGame()
{game_type=MAN;//人人模式game->gameStatus=PLAYING;//正在玩game->startGame(game_type);//启动游戏,在数据模型里初始化update();
}
void MainWindow::initAIGame()
{game_type=AI;//ai模式game->gameStatus=PLAYING;//正在玩game->startGame(game_type);//启动游戏,在数据模型里初始化update();
}void MainWindow::mouseMoveEvent(QMouseEvent *event)
{//通过鼠标的盘旋确定落子的标记int x=event->x();int y=event->y();//棋盘边缘不能落子if(x>=MARGIN+BLOCK_SIZE/2&&x<size().width()-MARGIN-BLOCK_SIZE/2&&y>MARGIN+BLOCK_SIZE/2&&y<size().height()-MARGIN-BLOCK_SIZE/2){//获取最近的左上角的点int col=(x-MARGIN)/BLOCK_SIZE;int row=(y-MARGIN)/BLOCK_SIZE;int leftTopPosX=MARGIN+BLOCK_SIZE*col;int leftTopPosY=MARGIN+BLOCK_SIZE*row;//根据鼠标到四个点的距离选择半径最短的clickPosRow=-1;clickPosCol=-1;//初始化int len=0;//计算后取整selectPos=false;//表示有没有选成功len=sqrt((x-leftTopPosX)*(x-leftTopPosX)+(y-leftTopPosY)*(y-leftTopPosY));//四种情况表示到四个点距离以判断哪个点需要响应if(len<POS_OFFSET){clickPosRow=row;clickPosCol=col;if(game->mygameMap[clickPosRow][clickPosCol]==0){//选中的地方要有棋子selectPos=true;}}len=sqrt((x-leftTopPosX-BLOCK_SIZE)*(x-leftTopPosX-BLOCK_SIZE)+(y-leftTopPosY)*(y-leftTopPosY));if(len<POS_OFFSET){clickPosRow=row;clickPosCol=col+1;if(game->mygameMap[clickPosRow][clickPosCol]==0){//选中的地方要有棋子selectPos=true;}}len=sqrt((x-leftTopPosX)*(x-leftTopPosX)+(y-leftTopPosY-BLOCK_SIZE)*(y-leftTopPosY-BLOCK_SIZE));if(len<POS_OFFSET){clickPosRow=row+1;clickPosCol=col;if(game->mygameMap[clickPosRow][clickPosCol]==0){//选中的地方要有棋子selectPos=true;}}len=sqrt((x-leftTopPosX-BLOCK_SIZE)*(x-leftTopPosX-BLOCK_SIZE)+(y-leftTopPosY-BLOCK_SIZE)*(y-leftTopPosY-BLOCK_SIZE));if(len<POS_OFFSET){clickPosRow=row+1;clickPosCol=col+1;if(game->mygameMap[clickPosRow][clickPosCol]==0){//选中的地方要有棋子selectPos=true;}}}//重绘update();
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{if(selectPos==false){return;//如果之前没选成功,就返回,即不会落子}else{selectPos=false;//如果选成功了,马上要落子,把落子标记再标记为假,相当于将他失效}PersonNow(); //人下棋if(game_type==AI){//人机模式QTimer::singleShot(AI_THINK_TIME,this,SLOT(AINow()));//thinktime之后调用,调用this窗体的AINow方法}}
void MainWindow::PersonNow()
{//根据当前存储的坐标下子//只有有效点击才下子,并且该处无字if(clickPosRow!=-1&&clickPosCol!=-1&&game->mygameMap[clickPosRow][clickPosCol]==0){//在数据模型里修改二维数组以达到落子目的game->TurnToPerson(clickPosRow,clickPosCol);update();}
}
void MainWindow::AINow()
{game->TurnToAI(clickPosRow,clickPosCol);update();
}

源码下载

链接:程序源码下载链接
提取码:1111

QT实现的人机对战五子棋相关推荐

  1. java swing人机对战五子棋(含背景音乐)

    一.项目简介 本项目是一套基于java swing的人机对战五子棋系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者. 包含:项目源码.数据库脚本等,该项目附带全部源码可 ...

  2. 介绍一款Android小游戏--交互式人机对战五子棋

    学习Android系统开发之余,编写了一个小游戏--交互式人机对战五子棋,自娱自乐.之所以称之为交互式人机对战五子棋,一是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看 ...

  3. Qt实现的局域网对战五子棋

    GoBang 使用Qt5.7.0完成的五子棋小软件,支持人人对战,人机对战,局域网联机对战 学习Qt后的一个练手项目,完成自己曾经在命令行下的五子棋的升华^_^ 人机对战使用基于评分表的策略来完成电脑 ...

  4. java五子棋人机对战_实现简单的人机对战五子棋(实践)

    五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1.   基本概念 像素,坐标 2.   组件自定义绘图原理 3.   Graphic ...

  5. Java-基于GUI编程的人机对战五子棋

    1.人员分工 组员 职务 负责模块 刘新臻 组长 AI算法设计.程序逻辑设计 陈钦毅 组员 游戏画面框架,监听器.工具类 文才学 组员 棋子设计类.菜单功能 2.前期调查 根据调研我们需要以下功能 功 ...

  6. 基于FPGA(basys3)的双人对战人机对战五子棋(vivado)课程设计项目

    目录 主界面显示与选择模式 双人对战 人机对战 胜利界面显示 部分源码 主界面显示与选择模式 VGA显示器显示图片,显示图片利用Block Memory Generator将图片像素点储存在RAM里面 ...

  7. C++新手项目实践 — 智能人机对战五子棋

    C-project-practice-intelligent-man-machine-gobang-fight C++新手项目实践 - 智能人机五子棋对战(利用Easyx的基础函数) 项目演示视频 智 ...

  8. slider节点透明背景_【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)...

    一.涉及知识点 场景切换 按钮事件监听 节点事件监听 节点数组 循环中闭包的应用 动态更换sprite图片 定时器 预制资源 二.步骤 2.1 准备工作 首先,我们要新建一个空白工程,并在资源管理器中 ...

  9. 【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)

    整体思路 在15*15的棋盘上每一个可下棋子的地方都放置一个"隐形的棋子",当要在某个位置下子时就将该位置的棋子显示出来,在判断输赢逻辑里,我们根据这225个"隐形棋子& ...

  10. 完全基于C++ 实现的人机对战五子棋小游戏

    1. 项目目标 掌握C++的核心技术 掌握C++开发项目的方法和流程 掌握AI算法的基础应用 2. 效果演示 3. 创建项目 使用VS2019+easyx图形库开发,也可以使用VS的其他版本. 使用V ...

最新文章

  1. vue-video-player有画面没声音_电视盒子没声音?问题都在这了!
  2. A Multi-task Deep Network for Person Re-identification
  3. helm离线安装helm-push插件
  4. MySQL主从复制虽好,能完美解决数据库单点问题吗?
  5. Shiro 权限标签
  6. 广州的11个辖区_重庆前三季度GDP反超广州,这对两城到底意味着什么?
  7. 音乐的聆听 古典音乐的入门
  8. Mininet的内部实现原理简介
  9. Spark streaming消费Kafka的正确姿势
  10. steam新授权软件_「西米软件推荐」桌面乱七八糟的人,请认真看完
  11. laravel 阿里云短信验证码
  12. java 调用关机命令_java调用关机命令
  13. 互联网+机器人”碰撞出啥样火花? 华数机器人以大数据云平台为智能制造连接“大脑”...
  14. DX12之手撸GPU Driven Pipeline
  15. css div img等元素居中对齐
  16. 使用excel校验身份证号码是否正确
  17. 麻省理工学院公开课:计算机科学及编程导论习题3下
  18. 1和new Number(1)的区别
  19. 信息学奥赛一本通 1296:开餐馆 | OpenJudge NOI 2.6 6045:开餐馆
  20. 三菱FX3U源码在V10.5的基础上增加了禁止上传功能

热门文章

  1. linux下列目录清单用命令,Linux入门必看的Is命令实用范例!
  2. 双交换消元:模合数多项式矩阵行列式、新伴随矩阵算法
  3. tm4c123g c语言,Tm4c123GX(tiva)入门详细教程
  4. excel概率密度函数公式_excel统计函数公式汇总
  5. 什么是SOCKS5协议
  6. 速达3000pro saas数据库修复
  7. 2019-9-2-贡献自己的服务器搭建tor中转
  8. java实现网络下载进度_Retrofit+Rxjava下载文件进度的实现
  9. Android 混淆
  10. 免费的18个开源快速建站Java CMS