用qt的图形视图框架实现的五子棋

用qt的图形视图框架实现的五子棋.

效果如图:

/*MainWindow.h*/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets/QMainWindow>
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QMouseEvent>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow(QWidget *parent = 0);
	void mousePressEvent(QMouseEvent *);//鼠标按下事件
	void drawCrossLine();//画棋盘
	void Win();//判断输赢
	int situation1();
	int situation2();
	int situation3();
	int situation4();
private:
	QGraphicsScene *scene;
	QGraphicsView *view;
	QGraphicsItem *item;
	int palyer;
	int a[15][15];
};

#endif // MAINWINDOW_H
</pre><pre name="code" class="cpp">/*main.cpp*/
#include "mainwindow.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	MainWindow w;
	w.show();
	return a.exec();
}
</pre>/*MainWindow.cpp*/<pre>
#include "mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent)
{


	/*将每个落点的默认值设为2, 数组a用来标记落点是否有棋子*/
	for(int i = 0; i<15; ++i)
	{
		for(int j = 0; j<15; ++j)
		{
			a[i][j] = 2;
		}
	}

	palyer = 0;
	setStatusBar(0);
	scene = new QGraphicsScene;
	scene->setSceneRect(-300, -300, 600, 600);//设置场景大小

	drawCrossLine();//画棋盘

	view = new QGraphicsView;
	view->setBackgroundBrush(QColor(135, 206, 235));//设置背景颜色
	view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//去除QGraphicsView的滚动条
	view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	view->setScene(scene);
	view->setRenderHint(QPainter::Antialiasing);//设置反走样(抗锯齿)
	setCentralWidget(view);

	/*固定大小*/
	setMaximumSize(600, 600);
	setMinimumSize(600, 600);
	setWindowTitle("Chess");//设置窗口标题

}

void MainWindow::mousePressEvent( QMouseEvent *e )
{
	int x, y;
	int m, n;

	/*鼠标事件的坐标系是view,而不是scene*/
	if(e->x()<=300)
		x =(e->x()-300)/40 -1;
	else if(e->x()>300)
		x =(e->x()-300)/40;
	if(e->y()<=300)
		y = (e->y()-300)/40-1;
	else if(e->y()>300)
		y = (e->y()-300)/40;

	m = x+8;
	n = y+8;

	/*如果当前落点有棋子,弹出警告*/
	if(a[m][n] != 2)
	{
		QMessageBox::warning(this, "warning", "This Position has Already had chess!", QMessageBox::Ok);
	}
	else
	{
		if(!palyer )
		{
			a[m][n] = 0;
			scene->addEllipse(40*x, 40*y, 35, 35, QPen(Qt::NoPen),QBrush(Qt::black));//添加黑棋
		}
		else if(palyer )
		{
			a[m][n] = 1;
			scene->addEllipse(40*x, 40*y, 35, 35, QPen(Qt::NoPen),QBrush(Qt::white));//添加白棋
		}
	}
	palyer = !palyer;//转换黑白棋子
	Win();//判断输赢
}

void MainWindow::drawCrossLine()
{
	for(int i = 0; i<15; ++i)
	{
		scene->addLine(-300, -300+40*i, 300, -300+40*i);
		scene->addLine(-300+40*i, -300, -300+40*i, 300);
	}
}

void MainWindow::Win()
{
	int okButton;
	if((situation1() ==1)
		||(situation2() ==1)
		|| (situation3() ==1)
		|| (situation4() ==1))
	{
		 okButton= QMessageBox::information(this, "win", "black win!", QMessageBox::Ok);
	}
	if((situation1() ==2)
		||(situation2() ==2)
		|| (situation3() ==2)
		|| (situation4() ==2))
		okButton = QMessageBox::information(this, "win", "white win!", QMessageBox::Ok);

	if(okButton == QMessageBox::Ok)
	{
		/*清除棋盘*/
		QList<QGraphicsItem*> list = scene->items();
		while(!list.empty())
		{
			scene->removeItem(list.at(0));
			list.removeAt(0);
		}
		/*初始化棋盘*/
		for(int i = 0; i<15; ++i)
		{
			for(int j = 0; j<15; ++j)
			{
				a[i][j] = 2;
			}
		}
		palyer = 0;
		drawCrossLine();
	}
}

int   MainWindow::situation1()//五个棋子横着
{
	for(int i = 0; i< 15; ++i)
		for(int j = 0; j<15; ++j)
		{
			if(i>=0 && i<11 && j >=0 &&j<15)
			{
				if(	a[i][j] == 0
					&&a[i+1][j] == 0
					&&a[i+2][j] == 0
					&&a[i+3][j] == 0
					&&a[i+4][j] == 0)
					return 1;
				if(	a[i][j] == 1
					&&a[i+1][j] == 1
					&&a[i+2][j] == 1
					&&a[i+3][j] == 1
					&&a[i+4][j] == 1)
					return 2;
			}
		}
		return 0;
}

int MainWindow::situation2()//五个棋子竖着
{
	for(int i = 0; i< 15; ++i)
		for(int j = 0; j<15; ++j)
		{
			if(i>=0 &&i<15 &&j>=0 &&j<11)
			{
				if(	a[i][j] == 0
					&&a[i][j+1] == 0
					&&a[i][j+2] == 0
					&&a[i][j+3] == 0
					&&a[i][j+4] == 0)
					return 1;
				if(	a[i][j] == 1
					&&a[i][j+1] == 1
					&&a[i][j+2] == 1
					&&a[i][j+3] == 1
					&&a[i][j+4] == 1)
					return 2;
			}
		}
		return 0;
}

int MainWindow::situation3()//五个棋子向下斜着
{
	for(int i = 0; i< 15; ++i)
		for(int j = 0; j<15; ++j)
		{
			if(i>=0&& i<11&&j>=4&&j<15)
			{
				if(	a[i][j] == 0
					&&a[i+1][j-1] == 0
					&&a[i+2][j-2] == 0
					&&a[i+3][j-3] == 0
					&&a[i+4][j-4] == 0)
					return 1;
				if(	a[i][j] == 1
					&&a[i+1][j-1] == 1
					&&a[i+2][j-2] == 1
					&&a[i+3][j-3] == 1
					&&a[i+4][j-4] == 1)
					return 2;
			}
			
		}
		return 0;
}

int MainWindow::situation4()//五个棋子向上斜着
{
	for(int i = 0; i< 15; ++i)
		for(int j = 0; j<15; ++j)
		{
			if(i>=0&& i<15&&j>=0&&j<11)
			{
				if(	a[i][j] == 0
					&&a[i+1][j+1] == 0
					&&a[i+2][j+2] == 0
					&&a[i+3][j+3] == 0
					&&a[i+4][j+4] == 0)
					return 1;
				if(	a[i][j] == 1
					&&a[i+1][j+1] == 1
					&&a[i+2][j+2] == 1
					&&a[i+3][j+3] == 1
					&&a[i+4][j+4] == 1)
					return 2;
			}
		}
		return 0;
}


posted on 2015-07-30 18:38  小二杰  阅读(680)  评论(0编辑  收藏  举报

导航