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(); //发出信号,等待主窗口接收
}