• 4566阅读
  • 1回复

[提问]QT实现贪吃蛇// x/20*20什么意思 [复制链接]

上一主题 下一主题
离线mirro
 
只看楼主 倒序阅读 楼主  发表于: 2012-04-11

  1. #ifndef SNAKE_H
  2. #define SNAKE_H
  3. #include<QDialog>
  4. #include<QLabel>
  5. #include <QList>
  6. #include <QFrame>
  7. #include <QPalette>
  8. #include <QColor>
  9. #include <QApplication>
  10. #include <QMessageBox>
  11. #include <QTime>
  12. enum Direction{d_up,d_down,d_left,d_right};//o代表d_up? 1代表d_down? 10代表d_left?
  13. class Snake:public QDialog{
  14. Q_OBJECT
  15. private:
  16. QLabel *food;
  17. QList<QLabel*> data;
  18. int maxlen;
  19. int speed;
  20. Direction dire; //枚举类型的变量?
  21. public :
  22. Snake();
  23. ~Snake();
  24. public slots:
  25. void snakemove();
  26. public:
  27. void keyPressEvent(QKeyEvent *e);
  28. void timerEvent(QTimerEvent *e);
  29. /*生成食物的函数 */
  30. QLabel* getFood();
  31. };
  32. #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(){
  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, //20像素移动一步
  75. (qrand()%(y/20))*20);
  76. return food;
  77. }

离线zzh12215
只看该作者 1楼 发表于: 2012-04-28
food->move((qrand()%(x/20))*20, (qrand()%(y/20))*20); //20像素移动一步

这里的注释 //20像素移动一步  有问题吧


这是随机生成一个 点,这个点的可能出现的横坐标为: 20的倍数,但小于屏幕宽x
纵坐标类似
快速回复
限100 字节
 
上一个 下一个