QT QTableView 智障OX棋代码

本文介绍了一种使用QTableView实现OX棋(九宫棋)的方法。该程序采用Qt框架,展示了如何利用QStandardItemModel来创建棋盘,并实现了基本的游戏逻辑。尽管电脑只会随机下棋,但该项目提供了一个良好的起点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚接触QTableView的时候随手写的OX棋(九宫棋),后面没完善所以电脑只会随机下棋。。不过也包含了一些基础用法。。

代码如下:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QStandardItemModel>
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_tableView_clicked(const QModelIndex &index);
    void on_pushButton_clicked();
    void win(int &w);
private:
    Ui::MainWindow *ui;
    QStandardItemModel *model;
    int *w;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QDateTime>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("OOXX棋");
    model = new QStandardItemModel;
    ui->tableView->setModel(model);//显示数据
    ui->tableView->setColumnWidth(1,100);//默认列宽。
    ui->tableView->verticalHeader()->setDefaultSectionSize(100);//默认行高。
    for(int i = 0; i < 3; i++)//显示3*3空白
     {
        for(int j = 0; j < 3; j++)
        {
         model->setItem(i,j,new QStandardItem(QString::fromLocal8Bit("")));
         }
     }
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//不能编辑
    ui->tableView->horizontalHeader()->setVisible(false);//不显示表头
    ui->tableView->verticalHeader()->setVisible(false);//不显示序号
    ui->tableView->setSelectionMode(QAbstractItemView::NoSelection);//不可选中
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_tableView_clicked(const QModelIndex &index)
{
    int nRow  = index.row();
    int ncolumn  = index.column();
    int w=0;
    //QString str=model.data(model->index(nRow,ncolumn));
    qDebug()<<model->data(index);
    if(model->data(index)=="")//判断是否为空
    {
        model->setItem(nRow,ncolumn, new QStandardItem("×"));
        model->item(nRow,ncolumn)->setTextAlignment(Qt::AlignCenter);   //居中
        model->item(nRow,ncolumn)->setForeground(QBrush(QColor(255, 0, 0)));//颜色
        qDebug()<<nRow<<"   "<<ncolumn;
        win(w);
        int panduan=0;
        for(int i = 0; i < 3; i++)//用来判断是否格子填满
         {
            for(int j = 0; j < 3; j++)
            {
                if(model->index(i,j).data().toString()=="")
                {
                    panduan=1;//有空格则等于1
                }
             }
         }
        if(panduan==1)//未结束则继续
        {
            int a=QDateTime::currentDateTime().toString("z").toInt();
            srand(a);
            int randNum1 = (rand()%10)/4;
            int randNum2 = (rand()%10)/4;
            while(model->index(randNum1,randNum2).data().toString()!="")
            {
             randNum1 = (rand()%10)/4;
             randNum2 = (rand()%10)/4;
             }
            model->setItem(randNum1,randNum2, new QStandardItem("o"));
            w=1;
            model->item(randNum1,randNum2)->setTextAlignment(Qt::AlignCenter);
            win(w);
        }
        panduan=0;
        for(int i = 0; i < 3; i++)//用来判断是否格子填满
         {
            for(int j = 0; j < 3; j++)
            {
                if(model->index(i,j).data().toString()=="")
                {
                    panduan=1;
                }
             }
         }
        if(panduan==0) QMessageBox::warning(this, "平局", "哇,你居然和傻瓜旗鼓相当");
    }
}
void MainWindow::win(int &w)
{
    for(int i = 0; i < 3; i++)
    {
        if((model->index(i,0).data().toString()==model->index(i,1).data().toString()&&model->index(i,1).data().toString()==model->index(i,2).data().toString()&&model->index(i,0).data().toString()!=""&&model->index(i,1).data().toString()!=""&&model->index(i,2).data().toString()!="")||
                (model->index(0,i).data().toString()==model->index(1,i).data().toString()&&model->index(1,i).data().toString()==model->index(2,i).data().toString()&&model->index(0,i).data().toString()!=""&&model->index(1,i).data().toString()!=""&&model->index(2,i).data().toString()!="")||
                (model->index(0,0).data().toString()==model->index(1,1).data().toString()&&model->index(1,1).data().toString()==model->index(2,2).data().toString()&&model->index(0,0).data().toString()!=""&&model->index(1,1).data().toString()!=""&&model->index(2,2).data().toString()!="")||
                (model->index(0,2).data().toString()==model->index(1,1).data().toString()&&model->index(1,1).data().toString()==model->index(2,0).data().toString()&&model->index(0,2).data().toString()!=""&&model->index(1,1).data().toString()!=""&&model->index(2,0).data().toString()!=""))
           {
            if(w==0)
            {
                QMessageBox::warning(this, "你赢了!", "恭喜,你赢啦~~好厉害,比傻瓜还聪明~");
            }
            else
            {
                QMessageBox::warning(this, "你输了!", "这...你也能输。。");
            }
            for(int i = 0; i < 3; i++)//显示3*3空白
             {
                for(int j = 0; j < 3; j++)
                {
                 model->setItem(i,j,new QStandardItem(QString::fromLocal8Bit("")));
                 }
             }
            break;
        }
     }
}
void MainWindow::on_pushButton_clicked()
{
    for(int i = 0; i < 3; i++)//显示3*3空白
     {
        for(int j = 0; j < 3; j++)
        {
         model->setItem(i,j,new QStandardItem(QString::fromLocal8Bit("")));
         }
     }
}

main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}


效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值