贪吃蛇


记录一下我搞了好久的贪吃蛇


#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<string.h>
#include<windows.h>
//全局变量
int v;//难度选择中,速度
int snakes[200][3]={0};//蛇的数组,蛇有三个参数:x坐标,y坐标,方向,最多两百节
//蛇的方向用枚举类型来表示
enum{toeast = 2, towest = -2, tonorth = -1, tosouth = 1};
//东西,北南

//打印边框,一个中文两个字符
char map[20][48]={"静静静静静静静静静静静静静静静静静静静静静静静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静                                          静\n",
                      "静静静静静静静静静静静静静静静静静静静静静静静\n"
                     };

//行,列来表示食物的位置
int hang,lie;

//蛇的初始方向
int snakedir = -2;

int d1;
int d=0;//d和d1判断蛇是否死亡

int snakelen = 2;//开始有三节0,1,2

int n=0;//得分
void fmian()
{
    printf("欢迎来到贪吃蛇\n");
    printf("注释:W,S,A,D分别表示上下左右哦\n\n\n");
    printf("按空格键进入,去选择难度吧!!");
}
void kge()
{

    while(1)//一直循环,直到按到空格键,清屏
    {
        if(' ' == getch()) break;//getch在头文件conio中,使空格不显示在屏幕上
    }
    system("cls");//清屏,在头文件stdlib中

}
void xzndu()
{
    printf("有五个难度供给选择:1,2,3,4,5依次递增!!\n");
    printf("选择完毕后,可以按回车键开始游戏了\n\n");
    printf("选择吧:\n");
    char ch;
    scanf("%c",&ch);
    switch (ch)
    {
        case '1':
            v=500;
            break;
        case '2':
            v=400;
            break;
        case '3':
            v=300;
            break;
        case '4':
            v=200;
            break;
        case '5':
            v=100;
            break;
    }
}
void xiesnake()
{
    for(int i=0;snakes[i][0]!=0;i++)
    {
        strncpy(&map[snakes[i][0]][snakes[i][1]],"爱",2);//一个中文两个字符,把爱的前两个字符复制到map地址中
    }
}
void snake ()
{
    int x,y;
    srand((unsigned)time(NULL));//srand()在头文件stdlib.h中,time()在time.h中
    x=rand()%19+1;//最小是1,最大是19
    y=rand()%18+1;//最小是1,最大是18
    //蛇最开始有三节
    snakes[0][0] = y; //行,1--18
    snakes[0][1] = x*2; //列,2--38
    snakes[0][2] = towest;//方向

    snakes[1][0] = y;
    snakes[1][1] = x*2 + 2;
    snakes[1][2] = towest;

    snakes[2][0] = y;
    snakes[2][1] = x*2 + 4;
    snakes[2][2] = towest;//向西前进

    //把蛇显示在屏幕上
    xiesnake();

}
void huisnake()//摧毁蛇,实在屏幕上消失,但数组snakes还有
{
    for(int i=0;snakes[i][0]!=0;i++)
    {
        strncpy(&map[snakes[i][0]][snakes[i][1]],"  ",2);
    }
}

void food()
{
    //随机
    srand((unsigned)time(NULL));
    while(1)
    {
        int j=1;
        hang=rand()%18+1;
        lie=rand()%21+1;
        for(int i=0;snakes[i][0]!=0;i++)
        {
            if(hang==snakes[i][0]&&lie*2==snakes[i][1])
            {
                j=0;
            }
        }
        if(j==1)break;
    }
    //把食物画进地图
    strncpy(&map[hang][lie*2],"凌",2);
}

