使用C语言以及gtk编程设计一个贪吃蛇游戏。
功能需求:
(1)窗口界面设计:创建各种窗口和按钮标签等;
(2)小蛇移动控制:按键盘上的上下左右键控制小蛇上下左右移动;
(3)游戏进程控制:若小蛇碰到界面中的豆子,则界面中豆子消失,小蛇变长;
(4)死亡判断:小蛇撞墙或撞到自己身体时即死亡,小蛇进入传送点时从另一特定。

main函数:

#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <stdlib.h>#define length 50
#define side 24GtkWidget *window;
GtkWidget *fixed;
GtkWidget *snake[length];
GtkWidget *food[length];
GtkWidget *border_up;
GtkWidget *border_down;
GtkWidget *border_left;
GtkWidget *border_right;
GtkWidget *game_pause;
GtkWidget *game_speed_label;
GtkWidget *game_speed[4];
GtkWidget *death;
GtkWidget *win;
GdkColor color[7];
gint function(gpointer data);
void up(void);
void down(void);
void left(void);
void right(void);
gboolean key_control(GtkWidget *widget,GdkEventKey *event);
void show_pause(void);
void speed_control0(void);
void speed_control1(void);
void speed_control2(void);
void eat(void);
void showwin(void);
void showdeath(void);
gpointer data;
gint sign;
int i=0;
int j=0;
int h=0;
int k=0;
int snake_x[length],snake_y[length],food_x[length],food_y[length];
int flag=3;
int jieshu=6;
int stop=1;
int speed=0;
int op_speed[3]={100,300,500};
char dir[4][4]={"上","下","左","右"};int main(int argc,char *argv[ ]){gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gdk_color_parse ("#00F0F0", &color[0]);//天蓝色gdk_color_parse ("#F00000", &color[1]);//红色gdk_color_parse ("#0F0000", &color[2]);//黑色gdk_color_parse ("#00F000", &color[3]);//绿色gdk_color_parse ("#F0F000", &color[4]);//黄色gdk_color_parse ("#F0F0F0", &color[5]);//无色gdk_color_parse ("#F0F0FF", &color[6]);//银白色1gtk_window_set_title(GTK_WINDOW(window),"Snake");gtk_widget_set_usize(window,580,480);gtk_widget_set_uposition(window,400,100);gtk_widget_modify_bg(window,GTK_STATE_NORMAL,&color[0]);g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);gtk_window_set_resizable(GTK_WINDOW(window),FALSE);fixed=gtk_fixed_new();srand((int)time(0));for(j=0;j<length;j++){snake[j]=gtk_button_new_with_label("  ");food[j]=gtk_button_new_with_label("M");gtk_widget_set_size_request(snake[j],side,side);gtk_widget_set_size_request(food[j],side,side);gtk_widget_modify_bg(snake[j],GTK_STATE_NORMAL,&color[6]);gtk_widget_modify_bg(food[j],GTK_STATE_NORMAL,&color[3]);}for(j=0;j<length;j++){gtk_fixed_put(GTK_FIXED(fixed),snake[j],snake_x[j]=side*(6-j),snake_y[j]=side);}for(j=0;j<length;j++){gtk_fixed_put(GTK_FIXED(fixed),food[j],food_x[j]=side*(rand()%10)+side,food_y[j]=side*(rand()%10)+side);}for(j=0;j<6;j++){gtk_widget_show(snake[j]);}gtk_widget_show(food[0]);g_signal_connect(G_OBJECT(window), "key-press-event",G_CALLBACK(key_control),NULL);border_left=gtk_button_new();gtk_widget_set_sensitive(border_left,FALSE);border_right=gtk_button_new();gtk_widget_set_sensitive(border_right,FALSE);border_up=gtk_button_new();gtk_widget_set_sensitive(border_up,FALSE);border_down=gtk_button_new();gtk_widget_set_sensitive(border_down,FALSE);gtk_widget_modify_bg(border_up,GTK_STATE_NORMAL,&color[2]);gtk_widget_modify_bg(border_down, GTK_STATE_NORMAL,&color[2]);gtk_widget_modify_bg(border_left, GTK_STATE_NORMAL,&color[2]);gtk_widget_modify_bg(border_right,GTK_STATE_NORMAL,&color[2]);gtk_fixed_put(GTK_FIXED(fixed),border_left,15,15);gtk_fixed_put(GTK_FIXED(fixed),border_right,432,15);gtk_fixed_put(GTK_FIXED(fixed),border_up,15,15);gtk_fixed_put(GTK_FIXED(fixed),border_down,15,432);gtk_widget_set_size_request(border_up,580,10);gtk_widget_set_size_request(border_down,580,10);gtk_widget_set_size_request(border_left,10,425);gtk_widget_set_size_request(border_right,10,425);gtk_widget_show(border_up);gtk_widget_show(border_down);gtk_widget_show(border_left);gtk_widget_show(border_right);game_pause=gtk_button_new_with_label("空格 暂停");gtk_widget_modify_bg(game_pause,GTK_STATE_NORMAL,&color[6]);gtk_widget_set_size_request(game_pause,140,140);gtk_fixed_put(GTK_FIXED(fixed),game_pause,439,295);gtk_widget_set_sensitive(game_pause,FALSE);g_signal_connect(GTK_OBJECT(game_pause),"clicked",G_CALLBACK(show_pause),NULL);gtk_widget_show(game_pause);game_speed_label=gtk_button_new_with_label("游戏难度选择");gtk_widget_set_sensitive(game_speed_label,FALSE);game_speed[0]=gtk_button_new_with_label("1困难");game_speed[1]=gtk_button_new_with_label("2一般");game_speed[2]=gtk_button_new_with_label("3容易");gtk_widget_modify_bg(game_speed[0],GTK_STATE_NORMAL,&color[1]);gtk_widget_modify_bg(game_speed[1],GTK_STATE_NORMAL,&color[3]);gtk_widget_modify_bg(game_speed[2],GTK_STATE_NORMAL,&color[4]);gtk_fixed_put(GTK_FIXED(fixed),game_speed_label,465,75);for(j=0;j<3;j++){gtk_fixed_put(GTK_FIXED(fixed),game_speed[j],480,125+45*j);}g_signal_connect(GTK_OBJECT(game_speed[0]),"clicked",G_CALLBACK(speed_control0),NULL);g_signal_connect(GTK_OBJECT(game_speed[1]),"clicked",G_CALLBACK(speed_control1),NULL);g_signal_connect(GTK_OBJECT(game_speed[2]),"clicked",G_CALLBACK(speed_control2),NULL);gtk_widget_show(game_speed_label);for(j=0;j<3;j++){gtk_widget_show(game_speed[j]);}death=gtk_button_new_with_label("!!!你输了!!!");gtk_widget_modify_bg(death, GTK_STATE_NORMAL,&color[6]);gtk_widget_set_size_request(death,200,100);gtk_fixed_put(GTK_FIXED(fixed),death,120,150);g_signal_connect(GTK_OBJECT(death),"clicked",G_CALLBACK(gtk_main_quit),NULL);gtk_container_add(GTK_CONTAINER(window),fixed);gtk_widget_show(fixed);gtk_widget_show(window);gtk_main();
}

