C语言贪吃蛇简化版

C语言 贪吃蛇简化版

前一阵子做贪吃蛇,看了很多教程,有好多都是用指针的。我指针用的不熟练,就做了一个简单的,代码量很少,不过没什么bug,当然内容也很简单,只用了一些基础的结构体。我的贪吃蛇参考了很多博客,希望和我一样的初学者能从中得到一些收获吧。

/*以下为思路
1.初始化地图,蛇,食物
2,蛇的移动(头,身体,尾巴)
3.按键输入与接收
4.食物的再次产生,打印蛇
5.判断死亡
*/
#include<conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#define a 1
#define d 2
#define w 3
#define s 4
struct{int x[50];int y[50];int len;}snake;
struct{int x;int y;}food;
int key=a;
void gotoxy(int x, int y)//定位光标位置到指定坐标
{HANDLE hout;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { x,y };
SetConsoleCursorPosition(hout, pos);}
void init()//初始化
{for(int i=0;i<40;i++)
{
    gotoxy(0,i);
    printf("*");
    gotoxy(40,i);
    printf("*");
}
for(int i=0;i<40;i++)
{
    gotoxy(i,0);
    printf("*");
    gotoxy(i,40);
    printf("*");
}//打印地图
snake.x[0]=20;snake.y[0]=20;
snake.x[1]=21;snake.y[1]=20;
snake.x[2]=22;snake.y[2]=20;
snake.len=3;//初始化蛇
srand((unsigned)time(NULL));
food.x=rand()%38+1;
food.y=rand()%38+1;
gotoxy(food.x,food.y);
printf("$");
}
void move()//蛇的移动
{
    gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
    printf(" ");
    for(int i=snake.len-1;i>0;i--)
    {
        snake.x[i]=snake.x[i-1];
        snake.y[i]=snake.y[i-1];
    }
    switch(key)
    {case w:
        snake.y[0]--;
        break;
    case s:
        snake.y[0]++;
        break;
    case a:
        snake.x[0]--;
        break;
    case d:
        snake.x[0]++;
        break;
    }

}
void drawsnake()//重新画蛇
{
    for(int i=0; i<snake.len;i++)
    {
        gotoxy(snake.x[i],snake.y[i]);
        printf("@");
    }
}
void keyboard()       //按键输入与蛇的反应
{ if(kbhit()!=0)          //如果有键盘输入
    {
        char in;
         in=getch();
        switch(in)
        {
        case 'w':
        case 'W':
            if(key!=s)         //不能缩头吧。。。。
                key=w;
            break;
        case 's':
        case 'S':
            if(key!=w)
                key=s;
            break;
        case 'a':
        case 'A':
            if(key!=d)
                key=a;
            break;
        case 'd':
        case 'D':
            if(key!=a)
                key=d;
            break;
        }
    }

}

void newfood()//新食物的生成和蛇的变长
{
    if(snake.x[0]==food.x&&snake.y[0]==food.y)
    {srand((unsigned)time(NULL));
food.x=rand()%38+1;
food.y=rand()%38+1;
gotoxy(food.x,food.y);
printf("$");
snake.len++;

    }
}
void yingchang()//隐藏关标,加了这个函数更美观
{CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

}
void judge()   //判断
{
    if(snake.x[0]==0||snake.x[0]==40||snake.y[0]==0||snake.y[0]==40)
    {
        system("cls");
        printf("gameover,你的分数是%d",snake.len);
        system("pause");
    }
    for(int i=1;i<snake.len;i++)
{
    if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])
        {
        system("cls");
        gotoxy(20,20);
        printf("gameover\t你的分数是%d",snake.len);
        system("pause");
}}}
int main()
{
    init();
    while(1)
    {
    move();
    drawsnake();
    Sleep(500);
    keyboard();
    newfood();
    judge();
    yingchang();
    }
    return 0;
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值