用C写一个功能较为完善的贪吃蛇小游戏

主要功能:

方向控制-食物与增长-变速(进入游戏界面后,需按shift键切换成英文输入)

  1 #include<stdio.h>
  2 #include<time.h>//种子-随机数
  3 #include<windows.h>//system函数,控制台句柄
  4 #include<conio.h>//按键
  5 //界面(欢迎界面-游戏界面-结束得分界面)-驱动-方向控制-食物
  6 //位置锁定-打印-删除
  7 int snake_x[520]={0};//存储蛇各节的x坐标
  8 int snake_y[520]={0};//存储y坐标
  9 int head=2;//蛇头在坐标数组中的位置;
 10 int food_x,food_y;
 11 char dir=1;//在gotoprint中需要用到
 12 int dx,dy=0;//在桌面上要删除的坐标,上一帧的蛇尾
 13 int flag_eat=0;//吃到食物的标志
 14 int score=0;
 15 int f_gover=0;
 16 int f_all=0;//是否达到通关分数
 17 
 18 void gotoxy(int x,int y){
 19     COORD pos;
 20     HANDLE hOutput;
 21     pos.X=x;
 22     pos.Y=y;
 23     hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
 24     SetConsoleCursorPosition(hOutput,pos);
 25 }
 26 void createfood(){
 27      srand(time(NULL));//每次产生不同的种子
 28 
 29      int flag=0;
 30      while(1){
 31         food_x=((rand()%65)/2)*2+18;//x坐标一定要对齐,我们采取的是偶数对齐(统一小方格的坐标取法)
 32         food_y=(rand()%15)+6;
 33         for(int i=0;i<=head;i++){//判断食物是否与蛇重叠
 34             if(food_x==snake_x[head-i]&&food_y==snake_y[head-i]) {
 35                     flag=1; break;//有则跳出循环,置重新生成标志为有效
 36             }
 37             else;
 38         }
 39         if(flag==0) break;//食物达标,可生成跳出while
 40         else flag=0;//食物不达标,再次生成
 41     }
 42     gotoxy(food_x,food_y);
 43     printf("");
 44 }
 45 
 46 void gotoprint(int x,int y){
 47     gotoxy(x,y);
 48     printf("");//正方形宽占两个字符,高占一个字符
 49     //吃到食物的情况
 50     if((x==food_x)&&(y==food_y)){
 51         flag_eat=1;//吃到食物了
 52         createfood();//需要生成新食物
 53         //分数增加-分数越高速度越快,每次分值越大
 54         if(score<150)score+=10;
 55         else if(score<370) score+=20;
 56         else score+=30;
 57 
 58     if(score==520) {f_gover=1; f_all=1;}//设定达到520分游戏结束
 59 
 60         head++;//增加蛇长,下面更新蛇位置数据
 61         for(int i=0;i<=head-1;i++){
 62             snake_x[head-i]=snake_x[head-i-1];
 63             snake_y[head-i]=snake_y[head-i-1];
 64         }
 65         snake_x[0]=dx;
 66         snake_y[0]=dy;
 67         //正确
 68     }
 69 }
 70 void gotodelete(int x,int y){
 71     gotoxy(x,y);
 72     printf("  ");//正方形宽占两个字符,高占一个字符
 73 }
 74 
 75 void welcome(){
 76     gotoxy(35,8);  printf("/***********************************/");
 77     gotoxy(35,10);  printf("/                                   /");
 78     gotoxy(35,12); printf("/       欢迎来到贪吃蛇小游戏/       /");
 79     gotoxy(35,14); printf("/                                   /");
 80     gotoxy(35,16); printf("/***********************************/");
 81     system("pause");
 82     system("cls");
 83 }
 84 void gamepage(){
 85     //外围
 86     for(int i=0;i<=68;i+=2) { gotoprint(16+i,4);}//原点坐标(16,4)外围设定:长X高=34X18
 87     for(int i=0;i<=68;i+=2) { gotoprint(16+i,22);}
 88     for(int i=1;i<=17;i++){gotoprint(16,4+i);gotoprint(84,4+i);}
 89     //蛇身
 90     snake_x[0]=32;snake_y[0]=12;gotoprint(snake_x[0],snake_y[0]);
 91     snake_x[1]=34;snake_y[1]=12;gotoprint(snake_x[1],snake_y[1]);
 92     snake_x[2]=36;snake_y[2]=12;gotoprint(snake_x[2],snake_y[2]);
 93     createfood();
 94 }
 95 
 96 void running(){
 97 
 98 int f_ws,f_ad;
 99 f_ws=f_ad=1;
100 int ini_dir=1;
101 
102 while(1){
103         if (_kbhit()) ini_dir = _getch();
104         if(ini_dir=='w') {if(f_ws==1)       dir=ini_dir; else ;}//如果是w s a d 按键,需要判断按键有效性;直接掉头和朝同一方向的按键是无效的
105         else if(ini_dir=='s') {if(f_ws==1)  dir=ini_dir; else ;}
106         else if(ini_dir=='a') {if(f_ad==1)  dir=ini_dir; else ;}
107         else if(ini_dir=='d') {if(f_ad==1)  dir=ini_dir; else ;}
108         else dir=ini_dir;
109 
110         if(score<=120) Sleep(170);//分数越高-蛇移动越快
111         else if(score<=200) Sleep(140);
112         else if(score<=320) Sleep(110);
113         else if(score<=450) Sleep (80);
114         else Sleep(60);
115 
116         if(dir=='w'){
117                 dx=snake_x[0];dy=snake_y[0];
118                 for(int i=0;i<head;i++){
119                     snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1];
120                 }
121                 //snake_x[head]=snake_x[head];
122                 snake_y[head]=snake_y[head]-1;
123                 f_ws=0;
124                 f_ad=1;
125 
126         }
127         else if(dir=='s'){
128                 dx=snake_x[0];dy=snake_y[0];
129                 for(int i=0;i<head;i++){
130                     snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1];
131                 }
132                 snake_y[head]=snake_y[head]+1;
133                 f_ws=0;
134                 f_ad=1;
135 
136         }
137         else if(dir=='a'){
138                 dx=snake_x[0];dy=snake_y[0];
139                 for(int i=0;i<head;i++){
140                     snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1];
141                 }
142                 snake_x[head]=snake_x[head]-2;
143                 f_ws=1;
144                 f_ad=0;
145         }
146         else if(dir=='d'){
147                 dx=snake_x[0];dy=snake_y[0];
148                 for(int i=0;i<head;i++){
149                     snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1];
150                 }
151                 snake_x[head]=snake_x[head]+2;
152                 f_ws=1;
153                 f_ad=0;
154         }
155         else continue;
156         //检查是否超出范围
157         if (snake_x[head]<=16||snake_x[head]>=84||snake_y[head]<=4||snake_y[head]>=22) break;//直接跳出while循环
158         gotoprint(snake_x[head],snake_y[head]);
159         gotoxy(16,23);
160         printf("Dear,You've got %d points so far!",score);
161 //判断有没有吃的食物,吃到食物则不用删除蛇尾,因为长度+1
162         if(flag_eat==0){
163                 gotodelete(dx,dy);gotoxy(16,23);
164                 printf("Dear,You've got %d points so far!",score);
165         }
166         else flag_eat=0;
167 //检查蛇是否吃到自己
168         for(int i=1;i<=head;i++){
169             if(snake_x[head]==snake_x[head-i]&&snake_y[head]==snake_y[head-i]) f_gover=1;
170         }
171 
172         if(f_gover==1){f_gover=0;Sleep(300);break;}
173         else ;
174     }
175  system("cls");//清除屏幕
176  gotoxy(36,13);
177  if(f_all==0) printf("Baby,You got %d points !Keep Trying!",score);
178  else printf("Baby,You got all %d points !",score);
179  gotoxy(2,32);
180  system("pause");
181 
182 }
183 
184 int main(){
185     system("color 0B");
186     welcome();
187     gamepage();
188     running();
189     gotoxy(2,24);
190     printf("\n");
191     printf("\n");
192 return 0;
193 }

   

                  

posted @ 2020-02-16 19:42  JC97  阅读(241)  评论(0编辑  收藏  举报