QT实现五子棋游戏

本文实例为大家分享了QT实现五子棋游戏的具体代码,供大家参考,具体内容如下

有点bug 但是能运行

每次点击右边会出现提示图标,表示是黑方落子还是白方并计时,不过不知道为什么点的次数多了 就不出现提示了 然后过一会又有了![Alt]

代码片:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QBrush>
#include <QMouseEvent>
#include <QPen>
#include <QDebug>
#include <QMessageBox>
#include <QTime>
#include <QMainWindow>
#include <QTimer>
#include <QDateTime>
#include <QDesktopWidget>
#include <QApplication>
#include <QCoreApplication>
#include <QEventLoop>
#include <QProcess>
#include <QString>
Widget::Widget(QWidget *parent)
  : QWidget(parent)
  , ui(new Ui::Widget)
{
  ui->setupUi(this);

    ui->label_2->hide();
  // resize(640, 640);
  memset(a, 0, 15 * 15 * sizeof(int));
  player = 0;
  ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat);
  ui->lcdNumber->display(QDateTime::currentDateTime().toString("000"));
  ui->lcdNumber_2->setSegmentStyle(QLCDNumber::Flat);
  ui->lcdNumber_2->display(QDateTime::currentDateTime().toString("000"));
  timer1=new QTimer(this);
  connect(timer1,&QTimer::timeout,this,&Widget::handle_timeout);
  timer1->start(1000);
  timer2=new QTimer(this);
  connect(timer2,&QTimer::timeout,this,&Widget::handle_timeout);
  timer2->start(1000);

}

Widget::~Widget()
{
  delete ui;
}

 void Widget::handle_timeout()
{

  if(flag%2==0){
    for(sec=numb1;sec>0;sec--)
    {
      ui->lcdNumber->display(QDateTime::currentDateTime().toString(QString::number(sec)));
        Delay_MSec(1000);
        if(flag%2==1){
          numb1=sec;
          break;
        }
        if(sec<=0)
          QMessageBox::information(this, "Win", "White Win", QMessageBox::Ok);
    }
    // timer1->stop();
  }
  else if(flag%2==1)
  {
    for(sec=numb2;sec>0;sec--)
    {
      ui->lcdNumber_2->display(QDateTime::currentDateTime().toString(QString::number(sec)));
        Delay_MSec(1000);
        if(flag%2==0) {
          numb2=sec;
          break;}
        if(sec<=0)
          QMessageBox::information(this, "Win", "Black Win", QMessageBox::Ok);
    }
    // timer2->stop();
  }

}
void Widget::Delay_MSec(unsigned int msec)
{
  QTime _Timer=QTime::currentTime().addMSecs(msec);
  while(QTime::currentTime()<_Timer)
  {
    QCoreApplication::processEvents(QEventLoop::AllEvents,100);
  }
}
void Widget::paintEvent(QPaintEvent *)
{
  gridW = width()/19; //窗口宽度分18份
  gridH = height()/19; //窗口高度分18份
  //棋盘起点坐标
  startX = gridW;
  startY = gridH;
  QPainter p(this);
  //背景图
  p.drawPixmap(0,0, width(),height(),QPixmap(":/new/prefix1/C:/tupian/image/board1.jpg"));
  p.setRenderHint(QPainter::Antialiasing, true);

  int i, j;
  for (i = 0; i < 16; i++)
  {
    p.drawLine(startX, startY + i * gridH, startX+15*gridW, startY + i * gridH);
    p.drawLine(startX + i * gridW, startY, startX + i * gridW, startY+15*gridH);
  }

  QBrush brush;
  brush.setStyle(Qt::SolidPattern);
  for (i = 0; i < 15; i++)
  {
    for (j = 0; j < 15; j++)
    {
      if (a[i][j] == 1)
      {
        p.drawPixmap(startX+i*gridW, startY+j*gridH,
               gridW, gridH,
          QPixmap(":/new/prefix1/C:/tupian/image/white.png")
          );
        ui->label->hide();
        ui->label_2->show();

        /*brush.setColor(Qt::black);
        p.setBrush(brush);
        p.drawEllipse(QPoint((i + 1) * 40, (j + 1) * 40), 15, 15);*/
      }
      else if (a[i][j] == 2)
      {
        p.drawPixmap(startX+i*gridW, startY+j*gridH,
            gridW, gridH,
            QPixmap(":/new/prefix1/C:/tupian/image/black.png")
            );
        ui->label->show();
          ui->label_2->hide();

        /*brush.setColor(Qt::white);
        p.setBrush(brush);
        p.drawEllipse(QPoint((i + 1) * 40, (j + 1) * 40), 15, 15);*/
      }
    }
  }
}

