`

贪吃蛇

    博客分类:
  • 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
分享到:
评论

相关推荐

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

    《简单的贪吃蛇源码分析与探讨》 贪吃蛇是一款经典的休闲游戏,深受各年龄段玩家的喜爱。在Android平台上,我们可以找到许多实现贪吃蛇的游戏源码,这为我们理解和学习移动游戏开发提供了宝贵的学习资源。这里我们...

    jQuery贪吃蛇网页版游戏代码

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

    双人贪吃蛇源代码

    双人贪吃蛇源代码 作为一名 IT 行业大师,我将为您生成相关知识点,详细解释标题、描述、标签和部分内容中的知识点。 标题:双人贪吃蛇源代码 双人贪吃蛇源代码是指在计算机程序设计基础课程设计中,设计和实现的...

    贪吃蛇_贪吃蛇图片.ico_贪吃蛇游戏mfc_贪吃蛇_MFC_

    标题中的“贪吃蛇_贪吃蛇图片.ico_贪吃蛇游戏mfc_贪吃蛇_MFC_”表明这是一个关于使用Microsoft Foundation Classes (MFC)框架开发的贪吃蛇游戏项目,其中可能包含了游戏的图标资源(.ico文件)和其他相关文件。...

    32贪吃蛇_基于stm32的oled贪吃蛇游戏_贪吃蛇STM32_stm32f103ret6_stm32贪吃蛇_贪吃蛇htm_源

    《基于STM32的OLED贪吃蛇游戏详解》 贪吃蛇游戏,作为一个经典的电子游戏,自上世纪80年代以来就深受玩家喜爱。而如今,我们可以通过微控制器(MCU)实现这个游戏,例如STM32系列单片机。本文将深入探讨如何使用STM...

    自己制作的贪吃蛇的aia

    贪吃蛇的aia 贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。 [1] 另外还有一种名为“贪吃蛇”钻井测井技术,是运用旋转导向系统、...

    贪吃蛇-代码-uml设计

    《贪吃蛇游戏的UML设计与实现》 贪吃蛇是一款经典的电子游戏,它以其简单易懂的规则和无尽的游戏模式深受玩家喜爱。在软件工程领域,将这种游戏进行设计并编码时,通常会借助统一建模语言(UML)来规划和组织项目的...

    Labview贪吃蛇课程设计

    《Labview贪吃蛇课程设计:打造趣味性虚拟仪器》 Labview(Laboratory Virtual Instrument Engineering Workbench)是一款由美国国家仪器公司(NI)开发的图形化编程环境,专为构建虚拟仪器而设计。在“Labview...

    GUI贪吃蛇图片素材

    在这个系列中,"贪吃蛇"小游戏是一个常见的教学实例,它通过实现一个简单的游戏来帮助初学者理解和运用Java的基本概念。 贪吃蛇游戏通常涉及到图形用户界面(GUI)的创建,这是Java中的一个重要主题。GUI允许用户与...

    AD工程 贪吃蛇脚本.rar

    标题中的“AD工程 贪吃蛇脚本.rar”表明这是一个与Active Directory(AD)相关的项目,同时结合了“贪吃蛇”的元素,这通常意味着它是一个编程脚本,可能是用某种编程语言编写的,用于在Windows环境中进行自动化或者...

    贪吃蛇大战 cocoscreator

    《贪吃蛇大战》是一款基于Cocos Creator开发的多人在线竞技游戏,它的核心玩法是玩家控制一条不断增长的蛇,在地图上吞食食物,同时避免与其他玩家的蛇相撞,以此来获得分数并竞争排行榜。Cocos Creator是一个强大的...

    大作业python游戏编程课程设计魔改贪吃蛇之贪吃蛇捕蛙游戏源码.zip

    大作业python游戏编程课程设计魔改贪吃蛇之贪吃蛇捕蛙游戏源码,完整代码注释,开发文档。 基于贪吃蛇捕蛙的游戏,贪食蛇吃了青蛙并不会变长,当贪食蛇吃了一些青蛙之后,游戏关卡会升级,升级后蛇的行动速度会变快...

    greedysnake_QT5贪吃蛇_qt贪吃蛇_贪吃蛇_

    【标题】"greedysnake_QT5贪吃蛇_qt贪吃蛇_贪吃蛇_" 指的是一个使用QT5框架开发的贪吃蛇游戏项目。QT5是Qt库的一个版本,它是一个跨平台的应用程序开发框架,广泛用于创建桌面、移动和嵌入式系统的图形用户界面。这...

    C语言--贪吃蛇相关PPT(详细介绍相关贪吃蛇过程及问题).pptx

    "C语言贪吃蛇相关PPT详细介绍贪吃蛇过程及问题" 通过分析给定的文件信息,我们可以总结出以下知识点: 1. C语言编程:贪吃蛇游戏的开发过程中使用C语言编程,包括项目的建立、头文件的使用、预编译头文件的作用等...

    个人编写的贪吃蛇

    【贪吃蛇游戏详解】 贪吃蛇是一款经典的计算机游戏,起源于1976年的"Blockade",随后在各种早期计算机和手机平台上流行。在这个个人编写的版本中,我们有机会深入了解一个简单的贪吃蛇游戏是如何实现的。下面将详细...

    贪吃蛇源码eclipse开发

    贪吃蛇是一款经典的电子游戏,它的源码分析和学习对于初学者来说是非常有价值的。这个"贪吃蛇源码eclipse开发"项目是用Java语言在Eclipse集成开发环境中编写的,因此我们可以从中深入理解Java编程语言和Eclipse IDE...

    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语言贪吃蛇

    C#贪吃蛇(非常强悍的C#贪吃蛇游戏,你一定不会后悔的)

    《C#贪吃蛇》是一款基于C#编程语言开发的极具挑战性和趣味性的经典小游戏,其强大之处在于它不仅保留了传统贪吃蛇的基本玩法,还融入了丰富的关卡设计和多样化的游戏功能,给玩家带来了更为丰富的游戏体验。...

Global site tag (gtag.js) - Google Analytics