贪吃蛇C语言代码(简单易懂)

//游戏说明;
//游戏由基本的C语言和easyx制作而成
//在玩游戏之前,你需要下载一个VS并创建一个空项目
//然后再在源文件里创造一个后缀为.cpp的源文件
//由于easyx(一种绘图语言)必须用c++的文件编译,所以用.c后缀的文件是不行的
//但是代码全部是由c语言和c语言的风格写完的,这点大可放心
//将一下代码粘贴过去以后,你需要将VS最上面一栏的"项目"——"xxx的属性"——"高级"——"字符集"改成使用多字符集
//这样做的原因是,音频的播放需要这样修改以后才可以运行
//另外你还需要去easyx官网下载并安装一下easyx
//网站如下https://easyx.cn/download
//以及:代码的音乐文件需要下载并且在最后音频处修改为自己电脑中的音频的地址
// (注意音频播放函数下面的提示和双斜杠哦!)
//完成这些以后,就可以愉快体验贪吃蛇游戏啦!
//祝您游戏愉快!
 
 
#define _CRT_SECURE_NO_WARNINGS 1        //scanf函数在vs运行中存在风险,需要先宏定义无风险才可以使用
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>    //getch函数
#include <time.h>
#include <graphics.h> //easyx中的函数
#include <mmsystem.h> //播放音乐的头文件
#pragma comment(lib,"winmm.lib")//播放音乐的库文件
 
/*
知识点:结构体 循环 函数 easyx 数组
*/
 
 
#define SNAKE_NUM 100000  //蛇的最大节数
#define X 500
#define Y 500
void Game();             //对游戏函数声明
 
//xy坐标的结构
struct coor
{
    int x;             //横坐标
    int y;             //纵坐标
};
 
 
//蛇的结构
struct Snake
{
    struct coor xy[SNAKE_NUM];        //记录每一节坐标
    int  size;                        //当前蛇的长度
    int  dir;                        //方向
}snake;
 
 
//食物结构
struct Food
{
    struct coor xy;         //食物的坐标
    int flag;               //食物有没有被吃掉的标志
}food;
 
 
//墙的结构
struct Wall
{
    struct coor xy;        //墙的坐标
    int flag;              //有没有撞墙的标志
}wall;
 
 
//初始化食物
void InitFood()
{
    food.flag = 1;                                    //食物没有被吃掉
    food.xy.x = rand() % ((X - 100) / 10) * 10;         //生成的食物的坐标是10整数,否则容易出现不落在方块区域内的问题
    food.xy.y = rand() % ((Y - 100) / 10) * 10;
}
 
 
//绘制食物
void DrawFood()
{
    setfillcolor(WHITE);            //设置食物的颜色为白色
    setlinecolor(BLACK);                                                    //食物的边框线为黑色
    fillrectangle(food.xy.x, food.xy.y, food.xy.x + 10, food.xy.y + 10);
}
 
 
//初始化墙
void InitWall()
{
    wall.xy.x = 0;
    wall.xy.y = 0;
    wall.flag = 1;
}
 
//绘制墙
void DrawWall()
{
    for (wall.xy.x = 0; wall.xy.x < X; wall.xy.x += 10)
    {
        wall.xy.y = 0;
        setfillcolor(WHITE);
        setlinecolor(BLACK);
        fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
    }
    for (wall.xy.x = 0; wall.xy.x < X; wall.xy.x += 10)
    {
        wall.xy.y = Y - 10;
        setfillcolor(WHITE);
        setlinecolor(BLACK);
        fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
    }
    for (wall.xy.y = 0; wall.xy.y < Y; wall.xy.y += 10)
    {
        wall.xy.x = X - 10;
        setfillcolor(WHITE);
        setlinecolor(BLACK);
        fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
    }
    for (wall.xy.y = 0; wall.xy.y < Y; wall.xy.y += 10)
    {
        wall.xy.x = 0;
        setfillcolor(WHITE);
        setlinecolor(BLACK);
        fillrectangle(wall.xy.x, wall.xy.y, wall.xy.x + 10, wall.xy.y + 10);
    }
}
 
