Qt实现六子棋游戏

Qt实现六子棋游戏

游戏规则

1.对峙双方谁的六个棋子先连在一条线即为胜者。
2.当有四个子连成一条直线时,就应采取防守,堵住四子的一端,否则就会输掉比赛。
3.应当避免在比赛内出现四四禁手、五五禁手等情况,否则就会不小心输掉比赛。

已实现的功能

1.Qt编程实现server程序六子棋游戏界面,20*20格子;

2.编程实现server本地端的鼠标点击依次放置黑白棋子,实现双人手动下棋;

3.编程实现自动判别下棋的合法性;

4.编程实现自动判别盘面输赢或者和棋;

5.编程实现实现本地人机下棋;

6.编程实现本地机机下棋;

开发平台

所使用的开发环境:Windows10 + Qt 5.9.2 + C++

项目地址

作者Github主页:https://github.com/13243129626

项目仓库:https://github.com/13243129626/QT-Connec6

项目运行状况

游戏初始界面
棋盘界面
人机对战界面

主要函数描述

函数名称函数功能
void MainWindow::paintEvent(QPaintEvent *);绘图函数:绘制棋盘、根据实时情况绘制黑棋子和白棋子、添加棋盘背景图片、实现部分按钮特效
void MainWindow::mouseReleaseEvent(QMouseEvent *event);鼠标点击函数:如果是双人模式,则每次点击棋盘时,该函数调用playByPerson()进行人下棋;如果是人机模式,每次点击时,该函数被调用,根据情况调用playByPerson()人下棋playByAI()进行AI下棋;同时更新界面
void MainWindow::mouseMoveEvent(QMouseEvent *event);鼠标移动函数:鼠标移动到按钮处时,显示按钮;获取鼠标的当前坐标值,并计算距离最近的可落子的点;并更新界面;
void MainWindow::isEnd();判断游戏是否结束函数:分别调用函数bool Game::isWin(int clickX,int clickY)、bool Game::isHeQi()、bool Game::isJinShou(int x,int y)判断是否六子连珠、是否和棋、是否禁手,从而判断游戏是否结束,并做相应处理;
bool Game::isWin(int clickX,int clickY);判断输赢函数:判断是否因发生任意一方六子连珠导致游戏结束;
bool Game::isHeQi();判断和棋函数:判断是否棋子占满棋盘仍未结束游戏,即为和棋;
bool Game::isJinShou(int x,int y);判断禁手函数:判断先手一方的落子点是否是禁手点;若是,则结束游戏,先手方败;
void Game::getScore();计分函数:分别对黑棋子方、白棋子方的落子情况进行计分,最后取最大计分值,并存入计分数组score

总体思路

1. 设计绘图函数paintEvent(QPaintEvent * ),绘制出20 * 20棋盘,并添加背景图片,使用UI界面添加三个按钮,分别作为人人对战、人机对战、机机对战的开始按钮;

2. 设计鼠标移动处理函数:mouseMoveEvent(QMouseEvent * event),记录下鼠标位置;设计鼠标点击处理函数mouseReleaseEvent(QMouseEvent * event),根据情况将该点击位置存储到预先设定的棋盘二维数组board中,再通过步骤 1 的绘图函数绘制出相应棋盘布局情况;

3. 设计判断游戏是否结束的函数isEnd(),该函数通过调用isWin()、isHeQi()、isJinShou()三个函数分别判断是否六子连珠、是否和棋、是否黑子方禁手,从而判断游戏是否结束,并做出相应处理;至此,双人模式即算完成;

4. 设计人机模式,首先构造AI思考函数,通过getScore()函数获得AI的最大分值位置,计入棋盘积分数组,考虑每次人点击棋盘下棋后,AI经过一定延迟时间,在最大计分位置落子;即可构思人机模式;

5. 考虑机机模式,通过设计定时器,启动游戏后,定时器启动,每隔一定间隔时间,AI双方轮流调用AI思考函数,找到各自的权值最大的位置落子,从而实现AI对决的模式。

计分函数void Game::getScore()权值设定

类型分值
活五+=60 0000
死五+=50 0000
活四+=40 0000
死四+=25 0000
活三+=30 0000
死三+=15 0000
活二+=20 0000
死二+=10 0000
单棋+=2000
其他+=1000

优先级顺序:活五>>死五>>活四>>活三>>死四>>活二>>死三>>死二>>其他

该函数为AI思考的主要函数,判断落子点时,该函数需要计算我方和对方的棋盘权值最大值,再找到两者最大权值的位置,作为落子点。

主要函数流程图

一、人和AI落子函数
在这里插入图片描述

二、 判断游戏是否结束函数
在这里插入图片描述

三、 机机对战函数
在这里插入图片描述
部分实现代码:
game.cpp

#include "Game.h"
#include"mainwindow.h"
#include <utility>
#include <stdlib.h>
#include <time.h>
#include<QDebug>
#include<QApplication>
#include<iostream>
#include<vector>
#include<QTimer>

using namespace std;

const int chessboard_size=21;  //棋盘尺寸

Game::Game()
{
   black=1;
   white=-1;
   state=0;
}

void Game::startgame(char type)
{
    clear();
    player=true;
    if(type=='r'||type=='z')
    {
        clear2();
    }
}

void Game::clear()
{
    for(int i=0;i<chessboard_size;i++)
    {
        for(int j=0;j<chessboard_size;j++)
        {
            board[i][j]=0;  //数组初始化置0
        }
    }
}
void Game::updateMap(int x,int y)
{
    if(player)  //根据下棋方填充数组
    {
        board[x][y]=1;
    }
    else
    {
         board[x][y]=-1;
    }
    player=!player;


}
void Game::actionByPerson(int x, int y)
{
    updateMap(x,y); //重绘
}
void Game::actionByAI(int &clickX,int &clickY)
{
    getScore();  //计算分值
    //记录最大值的位置,若有多个点,记录最后一个搜索到的点
    int maxScore = 0;
    vector<pair<int, int>> maxPoints;   //使用vector容器放最大值所在位置

    for (int row = 0; row < chessboard_size; row++)
        for (int col = 0; col < chessboard_size; col++)
        {
            // 前提是这个坐标是空的
            if (board[row][col] == 0)
            {
                if (score[row][col] > maxScore)          // 找最大的数和坐标
                {
                    maxPoints.clear();       //发现新的最大值,清空容器内之前存储的所有元素
                    maxScore = score[row][col];
                    maxPoints.push_back(make_pair(row, col));  //放入最新的最大值坐标
                }
                else if (score[row][col] == maxScore)     // 如果有多个最大的数,都放到容器中
                    maxPoints.push_back(make_pair(row, col));
            }
        }

    // 随机落子,如果有多个点的话
    srand((unsigned)time(0));   //随机种子
    int index = rand() % maxPoints.size();  //随机下标,范围在容器容量内

    pair<int, int> pointPair = maxPoints.at(index);  //取出该位置元素
    clickX = pointPair.first;
    clickY = pointPair.second;    //赋值

    updateMap(clickX,clickY);  //更新棋盘数组
}

void Game::playEVE(int &clickx,int &clicky)  //ai对战ai
{
      getScore();  //计分

      actionByAI(clickx,clicky);  //落子

}