蛇的移动控制,包括移动过程中的死亡判断;

gint function(gpointer data)//蛇移动控制
{int q;eat();if(!stop){switch(flag){case 0:if(snake_y[0]<48){showdeath();break;}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0],snake_y[0]-side);break;case 1:if(snake_y[0]>400){showdeath();break;}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0],snake_y[0]+side);break;case 2:if(snake_x[0]<48){showdeath();break;}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0]-side,snake_y[0]);break;case 3:if(snake_x[0]>400){showdeath();break;}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0]+side,snake_y[0]);break;}for(j=length-1;j>0;j--){gtk_fixed_move(GTK_FIXED(fixed),snake[j],snake_x[j]=snake_x[j-1],snake_y[j]=snake_y[j-1]);}switch(flag){case 0:snake_y[0]=snake_y[0]-side;break;case 1:snake_y[0]=snake_y[0]+side;break;case 2:snake_x[0]=snake_x[0]-side;break;case 3:snake_x[0]=snake_x[0]+side;break;}for(j=1;j<jieshu;j++){if(snake_x[0]==snake_x[j]&&snake_y[0]==snake_y[j]){showdeath();}}}
}

从键盘读取方向键以及空格,实现不同方向移动以及暂停。

gboolean key_control(GtkWidget *widget,GdkEventKey *event)//获取键盘事件
{if(k==0){if(strcmp(gdk_keyval_name(event->keyval),"1")==0)speed_control0();else if(strcmp(gdk_keyval_name(event->keyval),"2")==0)speed_control1();else if(strcmp(gdk_keyval_name(event->keyval),"3")==0)speed_control2();}else if(k==1){if(strcmp(gdk_keyval_name(event->keyval),"space")==0)show_pause();}else if(k==-1){if(strcmp(gdk_keyval_name(event->keyval),"Return")==0)gtk_main_quit();}if(!stop){if(strcmp(gdk_keyval_name(event->keyval),"Up")==0)up();else if(strcmp(gdk_keyval_name(event->keyval),"Down")==0)down();else if(strcmp(gdk_keyval_name(event->keyval),"Left")==0)left();else if(strcmp(gdk_keyval_name(event->keyval),"Right")==0)right();}
}void up(void)//设置上方向键控制方向
{if(flag!=1)flag=0;
}void down(void)//设置下方向键控制方向
{if(flag!=0)flag=1;
}void left(void)//设置左方向键控制方向
{if(flag!=3)flag=2;
}void right(void)//设置右方向键控制方向
{if(flag!=2)flag=3;
}void show_pause(void)//设置空格暂停
{if(i==0){stop=1;i=1;}else{stop=0;i=0;}
}

