贪吃蛇C程序(gtk)

  • 格式:doc
  • 大小:1.64 MB
  • 文档页数:12

0

1

贪吃蛇源程序

#include

#include

#include

#include

#define length 10/*最长蛇节数*/

#define side 24/*每节蛇身以及食物的边长*/

#define p_prize 20/*特殊食物概率*/

GtkWidget *window;/*定义窗体*/

GtkWidget *fixed;/*定义固定容器构件*/

GtkWidget *snake[length];/*蛇的节数*/

GtkWidget *food[length];/*食物数*/

GtkWidget *border_up;/*上边界*/

GtkWidget *border_down;/*下边界*/

GtkWidget *border_left;/*左边界*/

GtkWidget *border_right;/*右边界*/

GtkWidget *game_score_label;/*当前分数标签*/

GtkWidget *game_score[2*length-12];/*当前分数值*/

GtkWidget *game_pause;/*游戏暂停*/

GtkWidget *game_speed_label;/*速度调节标签*/

GtkWidget *game_speed[4];/*当前速度*/

GtkWidget *death;/*游戏失败提示窗口*/

GtkWidget *win;/*游戏通关提示窗口*/

GtkWidget *direction[4];/*改变蛇的方向*/

GdkColor color[20];/*颜色值*/

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 j1=0;

int k=0;/*未设置速度前为0 游戏过程中为1 游戏结束时为-1*/ 2

int snake_x[length],snake_y[length],food_x[length],food_y[length];/*蛇及食物的坐标位置数组*/

int flag=3;/*方向标记*/

int jieshu=6;/*蛇当前节数*/

int stop=1;/*蛇停止运动时stop=1*/

int speed=0;

int op_speed[3]={100,300,500};

int prize[2*length-12]={0};

char

score[41][8]={"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40"};

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 ("#000F00", &color[4]);

gdk_color_parse ("#0000F0", &color[5]);

gdk_color_parse ("#00000F", &color[6]);

gdk_color_parse ("#F0F000", &color[7]);

gdk_color_parse ("#FF0000", &color[8]);

gdk_color_parse ("#0FF000", &color[9]);

gdk_color_parse ("#00FF00", &color[10]);

gdk_color_parse ("#F00F00", &color[11]);

gdk_color_parse ("#F000F0", &color[12]);

gdk_color_parse ("#F0F0F0", &color[13]);

gdk_color_parse ("#F0000F", &color[14]);

gdk_color_parse ("#0FF00F", &color[15]);

gdk_color_parse ("#00FFF0", &color[16]);

gdk_color_parse ("#F00FF0", &color[17]);

gdk_color_parse ("#FF00F0", &color[18]);

gdk_color_parse ("#F0F0FF", &color[19]);

gtk_window_set_title(GTK_WINDOW(window),"贪吃蛇 键盘、鼠标两种控制方式 游戏前请先选择难度 蛇不会咬到自己 彩色食物加分多");/*设定游戏标题*/

gtk_widget_set_usize(window,580,480);/*设置窗口大小*/

gtk_widget_set_uposition(window,400,100);/*设定窗口位置*/

g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); 3

gtk_window_set_resizable(GTK_WINDOW(window),FALSE);/*不允许修改窗口大小*/

fixed=gtk_fixed_new();/*创建固定容器构件*/

/*蛇与食物*/

srand((int)time(0));/*设置随机数种子*/

for(j=0;j

{

snake[j]=gtk_button_new_with_label("ss");/*创建蛇身*/

food[j]=gtk_button_new_with_label("food");/*创建食物*/

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[0]);

if((rand()%100+1)<=p_prize)

{

gtk_widget_modify_bg(food[j],GTK_STATE_NORMAL,&color[(rand()%19)+1]);

for(j1=j+1;j1<2*length-12;j1++)

{

prize[j1]++;

}

}

}

for(j=0;j

{

gtk_fixed_put(GTK_FIXED(fixed),snake[j],snake_x[j]=side*(6-j),snake_y[j]=side);/*蛇身初始位置设定*/

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++) /*初始显示6节蛇身*/

{

gtk_widget_show(snake[j]);/*显示蛇身*/

}

gtk_widget_show(food[0]);/*显示第一个食物*/

/*键盘按键控制方向*/

g_signal_connect(G_OBJECT(window), "key-press-event",

G_CALLBACK(key_control), NULL);

/*方向键鼠标控制*/

for(j=0;j<4;j++)

{

direction[j]=gtk_button_new_with_label(dir[j]);/*方向按键*/

gtk_widget_modify_bg(direction[j], GTK_STATE_NORMAL, &color[10]);

gtk_widget_set_size_request(direction[j],50,50);/*按键大小*/