void Widget::mouseReleaseEvent(QMouseEvent *e)
{
  int x, y;

   flag++;
  if(e->x() >= startX && e->x() < startX+15*gridW && e->y() >= startY && e->y() < startY+15*gridH)
  {
    x = (e->x() - startX) / gridW;
    y = (e->y() - startY) / gridH;
    if (!a[x][y])
    {
      a[x][y] = player++ % 2 + 1;
    }
    if(iswin(x, y))
    {
      update();
      setEnabled(false);
      if(flag%2==1)
         QMessageBox::information(this, "Win", "Black Win", QMessageBox::Ok);
      else
         QMessageBox::information(this, "Win", "White Win", QMessageBox::Ok);

    }
  }
  update();
}

int Widget::iswin(int x, int y)
{
   return f1(x, y) || f2(x, y) || f3(x, y) || f4(x ,y);
}

int Widget::f1(int x, int y)
{
  int i;
  for (i = 0; i < 5; i++)
  {
    if(y - i >= 0 &&
      y + 4 - i <= 0xF &&
      a[x][y - i] == a[x][y + 1 - i] &&
      a[x][y - i] == a[x][y + 2 - i] &&
      a[x][y - i] == a[x][y + 3 - i] &&
      a[x][y - i] == a[x][y + 4 - i])
    return 1;
  }
  return 0;
}

int Widget::f2(int x, int y)
{
  int i;
  for (i = 0; i < 5; i++)
  {
    if(x - i >= 0 &&
      x + 4 - i <= 0xF &&
      a[x - i][y] == a[x + 1 - i][y] &&
      a[x - i][y] == a[x + 2 - i][y] &&
      a[x - i][y] == a[x + 3 - i][y] &&
      a[x - i][y] == a[x + 4 - i][y])
      return 1;
  }
  return 0;
}

int Widget::f3(int x, int y)
{
  int i;
  for (i = 0; i < 5; i++)
  {
    if(x - i >= 0 &&
      y - i >= 0 &&
      x + 4 - i <= 0xF &&
      y + 4 - i <= 0xF &&
      a[x - i][y - i] == a[x + 1 - i][y + 1 - i] &&
      a[x - i][y - i] == a[x + 2 - i][y + 2 - i] &&
      a[x - i][y - i] == a[x + 3 - i][y + 3 - i] &&
      a[x - i][y - i] == a[x + 4 - i][y + 4 - i])
      return 1;
  }
  return 0;
}

int Widget::f4(int x, int y)
{
  int i;
  for (i = 0; i < 5; i++)
  {
    if(x + i <= 0xF &&
      y - i >= 0 &&
      x - 4 + i >= 0 &&
      y + 4 - i <= 0xF &&
      a[x + i][y - i] == a[x - 1 + i][y + 1 - i] &&
      a[x + i][y - i] == a[x - 2 + i][y + 2 - i] &&
      a[x + i][y - i] == a[x - 3 + i][y + 3 - i] &&
      a[x + i][y - i] == a[x - 4 + i][y + 4 - i])
      return 1;
  }
  return 0;
}

void Widget::on_pushButtonOver_clicked()
{
  this->close();
}

/*-------main.cpp----------------------------*/
#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
/*---------widget.h-----------*/
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
  Q_OBJECT

public:
  Widget(QWidget *parent = nullptr);
  ~Widget();
  void paintEvent(QPaintEvent *event);
  void mouseReleaseEvent(QMouseEvent *event);
  QTimer *timer1,*timer2;
  void handle_timeout(void);
  void Delay_MSec(unsigned int msec);
  int flag=3;
  int sec=0;
  int numb1=900;
  int numb2=900;
  int player;

private slots:
  void on_pushButtonOver_clicked();