吃食物,其中包括蛇的定点传送功能。

void eat(void)//吃食物
{if((snake_x[0]==food_x[jieshu-6])&&(snake_y[0]==food_y[jieshu-6])){gtk_widget_show(snake[jieshu]);gtk_widget_hide(food[jieshu-6]); jieshu++;gtk_widget_show(food[jieshu-6]);
if(jieshu%5==0)
{gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0]=10*side,snake_y[0]=10*side);
}}
}

游戏难度设置,包括简单  一般  困难三个难度级,设置不同speed进行控制。

void speed_control0(void)//速度控制1
{gtk_widget_hide(game_speed[1]);gtk_widget_hide(game_speed[2]);speed=-1;k=1;sign=g_timeout_add(op_speed[speed],function,data);gtk_widget_set_sensitive(game_speed[0],FALSE);gtk_widget_set_sensitive(game_pause,TRUE);for(j=0;j<length;j++){gtk_widget_set_sensitive(snake[j],TRUE);gtk_widget_set_sensitive(food[j],TRUE);}sleep(0.7);stop=0;
}void speed_control1(void)//速度控制2
{gtk_widget_hide(game_speed[0]);gtk_widget_hide(game_speed[2]);speed=0;k=1;sign=g_timeout_add(op_speed[speed],function,data);gtk_widget_set_sensitive(game_speed[1],FALSE);gtk_widget_set_sensitive(game_pause,TRUE);for(j=0;j<length;j++) {gtk_widget_set_sensitive(snake[j],TRUE);gtk_widget_set_sensitive(food[j],TRUE);}sleep(0.7);stop=0;
}void speed_control2(void)//速度控制3
{gtk_widget_hide(game_speed[0]);gtk_widget_hide(game_speed[1]);speed=0.8;k=1;sign=g_timeout_add(op_speed[speed],function,data);gtk_widget_set_sensitive(game_speed[2],FALSE);gtk_widget_set_sensitive(game_pause,TRUE);for(j=0;j<length;j++){gtk_widget_set_sensitive(snake[j],TRUE);gtk_widget_set_sensitive(food[j],TRUE);}sleep(0.7);stop=0;
}

