目录
游戏功能
- 设计了一个贪吃蛇游戏,游戏分为两个模式,一个模式为娱乐模式,玩家通过吃铲子累计积分;另一个模式为生存模式,玩家通过吃铲子减缓自己的速度(当速度达到一定的程度,直接失败)。
- 玩家在娱乐模式中的积分记录被保存在txt文件中,作为历史记录。
- 该贪吃蛇游戏分为两个界面,一个界面为开始/结束界面,另一个界面为游戏界面。
- 两个界面可以通过BACK/退出切换。
游戏界面
控制方向
首先控制贪吃蛇方向,通过增加第一个棋子和删除最后一个棋子的方式。由于贪吃蛇有穿墙的功能,所以要特判如果当企鹅在窗口时,它将在对面窗口的对应位置出现。
void Widget::addTOP(){
QPointF leftTop;
QPointF rightButtom;
if(snake[0].y()-nodeHeight<0){
leftTop=QPointF(snake[0].x(),this->height()-nodeHeight);
rightButtom=QPointF(snake[0].x()+nodeWidth,this->height());
}
else{
leftTop=QPointF(snake[0].x(),snake[0].y()-nodeHeight);
rightButtom=snake[0].topRight();
}
snake.insert(0,QRectF(leftTop,rightButtom));
}
void Widget::addDown(){
QPointF leftTop;
QPointF rightButtom;
if(snake[0].y()+2*nodeHeight>this->height()){
leftTop=QPointF(snake[0].x(),0);
rightButtom=QPointF(snake[0].x()+nodeWidth,nodeHeight);
}
else{
leftTop=snake[0].bottomLeft();
rightButtom=snake[0].bottomRight()+QPointF(0,nodeHeight);
}
snake.insert(0,QRectF(leftTop,rightButtom));
}
void Widget::addLeft(){
QPointF leftTop;
QPointF rightButtom;
if(snake[0].x()-nodeWidth<0){
leftTop=QPointF(this->width()-nodeWidth,snake[0].y());
rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
}
else{
leftTop=snake[0].topLeft()-QPointF(nodeWidth,0);
rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
}
snake.insert(0,QRectF(leftTop,rightButtom));
}
void Widget::addRight(){
QPointF leftTop;
QPointF rightButtom;
if(snake[0].x()+2*nodeWidth>this->width()){
leftTop=QPointF(0,snake[0].y());
rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
}
else{
leftTop=snake[0].topRight();
rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
}
snake.insert(0,QRectF(leftTop,rightButtom));
}
增添奖励
由于奖励是随机生成的,可能与蛇身重合,所以要判断生成的奖励是否与蛇身重合,如果重合则删去,反之则是生成成功。
void Widget::addNewReward(){
rewardNode=new QRectF;
bool a;
do{
a=true;
*rewardNode=QRectF(
qrand()%(this->width()/80)*80,
qrand()%(this->height()/80)*80,
nodeWidth,
nodeHeight);
for(int i=0;i<snake.length();i++){
if(snake[i]==*rewardNode)a=false;
}
}while(!a);
}
吃掉奖励
当蛇头与奖励的坐标重合时,则被认为是成功吃掉奖励,返回是true。
bool Widget::rewardEat(){
if(snake[0]==*rewardNode)return true;
else return false;
}
游戏结束
当蛇头与身体的某一个部分重合时,则被认为游戏结束,返回true。
bool Widget::checkContact(){
for(int i=0;i<snake.length();i++){
for(int j=i+1;j<snake.length();j++){
if(snake[i]==snake[j]){
return true;
}
}
}
return false;
}
添加背景等
通过画笔的形式为游戏添加背景,音乐等,增添游戏效果。
void Widget::paintEvent(QPaintEvent *event){
QPainter painter(this);
QPen pen;
QBrush brush;
//背景图片
QPixmap pix;
pix.load("C:/Qt/tanchSnake/tanchSnake/cxk.png");
//图片大小
painter.drawPixmap(0,0,800,640,pix);
//画奖品
QPixmap c;
c.load("C:/Qt/tanchSnake/tanchSnake/reward.png");
painter.drawPixmap(rewardNode->x(),rewardNode->y(),nodeWidth,nodeHeight,c);
//画蛇
QPixmap a;
a.load("C:/Qt/tanchSnake/tanchSnake/head.png");
QPixmap b;
b.load("C:/Qt/tanchSnake/tanchSnake/body.png");
painter.drawPixmap(snake[0].x(),snake[0].y(),nodeWidth,nodeHeight,a);
for(int i=1;i<snake.length();i++){
painter.drawPixmap(snake[i].x(),snake[i].y(),nodeWidth,nodeHeight,b);
}