简单的贪吃蛇

首先关于贪吃蛇的程序基本的功能无非就是让蛇移动,生成食物,吃到自己或者吃到墙就死了的结束判定,蛇吃食长大这几个部分。

1. 蛇移动可用如下函数实现:

其中包含了移动和吃食两种功能。

void snakeMove(int x, int y)
{
    if(map[snakeY[snakeLength-1]+y][snakeX[snakeLength-1]+x] != '$')//如果下一步没有食物则正常走 
    {
    int i, j;
    int a = snakeY[snakeLength-1];
    int b = snakeX[snakeLength-1];
    map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'X';//先假设蛇都是'X',以便之后对于蛇身进行移动 
    map[snakeY[0]][snakeX[0]] = ' ';//蛇尾走了后就变成' '。 
    for(i = 1; i<snakeLength-1; i++)
    {
        map[snakeY[i]][snakeX[i]] = map[snakeY[i+1]][snakeX[i+1]];//移动蛇身 
    }
    snakeX[snakeLength-1] += x;
    snakeY[snakeLength-1] += y;
    map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'H';
    for(j = 0; j<snakeLength-2; j++)//接下来更新对于蛇身的坐标。 
    {
        snakeX[j] = snakeX[j+1];
        snakeY[j] = snakeY[j+1];
    }
    snakeY[snakeLength-2] = a;//注意这里蛇头的坐标赋给第二个时要赋未改变位置时的值。 
    snakeX[snakeLength-2] = b;
    }
    else//如果下一步有食物,则将数组界加一,把新加的那个坐标定为食物的坐标也即为蛇头,其余坐标均为身子 
    { 
        snakeLength += 1;
        snakeX[snakeLength-1] = snakeX[snakeLength-2]+x;
        snakeY[snakeLength-1] = snakeY[snakeLength-2]+y;
        int i;
        for(i = 0; i < snakeLength-1; i++)
        {
            map[snakeY[i]][snakeX[i]] = 'X';
        }
        map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'H';
        ok = 0;
    } 
}

2. 生成食物

利用随机数来随机在地图内生成食物

void put_money()
{
    int x, y;
    while(ok == 0)
    {
    srand(time(0)); 
    x = rand() % (9) + 1;
    y = rand() % (9) + 1;
    if(map[y][x] == ' ')
    {
        map[y][x] = '$';//用随机数在地图空白处生成食物 
        ok = 1;
        break;
    }
    }
} 

3. 游戏结束的判定

如果蛇吃到了墙或者自己就死了

void gameover()
{
    int a = snakeX[snakeLength-1];
    int b = snakeY[snakeLength-1];
    if(a == 0 || b == 0 || a == 11 || b == 11)//判断是否在边界 
    {
        judge = 0;
    }
    int i;
    for(i = 0; i < snakeLength-1; i++)
    {
        if(b == snakeY[i] && a == snakeX[i])//判断是否吃到了身子 
        {
            judge = 0;
        }
    }
}

除了上述功能外,还要通过不断输出和清屏来实现蛇的连续移动。
主函数如下:

int main(void) {
    output();
    char ch;
    while(judge)//judge用来判断蛇是否越界 
    {
        put_money(); 
        ch =_getch();
        switch (ch) {
            case 'W':
                snakeMove(0, -1);//向上 
                break;
            case 'D':
                snakeMove(1, 0);//向右 
                break; 
            case 'A':
                snakeMove(-1, 0);//向左 
                break; 
            case 'S':
                snakeMove(0, 1);//向下 
                break;  
        }
        gameover();
        if(judge == 0)
        {
            break;
        }
        system("cls");
        output();
    }
    printf("game over!");
    return 0;
}

