用C语言做一个贪吃蛇小游戏

以下 头文件上的这串代码是因为解决VS2022认为getch()和scanf是不安全的函数,也可以直接写入属性预编译里面,低版本也可以直接不加也没有关系

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE

以下是C完整代码直接CV工程师就可以了

main.c

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE

#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>

//设置字体颜色
void color(const unsigned short textColor)
{
    if (textColor >= 0 && textColor <= 15)
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textColor);
    else
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}

//展示规则
int Show_Role()
{
    char back = 0;
    system("cls");
    printf("按住w键即可控制贪吃蛇向上移动\n");
    printf("按住a键即可控制贪吃蛇向左移动\n");
    printf("按住s键即可控制贪吃蛇向下移动\n");
    printf("按住d键即可控制贪吃蛇向右移动\n");
    printf("\n按下l键即可返回上级菜单\n");
    printf("按下任意键可以继续开始游戏\n");
    back = getch();
    if (back == 'l'||back=='L')
    {
        return 1;//按下l键返回菜单
    }
    else
    {
        return 0;//按下任意键继续游戏
    }
}

//判断蛇是否死亡
int Die(int snack[100][2])
{
    char y = 0;
    int s = 0;
    for(s=1;s<100;s++)
    {
        if (snack[0][0] == 0 || snack[0][0] == 49 || snack[0][1] == 0 || snack[0][1] == 99 || (snack[0][0] == snack[s][0] && snack[0][1] == snack[s][1]))
        {
            system("cls");
            printf("Game Over!!!\n");
            printf("\n按下r键重新开始游戏\n");
            printf("按下其它任意键退出游戏\n");
            y = getch();
            if (y == 'r' || y == 'R')
            {
                return 1;
            }
            else
            {
                exit(0);
            }
        }
        else
        {
            return 0;
        }
    }
}

//控制蛇身体
void ControlSnack_body(int snack[100][2], int k, int last[500][2])
{
    int p = 0;
    if(k>0)
    {
        for(p=1;p<k+1;p++)//蛇的每个部位等于蛇的上个部位位置
        {
            snack[p][0] = last[p-1][0];
            snack[p][1] = last[p-1][1];
        }
    }
}

//判断蛇头走向并且是否重新开始
int ControlSnack_head(int snack[100][2])
{
    char control = 0;
    control = getch();
    if (control == 'W' || control == 'w')
    {
        snack[0][0] -= 1;
    }
    else if (control == 'A' || control == 'a')
    {
        snack[0][1] -= 1;
    }
    else if (control == 'S' || control == 's')
    {
        snack[0][0] += 1;
    }
    else if (control == 'D' || control == 'd')
    {
        snack[0][1] += 1;
    }
    else if (control == 'r'||control=='R')
    {
        return 1;
    }
    return 0;
}

//创造贪吃蛇路径
void BackGround(int background[50][100], int snack[100][2], int food[1][2], int k)
{
    int i = 0, j = 0, n = 1;
    for (i = 0; i < 50; i++)
    {
        for (j = 0; j < 100; j++)
        {
            if (i == food[0][0] && j == food[0][1])
            {
                background[i][j] = 1;//食物
            }
            else if (i == snack[0][0] && j == snack[0][1])
            {
                background[i][j] = 2;//蛇头
            }
            else
            {
                background[i][j] = 0;//背景
            }
            for (n = 1; n < k + 1; n++)
            {
                if(i==snack[n][0]&&j==snack[n][1])
                {
                    background[i][j] = 3;
                }
            }
        }
    }
}

//判断蛇是否吃到零食
int SnackEat(int background[50][100],int snack[100][2],int food[1][2],int last[500][2], int k)
{
    if ((food[0][0] == snack[0][0]) && (food[0][1] == snack[0][1]))
    {
        //记录新身体的位置
        snack[k + 1][0] = last[k][0];
        snack[k + 1][1] = last[k][1];

        background[snack[0][0]][snack[0][1]] = 2;//蛇头和零食重合,只画蛇头
        background[last[k][0]][last[k][1]] = 3;//蛇头迟到零食,前一个蛇头的位置生成一个身体

        srand(time(NULL) + 3);//如果零食被吃掉则重新在生成一个零食
        food[0][0] = rand() % 48 + 1;
        food[0][1] = rand() % 98 + 1;

        return 1;
    }
    else
    {
        return 0;
    }
}

//根据路径将位置画出
void Paint(int background[50][100], int snack[100][2], int food[1][2])
{
    system("cls");
    int i = 0, j = 0;
    for (i = 0; i < 50; i++)
    {
        for (j = 0; j < 100; j++)
        {
            switch (background[i][j])
            {
            case 0:
                if(i==0||j==0||j==99||i==49)
                {
                    color(4);
                    printf("□");
                }
                else
                {
                    color(16);
                    printf("□");
                }
                break;
            case 1:
                color(6);
                printf("▲");
                break;
            case 2:
                color(2);
                printf("★");
                break;
            default:
                color(2);
                printf("■");
            }
        }
        printf("\n");
    }
}

//最高级菜单
int Menu()
{
    system("cls");
    char get_key = 0;
	color(4);
    printf("                                 -----------------------------贪吃蛇-----------------------------\n\n");
    printf("                                                  1、WASD控制上左下右方向\n\n");
    printf("                                                  2、按下2键开始游戏\n\n");
    printf("                                                  3、退出游戏\n\n");
    printf("                                                  4、游戏中按下r键即可重新开始游戏\n\n");
    printf("                                 -----------------------------------------------------------------\n\n");
    get_key = getch();
    if (get_key == '1')
    {
        return 1;
    }
    else if (get_key == '2')
    {
        return 2;
    }
    else if (get_key == '3')
    {
        exit(0);
    }
}

int main()
{
    while(1)
    {
        int i = 0;
        int food[1][2] = { 0 };//食物的坐标
        int snack[100][2] = { 0 };//蛇的大小
        int background[50][100] = { 0 };//地图
        int last[500][2] = { 0 };//记录蛇每个身体经过的坐标
        static int k = 0;//记录蛇身体长度

        srand(time(NULL) + 1);//游戏开始,随机生成蛇头位置
        snack[0][0] = rand() % 50;
        snack[0][1] = rand() % 100;

        srand(time(NULL) + 2);//游戏开始,随机生成零食位置
        food[0][0] = rand() % 48 + 1;
        food[0][1] = rand() % 98 + 1;

        switch (Menu())//选择菜单
        {
        case 1:
            if (Show_Role()) 
            {
                continue;
            }
        case 2:
            BackGround(background, snack, food, k);
            SnackEat(background, snack, food, last, k);
            Paint(background, snack, food);
            while (1)
            {
                for (i = 0; i <= k; i++)
                {
                    last[i][0] = snack[i][0];
                    last[i][1] = snack[i][1];
                }

                if (ControlSnack_head(snack))//控制蛇头
                {
                    break;
                }

                if (Die(snack))//蛇是否死亡
                {
                    break;
                }

                ControlSnack_body(snack, k, last);//控制蛇身体
                BackGround(background, snack, food, k);//规划路径

                if (SnackEat(background, snack, food, last, k) == 1)//如果蛇头到零食
                {
                    k += 1;//身体+1
                }

                Paint(background, snack, food);//将画面绘制
            }
            continue;
        }
    }

	return 0;//程序结束
}

以上就是所有代码并没有用到结构体,大家也可以自己试试缩减代码,或者也可以将小蛇和零食用结构体写或许会更简单!

如果代码上有问题,大家也可以发出来,作者会看尽力帮助解决。

记得点赞啊!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值