//方向控制
//0:上     1:下     2:右      3:左
// 用枚举类型来表示这些常数
enum direction
{
    up, down, right, left
};
 
 
//初始化蛇
void InitSnake()
{
    snake.xy[0].x = 20;   //初始状态蛇有三节,三节的坐标分别初始化
    snake.xy[0].y = 10;
 
    snake.xy[1].x = 10;
    snake.xy[1].y = 10;
 
    snake.xy[2].x = 0;
    snake.xy[2].y = 10;
 
    snake.size = 3;
    snake.dir = right;
 
 
    //对后面的坐标处理一下;
    for (int i = 3; i < SNAKE_NUM; i++)
    {
        snake.xy[i].x = -100;
        snake.xy[i].y = -100;
    }
}
 
 
//绘制一条蛇
void DrawSnake()
{
    setfillcolor(RED);             //给蛇头设计一个颜色
    setlinecolor(BLACK);
    fillrectangle(snake.xy[0].x, snake.xy[0].y, snake.xy[0].x + 10, snake.xy[0].y + 10);
    for (int i = 1; i < snake.size; i++)
    {
        setfillcolor(WHITE);             //给蛇身设计一个颜色
        setlinecolor(BLACK);
        fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
    }
}
 
//移动蛇
void MoveSnake()
{
    //处理后面的节数(跟随)
    for (int i = snake.size - 1; i > 0; i--)
    {
        snake.xy[i].x = snake.xy[i - 1].x;
        snake.xy[i].y = snake.xy[i - 1].y;
    }
    switch (snake.dir)
    {
    case up:
        snake.xy[0].y -= 10;
        break;
    case down:
        snake.xy[0].y += 10;
        break;
    case right:
        snake.xy[0].x += 10;
        break;
    case left:
        snake.xy[0].x -= 10;
        break;
    }
}
 
 
//按键处理控制蛇的移动
void KeyDown()
{
    char userkey = _getch();                 //读入输入的字符并且不需要回车
    switch (userkey)
    {
    case 'W':
    case 'w':
    case 72:
        if (snake.dir != down)
        {
            snake.dir = up;
        }
        break;
    case 's':
    case 'S':
    case 80:
        if (snake.dir != up)
        {
            snake.dir = down;
        }
        break;
    case 'a':
    case 'A':
    case 75:
        if (snake.dir != right)
        {
            snake.dir = left;
        }
        break;
    case 'd':
    case 'D':
    case 77:
        if (snake.dir != left)
        {
            snake.dir = right;
        }
        break;
    }
}
 
 
//吃食物
void EatFood()
{
    if (food.xy.x == snake.xy[0].x && food.xy.y == snake.xy[0].y)
    {
        food.flag = 0;
        snake.size++;
    }
}
 
 
//游戏暂停设置
void Stop()
{
    if (_kbhit())
    {
        if (_getch() == ' ')
        {
            while (_getch() != ' ');
        }
    }
}
 
//撞墙游戏结束
void GameOver()
{
    if (snake.xy[0].x == X || snake.xy[0].x == -10 || snake.xy[0].y == Y || snake.xy[0].y == -10)
    {
        wall.flag = 0;
    }
}
 
void Game()
{
    int grade = 0;                                                                 //分数
    srand((unsigned int)time(NULL));                                               //设计随机数种子;
    initgraph(X, Y);                                                               //初始化绘图窗口
    setbkcolor(RGB(rand() % 256, rand() % 256, rand() % 256));                     //设置背景颜色为随机
    cleardevice();                                                                 //用背景色清空屏幕
    InitSnake();
    InitFood();
    InitWall();
 
 
    mciSendString("open C:\\Users\\F\\Desktop\\bgm.mp3 alias bkmusic", NULL, 0, NULL);
    //open指令打开需要播放的音乐,alias后面制定了前面文件路径的别名,以后想要操作这个文件直接使用这个别名就可以了.
    //如果音乐文件和我们的debug文件夹在同一目录下,就可以像我这样不用写路径,直接音乐名。
    //如果音乐文件不是上面的情况就得写清楚路径。
    //例: D盘下的demo目录有一个叫1.MP3的文件
    //mciSendString("open D:\\demo\\1.mp3 alias bkmusic", NULL, 0, NULL);
    mciSendString("play bkmusic repeat", NULL, 0, NULL);     //循环播放音乐
 
    while (1)
    {
        BeginBatchDraw();                           //双缓冲绘图开始
        cleardevice();
        DrawSnake();
        DrawFood();
        DrawWall();
        MoveSnake();
        EatFood();
        Stop();                                     //按空格游戏暂停
        GameOver();
        if (food.flag == 0)
        {
            InitFood();
            grade += 10;
        }
        if (wall.flag == 0)
        {
            printf("***************************************\n");
            printf("***************************************\n");
            printf("*************Game Over!!!!*************\n");
            printf("*************Your Grade is:%d**********\n", grade);
            printf("***************************************\n");
            printf("***************************************\n");
            break;
        }
        if (_kbhit())                               //判断是否有按键
        {
            KeyDown();
        }
        Sleep(100);                                  //控制速度
        EndBatchDraw();                             //将之前的操作显示出来
    }
    closegraph();                                      //关闭图形窗口
}
 
void menu()
{
    printf("**************贪吃蛇小游戏*************\n");
    printf("***************************************\n");
    printf("***************************************\n");
    printf("***************游戏说明:**************\n");
    printf("****玩家操控蛇吃东西,吃到以后长度+1***\n");
    printf("**如果玩家操控蛇头撞墙了那么直接结束***\n");
    printf("*******另外按空格可以暂停游戏哦!******\n");
    printf("**************ok游戏开始!*************\n");
    printf("***************************************\n");
    printf("***************************************\n");
    printf("***********1.扣1回车开始游戏***********\n");
    printf("***************************************\n");
    printf("***************************************\n");
    printf("********2.扣眼珠子退出(bushi)********\n");
    printf("***************************************\n");
    printf("***************************************\n");
}
int main()
{
    int n = 0;
    menu();
    while (scanf("%d", &n), n == 1)
    {
        Game();
    }
    printf("好的,游戏结束!");
    return 0;
}

  • 9
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 以下是一个简单贪吃蛇游戏的 C 语言程序代码: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #define MAX_LENGTH 100 int width = 20; // 游戏窗口宽度 int height = 20; // 游戏窗口高度 int x, y; // 蛇头坐标 int food_x, food_y; // 食物坐标 int score; // 得分 int tail_x[MAX_LENGTH], tail_y[MAX_LENGTH]; // 蛇身坐标 int tail_length; // 蛇身长度 enum direction {STOP = 0, LEFT, RIGHT, UP, DOWN}; // 方向控制 enum direction dir; void init() { x = width / 2; y = height / 2; food_x = rand() % width; food_y = rand() % height; score = 0; dir = STOP; } void draw() { system("cls"); for (int i = 0; i < width+2; i++) printf("#"); printf("\n"); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (j == 0) printf("#"); if (i == y && j == x) printf("O"); else if (i == food_y && j == food_x) printf("F"); else { int flag = 0; for (int k = 0; k < tail_length; k++) { if (tail_x[k] == j && tail_y[k] == i) { printf("o"); flag = 1; } } if (!flag) printf(" "); } if (j == width - 1) printf("#"); } printf("\n"); } for (int i = 0; i < width+2; i++) printf("#"); printf("\n"); printf("Score: %d\n", score); } void input() { if (kbhit()) { switch (getch()) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'x': dir = STOP; break; case 'q': exit(0); break; } } } void logic() { int prev_x = tail_x[0], prev_y = tail_y[0]; int prev2_x, prev2_y; tail_x[0] = x; tail_y[0] = y; for (int i = 1; i < tail_length; i++) { prev2_x = tail_x[i]; prev2_y = tail_y[i]; tail_x[i] = prev_x; tail_y[i] = prev_y; prev_x = prev2_x; prev_y = prev2_y; } switch (dir) { case LEFT: x--; break; case RIGHT: x++; break; case UP: y--; break; case DOWN: y++; break; } if (x >= width) x = 0; else if (x < 0) x = width - 1; if (y >= height) y = 0; else if (y < 0) y = height - 1; for (int i = 0; i < tail_length; i++) { if (tail_x[i] == x && tail_y[i] == y) { score = 0; tail_length = 0; } } if (x == food_x && y == food_y) { score += 10; food_x = rand() % width; food_y = rand() % height; tail_length++; } } int main() { init(); while (1) { draw(); input(); logic(); Sleep(100); } return 0; } ``` 这个程序使用了 Windows.h 头文件,所以只能在 Windows 系统上运行。如果需要在其他系统上运行,需要将 `system("cls")` 改为相应的清屏命令。 ### 回答2: 贪吃蛇是一款经典的游戏,一般由一个蛇和苹果组成。游戏目标是控制蛇吃苹果,每吃到一个苹果蛇身长度增加一节。如果蛇头撞到蛇身或者撞墙,则游戏结束。 以下是一个简单贪吃蛇C语言程序代码: ```c #include <stdio.h> #include <conio.h> #include <windows.h> #define WIDTH 20 #define HEIGHT 15 int score; int gameOver; int x, y; // 蛇头的坐标 int fruitX, fruitY; // 苹果的坐标 int tailX[100], tailY[100]; // 蛇身的坐标 int tailLength; enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN }; enum eDirection dir; void Setup() { gameOver = 0; dir = STOP; x = WIDTH / 2; y = HEIGHT / 2; fruitX = rand() % WIDTH; fruitY = rand() % HEIGHT; score = 0; } void Draw() { system("cls"); for (int i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { if (j == 0) printf("#"); if (i == y && j == x) printf("O"); else if (i == fruitY && j == fruitX) printf("F"); else { int printTail = 0; for (int k = 0; k < tailLength; k++) { if (tailX[k] == j && tailY[k] == i) { printf("o"); printTail = 1; } } if (!printTail) printf(" "); } if (j == WIDTH - 1) printf("#"); } printf("\n"); } for (int i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); printf("Score: %d\n", score); } void Input() { if (_kbhit()) { switch (_getch()) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'x': gameOver = 1; break; } } void Logic() { int prevX = tailX[0]; int prevY = tailY[0]; int prev2X, prev2Y; tailX[0] = x; tailY[0] = y; for (int i = 1; i < tailLength; i++) { prev2X = tailX[i]; prev2Y = tailY[i]; tailX[i] = prevX; tailY[i] = prevY; prevX = prev2X; prevY = prev2Y; } switch (dir) { case LEFT: x--; break; case RIGHT: x++; break; case UP: y--; break; case DOWN: y++; break; } if (x >= WIDTH) x = 0; else if (x < 0) x = WIDTH - 1; if (y >= HEIGHT) y = 0; else if (y < 0) y = HEIGHT - 1; for (int i = 0; i < tailLength; i++) { if (tailX[i] == x && tailY[i] == y) { gameOver = 1; break; } } if (x == fruitX && y == fruitY) { score += 10; fruitX = rand() % WIDTH; fruitY = rand() % HEIGHT; tailLength++; } } int main() { Setup(); while (!gameOver) { Draw(); Input(); Logic(); Sleep(10); // 控制帧率 } return 0; } ``` 这个C语言程序通过控制台绘制了一个贪吃蛇游戏界面。可以使用键盘的ADWS键来控制蛇的移动方向,X键用来退出游戏。贪吃蛇移动时,每吃到一个苹果分数增加10分,同时长度也会增加一节。如果蛇头撞到蛇身或者撞墙,则游戏结束。 ### 回答3: 贪吃蛇是一款经典的游戏,在C语言中编写贪吃蛇的程序代码相当有趣。 首先,我们需要定义一些常量,如窗口宽度、高度、蛇身长度等。然后,我们需要定义蛇的结构体,包括蛇头位置、蛇身数组、蛇的长度等成员变量。 接下来,我们需要实现一些基本的功能函数,如初始化蛇头位置、绘制蛇身、处理键盘输入等。在每次游戏循环中,我们需要不断更新蛇的位置,并处理碰撞事件,如蛇头与边界、自身以及食物的碰撞。 当蛇头与食物碰撞时,蛇的长度增加,然后随机生成一个新的食物位置。同时,我们还需要实现一个函数来判断游戏是否结束,即蛇头与边界或自身碰撞。 在游戏主循环中,我们通过不断更新蛇的位置,并根据用户的输入来改变蛇的方向。通过不断刷新屏幕来实现动画效果,让蛇在窗口中移动。 最后,在主函数中调用以上函数,并通过一个循环来控制游戏的进行。当游戏结束时,展示最终得分,并询问玩家是否重新开始游戏。 总之,贪吃蛇C语言程序代码实现起来并不复杂,主要涉及蛇的移动、碰撞检测以及界面的绘制等基本操作。有了上述的框架和思路,我们就可以编写出一个简单而有趣的贪吃蛇游戏了。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值