//用方向键改变蛇的方向
int change()
{
    if(GetAsyncKeyState('W'))//来自Windows.h,如果有输入,则用输入的指示,否则以之前的方向前进
    {
        if(snakes[0][2]!=tonorth)
        {
            snakedir=tonorth;
            return 0;
        }


    }
    else if(GetAsyncKeyState('S'))
    {
        if(snakes[0][2]!=tosouth)
        {
            snakedir=tosouth;
            return 0;
        }

    }
    else if(GetAsyncKeyState('A'))

    {

        if(snakes[0][2]!=towest)

            {snakedir = towest;

        return 0;}

    }

    else if(GetAsyncKeyState('D'))

    {

        if(toeast != snakes[0][2])

           {
               snakedir = toeast;

        return 0;
           }

    }

    return 1;

}
void snakeup()
{
    if(hang == snakes[0][0] && lie*2 == snakes[0][1])
    {
        if(snakes[snakelen][2]==toeast)
        {
            snakes[snakelen+1][0] = snakes[snakelen][0];
            snakes[snakelen+1][1] = snakes[snakelen][1] - 2;
            snakes[snakelen+1][2] = snakes[snakelen][2];
        }
        else if(snakes[snakelen][2]==towest)
        {
            snakes[snakelen+1][0] = snakes[snakelen][0];
            snakes[snakelen+1][1] = snakes[snakelen][1] +2;
            snakes[snakelen+1][2] = snakes[snakelen][2];
        }
        else if(snakes[snakelen][2]==tonorth)
        {
            snakes[snakelen+1][0] = snakes[snakelen][0]+1;
            snakes[snakelen+1][1] = snakes[snakelen][1];
            snakes[snakelen+1][2] = snakes[snakelen][2];
        }
        else if(snakes[snakelen][2]==tosouth)
        {
            snakes[snakelen+1][0] = snakes[snakelen][0]-1;
            snakes[snakelen+1][1] = snakes[snakelen][1];
            snakes[snakelen+1][2] = snakes[snakelen][2];
        }
    food();
    n++;
    snakelen++;

    }


}
void snakemove()
{
      huisnake();//先毁掉蛇,这个只是让他从显示屏上消失
      for(int i=199;i>=1;i--)//把蛇往它运动的方向推动,他身体(包括身体)的第一节不动,最后会少一节,使他有一种向前移动的感觉
      {
                               //就相当于一整条蛇,去掉了尾巴
          if(snakes[i][0]!=0)
          {
              snakes[i][0]=snakes[i-1][0];
              snakes[i][1]=snakes[i-1][1];
              snakes[i][2]=snakes[i-1][2];
          }
      }
      //蛇头,就分几种情况
      snakes[0][2]=snakedir;
      if(snakes[0][2]==tonorth||snakes[0][2]==tosouth)
      {
          snakes[0][0]+=snakes[0][2];
      }
      else
      {
          snakes[0][1]+=snakes[0][2];
      }
      xiesnake();
}
void xiemap()
{
    for(int i=0;i<20;i++)
    {
        printf("%s",map[i]);
    }
    printf("当前分数:%d",n);
}
int sisnake()//判断蛇是否死亡
{
    if(snakes[0][2]==tonorth||snakes[0][2]==tosouth)
    {
        if(strncmp(&map[snakes[0][0]+snakes[0][2]][snakes[0][1]],"静",2)==0)//比较前两个字符
        {
            return 1;
        }
        else if(strncmp(&map[snakes[0][0]+snakes[0][2]][snakes[0][1]],"爱",2)==0)
            {
                return 1;
            }
    }
    else
    {
        if(strncmp(&map[snakes[0][0]][snakes[0][1] + snakes[0][2]], "静", 2)==0)
        {
            return 1;
        }
        else if(strncmp(&map[snakes[0][0]][snakes[0][1]+snakes[0][2]],"爱",2)==0)
        {
            return 1;
        }
    }
    return 0;
}
int main()
{
    fmian();//封面
    kge();//按空格,清屏
    xzndu();//设置难度
    snake();//设置蛇的随机位置
    food();//食物

    //进入游戏地图
    while(1)
    {
        system("cls");//清屏,stdlib中
        d1=change();//用键盘控制蛇的移动,d1==1,则我们没有按动键盘
        snakeup();//当我们创造完食物后,我们会使蛇向着那个方向移动,直到蛇头碰到食物,再判断尾巴的移动方向,新的一节加在最后一节的后面
        snakemove();
        xiemap();//把地图和当前分数打印在屏幕上
        if(d&&d1)//d和d1都为真,清屏,蛇死亡,就是当我们既没有按键盘让他改变反方向而且他再移动一次就可以碰到自己或者墙
        {
            system("cls");
            break;
        }
        if(sisnake())
        {
            d = 1;
        }
        else
        {
            d = 0;
        }
        Sleep(v);//头文件Windows.h,里面的单位是毫秒,表示滞留多久
    }
    system("pause");//表示暂停,防止控制台程序一闪而过
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值