private:
  Ui::Widget *ui;
  int a [15][15];

  int iswin(int,int);
  int f1(int,int);
  int f2(int,int);
  int f3(int,int);
  int f4(int,int);
  int gridW; //棋盘水平方向一个格子的宽度
  int gridH; //棋盘水平方向一个格子的高度
  int startX; //棋盘起点x坐标
  int startY; //棋盘起点y坐标

  int chessX=-1, chessY=-1; //棋盘下标

};
#endif // WIDGET_H

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现五子棋小游戏

    首先我们先来看一个稍微简单些的实现方式: #include <stdio.h> #include <stdlib.h> #define N 15 int chessboard[N + 1][N + 1] = { 0 }; int whoseTurn = 0; void initGame(void); void printChessboard(void); void playChess(void); int judge(int, int); int main(void) { init

  • C语言编写五子棋游戏

    本文实例为大家分享了C语言编写五子棋游戏的具体代码,供大家参考,具体内容如下 一.构建棋盘 首先可以用一个二维数组来构建棋盘,下标表示位置,内容表示黑子白子或者空位.当数组内容为1时,该位置为白字,当数组为0时,该位置为白子,空位输出+ int w[11][11], flag = 0; int a, b; for (int k = 0; k < 11; k++) printf("第%d列\t", k); printf("\n"); for (int i = 0

  • 纯C语言实现五子棋

    正在考虑增加一个MFC界面.不是人机对战的. 五子棋.c //date 2014年7月7日09:53:24 //willows //五子棋 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <assert.h> //棋盘初始化函数 //Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL void init_Chessboa

  • C语言实现简单五子棋小游戏

    五子棋简单功能实现,供大家参考,具体内容如下 游戏功能演示 代码如下: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <getch.h> // 棋盘 char board[15][15]; // 棋子坐标 char kx = 7 , ky = 7; // 角色 char role = '@'; // 显示棋盘 void show_board(void) { syste

  • C语言实现五子棋游戏

    本文实例为大家分享了C语言实现五子棋的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <bios.h> #include <ctype.h> #include <conio.h> #include <dos.h> #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #defin

  • 基于C语言实现五子棋游戏完整实例代码

    本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解. 五子棋游戏代码如下: /* * 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序 */ #include <stdio.h> #include <stdlib.h> #include <bios.h> #include <graphics.h> #include<malloc.h> /* * 对应键盘键的十六进制数字 */ #defi

  • QT实现五子棋游戏

    本文实例为大家分享了QT实现五子棋游戏的具体代码,供大家参考,具体内容如下 有点bug 但是能运行 每次点击右边会出现提示图标,表示是黑方落子还是白方并计时,不过不知道为什么点的次数多了 就不出现提示了 然后过一会又有了![Alt] 代码片: #include "widget.h" #include "ui_widget.h" #include <QPainter> #include <QBrush> #include <QMouseE

  • QT实现简单五子棋游戏

    本文实例为大家分享了QT实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 FIR.pro #------------------------------------------------- # # Project created by QtCreator 2012-09-01T15:09:11 # #------------------------------------------------- QT += core gui TARGET = FIR TEMPLATE = app SO

  • Python3利用Qt5实现简易的五子棋游戏

    要写出一个五子棋游戏,我们最先要解决的,就是如何下子,如何判断已经五子连珠,而不是如何绘制画面,因此我们先确定棋盘 五子棋采用15*15的棋盘,因此,我们可以使用二维列表来创建一个棋盘,不妨认为0表示未放置棋子,1表示放置白子,2表示放置黑子. 显而易见可以创建列表,注意不能使用*来复制列表 self.chess_board = [[0 for i in range(15)] for i in range(15)] 下棋的步骤十分好做,只需要找到对应的索引进行赋值即可,下一步应该解决如何判断五子

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • VC实现五子棋游戏的一个算法示例

    本文讲述了VC实现五子棋游戏的一个算法示例,该算法采用极大极小剪枝博弈算法,感兴趣的读者可以对程序中不完善的部分进行修改与完善. 该设计主要包括:数据结构.估值函数.胜负判断.搜索算法 程序运行界面如下: 具体实现步骤如下: 1.数据结构 //记录每步棋,可以建立链表用来进行悔棋.后退(本程序没有实现) struct Step { int x,y; //棋子坐标 int ball; //表示下子方{BLACK,WHITE} }; //记录棋盘情况,用于搜索过程 class CBoardSitua

  • jQuery实现的五子棋游戏实例

    本文实例讲述了jQuery实现的五子棋游戏.分享给大家供大家参考.具体如下: 这是一款非常不错的代码,就是人工智能方面差了一点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999

  • java实现单人版五子棋游戏

    本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 package gyb.exam; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.

  • 原生JS+Canvas实现五子棋游戏实例

    一.功能模块 先看下现在做完的效果: 线上体验:https://wj704.github.io/five_game.html 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15*15,通过canvas画棋盘: //绘画棋盘 var drawChessBoard = function(){ for(var i = 0; i < 15; i++){ context.moveTo(15 + i *

  • JS+canvas实现的五子棋游戏【人机大战版】

    本文实例讲述了JS+canvas实现的五子棋游戏.分享给大家供大家参考,具体如下: 运行效果图: html代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>五子棋</title> <link rel="stylesheet" type="text/css" href="css

随机推荐