QT实现的人机对战五子棋

QT实现的人机对战五子棋

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

部分代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include
#include
#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;i0&&clickPosRow0&&clickPosColmygameMap[clickPosRow][clickPosCol]==0)
    {
        if(game->playerFlag)
            brush.setColor(Qt::black);
        else
            brush.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;imygameMap[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&&clickPosRow0&&clickPosColmygameMap[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&&
            xMARGIN+BLOCK_SIZE/2&&
            ymygameMap[clickPosRow][clickPosCol]==0){//选中的地方要有棋子
                selectPos=true;
            }
        }
        len=sqrt((x-leftTopPosX-BLOCK_SIZE)*(x-leftTopPosX-BLOCK_SIZE)+(y-leftTopPosY)*(y-leftTopPosY));
        if(lenmygameMap[clickPosRow][clickPosCol]==0){//选中的地方要有棋子
                selectPos=true;
            }
        }
        len=sqrt((x-leftTopPosX)*(x-leftTopPosX)+(y-leftTopPosY-BLOCK_SIZE)*(y-leftTopPosY-BLOCK_SIZE));
        if(lenmygameMap[clickPosRow][clickPosCol]==0){//选中的地方要有棋子
                selectPos=true;
            }
        }
        len=sqrt((x-leftTopPosX-BLOCK_SIZE)*(x-leftTopPosX-BLOCK_SIZE)+(y-leftTopPosY-BLOCK_SIZE)*(y-leftTopPosY-BLOCK_SIZE));
        if(lenmygameMap[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,c++,人工智能)