贪吃蛇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);/*按键大小*/