免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2050 | 回复: 1
打印 上一主题 下一主题

gtk snake [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-10 14:57 |只看该作者 |倒序浏览
本帖最后由 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“时候,它才会走,而且每次走一两步就停了,
找了好久都没找到错误,求高手指点下。。。。。。

论坛徽章:
0
2 [报告]
发表于 2011-05-10 15:19 |只看该作者
给自己顶一下、。。。。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP