zoukankan      html  css  js  c++  java
  • 用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("
    ");
    191     printf("
    ");
    192 return 0;
    193 }

       

                      

  • 相关阅读:
    非洲出现新蓝海,他们抓住机遇将产品加工反向送入国内市场
    npm ERR! code ERR_STREAM_WRITE_AFTER_END
    程序默认不自动重连oracle
    一份超详细的MySQL高性能优化实战总结
    佩奇送福利:Eygle系列书籍免费下载
    解决waiting for target deviceto come online的做法
    Android真机运行闪退问题
    他是如何将小店铺打造成餐饮品牌的?
    用两张图告诉你,为什么你的App会卡顿?
    用两张图告诉你,为什么你的App会卡顿?
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/12318298.html
Copyright © 2011-2022 走看看