• 3118阅读
  • 2回复

[提问]QT贪吃蛇程序求解!//带注释 [复制链接]

上一主题 下一主题
离线r187111
 
只看楼主 倒序阅读 楼主  发表于: 2012-02-19
  1. #include <QMessageBox>
  2. #include <QTime>
  3. enum Direction{d_up,d_down,d_left,d_right};//o代表d_up? 1代表d_down? 10代表d_left?
  4. class Snake:public QDialog{
  5. Q_OBJECT
  6. private:
  7. QLabel *food;
  8. QList<QLabel*> data;
  9. int maxlen;
  10. int speed;
  11. Direction dire; //枚举类型的变量?
  12. public :
  13. Snake();
  14. ~Snake();
  15. public slots:
  16. void snakemove();
  17. public:
  18. void keyPressEvent(QKeyEvent *e);
  19. void timerEvent(QTimerEvent *e);
  20. /*生成食物的函数 */
  21. QLabel* getFood();
  22. };
  23. #endif // SNAKE_H
  1. #include "Snake.h"
  2. #include <QKeyEvent>
  3. #include <QTime>
  4. Snake::Snake(){
  5. qsrand(QTime::currentTime().msec());
  6. this->resize(600,500);
  7. data.push_back(getFood());
  8. // data[0]->show();
  9. dire=d_right;
  10. speed=20;
  11. this->startTimer(300);
  12. getFood();
  13. }
  14. Snake::~Snake(){
  15. }
  16. void Snake::snakemove(){
  17. int nhx=data[0]->x();
  18. int nhy=data[0]->y();
  19. if(nhx==food->x()&&nhy==food->y()){
  20. data.push_back(food);
  21. food=getFood();
  22. food->show();
  23. }
  24. switch(dire){
  25. case d_up:
  26. nhy=nhy-20;
  27. break;
  28. case d_down:
  29. nhy=nhy+20;
  30. break;
  31. case d_left:
  32. nhx=nhx-20;
  33. break;
  34. case d_right:
  35. nhx=nhx+20;
  36. break;
  37. }
  38. /*从data中的最后一个元素 */
  39. for(int i=data.size()-1;i>0;i--){
  40. data[i]->move(data[i-1]->x(),data[i-1]->y());
  41. }
  42. data[0]->move(nhx,nhy);
  43. if(nhx<=0||nhx>=this->width()||
  44. nhy<=0||nhy>=this->height()){
  45. this->close();
  46. }
  47. }
  48. void Snake::keyPressEvent(QKeyEvent *e){
  49. /*判断 到底那个键被按下*/
  50. if(e->key()==Qt::Key_Up){
  51. dire=d_up;
  52. }else if(e->key()==Qt::Key_Down){
  53. dire=d_down;
  54. }else if(e->key()==Qt::Key_Left){
  55. dire=d_left;
  56. }else if(e->key()==Qt::Key_Right){
  57. dire=d_right;
  58. }else{
  59. ;
  60. }
  61. }
  62. void Snake::timerEvent(QTimerEvent *e){
  63. snakemove();
  64. }
  65. /*生成食物的函数 */
  66. QLabel* Snake::getFood(){//为啥返回值类型是QLabel类型的指针?
  67. food=new QLabel(this);
  68. food->resize(20,20);
  69. food->setAutoFillBackground(true);
  70. food->setFrameShape(QFrame::Box);
  71. food->setPalette(QPalette(QColor(255,0,0)));
  72. int x=this->width();
  73. int y=this->height();
  74. food->move((qrand()%(x/20))*20,
  75. (qrand()%(y/20))*20);

  1. #include "Snake.h"
  2. #include <QApplication>
  3. int main(int argc,char**argv){
  4. QApplication app(argc,argv);
  5. Snake sn;
  6. sn.show();//show();函数的作用是通过sn调用头文件的Snake这个类内所有函数?
  7. return app.exec();
  8. }



离线kalxd

只看该作者 1楼 发表于: 2012-02-19
//为啥返回值类型是QLabel类型的指针?
因为他用一个填充红色的label来表示食物。
离线r187111
只看该作者 2楼 发表于: 2012-02-21
回 1楼(kalxd) 的帖子
姐姐,谢谢了。
sn.show();//show();函数的作用是通过sn调用头文件的Snake这个类内所有函数?
快速回复
限100 字节
 
上一个 下一个