`

贪吃蛇

    博客分类:
  • Qt
阅读更多
发一个自己写的贪吃蛇,很烂,就当给以后留下点回忆吧,靠它赢了顿必胜客,哈哈
myt.h
#include <QtGui/QWidget>
#include "ui_myt.h"
#include "qpainter.h"
#include "QTimer"
#include "QPainterPath"

class MyT : public QWidget
{
	Q_OBJECT

public:
	MyT(QWidget *parent = 0, Qt::WFlags flags = 0);
	~MyT();

	enum Direction{
		mLeft=0,
		mRight,
		mUp,
		mDown
	};

	enum Level{
		mEasy=1,
		mMedium,
		mDifficult,
		mBT
	};

private slots:
	void move();
protected:
	void paintEvent(QPaintEvent* e);
	void keyPressEvent(QKeyEvent *e);
private:
	bool outOfBound();
	bool coincide();
	QString getTitle();
	void stop();
	void initWidget(Level=mEasy);
private:
	int mRectNum;
	double mRectWidth;
	double mRectHeight;
	QTimer* mTimer;
	Direction mDirection;
	Level mLevel;
	QRectF mMoveRect;
	QList<QRectF> mPathList;
	QList<QRectF> mRandRectList;
private:
	Ui::MyTClass ui;
};

#endif // MYT_H



myt.cpp
#include "myt.h"
#include "qpainter.h"
#include "QKeyEvent"
#include "QTimer"
#include "QMessageBox"
#include "time.h"

#define MoveRect 5
#define RandomRect 8
static int opportuncity = 3;//give 3 times to try
MyT::MyT(QWidget *parent, Qt::WFlags flags)
	: QWidget(parent, flags)
{
	ui.setupUi(this);
	initWidget(mEasy);
}

MyT::~MyT()	
{

}

void MyT::initWidget(Level level)
{
	mPathList.clear();
	mRandRectList.clear();
	mLevel = level;
	QSize size(300,300);
	this->setFixedSize(size);
	mRectNum = 30;
	mRectWidth = rect().width()/mRectNum;
	mRectHeight = rect().height()/mRectNum;
	int pathNum = 0;
	int randRectNum = 0;
	int interValTime = 500;
	if (level==mBT)
	{
		pathNum+=5;
		randRectNum+=8;
		interValTime=200;
	}

	//move path
	mMoveRect = QRectF(size.width()/10.,size.height()/10.,mRectWidth,mRectHeight);
	pathNum += MoveRect+mLevel;
	for (int i=0;i<pathNum;i++)
	{
		mMoveRect = QRectF(mMoveRect.x()+mRectWidth,mMoveRect.y(),mRectWidth,mRectHeight);
		mPathList.push_front(mMoveRect);
	}

	//random rect
	QRectF randRect;
	long randTimeNum = time(NULL);
	randRectNum += RandomRect+mLevel*2;
	for (int i=0;i<randRectNum;i++)
	{
		int randX = (qrand()+randTimeNum)%30;
		int randY = (qrand()+randTimeNum)%30;
		randRect = QRectF(randX*mRectWidth,randY*mRectHeight,mRectWidth,mRectHeight);
		if (mPathList.contains(randRect)||mRandRectList.contains(randRect))//the random rect can not be first move rect
		{
			i--;
		}else
		{
			mRandRectList.push_back(randRect);
		}
	}

	//connect time
	mTimer = new QTimer(this);
	connect(mTimer,SIGNAL(timeout()),this,SLOT(move()));
	mTimer->start(interValTime/level);//From then on, the move() slot is called every 0.3/level second.
	mDirection = mRight;//default move right
	QString title = getTitle();
	setWindowTitle(title);
	repaint();
}

/*!
	return the window title
*/
QString MyT::getTitle()
{
	QString title;
	switch(mLevel)
	{
	case mEasy:
		title = tr("Easy");
		break;
	case mMedium:
		title = tr("Medium");
		break;
	case mDifficult:
		title = tr("Difficult");
		break;
	case mBT:
		title = tr("BT");
		break;
	}
	QString times = QString(",%1 times to try!").arg(opportuncity);
	if (opportuncity>0)
	{
		title += times;
	}
	return title;
}

/*!
	draw the window
*/
void MyT::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	for (int i=0;i<=mRectNum;i++)
	{
		painter.drawLine(mRectWidth*i,0,mRectWidth*i,rect().height());		
	}
	for (int j=0;j<=mRectNum;j++)
	{
		painter.drawLine(0,mRectHeight*j,rect().width(),mRectHeight*j);
	}	
	//draw path
	foreach(QRectF rect,mPathList)
	{
		painter.fillRect(rect,QBrush(Qt::SolidPattern));
	}
	//draw random rect
	foreach(QRectF rect,mRandRectList)
	{
		painter.fillRect(rect,QBrush(Qt::SolidPattern));
	}
}

void MyT::keyPressEvent(QKeyEvent *e)
{
	switch (e->key())
	{
	case Qt::Key_Up:
			if (mDirection!=mDown)
			{
				mDirection = mUp;
			}
			break;
	case Qt::Key_Down:
			if (mDirection!=mUp)
			{
				mDirection = mDown;
			}
			break;
	case Qt::Key_Left:
			if (mDirection!=mRight)
			{
				mDirection = mLeft;
			}
			break;
	case Qt::Key_Right:
			if (mDirection!=mLeft)
			{
				mDirection = mRight;
			}
			break;
	default:
			mDirection = mRight;
			break;
	}
	move();
}

/*!
	add new rect
*/
void MyT::move()
{
	switch(mDirection)
	{
	case mLeft:
		mMoveRect = QRectF(mMoveRect.x()-mRectWidth,mMoveRect.y(),mRectWidth,mRectHeight);
		break;
	case mRight:
		mMoveRect = QRectF(mMoveRect.x()+mRectWidth,mMoveRect.y(),mRectWidth,mRectHeight);
		break;
	case mUp:
		mMoveRect = QRectF(mMoveRect.x(),mMoveRect.y()-mRectHeight,mRectWidth,mRectHeight);
		break;
	case mDown:
		mMoveRect = QRectF(mMoveRect.x(),mMoveRect.y()+mRectHeight,mRectWidth,mRectHeight);
		break;
	default:
		mMoveRect = QRectF(mMoveRect.x()+mRectWidth,mMoveRect.y(),mRectWidth,mRectHeight);
		break;
	}
	//game over
	if (outOfBound()||coincide())
	{
		stop();
		QMessageBox::StandardButton button =QMessageBox::question(this,tr("loser"),tr("Game Over!Do you want to try it again?"),
			QMessageBox::Ok|QMessageBox::Close);
		if (button == QMessageBox::Close)
		{
			exit(0);
		}else
		{
			opportuncity--;
			if (opportuncity>0)
			{
				initWidget(mLevel);
			}else
			{
				opportuncity = 3;
				initWidget(mEasy);
			}			
			return;
		}
	}
	if (!mRandRectList.contains(mMoveRect))
	{
		mPathList.pop_back();
	}else
	{
		mRandRectList.removeOne(mMoveRect);
	}
	mPathList.push_front(QRectF(mMoveRect.x(),mMoveRect.y(),mRectWidth,mRectHeight));
	//win,next version
	if (mRandRectList.isEmpty())
	{
		stop();
		switch(mLevel)
		{
		case mEasy:
			mLevel = mMedium;
			break;
		case mMedium:
			mLevel = mDifficult;
			break;
		case mDifficult:
			mLevel = mBT;
			break;
		case mBT:
			//last winner
			QMessageBox::information(this,tr("winner"),
										   tr("Oh,you are so BT!"),
										   QMessageBox::Ok);
			exit(0);
			break;
		}
		QString title = getTitle();
		QMessageBox::StandardButton button = QMessageBox::question(this,tr("winner"),
																		tr("Nice,you have passed,would you want to try the %1").arg(title),
																		QMessageBox::Ok|QMessageBox::Close);
		if (button = QMessageBox::Ok)
		{
			initWidget(mLevel);
		}else
		{
			exit(0);
		}
	}
	repaint();
}

/*!
	lose or win to next version
*/
void MyT::stop()
{
	mTimer->stop();
	disconnect(mTimer,SIGNAL(timeout()),this,SLOT(move()));
}

/*!
	judge the rect the whether the head meet the body
*/
bool MyT::coincide()
{
	QRectF rect;
	for (int i=1;i<mPathList.size();i++)
	{
		rect = mPathList[i];
		if (rect==mMoveRect)
		{
			return true;
		}
	}
	return false;
}

/*!
	judge whether header is outer of bounder
*/
bool MyT::outOfBound()
{
	if(mMoveRect.x()>=rect().width()||mMoveRect.x()<0||mMoveRect.y()>=rect().height()||mMoveRect.y()<0)
	{
		return true;
	}
	return false;
}




main.cpp
#include <QtGui/QApplication>
#include "myt.h"

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	MyT w;
	w.show();
	return a.exec();
}



ui是一个空的QWidget就不发了
0
0
分享到:
评论

相关推荐

    jQuery贪吃蛇网页版游戏代码

    jQuery贪吃蛇网页版游戏代码,贪吃蛇网页版游戏代码基于jquery.1.11.3.min.js制作,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.Query网页版贪吃蛇游戏,带得分排行榜,交互的贪吃蛇游戏...

    java小游戏 贪吃蛇 java小游戏 贪吃蛇

    java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 ...

    13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13...

    c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇

    c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇,c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇,c语言 贪吃蛇!贪吃蛇 c语言贪吃蛇

    最新单片机仿真 8x8点阵做的贪吃蛇游戏

    最新单片机仿真 8x8点阵做的贪吃蛇游戏最新单片机仿真 8x8点阵做的贪吃蛇游戏最新单片机仿真 8x8点阵做的贪吃蛇游戏最新单片机仿真 8x8点阵做的贪吃蛇游戏最新单片机仿真 8x8点阵做的贪吃蛇游戏最新单片机仿真 8x8...

    (深信息)用python实现贪吃蛇小游戏毕业设计报告 .docx

    (深信息)用python实现贪吃蛇小游戏毕业设计报告 .docx(深信息)用python实现贪吃蛇小游戏毕业设计报告 .docx(深信息)用python实现贪吃蛇小游戏毕业设计报告 .docx(深信息)用python实现贪吃蛇小游戏毕业设计报告 .docx...

    PYTHON做贪吃蛇代码

    PYTHON做贪吃蛇代码 PYTHON做贪PYTHONPYTHON做贪吃蛇代码做贪吃蛇代码 吃蛇代码 PYTHON做贪吃蛇代码PYTHON做贪吃蛇代码PYPYTHON做贪吃蛇代码THON做贪吃蛇代码PYTHON做贪吃蛇代码PYTHON做PYTHON做贪吃蛇代码贪吃蛇...

    appinventor超简易贪吃蛇源码.rar

    绝对原创的贪吃蛇,没有借助任何人的帮助,所以可能在设计上与他人不同。这个是在appinventor 官方广州服务器制作的简易贪吃蛇,只用了球形精灵和画布为主要插件,等待完善,这个包括apk应用和aia源码,适用于各位...

    Python本科毕业设计项目源代码用pygame模块设计并运行贪吃蛇小游戏.zip

    Python本科毕业设计项目源代码用pygame模块设计并运行贪吃蛇小游戏Python本科毕业设计项目源代码用pygame模块设计并运行贪吃蛇小游戏Python本科毕业设计项目源代码用pygame模块设计并运行贪吃蛇小游戏,Python本科...

    汇编贪吃蛇汇编贪吃蛇汇编贪吃蛇

    汇编贪吃蛇汇编贪吃蛇汇编贪吃蛇汇编贪吃蛇汇编贪吃蛇汇编贪吃蛇

    appinventor超简易贪吃蛇(只含apk).apk

    绝对原创的贪吃蛇,没有借助任何人的帮助,所以可能在设计上与他人不同。这个是在appinventor 官方广州服务器制作的简易贪吃蛇,只用了球形精灵和画布为主要插件,等待完善,这个是apk安卓应用,不包括aia源码,适用...

    汇编贪吃蛇 汇编贪吃蛇

    汇编贪吃蛇 汇编贪吃蛇 汇编贪吃蛇 汇编贪吃蛇

    C语言课本贪吃蛇.cpp

    C编程——实现《贪吃蛇》大作战游戏:讲解的是用C语言写一款贪吃蛇的小游戏,希望对各位在学习之路上有很好的帮助!谢谢!C编程——实现《贪吃蛇》大作战游戏:讲解的是用C语言写一款贪吃蛇的小游戏,希望对各位在...

    贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码

    贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码贪吃蛇代码

    100行Python代码的贪吃蛇小游戏源码.zip

    100行Python代码的贪吃蛇小游戏源码100行Python代码的贪吃蛇小游戏源码100行Python代码的贪吃蛇小游戏源码100行Python代码的贪吃蛇小游戏源码100行Python代码的贪吃蛇小游戏源码100行Python代码的贪吃蛇小游戏源码...

    [Android游戏源码]-简单的贪吃蛇源码.rar_Android游戏源码_android_android 贪吃蛇_贪吃蛇_贪

    简单的贪吃蛇源码,安卓游戏源码,有需要的下载,仅供参考

    Labview贪吃蛇课程设计

    设计了一个不同的贪吃蛇,相较于普通的贪吃蛇,这个更加富有趣味性,可以作为大学生的Labview虚拟仪器课程设计

    基于Android的贪吃蛇游戏开发

    在手机屏幕上设计一个贪吃蛇游戏,屏幕四周被绿色苹果包围,中间有贪吃蛇和随机产生的苹果,贪吃蛇的头是黄色的,身子是红色的。玩家按上、下、左、右键盘控制贪吃蛇在屏幕上向上、下、左、右移动,贪吃蛇只能向左、...

    JAVA本科期末大作业贪吃蛇小游戏源码.zip

    JAVA本科期末大作业贪吃蛇小游戏源码JAVA本科期末大作业贪吃蛇小游戏源码JAVA本科期末大作业贪吃蛇小游戏源码JAVA本科期末大作业贪吃蛇小游戏源码JAVA本科期末大作业贪吃蛇小游戏源码JAVA本科期末大作业贪吃蛇小游戏...

Global site tag (gtag.js) - Google Analytics