• 蓝血人
    了解作者
  • QT
    开发工具
  • 752KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 4
    下载次数
  • 2017-06-14 08:35
    上传日期
用QT 5.6 实现的五子棋游戏,目前只实现了人机游戏,智能好玩!
goBang.rar
  • goBang
  • source
  • bkGround
  • pushButton1.png
    11.2KB
  • ss.png
    13.6KB
  • clock.jpg
    3.7KB
  • bkground.png
    12.4KB
  • pushButton.png
    11.4KB
  • user
  • clock.png
    30.2KB
  • clock1.png
    27KB
  • img
  • gobangBoard.jpg
    46.9KB
  • black.jpg
    11.6KB
  • white.jpg
    11.2KB
  • button
  • defeated.png
    7.7KB
  • back.png
    7.9KB
  • equal.png
    7.5KB
  • defeated0.png
    96.7KB
  • start1.png
    28.2KB
  • defeated1.png
    96.7KB
  • back0.png
    96.7KB
  • cancle.png
    186.2KB
  • start0.png
    27.3KB
  • equal1.png
    96.7KB
  • cancle.jpg
    25.5KB
  • equal0.png
    96.7KB
  • back1.png
    96.7KB
  • Icon.jpg
    62.9KB
  • icon.png
    115.8KB
  • fileplayer.h
    314B
  • main.cpp
    293B
  • terminaldialog.h
    395B
  • player.h
    529B
  • humanplayer.h
    311B
  • mainwindow.h
    906B
  • terminaldialog.cpp
    1.1KB
  • gamewindow.h
    1.9KB
  • timeshow.h
    446B
  • personinfo.h
    428B
  • player.cpp
    135B
  • aiplayer.cpp
    15KB
  • aiplayer.h
    1.3KB
  • timeshow.cpp
    995B
  • personinfo.cpp
    636B
  • downtimer.h
    329B
  • askcolordialog.cpp
    1.3KB
  • downtimer.cpp
    60B
  • goBang.pro
    568B
  • mainwindow.cpp
    2.7KB
  • humanplayer.cpp
    296B
  • counttimer.cpp
    463B
  • imagebutton.h
    586B
  • fileplayer.cpp
    216B
  • askcolordialog.h
    471B
  • netplayer.h
    294B
  • images.qrc
    1.5KB
  • gamewindow.cpp
    11.1KB
  • imagebutton.cpp
    1002B
  • goBang.pro.user
    82.6KB
  • counttimer.h
    439B
