QT QTableView 智障OX棋代码
刚接触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();
}
效果: