贪吃蛇

#include <stdio.h>
#include <conio.h> // 用于_getch()
#include <windows.h> // 用于Sleep()

#define WIDTH 30
#define HEIGHT 20
#define SNAKE_START_X 5
#define SNAKE_START_Y 5

char board[HEIGHT][WIDTH];
int snakeX[100], snakeY[100]; // 蛇的位置
int foodX, foodY; // 食物的位置
int snakeLength = 1; // 初始蛇长度
int direction = 0; // 初始方向(0=右)

void placeFood() {
    do {
        foodX = rand() % (WIDTH - 2) + 1;
        foodY = rand() % (HEIGHT - 2) + 1;
    } while (board[foodY][foodX] != ' ');
    board[foodY][foodX] = '.';
}

void setup() {
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            board[i][j] = ' ';
        }
    }
    board[0][0] = '*';
    board[HEIGHT - 1][0] = '*';
    board[0][WIDTH - 1] = '*';
    board[HEIGHT - 1][WIDTH - 1] = '*';

    snakeX[0] = SNAKE_START_X;
    snakeY[0] = SNAKE_START_Y;

    placeFood();
}

void draw() {
    system("cls"); // 清屏
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            printf("%c", board[i][j]);
        }
        printf("\n");
    }
}

void moveSnake() {
    for (int i = snakeLength; i > 0; i--) {
        snakeX[i] = snakeX[i - 1];
        snakeY[i] = snakeY[i - 1];
    }
    switch (direction) {
    case 0:
        snakeX[0]++;
        break;
    case 1:
        snakeY[0]--;
        break;
    case 2:
        snakeX[0]--;
        break;
    case 3:
        snakeY[0]++;
        break;
    }
    if (snakeX[0] >= WIDTH) snakeX[0] = 1;
    if (snakeX[0] < 1) snakeX[0] = WIDTH - 2;
    if (snakeY[0] >= HEIGHT) snakeY[0] = 1;
    if (snakeY[0] < 1) snakeY[0] = HEIGHT - 2;
}

void updateBoard() {
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            board[i][j] = ' ';
        }
    }
    for (int i = 0; i < snakeLength; i++) {
        board[snakeY[i]][snakeX[i]] = '#';
    }
    board[foodY][foodX] = '.';
}

void checkCollision() {
    for (int i = snakeLength; i > 0; i--) {
        if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
            exit(0); // 碰到自己,游戏结束
        }
    }
}

void checkFood() {
    if (snakeX[0] == foodX && snakeY[0] == foodY) {
        snakeLength++;
        placeFood();
    }
}

int main() {
    setup();
    while (1) {
        draw();
        moveSnake();
        updateBoard();
        checkCollision();
        checkFood();
        Sleep(100); // 控制游戏速度
        if (_kbhit()) { // 检查是否有按键按下
            switch (_getch()) {
            case 'w': direction = 1; break;
            case 's': direction = 3; break;
            case 'a': direction = 2; break;
            case 'd': direction = 0; break;
            }
        }
    }
    return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值