贪吃蛇
2015-10-12 18:19
232 查看
#include <stdio.h> #include <windows.h> #include <time.h> #include <conio.h> #include <stdlib.h> int snake_len=1;//蛇的长度 int snake_loc[50][2]={31,12};//整条蛇的位置,最长为50 int snake_head[2]={31,12};//蛇头位置,初始值为11,12; int food[2];//食物位置 char snake_direction='s'; int delay=200; //蛇每delay个时间走一步 int eat_flag=0;//1表示吃了食物,0表示未吃 int life=0;//1表示死了,游戏该结束了;0表示还活着 void gotoxy(int x, int y)//定位光标,x为行坐标,y为列坐标 { COORD pos = {x,y};//(坐标 位置); HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //得到标准处理(标准输出处理); SetConsoleCursorPosition(hOut, pos);//设置控制台光标位置; } void hidden()//隐藏光标 { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=0;//赋1为显示,赋0为隐藏 SetConsoleCursorInfo(hOut,&cci); } void welcome_w() //欢迎界面; { hidden();//隐藏光标; gotoxy(22,10); printf("Welcome to GREEDY SNAKER!"); gotoxy(22,17); system("pause"); system("cls"); for(int i=3;i>0;i--) { gotoxy(33,10); printf("%d",i); Sleep(1000); } gotoxy(33,10); printf("GO!"); Sleep(1000); system("cls"); } void create_window()//创建窗口 { gotoxy(0,0); printf("********************************************************************************"); printf("* * *"); printf("* * *"); printf("* * 分数:1 *"); printf("* * 按键说明: *"); printf("* * 上:w *"); printf("* * 下:s *"); printf("* * 左:a *"); printf("* * 右:d *"); printf("* * 暂停:空格 *"); printf("* * 退出:Esc键 *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("* * *"); printf("********************************************************************************"); } void init()//初始化 { int i; snake_len=1;//蛇的长度 snake_loc[0][0]=31;//整条蛇的位置 snake_loc[0][1]=12; snake_head[0]=31;//蛇头位置,初始值为31,12; snake_head[1]=12; snake_direction='s'; delay=200; eat_flag=0; life=0; for(i=1;i<50;i++) { snake_loc[i][0]=0;//整条蛇的位置 snake_loc[i][1]=0; } } void update_score()//更新分数,蛇吃一个食物为10分; { gotoxy(73,3); printf("%2d",(snake_len-1)*10); } void create_food()//产生食物的位置 { time_t t; srand(time(&t)); //以时间为随机种子; while(1) { food[0]=rand()%62+1;//生成1~62之间的随机数 food[1]=rand()%22+1;//生成1~22之间的随机数 if(food[0]!=snake_head[0]&&food[1]!=snake_head[1])break; } gotoxy(food[0],food[1]); printf("*"); } void direction() //接收按键; { char keyhit=0,i; while(kbhit()!=0)keyhit=getch(); if( ((keyhit=='a') || (keyhit=='d') || (keyhit=='w') || (keyhit=='s')) && (abs(snake_direction/16-keyhit/16)==1) )snake_direction=keyhit; else if(keyhit==' ') { gotoxy(30,24); system("pause"); gotoxy(30,24); for(i=0;i<19;i++)printf(" "); } else if(keyhit==27) { system("cls");exit(0);} } void state()//判定蛇死没死 { if(snake_head[0]<1||snake_head[0]>62||snake_head[1]<1||snake_head[1]>22)life=1; } void eat()//判定蛇吃没吃上,并对根据方向对蛇头位置进行更新 { switch(snake_direction) { case 'w': snake_head[1]--;break; case 's': snake_head[1]++;break; case 'a': snake_head[0]--;break; case 'd': snake_head[0]++;break; } if((food[0]==snake_head[0]) && (food[1]==snake_head[1]) ) //如果蛇把食物吃了; { eat_flag=1; switch(snake_direction) { case 'w': snake_head[1]--;break; case 's': snake_head[1]++;break; case 'a': snake_head[0]--;break; case 'd': snake_head[0]++;break; } } } void show_snake()//更新蛇在屏幕中的位置 { gotoxy(snake_head[0],snake_head[1]); printf("*"); gotoxy(snake_loc[snake_len-1][0],snake_loc[snake_len-1][1]); printf(" "); } void update_maxtrix()//更新存储蛇位置的数组 { int i; if(eat_flag!=1) { for(i=snake_len-1;i>0;i--) { snake_loc[i][0]=snake_loc[i-1][0]; snake_loc[i][1]=snake_loc[i-1][1]; } } else { snake_len++; if(snake_len>3 && delay>100)delay-=30; for(i=snake_len-1;i>1;i--) { snake_loc[i][0]=snake_loc[i-2][0]; snake_loc[i][1]=snake_loc[i-2][1]; } snake_loc[1][0]=food[0]; snake_loc[1][1]=food[1]; eat_flag=0; create_food(); update_score(); } snake_loc[0][0]=snake_head[0]; snake_loc[0][1]=snake_head[1]; } int main() { welcome_w(); LP: system("cls"); init(); //初始化游戏数据; create_window(); //创建游戏窗口; gotoxy(73,3); //在输出分数位置,输出0; printf("0"); hidden(); //隐藏鼠标; create_food(); //输出第一个食物的位置; while(1) { int i; Sleep(delay); direction(); //控制方向函数; eat(); //判定蛇吃没吃上,并对根据方向对蛇头位置进行更新 show_snake(); //更新蛇在屏幕中的位置; update_maxtrix(); //更新存储蛇位置的数组(为下一次) ; state(); //判断蛇死没有; if(life==1) //如果蛇死了,用空格将蛇的身体覆盖,达到消失的目的; { for(i=1;i<snake_len;i++) { gotoxy(snake_loc[i][0],snake_loc[i][1]); printf(" "); } gotoxy(food[0],food[1]); //将食物覆盖; printf(" "); gotoxy(30,12); printf("Game over!\n"); //输出游戏结束标志; gotoxy(25,13); printf("继续请按y,退出请按n"); //向玩家给出提示信息; while(1) //用死循环,防止玩家输入其他按键游戏无反应; { i=getch(); if(i=='y')goto LP;//判断是否重新开始游戏; else if(i=='n') system("cls"); break; } break; } } }
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#实现打造气泡屏幕保护效果
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结
- 字典树的基本知识及使用C语言的相关实现
- 详解C语言中free()函数与getpagesize()函数的使用
- C/C++ 宏详细解析
- 使用C语言解决字符串全排列问题
- C/C++实现对STORM运行信息查看及控制的方法
- 用C#生成不重复的随机数的代码
- String.Format大全(C# Java)
- 在c和c++中实现函数回调