使用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. 单元测试中使用mock最好不要使用easymock而应该使用powermock
  2. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )
  3. C++继承机制下的析构函数
  4. 高清晰电影的文件后缀解析
  5. python画一个点_pygame学习笔记(2):画点的三种方法和动画实例
  6. C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
  7. ubuntu Could not get lock /var/lib/dpkg/lock解决方法
  8. GPU Raycasting的两种实现方法
  9. 12-17 学习记录
  10. Ubuntu 14.04 LTC 有线网络--网线不识别,灯不亮问题
  11. WEEX|初始化工程
  12. contourlet matlab 源码,contourlet_toolbox matlab 238万源代码下载- www.pudn.com
  13. 如何开启Windows远程桌面服务
  14. WSL:关闭WSL【vmmem 进程占用CPU资源的解决办法】
  15. 哈佛大学凌晨4点半的景象--哈佛图书馆的二十条训言
  16. element-ui手风琴自定义html,element-ui中el-table expand 手风琴效果,展开里面的内容或者ta...
  17. Virustotal——md5转sha256
  18. C++Primer第五版 第十二章习题答案(1~10)
  19. vue父组件往子组件传值时报错Property or method 选择操作人 is not defined on the instance but referenced during rende
  20. Concurrency and Race Conditions

热门文章

  1. matlab提取海岸线,遥感自动提取海岸线方法.PDF
  2. 国服Dota2与Steam冲突问题解决
  3. 使用table元素写一个个人简历表格
  4. Selenium ChromeDriver 截图标记指定元素的方法
  5. Python程式與數據資料分析1
  6. [每日一题]746. 使用最小花费爬楼梯
  7. xUtils网络请求时的参数问题
  8. 判赔 189 万!世界之窗浏览器过滤腾讯视频广告
  9. Selenium WebDriver找不到元素的三种情况
  10. Javascript常用的十大设计模式详解