这样就可以写成一个简单的通过WASD来移动吃食的贪吃蛇了。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用easyx库实现的简单贪吃蛇游戏的C语言代码: ```c #include <graphics.h> #include <conio.h> #include <time.h> #define WIDTH 640 // 窗口宽度 #define HEIGHT 480 // 窗口高度 #define SIZE 20 // 贪吃蛇每个正方形的边长 #define MAX_LENGTH (WIDTH / SIZE) * (HEIGHT / SIZE) // 贪吃蛇最大长度 struct Snake { int x, y; // 贪吃蛇头部坐标 int length; // 贪吃蛇长度 int direction; // 贪吃蛇运动方向 int body[MAX_LENGTH][2]; // 贪吃蛇身体各个部分的坐标 } snake; struct Food { int x, y; // 食物坐标 } food; void init(); // 初始化函数 void drawSnake(); // 绘制贪吃蛇 void moveSnake(); // 移动贪吃蛇 void generateFood(); // 生成食物 bool isHitWall(); // 判断是否撞墙 bool isHitBody(); // 判断是否撞身体 bool isEatFood(); // 判断是否吃到食物 int main() { init(); while (1) { moveSnake(); if (isHitWall() || isHitBody()) { break; } if (isEatFood()) { generateFood(); } cleardevice(); drawSnake(); Sleep(100); } closegraph(); return 0; } void init() { initgraph(WIDTH, HEIGHT); setbkcolor(WHITE); setfillcolor(BLACK); setcolor(BLACK); snake.x = WIDTH / 2; snake.y = HEIGHT / 2; snake.length = 3; snake.direction = VK_RIGHT; for (int i = 0; i < snake.length; i++) { snake.body[i][0] = snake.x - i * SIZE; snake.body[i][1] = snake.y; } generateFood(); } void drawSnake() { for (int i = 0; i < snake.length; i++) { fillrectangle(snake.body[i][0], snake.body[i][1], snake.body[i][0] + SIZE, snake.body[i][1] + SIZE); } setfillcolor(RED); fillrectangle(food.x, food.y, food.x + SIZE, food.y + SIZE); setfillcolor(BLACK); } void moveSnake() { for (int i = snake.length - 1; i > 0; i--) { snake.body[i][0] = snake.body[i - 1][0]; snake.body[i][1] = snake.body[i - 1][1]; } switch (snake.direction) { case VK_UP: snake.y -= SIZE; break; case VK_DOWN: snake.y += SIZE; break; case VK_LEFT: snake.x -= SIZE; break; case VK_RIGHT: snake.x += SIZE; break; } snake.body[0][0] = snake.x; snake.body[0][1] = snake.y; } void generateFood() { srand((unsigned int)time(NULL)); bool flag = true; while (flag) { flag = false; food.x = SIZE * (1 + rand() % (WIDTH / SIZE - 2)); food.y = SIZE * (1 + rand() % (HEIGHT / SIZE - 2)); for (int i = 0; i < snake.length; i++) { if (food.x == snake.body[i][0] && food.y == snake.body[i][1]) { flag = true; break; } } } } bool isHitWall() { if (snake.x < SIZE || snake.x > WIDTH - 2 * SIZE || snake.y < SIZE || snake.y > HEIGHT - 2 * SIZE) { return true; } else { return false; } } bool isHitBody() { for (int i = 1; i < snake.length; i++) { if (snake.body[i][0] == snake.x && snake.body[i][1] == snake.y) { return true; } } return false; } bool isEatFood() { if (snake.x == food.x && snake.y == food.y) { snake.length++; snake.body[snake.length - 1][0] = snake.body[snake.length - 2][0]; snake.body[snake.length - 1][1] = snake.body[snake.length - 2][1]; return true; } else { return false; } } ``` 在该代码中,我们使用了`graphics.h`和`conio.h`两个头文件来实现图形界面和键盘输入的功能。其中,`init()`函数负责初始化贪吃蛇和食物的位置、长度、方向等信息,`drawSnake()`函数负责绘制贪吃蛇和食物,`moveSnake()`函数负责移动贪吃蛇,`generateFood()`函数负责随机生成食物,并判断其是否与贪吃蛇身体重叠,`isHitWall()`函数和`isHitBody()`函数分别用于判断贪吃蛇是否撞墙和撞身体,`isEatFood()`函数用于判断贪吃蛇是否吃到了食物。在主函数中,我们使用一个循环不断移动贪吃蛇,并根据不同情况终止游戏。 在编写完代码后,我们需要在编译选项中添加`-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32`这些库文件,才能正常编译和运行程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值