bool Game::isWin(int clickX,int clickY)  //判断游戏输赢
{

    for (int i = 0; i < 6; i++)
    {
         if (clickY - i >= 0 &&
            clickY - i + 5 < chessboard_size &&
            board[clickX][clickY - i] == board[clickX][clickY - i + 1] &&
            board[clickX][clickY - i] == board[clickX][clickY - i + 2] &&
            board[clickX][clickY - i] == board[clickX][clickY - i + 3] &&
            board[clickX][clickY - i] == board[clickX][clickY - i + 4]&&
            board[clickX][clickY-i]==board[clickX][clickY-i+5])  //竖直方向
         {
           return true;
         }
         else if (clickX - i >= 0 &&
             clickX - i + 5 < chessboard_size &&
             board[clickX - i][clickY] == board[clickX - i + 1][clickY] &&
             board[clickX - i][clickY] == board[clickX - i + 2][clickY] &&
             board[clickX - i][clickY] == board[clickX - i + 3][clickY] &&
             board[clickX - i][clickY] == board[clickX - i + 4][clickY]&&
             board[clickX - i][clickY] == board[clickX - i + 5][clickY])  //水平方向
         {
             return true;
         }
         else if(clickX+i<chessboard_size&&clickX+i-5>=0&&clickY-i>=0&&clickY-i+5<chessboard_size&&
                 board[clickX+i][clickY-i]==board[clickX+i-1][clickY-i+1]&&
                 board[clickX+i][clickY-i]==board[clickX+i-2][clickY-i+2]&&
                 board[clickX+i][clickY-i]==board[clickX+i-3][clickY-i+3]&&
                 board[clickX+i][clickY-i]==board[clickX+i-4][clickY-i+4]&&
                 board[clickX+i][clickY-i]==board[clickX+i-5][clickY-i+5])  //斜向左下
         {
             return true;
         }
         else if (clickX - i >= 0 &&
                  clickX - i + 5 < chessboard_size &&
                  clickY - i >= 0 &&
                  clickY - i + 5 < chessboard_size &&
                  board[clickX - i][clickY - i] == board[clickX - i + 1][clickY - i + 1] &&
                  board[clickX - i][clickY - i] == board[clickX - i + 2][clickY - i + 2] &&
                  board[clickX - i][clickY - i] == board[clickX - i + 3][clickY - i + 3] &&
                  board[clickX - i][clickY - i] == board[clickX - i + 4][clickY - i + 4]&&
                  board[clickX - i][clickY - i] == board[clickX - i + 5][clickY - i + 5]) //斜向右下
              {
                  return true;
              }

    }
    return false;
}
bool Game::isHeQi()
{
    //棋盘全部占满棋子则和棋,有空位则不是和棋
    for(int i=0;i<chessboard_size;i++)
    {
        for(int j=0;j<chessboard_size;j++)
        {
            if(board[i][j]==0)
            {
                return false;
            }
        }
    }
    return true;
}

