Qt C++ 贪吃蛇。上下左右健只设置了蛇对应的移动,为什么在添加三个radiobutton或下拉列表来选择游戏难度的时候,按上下键蛇并不动反而是按钮的值变呢
#include "snake.h"
#include "ui_snake.h"
#include <QPainter>
#include <QKeyEvent>
#define SNAKE_NODE_WIDTH 15
#define SNAKE_NODE_HEIGHT 15
snake::snake(QWidget *parent) :
QWidget(parent),
ui(new Ui::snake)
{
ui->setupUi(this);
snakeBody<<QRect(105,105,SNAKE_NODE_WIDTH,SNAKE_NODE_HEIGHT)
<<QRect(120,105,SNAKE_NODE_WIDTH,SNAKE_NODE_HEIGHT)
<<QRect(135,105,SNAKE_NODE_WIDTH,SNAKE_NODE_HEIGHT)
<<QRect(150,105,SNAKE_NODE_WIDTH,SNAKE_NODE_HEIGHT);
food=QRect((qrand()%(width()/SNAKE_NODE_WIDTH))*SNAKE_NODE_WIDTH,
(qrand()%(height()/SNAKE_NODE_HEIGHT))*SNAKE_NODE_HEIGHT,
SNAKE_NODE_WIDTH,
SNAKE_NODE_HEIGHT);
curDir=RIGHT;
rank0=1000;
startTimer(rank0);
}
snake::~snake()
{
delete ui;
}
void snake::paintEvent(QPaintEvent *e){
QPainter p(this);
foreach(QRect r,snakeBody){//画出蛇身
p.drawRect(r);
}
p.drawRect(food);//画出食物
//head=snakeBody.first();
if(ui->easy->isChecked())
rank0=1000;
if(ui->common->isChecked())
rank0=500;
if(ui->difficult->isChecked())
rank0=100;
}
void snake::timerEvent(QTimerEvent *e){
head=snakeBody.first();
//head.setX(snakeBody.last().x()+SNAKE_NODE_WIDTH);
//head.setY(snakeBody.last().y());
switch (curDir) {
case UP:head.setX(snakeBody.last().x());
head.setY(snakeBody.last().y()-SNAKE_NODE_HEIGHT);
break;
case DOWN:head.setX(snakeBody.last().x());
head.setY(snakeBody.last().y()+SNAKE_NODE_HEIGHT);
break;
case LEFT:head.setX(snakeBody.last().x()-SNAKE_NODE_WIDTH);
head.setY(snakeBody.last().y());
break;
case RIGHT:head.setX(snakeBody.last().x()+SNAKE_NODE_WIDTH);
head.setY(snakeBody.last().y());
break;
}
head.setSize(QSize(SNAKE_NODE_WIDTH,SNAKE_NODE_HEIGHT));
if(head!=food){
snakeBody.takeFirst();
}
else{
food=QRect((qrand()%(width()/SNAKE_NODE_WIDTH))*SNAKE_NODE_WIDTH,
(qrand()%(height()/SNAKE_NODE_HEIGHT))*SNAKE_NODE_HEIGHT,
SNAKE_NODE_WIDTH,
SNAKE_NODE_HEIGHT);
}
snakeBody.append(head);
ui->score->display(snakeBody.count()*10);
update();
}
void snake::keyPressEvent(QKeyEvent *e){
if(e->key()==Qt::Key_Up){
curDir=UP;
}
if(e->key()==Qt::Key_Down){
curDir=DOWN;
}
if(e->key()==Qt::Key_Left){
curDir=LEFT;
}
if(e->key()==Qt::Key_Right){
curDir=RIGHT;
}
update();
}