gtk snake

发布于 2022-10-15 07:23:18 字数 13929 浏览 22 评论 0

本帖最后由 DNFCF 于 2011-05-10 15:01 编辑

  1. #include<gtk/gtk.h>
  2. #include<gdk/gdkkeysyms.h>
  3. #define LEFT 1
  4. #define UP 2
  5. #define RIGHT 3
  6. #define DOWN 4
  7. #define MAXLENGTH 20
  8. #define WIDTH 30
  9. #define HEIGHT 20
  10. struct _point
  11. {
  12.         int x;
  13.         int y;
  14. };
  15. typedef struct _point point;
  16. GdkPixbuf *pixbuf=NULL;
  17. GdkPixbuf *pix1=NULL;
  18. GdkPixbuf *pix2=NULL;
  19. GtkWidget *image[WIDTH][HEIGHT];
  20. gint locate[MAXLENGTH][2];
  21. gint slength=0;
  22. gint forward=DOWN;
  23. gint now_forward=DOWN;
  24. gint headx;
  25. gint heady;
  26. gint tailx;
  27. gint taily;
  28. gint beanx;
  29. gint beany;
  30. static gint timer=0;
  31. void init(gint length);
  32. void bean();
  33. point rand_point();
  34. void move();
  35. void erase();
  36. void draw();
  37. void clean();
  38. point rand_point()
  39. {
  40.         point p;
  41.         p.x=g_random_int_range(0,WIDTH);
  42.         p.y=g_random_int_range(0,HEIGHT);
  43.         return p;
  44. }
  45. int is_bean_right_place(point p)
  46. {
  47.         int i=0;
  48.         for(;i<slength;i++)
  49.                 if(p.x==locate[i][0]&&p.y==locate[i][1])
  50.                         return 0;
  51.         return 1;
  52. }
  53. void bean()
  54. {
  55.         point p=rand_point();
  56.         while(!is_bean_right_place(p)) p=rand_point();
  57.         gtk_image_set_from_pixbuf(GTK_IMAGE(image[p.x][p.y]),pix2);
  58.         beanx=p.x;
  59.         beany=p.y;
  60. }
  61. void erase()
  62. {
  63.         g_print("enter erase....\n");
  64.         gtk_image_set_from_pixbuf(GTK_IMAGE(image[tailx][taily]),pixbuf);
  65.         g_print("out erase....\n");
  66. }
  67. void draw()
  68. {
  69.         g_print("enter draw....\n");
  70.         gtk_image_set_from_pixbuf(GTK_IMAGE(image[headx][heady]),pix1);
  71.         g_print("out draw....\n");
  72. }
  73. void init(gint length)
  74. {
  75.         int i=0;
  76.         slength=length;
  77.         for(i;i<length;i++)
  78.         {
  79.                 locate[i][0]=5;
  80.                 locate[i][1]=i;
  81.                 gtk_image_set_from_pixbuf(GTK_IMAGE(image[5][i]),pix1);
  82.         }
  83.        
  84. }
  85. void move()
  86. {
  87.         gint len=slength-1;
  88.         headx=locate[len][0];
  89.         heady=locate[len][1];
  90.         tailx=locate[0][0];
  91.         taily=locate[0][1];
  92.         erase();
  93.         switch(forward)
  94.         {
  95.                 case UP:
  96.                 heady--;
  97.                 if(heady==-1) heady=HEIGHT-1;
  98.                 break;
  99.                 case DOWN:
  100.                 heady++;
  101.                 if(heady==HEIGHT) heady=0;
  102.                 break;
  103.                 case LEFT:
  104.                 headx--;
  105.                 if(headx==-1) headx=WIDTH-1;
  106.                 break;
  107.                 case RIGHT:
  108.                 headx++;
  109.                 if(headx==WIDTH) headx=0;
  110.                 break;
  111.         }//switch
  112.         int i=0;
  113.         for(;i<slength;i++)
  114.         {
  115.                 locate[i][0]=locate[i+1][0];
  116.                 locate[i][1]=locate[i+1][1];
  117.         }
  118.         locate[len][0]=headx;
  119.         locate[len][1]=heady;
  120.         draw();
  121.         if(headx==beanx&&heady==beany)
  122.         {
  123.         }
  124. }
  125. void game_run()
  126. {
  127.         move();
  128. }
  129. void start_button_clicked(GtkWidget *widget,gpointer data)
  130. {
  131.         timer=gtk_timeout_add(50,(GtkFunction)game_run,NULL);
  132. }
  133. void stop_button_clicked(GtkWidget *widget ,gpointer data)
  134. {
  135.         gtk_timeout_remove(timer);
  136. }
  137. void key_press(GtkWidget *widget ,GdkEventKey *event,gpointer data)
  138. {
  139.         switch(event->keyval)
  140.         {
  141.                 case GDK_Up:
  142.                 if(forward!=DOWN)
  143.                         forward=now_forward=UP;
  144.                 break;
  145.                 case GDK_Down:
  146.                 if(forward!=UP)
  147.                         forward=now_forward=DOWN;       
  148.                 break;
  149.                 case GDK_Left:
  150.                 if(forward!=RIGHT)
  151.                         forward=now_forward=LEFT;
  152.                 break;
  153.                 case GDK_Right:
  154.                 if(forward!=LEFT)
  155.                         forward=now_forward=RIGHT;
  156.                 break;
  157.         }//switch
  158. }
  159. int main(int argc,char **argv)
  160. {
  161.         GtkWidget *window;
  162.         GtkWidget *vbox;
  163.         GtkWidget *start_button;
  164.         GtkWidget *stop_button;
  165.         GtkWidget *sep;
  166.         GtkWidget *bbox;
  167.         GtkWidget *table;
  168.         gtk_init(&argc,&argv);
  169.         window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  170.         gtk_window_set_default_size(GTK_WINDOW(window),600,500);
  171.         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  172.         gtk_container_set_border_width(GTK_CONTAINER(window),5);
  173.        
  174.         vbox=gtk_vbox_new(FALSE,0);
  175.         gtk_container_add(GTK_CONTAINER(window),vbox);
  176.         pixbuf=gdk_pixbuf_new_from_file("white20.png",NULL);
  177.         pix1=gdk_pixbuf_new_from_file("snake.png",NULL);
  178.         pix2=gdk_pixbuf_new_from_file("bean.png",NULL);
  179.        
  180.         table=gtk_table_new(WIDTH,HEIGHT,FALSE);
  181.         int i,j;       
  182.         for(i=0;i<WIDTH;i++)
  183.                 for(j=0;j<HEIGHT;j++)
  184.                 {
  185.                         image[i][j]=gtk_image_new_from_pixbuf(pixbuf);
  186.                         gtk_widget_set_size_request(image[i][j],20,20);
  187.                         gtk_table_attach(GTK_TABLE(table),
  188.                                                          image[i][j],
  189.                                                          i,i+1,
  190.                                                          j,j+1,
  191.                                                          GTK_FILL|GTK_EXPAND,
  192.                                                          GTK_FILL|GTK_EXPAND,
  193.                                                          0,0);
  194.                 }
  195.         gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0);
  196.        
  197.         sep=gtk_hseparator_new();
  198.         gtk_box_pack_start(GTK_BOX(vbox),sep,TRUE,TRUE,5);
  199.         bbox=gtk_hbutton_box_new();
  200.        
  201.         gtk_box_pack_start(GTK_BOX(vbox),bbox,FALSE,FALSE,0);
  202.         GtkWidget *label=gtk_label_new("snake length : 1");
  203.         gtk_box_pack_start(GTK_BOX(bbox),label,FALSE,FALSE,0);
  204.         start_button=gtk_button_new_with_label("Start");
  205.         gtk_box_pack_start(GTK_BOX(bbox),start_button,FALSE,FALSE,0);
  206.         stop_button=gtk_button_new_with_label("Stop");
  207.         gtk_box_pack_start(GTK_BOX(bbox),stop_button,FALSE,FALSE,0);
  208.         g_signal_connect(start_button,"clicked",G_CALLBACK(start_button_clicked),NULL);
  209.         g_signal_connect(stop_button,"clicked",G_CALLBACK(stop_button_clicked),NULL);
  210.         g_signal_connect(G_OBJECT(window),"key_press_event",G_CALLBACK(key_press),NULL);
  211.         g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
  212.        
  213.         init(5);
  214.         bean();
  215.         gtk_widget_show_all(window);
  216.         gtk_main();
  217.         return FALSE;
  218.        
  219. }

复制代码模仿写了一个snake小游戏,可是每次它不会自动的走,只有每次按下按钮”start“时候,它才会走,而且每次走一两步就停了,
找了好久都没找到错误,求高手指点下。。。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

御守 2022-10-22 07:23:18

给自己顶一下、。。。。。。。。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文