bool Game::isJinShou(int x,int y)  //发生四四禁手和五五禁手都属于禁手
{
    int num=0,k=0;
    k=0;
    //向上
    for(int i=0;i<6;i++)
    {
        if(y+i<chessboard_size)
        {
            if(board[x][y+i]==1)
            {
                k++;
            }
            else if(board[x][y+i]==-1)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    //qDebug()<<num;
    if(k>=4)
    {
        num++;
    }
    k=0;
    if(num>=2)
    {
        return true;
    }
    //向下
    for(int i=0;i<6;i++)
    {
        if(y-i>=0)
        {
            if(board[x][y-i]==1)
            {
                k++;
            }
            else if(board[x][y-i]==-1)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if(k>=4)
    {
        num++;
    }
    if(num>=2)
    {
        return true;
    }
    k=0;
    //向左
    for(int i=0;i<6;i++)
    {
        if(x-i>=0)
        {
            if(board[x-i][y]==1)
            {
                k++;
            }
            else if(board[x-i][y]==white)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if(k>=4)
    {
        num++;
    }
    if(num>=2)
    {
        return true;
    }
    k=0;
    //向右

    for(int i=0;i<6;i++)
    {
        if(x+i<chessboard_size)
        {
            if(board[x+i][y]==1)
            {
                k++;
            }
            else if(board[x+i][y]==-1)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if(k>=4)
    {
        num++;
    }
    if(num>=2)
    {
        return true;
    }
    k=0;
    //向左上
    for(int i=0;i<6;i++)
    {
        if(x-i>=0&&y-i>=0)
        {
            if(board[x-i][y-i]==1)
            {
                k++;
            }
            else if(board[x-i][y-i]==-1)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if(k>=4)
    {
        num++;
    }
    if(num>=2)
    {
        return true;
    }
    k=0;
    //向左下
    for(int i=0;i<6;i++)
    {
        if(x-i>=0&&y+i<chessboard_size)
        {
            if(board[x-i][y+i]==1)
            {
                k++;
            }
            else if(board[x-i][y+i]==-1)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if(k>=4)
    {
        num++;
    }
    if(num>=2)
    {
        return true;
    }
    k=0;
    //向右上
    for(int i=0;i<6;i++)
    {
        if(x+i<chessboard_size&&y-i>=0)
        {
            if(board[x+i][y-i]==1)
            {
                k++;
            }
            else if(board[x+i][y-i]==-1)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if(k>=4)
    {
        num++;
    }
    if(num>=2)
    {
        return true;
    }
    k=0;
    //向右下
    for(int i=0;i<6;i++)
    {
        if(x+i<chessboard_size&&y+i<chessboard_size)
        {
            if(board[x+i][y+i]==1)
            {
                k++;
            }
            else if(board[x+i][y+i]==-1)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if(k>=4)
    {
        num++;
    }
    if(num>=2)
    {
        return true;
    }
    return false;


}
//活五》死五》活四》活三》死四》活二》死三》死二》其他
//分别求各位置两种棋子的加权值,取最大值位置为最佳落子点
void Game::getScore()
{
    int value=0;
    int value2=0;
    int flag=-1;   //白子
    int flag2=1;    //黑子
    clear2();
    for(int clickx=0;clickx<chessboard_size;clickx++)
    {
        for(int clicky=0;clicky<chessboard_size;clicky++)
        {
            if(board[clickx][clicky]!=0) continue;
            value=0;
            value2=0;

            for(int i=-1;i<=1;i++)
            {
                for(int j=-1;j<=1;j++)
                {
                    if(clickx+6*i>=0&&clickx+6*i<chessboard_size&&clicky+6*j>=0&&clicky+6*j<chessboard_size&&clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==flag
                            &&board[clickx+i*4][clicky+j*4]==flag&&board[clickx+i*5][clicky+j*5]==flag&&board[clickx+i*6][clicky+j*6]==0) //活五
                    {
                        value+=600000;
                    }
                    else if(clickx+6*i>=0&&clickx+6*i<chessboard_size&&clicky+6*j>=0&&clicky+6*j<chessboard_size&&clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==flag
                            &&board[clickx+i*4][clicky+j*4]==flag&&board[clickx+i*5][clicky+j*5]&&board[clickx+i*6][clicky+j*6]==1)   //死五
                    {
                        value+=500000;
                    }
                    else if(clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==flag
                            &&board[clickx+i*4][clicky+j*4]==flag&&board[clickx+i*5][clicky+j*5]==0)  //活四
                    {
                        value+=400000;
                    }
                    else if(clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==flag
                            &&board[clickx+i*4][clicky+j*4]==flag&&board[clickx+i*5][clicky+j*5]==1)  //死四
                    {
                        value+=250000;
                    }
                    else if(clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==flag
                            &&board[clickx+i*4][clicky+j*4]==0)  //活三
                     {
                         value+=300000;
                     }
                    else if(clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==flag
                            &&board[clickx+i*4][clicky+j*4]==1)  //死三
                    {
                        value+=150000;
                    }
                    else if(clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==0)  //活二
                    {
                        value+=200000;
                    }
                    else if(clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag
                            &&board[clickx+i*2][clicky+j*2]==flag&&board[clickx+i*3][clicky+j*3]==1)  //死二
                    {
                        value+=100000;
                    }
                    else if(clickx+1*i>=0&&clickx+1*i<chessboard_size&&clicky+1*j>=0&&clicky+j*1<chessboard_size&&board[clickx+1*i][clicky+1*j]==flag)  //一个棋子
                    {
                        value+=2000;
                    }
                    else  //其他
                    {
                        value+=1000;
                    }
                }
            }

            for(int i=-1;i<=1;i++)
            {
                for(int j=-1;j<=1;j++)
                {
                    if(clickx+6*i>=0&&clickx+6*i<chessboard_size&&clicky+6*j>=0&&clicky+6*j<chessboard_size&&clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==flag2
                            &&board[clickx+i*4][clicky+j*4]==flag2&&board[clickx+i*5][clicky+j*5]==flag2&&board[clickx+i*6][clicky+j*6]==0) //活五
                    {
                        value2+=600000;
                    }
                    else if(clickx+6*i>=0&&clickx+6*i<chessboard_size&&clicky+6*j>=0&&clicky+6*j<chessboard_size&&clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==flag2
                            &&board[clickx+i*4][clicky+j*4]==flag2&&board[clickx+i*5][clicky+j*5]==flag2&&board[clickx+i*6][clicky+j*6]==-1)   //死五
                    {
                        value2+=500000;
                    }
                    else if(clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==flag2
                            &&board[clickx+i*4][clicky+j*4]==flag2&&board[clickx+i*5][clicky+j*5]==0)  //活四
                    {
                        value2+=400000;
                    }
                    else if(clickx+5*i>=0&&clicky+5*j>=0&&clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+5*i<chessboard_size&&clicky+5*j<chessboard_size&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==flag2
                            &&board[clickx+i*4][clicky+j*4]==flag2&&board[clickx+i*5][clicky+j*5]==-1)  //死四
                    {
                        value2+=250000;
                    }
                    else if(clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==flag2
                            &&board[clickx+i*4][clicky+j*4]==0)  //活三
                     {
                         value2+=300000;
                     }
                    else if(clickx+4*i>=0&&clicky+4*j>=0
                            &&clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+4*i<chessboard_size&&clicky+4*j<chessboard_size
                            &&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==flag2
                            &&board[clickx+i*4][clicky+j*4]==-1)  //死三
                    {
                        value2+=150000;
                    }
                    else if(clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==0)  //活二
                    {
                        value2+=200000;
                    }
                    else if(clickx+3*i>=0&&clicky+3*j>=0&&clickx+2*i>=0&&clicky+2*j>=0&&clickx+i>=0
                            &&clicky+j>=0&&clickx+3*i<chessboard_size&&clicky+3*j<chessboard_size&&clickx+2*i<chessboard_size&&clicky+2*j<chessboard_size&&clickx+i<chessboard_size
                            &&clicky<chessboard_size&&board[clickx+i*1][clicky+j*1]==flag2
                            &&board[clickx+i*2][clicky+j*2]==flag2&&board[clickx+i*3][clicky+j*3]==-1)  //死二
                    {
                        value2+=100000;
                    }
                    else if(clickx+1*i>=0&&clickx+1*i<chessboard_size&&clicky+1*j>=0&&clicky+j*1<chessboard_size&&board[clickx+1*i][clicky+1*j]==flag2)  //一个棋子
                    {
                        value2+=2000;
                    }
                    else        //其他
                    {
                        value2+=1000;
                    }
                }
            }

            score[clickx][clicky]=value>value2?value:value2;
        }
    }
}

void Game::clear2()
{
    for(int i=0;i<chessboard_size;i++)
    {
        for(int j=0;j<chessboard_size;j++)
        {
            score[i][j]=0;

        }
    }
}

mainpage.cpp

#include "mainpage.h"
#include<QPainter>
#include<QIcon>
#include<QPaintEvent>
#include<QSound>

#define BACK ":/new/prefix1/image/1.png"
#define BUTTON_PLAY ":/new/prefix1/sound/button.wav"   //按钮提示音

mainpage::mainpage(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("Connect Six   六子棋");
    this->setWindowIcon(QIcon(":/new/prefix1/Image/logo.png")); //设置应用图标
    this->setFixedSize(1280,880);
    button=new QPushButton(this);
    button->move(QPoint(550,600));
    button->setFlat(true);  //透明效果
    button->setFixedSize(300,70);  //设定按钮尺寸
    button->setFont(QFont("微软雅黑",20,700));
    button->setText("进入游戏");
    connect(button,&QPushButton::clicked,this,&mainpage::sendslot);  //连接信号

}
void mainpage::paintEvent(QPaintEvent *event)
{
    if(button->underMouse())
    {
        button->setFlat(false);
    }
    else
    {
        button->setFlat(true);
    }
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true); // 抗锯齿,防止图像走样
    painter.drawPixmap(0,0,this->width(),this->height(),QPixmap(BACK));  //背景图片
    painter.drawPixmap(450,100,500,300,QPixmap(":/new/prefix1/image/title.png"));

}
void mainpage::sendslot()
{
    QSound::play(BUTTON_PLAY);
    emit mysignal();   //发出信号,等待主窗口接收
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值