内容介绍
#include "aiplayer.h" #include <algorithm rel='nofollow' onclick='return false;'> bool point::operator ==(const point& x)const { return x.row == this->row && x.col == this->col; } bool point::operator <(const point& another)const { return score>another.score; } AIPlayer::AIPlayer() { } void AIPlayer::setColor(CHESSCOLOR color) { myColor = color; } void AIPlayer::setName(QString name) { this->name =name; } double AIPlayer::alphaBeta(int depth,double alpha,double beta,CHESSCOLOR player,point& choose )//待补充 { CHESSCOLOR opp = (player==WHITE?BLACK:WHITE); CHESSCOLOR winner = isWin(); if(winner != NONE) if(winner == myColor) return DBL_MAX/10; else return -DBL_MAX/10; modifyScore(); if(depth<=1 && player==myColor){ return score; } point bestMove; std::vector<point> canMove; int canMoveNums = 0; posCanMove(canMove,player); //prune(canMove,player); canMoveNums = canMove.size(); double tempScore = score; if(player==myColor)//力求最大 { double temp = -DBL_MAX; for(int i(0);i<canMoveNums;i++) { addAChess(canMove[i],player); steps.push_back(canMove[i]); temp = std::max(temp,alphaBeta(depth-1,alpha,beta,opp,bestMove)); score = tempScore; removeAChess(canMove[i]); steps.pop_back(); if(temp>=beta) return temp; if(alpha < temp) { choose = canMove[i]; alpha = temp; } } return temp; } else//求最小 { double temp = DBL_MAX; for(int i(0);i<canMoveNums;i++) { addAChess(canMove[i],player); steps.push_back(canMove[i]); temp = std::min(temp,alphaBeta(depth-1,alpha,beta,opp,bestMove)); score = tempScore; steps.pop_back(); removeAChess(canMove[i]); if(temp<=alpha) return temp; beta = std::min(beta,temp); } return temp; } } bool AIPlayer::hasNeigh(int x,int y)//判断是否有有邻居 { return neighNums[x][y]>0; } void AIPlayer::posCanMove(std::vector<point>&canMove,CHESSCOLOR player)//下一步可以落子的点,仅仅考虑5*5邻域 { CHESSCOLOR opp = (player==BLACK?WHITE:BLACK); for(int i(0);i<15;i++) for(int j(0);j<15;j++) { if(myBoard[i][j]==NONE && hasNeigh(i,j)) { canMove.push_back(point(i,j,evaluate(i,j,player)+evaluate(i,j,opp))); } } sort(canMove.begin(),canMove.end()); while(canMove.size()>10) canMove.pop_back(); } void AIPlayer::initiallizeNeigh() { neighNums = QVector<QVector<int> >(15,QVector<int>(15,0)); for(int i(0);i<15;i++) for(int j(0);j<15;j++) { if(myBoard[i][j]!=NONE) { for(int k(-2);k<=2;k++) for(int l(-2);l<=2;l++) { if(legal(i+k,j+l)) { neighNums[i+k][j+l]++; } } } } } void AIPlayer::addAChess(const point &p, const CHESSCOLOR &color) { int x = p.row,y = p.col; myBoard[p.row][p.col] = color; int maxx = std::min(14,x+2),maxy = std::min(14,y+2); for(int i(std::max(0,x-2));i<=maxx;i++) for(int j(std::max(0,y-2));j<=maxy;j++) { neighNums[i][j]++; } } void AIPlayer::removeAChess(const point& p) { int x = p.row,y = p.col; myBoard[x][y]=NONE; for(int i(-2);i<=2;i++) for(int j(-2);j<=2;j++) { if(legal(x+i,y+j)) neighNums[x+i][y+j]--; } } void AIPlayer::myTurn(const QVector<QVector<CHESSCOLOR> >&board) { myBoard = board; initiallizeNeigh(); evaluate(); steps.clear(); alphaBeta(5,-DBL_MAX,DBL_MAX,myColor,bestMove); emit player::addAChess(myColor,bestMove.row,bestMove.col); } void AIPlayer::modifyScore()//走了一步,需要重新计算分数,只需要重新计算落子点附近的位置分数即可 { if(steps.size()==0) return; point lastStep = steps.back(); int x = lastStep.row,y = lastStep.col; CHESSCOLOR player = myBoard[x][y]; CHESSCOLOR opp = (player==WHITE?BLACK:WHITE); double temp = 0; temp = evaluate(x,y,player); myBoard[x][y]=NONE; temp -= evaluate(x,y,player); temp += evaluate(x,y,opp); myBoard[x][y]=player; if(player==myColor) score += temp*5; else score -= temp*5; } bool AIPlayer::legal(int x,int y) { return x>=0 && x<15&&y>=0&&y<15; } double AIPlayer::evaluate()//计算整个棋盘的分数 { score = 0; CHESSCOLOR opp; opp = (myColor==WHITE?BLACK:WHITE); for(int i(0);i<15;i++) for(int j(0);j<15;j++) { score += evaluate(i,j,myColor) - evaluate(i,j,opp); } return score; } double AIPlayer::evaluate(int x,int y,CHESSCOLOR player)//计算某一位置的分数 { static double scores[6]={0,1,20,600,4000,1000000}; static double combo[5][5]={ {0,0,0,0,0}, {0,0,0,0,0}, {0,0,100,400,800}, {0,0,400,2000,30000}, {0,0,800,30000,100000} }; static int dx[4]={1,1,1,0}; static int dy[4]={-1,1,0,1}; double result = 0; CHESSCOLOR opp; opp = (player==WHITE?BLACK:WHITE); int style[4]={0}; int lx,ly,hx,hy; int num,num0,temp; for(int i(0);i<4;i++) { lx = x-dx[i],ly = y-dy[i]; num = 0; while(legal(lx,ly)&&num<4 && myBoard[lx][ly]!=opp) { lx -= dx[i],ly-=dy[i]; num++; } lx += dx[i];ly+=dy[i]; hx = lx;hy = ly; num0 = num; temp = 0; num = 0; while((num<5)&&legal(hx,hy)&&(myBoard[hx][hy]!=opp)) { if(myBoard[hx][hy]==player) temp++; hx+=dx[i];hy+=dy[i]; num++; } if(num<5) continue; result += scores[temp]; while(num0>0 && legal(hx,hy) && myBoard[hx][hy]!=opp) { if(myBoard[lx][ly]==player) temp--; if(myBoard[hx][hy]==player) temp++; if(temp>style[i]) style[i]=temp; result += scores[temp]; lx+=dx[i];ly+=dy[i]; hx+=dx[i];hy+=dy[i]; num0 --; } /*for(int i(0);i<4;i++) for(int j(i+1);j<4;j++) { if(i!=j &&style[i]!=5 && style[j]!=5) { result += combo[style[i]][style[j]]; } }*/ } return result; } point::point(int x,int y,int score) { row = x,col = y; this->score = score; } void point::set(int x,int y) { row = x; col = y; } void AIPlayer::prune(std::vector<point> &canMove,CHESSCOLOR player) { CHESSCOLOR opp = (player==WHITE?BLACK:WHITE); std::vector<point> threats; for(size_t i(0);i<canMove.size();i++) { if(haveThreat(canMove[i],opp)) { threats.push_back(canMove[i]); } else if(haveThreat(canMove[i],player)) threats.push_back(canMove[i]); } if(threats.size()>=3) canMove = threats; return; } //判断是否有三个子,或者有两个活2,己方可以利用这些点来进攻 bool AIPlayer::havePotThreat(const point& step,CHESSCOLOR player) { static int dx[4]={1,1,1,0}; static int dy[
评论
    相关推荐
    • QT五子棋课设.zip
      使用QT进行页面设计,使用C++语言的五子棋游戏设计。
    • 基于Qt五子棋.rar
      利用QT Creator平台和C++开发语言设计的五子棋项目
    • 基于QT图形化编程界面设计---五子棋
      参阅现有游戏,设计有良好人机交互界面的程序;鼓励用可视化的人机交互设计, 如菜单、按钮,可基于 MFC、Qt 等开发工具。适用于Qt初学者,大一课设。
    • Qt网络五子棋
      网络五子棋的客户端,想学习C++的,QT和界面应用的孩子来吧
    • qt网络五子棋
      由客户端和服务器端组成。Centos7 + qt 5.3下调试通过,windows+ qt5.3下调试通过。有什么问题发至hbdl_119@126.com.
    • Gobang:Linux 下QT 五子棋
      Gobang Linux 下QT 五子棋
    • Qt实现五子棋游戏(含功能按钮)
      程序设计实践,开发五子棋游戏程序,其中包含功能按钮,可以满足基础需求,界面上有一定优化
    • C++ Qt 实现 经典五子棋游戏
      本程序使用C++ Qt界面开发工具,经典的五子棋游戏,是C++必练项目。实现了双人对战,人机对战,以及悔棋的操作,游戏体验极高,通过鼠标移动选择落子。
    • Qt五子棋代码
      网络五子棋的实现:实现基本界面,和以下两个功能 1、传输棋子数据(Socket) 2、同步棋盘(Socket + 数据链表)
    • Qt制作五子棋游戏
      简单的五子棋游戏,有比分显示,双人对战,并且隐藏了窗口,可以通过左键移动游戏,右键关闭窗口。 可以先看一下界面效果: https://imgchr.com/i/1TSnfK https://imgchr.com/i/1TSmY6 抱歉,好像不小心把ui...