C语言小项目之贪吃蛇

版权声明: https://blog.csdn.net/qq_39539470/article/details/81475767

设计思路:
(1)、首先需要定义一个确定大小的范围,即一个矩形范围。需要定义两个宏Height ,Width分别代表长和宽。
(2)、蛇身设计需要定义一个一定大小的数组,由于矩形范围是Height*Width , 所以可以定义数组大小为 Height*Width即可。
(3)、蛇所吃的食物的设计需要一个在矩形范围内随便出现的光点位置,用一个随机函数产生一个有范围限制的随机值即可。需要注意的是
食物出现的位置要避免被蛇身覆盖。
(4)、蛇身的移动实现是在一个函数中,循环获得键值,判断键值为上下左右任一方向,然后做出响应,例如如果按左键,蛇身的
每一个点除蛇头外都赋值为当前点的前一个点的坐标,设置蛇头点向左移动一位即可,蛇身长度Length+1。

(5)、存活和死亡的判断,当移动时循环监听蛇头的位置即可,当蛇头和蛇身某位置重合时Game Over,或者舌头坐标接触到矩形边界即撞墙
也Game Over。
(6)、由于游戏是一个动态的过程,因此我们用一个库函数来短间隔地刷新屏幕即可看到动态效果。
(7)、游戏结束后可以通过键值y继续游戏,n退出游戏。
具体的实现方法,及相应的函数,程序中也有详细的讲解,代码可直接复制运行。(此次运行实在VS2013下完成)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#define MAX_WIDE 60
#define MAX_HIGH 20
//蛇身结构体 包含蛇体长度len 和 蛇身数组
struct snake{
    short len;
    short body[MAX_WIDE*MAX_HIGH];
}snake;
short dx = 1, dy = 0, randxy, score = 0;     //dx为横坐标 dy为纵坐标
COORD coord; //定位光点坐标
void draw()
{
    for (short i = 0; i < snake.len; i++)
    {
        coord.X = snake.body[i] & 127; //横坐标取body[i]的低八位
        coord.Y = snake.body[i] >> 8; //纵坐标取body[i]的高八位
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); //找到蛇身所有光点坐标
        putchar('*'); //给蛇身光点坐标处放@显示
    }
    coord.X = randxy & 127; //
    coord.Y = randxy >> 8; //随机放置一个光点*作为食物
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    putchar('*'); //显示随机放置的光点
}
void run()
{
    char key = 't';
    short i, j;
    while (snake.body[0] > 0 && ((snake.body[0] & 127) < MAX_WIDE) && (snake.body[0] >> 8 < MAX_HIGH))//蛇头的横纵临界值
    {
        draw(); //画蛇添足
        for (; _kbhit();) key = _getch(); //循环得到键值控制方向
        switch (key)
        {
        case 'w': dx = 0, dy = -1; break;
        case 's': dx = 0, dy = 1; break;
        case 'a': dx = -1, dy = 0; break;
        case 'd': dx = 1, dy = 0; break;
        }
        for (j = 1; j < snake.len; j++)
        if (snake.body[j] == snake.body[0]) //蛇头和蛇身相碰就结束
            return;
        if (randxy == snake.body[0]) //随机光点和蛇头相碰则加长蛇身
        {
            snake.len++, score += 10; //蛇身加一 得分加十
            randxy = ((rand() % 16 + 0) << 8) | (rand() % 50 + 0); //随机在矩形范围内产生光点的坐标
        }
        for (i = snake.len - 1; i > 0; i--)
            snake.body[i] = snake.body[i - 1]; //蛇身整体向前挪动一位 
        snake.body[0] = ((snake.body[0] & 127) + dx) | ((snake.body[0] >> 8) + dy) << 8; //新的蛇头的位置
        Sleep(600); //延时
        system("cls"); //屏幕刷新
    }
}
int main()
{
    while (1)
    {
        snake.body[MAX_WIDE*MAX_HIGH] = 0;
        snake.body[0] = (MAX_HIGH / 2) << 8 | MAX_WIDE / 2; //初始化蛇头
        snake.len = 1; //初始化蛇身长度
        srand((unsigned)time(NULL)); //随机值计时 即以后不会出现重复的随机值
        randxy = ((rand() % 16 + 0) << 8) | (rand() % 50 + 0); //第一次随机产生一个光点
        SMALL_RECT rect;
        rect.Top = 0, rect.Left = 0; // 定义一个矩形框 左上为0 0 下右为 MAX_HIGH 高 MAX_WIDE 宽
        rect.Bottom = MAX_HIGH, rect.Right = MAX_WIDE;
        SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), 1, &rect);
        run();
        printf("Your Score:%d", score);
        printf("是否继续? y/n \n");
        char ch;
        ch = getchar();
        if (ch == 'n')
            break;
    }
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_39539470/article/details/81475767