board.h

#ifndef BOARD_H
#define BOARD_H #define MAX_X 40
#define MAX_Y 30
#define NORMAL_LABEL 0//普通label
#define BORDER_LABEL 1//边界label
#define SNAKE_LABEL 2//蛇身label
#define FOOD_LABEL 3//食物label #include <QWidget>
#include <QLabel>
#include <QList>
#include <QTimer>
#include <QKeyEvent> struct Node{
    QLabel *label;
    int type;//边界:1   蛇身:2  普通:0 食物:3
    int x;
    int y;
}; class Board : public QWidget
{
    Q_OBJECT
public:
    explicit Board(QWidget *parent = 0);
    void init();
    void drawBorder();//画边界
    void initSnake();
    void moveStep();
    void getHeadTail();//得到头和尾
    bool left();//判断是否能上下左右移动
    bool right();
    bool up();
    bool down();
    void keyPressEvent(QKeyEvent *e);//键盘事件
//    void gameover();
//    void showAllType();
    void generateFood();//生成食物 signals: public slots:
    void slotMoveStep();//槽函数,可以当做普通函数使用 private:
    Node *matrix[MAX_X][MAX_Y];
    QList<Node*> snake;//蛇身     int dx, dy;
    Node *head;//蛇头指针
    Node *tail;//蛇尾指针     QTimer timer; }; #endif // BOARD_H

boarder.cpp

#include "board.h"
#include <QDebug>
#include <QString>
#include <QTimer>
#include <QMessageBox>
#include <QKeyEvent>
#include <ctime> Board::Board(QWidget *parent) :
    QWidget(parent)
{
    this->setWindowTitle("贪吃蛇");
    init();//初始化
    drawBorder();//画边界
    initSnake();//初始化蛇身
    moveStep();     generateFood();//初始化完就产生一个食物     connect(&timer, SIGNAL(timeout()), this, SLOT(slotMoveStep()));
    timer.start(100); } void Board::init(){
    int gridSize = 25;     for(int x = 0; x < MAX_X; x++){
        for(int y = 0; y < MAX_Y; y++){
            QLabel *label = new QLabel(this);
            label->setStyleSheet("background:red");
            label->setGeometry(x * gridSize, y * gridSize, gridSize - 1, gridSize - 1);
            label->hide();
            matrix[x][y]= new Node;
            matrix[x][y]->label =label;
            matrix[x][y]->type = NORMAL_LABEL;//将所有的都初始化成普通label
            matrix[x][y]->x = x;
            matrix[x][y]->y = y;
        }
    }
} void Board::drawBorder(){//画边界
    for(int x = 0; x < MAX_X; x++){
        for(int y = 0; y < MAX_Y; y++){
            if(x == 0 || x == MAX_X - 1 || y == 0 || y == MAX_Y - 1){
                matrix[x][y]->label->show();
                matrix[x][y]->type = BORDER_LABEL;//边界label
            }
        }
    }
} void Board::initSnake(){//画蛇身
    int x0 = 5, y0 = 5;
    int snakeLen = 5;//初始蛇身长5     dx = 1;
    dy = 0;
    snake.clear();
    for(int x = x0; x < x0 + snakeLen; x++){         snake.append(matrix[x][y0]);
        snake.at(snake.length() - 1)->x = x;
        snake.at(snake.length() - 1)->y = y0;
        matrix[x][y0]->type = SNAKE_LABEL;//蛇身label
        matrix[x][y0]->label->show();
    } } void Board::moveStep(){
    getHeadTail();//获取蛇头和蛇尾指针
    Node *n = matrix[head->x + dx][head->y + dy];
    n->label->show();
    //n是即将变成蛇头的那个label
    if(n->type == BORDER_LABEL || n->type == SNAKE_LABEL){
        qDebug() << "Game over@!!!";
        timer.stop();
        QMessageBox::information(this, "提示", "*** Game Over ***", QMessageBox::Ok);
    }else{
        if(n->type == FOOD_LABEL){//吃到食物了
            n->type = SNAKE_LABEL;
            snake.append(n);
            //不移除尾巴
            generateFood();//生成下一个食物
        }else{
            n->type = SNAKE_LABEL;
            snake.append(n);
            tail->label->hide();
            tail->type = NORMAL_LABEL;
            snake.removeFirst();
        }
    }
} void Board::getHeadTail(){
    head = snake.at(snake.length() - 1);//蛇头其实是list的尾巴
    tail = snake.at(0);//蛇尾其实是list的第一个元素
    //    gameover();
} void Board::slotMoveStep(){
    //    qDebug() << "movestep";
    moveStep();
} void Board::keyPressEvent(QKeyEvent *e){
    //qDebug() << Qt::Key_up;
    qDebug() << e->key();
    switch (e->key()) {
    case 16777235://上
        if(up()){
            dy = -1;
            dx = 0;
        }
        break;
    case 16777237://下
        if(down()){
            dy = 1;
            dx = 0;
        }
        break;
    case 16777234://左
        if(left()){
            dx = -1;
            dy = 0;
        }
        break;
    case 16777236://右
        if(right()){
            dx = 1;
            dy = 0;
        }
        break;
    default:
        break;;
    }
} void Board::generateFood(){//生成食物
    int food_x,food_y;
    srand((unsigned)time(0));
    do{
        food_x = rand()%MAX_X;
        food_y = rand()%MAX_Y;
    }while(matrix[food_x][food_y]->type != NORMAL_LABEL);
//    matrix[food_x][food_y]->label->setText("food");
    matrix[food_x][food_y]->type = FOOD_LABEL;
    matrix[food_x][food_y]->label->show(); } bool Board::left(){
    if(dy == 0){//向左或向右走
        return false;
    }
    return true;
} bool Board::right(){
    if(dy == 0){//向左或向右走
        return false;
    }
    return true;
} bool Board::up(){
    if(dx == 0){//向上或向下走
        return false;
    }
    return true;
} bool Board::down(){
    if(dx == 0){//向上或向下走
        return false;
    }
    return true;
}

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/2F/2E/wKiom1Oeqa-ymO_qAAG6R9KtXxQ333.jpg" title="QQ截图20140616161726.png" alt="wKiom1Oeqa-ymO_qAAG6R9KtXxQ333.jpg" />

本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/1426968

QT实现贪吃蛇的更多相关文章

  1. QT下的贪吃蛇

    QT写的贪吃蛇,学习于https://www.devbean.net/2012/12/qt-study-road-2-snake-1/ 建议就学习一下开发思想,开发游戏还是用专门的编译器. 多加了墙, ...

  2. Qt 学习之路 2(34):贪吃蛇游戏(4)

    Qt 学习之路 2(34):贪吃蛇游戏(4) 豆子 2012年12月30日 Qt 学习之路 2 73条评论 这将是我们这个稍大一些的示例程序的最后一部分.在本章中,我们将完成GameControlle ...

  3. Qt 学习之路 2(33):贪吃蛇游戏(3)

    Qt 学习之路 2(33):贪吃蛇游戏(3) 豆子 2012年12月29日 Qt 学习之路 2 16条评论 继续前面一章的内容.上次我们讲完了有关蛇的静态部分,也就是绘制部分.现在,我们开始添加游戏控 ...

  4. Qt 学习之路 2(32):贪吃蛇游戏(2)

    Qt 学习之路 2(32):贪吃蛇游戏(2) 豆子 2012年12月27日 Qt 学习之路 2 55条评论 下面我们继续上一章的内容.在上一章中,我们已经完成了地图的设计,当然是相当简单的.在我们的游 ...

  5. Qt 学习之路 2(31):贪吃蛇游戏(1)

    Qt 学习之路 2(31):贪吃蛇游戏(1) 豆子 2012年12月18日 Qt 学习之路 2 41条评论 经过前面一段时间的学习,我们已经了解到有关 Qt 相当多的知识.现在,我们将把前面所讲过的知 ...

  6. easyx图形库做贪吃蛇游戏

    编程总是对着一个黑窗口,可以说是非常乏味了,于是喵喵就翻出来了以前用easyx图形库做图形界面的贪吃蛇游戏. 不过大家只是当做提高编程的乐趣来学习吧,想进一步做的话可以学习QT,还有其他的框架. 这是 ...

  7. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  8. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  9. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

随机推荐

  1. linux下使用 du查看某个文件或目录占用磁盘空间的大小

    du -ah --max-depth=1     这个是我想要的结果  a显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小但是由于用了--max-depth选项,表示显示目录下所有 ...

  2. 原 JQuery监听页面滚动总结

    1.当前滚动的地方的窗口顶端到整个页面顶端的距离: var winPos = $(window).scrollTop(); 2.获取指定元素的页面位置: $(val).offset().top; 3. ...

  3. perl sub

    #/usr/bin/perl -w use strict; my $usage = "\n\nusage: $0 <length>\n\n"; my $length = ...

  4. 【BZOJ-2836】魔法树 树链剖分

    2836: 魔法树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 323  Solved: 129[Submit][Status][Discuss] ...

  5. 【BZOJ-3156】防御准备 DP + 斜率优化

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 951  Solved: 446[Submit][Status][Discuss] ...

  6. SSH无密码登陆Agent admitted failure to sign using the key

    A :CentOS_Master B:Slave_1 C:Slave_2 普通用户hxsyl 1.现在A 上 ssh-keygen -t rsa 一路回车,不需要输入密码 执行该操作将在/home/h ...

  7. 用WebBrowser采集渲染后的HTML页面

    主要用于微信的文章采集,如果用单纯的HttpClient采集,会出现页面无法渲染的情况: 经过研究发觉公众文章html页面是经过渲染之后显示的,那么思路来了,如果在dotnet的环境下,用WebBro ...

  8. poj3675 求多边形与圆的面积交

    题意:给出多边形的顶点坐标.圆的圆心坐标和半径,求面积交 sol:又是模板题啦= = 注意poj的C++好像认不出hypot函数,要稍微改写一下. hypot(double x,double y):即 ...

  9. RabbitMQ配置文件

    配置文件Config 在Web的可视化管理界面中可以看到一些文件的路径 比如 Config文件的地址 数据库存放的文件夹 log文件的地址 进入到这个文件夹会发现有这些文件,其中example是con ...

  10. Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property 'xxx': no matching editors or conversion strategy found

    今天在完成项目的时候遇到了下面的异常信息: 04-Aug-2014 15:49:27.894 SEVERE [http-apr-8080-exec-5] org.apache.catalina.cor ...