游戏失败判断

void showdeath(void)//游戏失败提示
{gtk_timeout_remove(sign);gtk_widget_set_sensitive(game_pause,FALSE);sleep(0.3);gtk_widget_show(death);k=-1;
}

改编自:https://www.doc88.com/p-1846392784521.html?r=1

增加撞到自己身体时即死亡,小蛇进入传送点时从另一特定或随机位置出来的功能。

使用C语言gtk编程一个贪吃蛇游戏设计与实现相关推荐

  1. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

  2. 完整版! 大一新手C语言数据结构实现简单贪吃蛇游戏

    大一新手C语言数据结构实现简单贪吃蛇游戏含源代码 贪吃蛇 1.前言简述 2.编写语言及工具 3.游戏的头文件代码(.h) 3.1map.h 3.2snake.h 3.3Food.h 4.游戏的源文件代 ...

  3. python游戏脚本实例-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  4. java gui怎么做游戏_Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】

    本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package sna ...

  5. python写一个游戏多少代码-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  6. java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏

    基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...

  7. 基于verilog贪吃蛇游戏设计

    概述 基于verilog贪吃蛇游戏设计.使用verilog语言 小游戏主要分为以下几个模块:顶层模块.VGA显示模块.蛇身控制模块.苹果控制模块. 系统主要分为顶层模块.VGA显示模块.蛇身控制模块. ...

  8. 【STM32单片机】贪吃蛇游戏设计

    文章目录 一.主要功能 二.硬件资源 1.硬件准备 2.硬件连接 四.软件设计 1.软件结构 2.主要代码 五.实验现象 联系作者 一.主要功能 系统运行后,TFTLCD触摸屏显示游戏界面,通过按键任 ...

  9. 字符版本贪吃蛇游戏设计及算法

    字符版本贪吃蛇游戏设计及算法 贪吃蛇,是一款经典的益智游戏.我们可以通过算法捕捉和传递智能,设计出能自动跑着吃食物的智能蛇. 有不少人对此研究,设计出了很棒的算法,如图: 归纳一些比较高级的算法为三类 ...

最新文章

  1. silverlight storyboard
  2. ondraw() 和dispatchdraw()的区别
  3. 在Spring中使用JDBCJobStore配置Quartz
  4. 阿里巴巴Java开发手册-使用JDK8的Opional类来防止出现NPE问题
  5. c语言多线程面试题,iOS面试题--网络多线程
  6. c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题
  7. [转]训练集和测试集的含义和区别?
  8. 第三章(循环) 编程题 2
  9. java sleep()和wait()的区别
  10. 【C++】STL-函数对象(仿函数)
  11. 怎么查看Java的源代码
  12. ONVIF协议--ONVIF协议简介
  13. 7天刷完剑指offer(一)
  14. 中国石油大学《社交礼仪》在线考试
  15. python调用百度地图,通过经纬度定位
  16. 使用注册表reg文件修复git bash git gui 右键快捷方式
  17. 和专业计算机男生谈恋爱,和不同专业的男生谈恋爱是什么感觉?
  18. 从初级晋级高级UI设计师学习路线+全套视频
  19. git仓库迁移(阿里云git切换到公司内部的gitlab)
  20. 【Arcgis】图层的置顶与置底

热门文章

  1. 2021-07-11-gdF103替换st103
  2. 1.openstreetmap获取路网信息
  3. 鸿蒙系统1007鸿蒙系统,1007 燃爆 | 华为“鸿蒙”真的来了!看完这些商标来历,网友们又激动了...
  4. 三元一次方程组例题_三元一次方程组练习题及答案(带过程)
  5. easymock安装和使用
  6. EXCEL如何分组排序,如何标记序,如何取指定的第n笔?
  7. docker insecure-registry
  8. 读书笔记:精益数据分析 第17-20章
  9. ebay API对接
  10. BWT901BLECL5.0连接Ubuntu