首页 > 其他分享 >C语言项目(一)----- 贪吃蛇

C语言项目(一)----- 贪吃蛇

时间:2024-03-28 11:23:24浏览次数:22  
标签:body case int void C语言 贪吃蛇 ----- snake size

1.定义蛇、食物的结构体
2.初始化蛇和食物
3.开始游戏
  蛇和墙的碰撞
  蛇和自身碰撞
  蛇和食物碰撞
    重新随机食物
    蛇身体增长
    分数增长
  方向键控制
4.游戏结束

 

---1.定义蛇、食物的结构体

#define WIDTH 60
#define HEIGHT 20

struct BODY
{
    int X;
    int Y;
};

struct Snake
{
    int size;
    struct BODY body[WIDTH * HEIGHT];
}snake;

struct Food
{
    int X;
    int Y;
}food;

---2.初始化蛇、食物、墙

void InitFood()
{
    food.X = rand() % WIDTH;
    food.Y = rand() % HEIGHT;
}

void InitSnake()
{
    snake.size = 2;
    snake.body[0].X = WIDTH / 2;
    snake.body[0].Y = HEIGHT / 2;

    snake.body[1].X = WIDTH / 2 - 1;
    snake.body[1].Y = HEIGHT / 2;

}
void InitWall() { for (int i = 0; i <= HEIGHT; i++) { for (int j = 0; j <= WIDTH; j++) { if (i == HEIGHT) { putchar('='); } else if (j == WIDTH) { putchar('='); } else { putchar(' '); } } putchar('\n'); } }

---3.开始游戏

    int key = 'D';
    // 是否和墙碰撞
    while (snake.body[0].X >= 0 && snake.body[0].X < WIDTH
        && snake.body[0].Y >= 0 && snake.body[0].Y < HEIGHT)
    {
        // 显示界面
        ShowUi();

        // 方向控制
        while (_kbhit())
        {
            key = _getch();
        }
        switch (key)
        {
        case'D':case'd':dx = 1; dy = 0; break;
        case'A':case'a':dx = -1; dy = 0; break;
        case'W':case'w':dx = 0; dy = -1; break;
        case'S':case's':dx = 0; dy = 1; break;
        }

        // 是否和自身碰撞
        for (int i = 1; i < snake.size; i++)
        {
            if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)
            {
                return;
            }
        }

        // 和食物碰撞
        if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
        {
            // 随机新食物
            InitFood();
            // 身体增长
            snake.size++;
            // 分数增长
            score += 10;
            // 关卡 速度 障碍物
        }
   }
        // 将蛇尾巴经过显示的痕迹去掉
        lx = snake.body[snake.size - 1].X;
        ly = snake.body[snake.size - 1].Y;
                // 蛇更新坐标
        for (int i = snake.size - 1; i > 0; i--)
        {
            snake.body[i].X = snake.body[i - 1].X;
            snake.body[i].Y = snake.body[i - 1].Y;
        }
        // 更新蛇头
        snake.body[0].X += dx;
        snake.body[0].Y += dy;
                // 控制蛇移动的速度
                if (score > 30)
        {
            Sleep(300);
        }
        else if(score > 50)
        {
            Sleep(100);
        }
        else
        {
            Sleep(500);
        }         

-------------------------------------------------------------------------------------------------------完整代码---------------------------------------------------------------------------------------------------------------------------------------

// Snakes.h

#define WIDTH 60
#define HEIGHT 20

struct BODY
{
    int X;
    int Y;
};

struct Snake
{
    int size;
    struct BODY body[WIDTH * HEIGHT];
}snake;

struct Food
{
    int X;
    int Y;
}food;

int score = 0;
// 记录蛇末尾坐标
int lx = 0;
int ly = 0;
// 偏移坐标
int dx = 0;
int dy = 0;
void InitFood();
void InitSnake();
void ShowUi();
void PlayGame();
void InitWall();
// Snakes.cpp

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

#include "Snakes.h"

void InitFood()
{
    food.X = rand() % WIDTH;
    food.Y = rand() % HEIGHT;
}

void InitSnake()
{
    snake.size = 2;
    snake.body[0].X = WIDTH / 2;
    snake.body[0].Y = HEIGHT / 2;

    snake.body[1].X = WIDTH / 2 - 1;
    snake.body[1].Y = HEIGHT / 2;

}

void ShowUi()
{
    COORD coord;
    // 更新末尾空格
    coord.X = lx;
    coord.Y = ly;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    putchar(' ');

    // 显示蛇的位置
    for (int i = 0; i < snake.size; i++)
    {
        coord.X = snake.body[i].X;
        coord.Y = snake.body[i].Y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
        if (i == 0)
        {
            putchar('@');
        }
        else
        {
            putchar('*');
        }
    }

    // 显示食物的位置
    coord.X = food.X;
    coord.Y = food.Y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    printf("#");
}

void PlayGame()
{
    int key = 'D';
    // 是否和墙碰撞
    while (snake.body[0].X >= 0 && snake.body[0].X < WIDTH
        && snake.body[0].Y >= 0 && snake.body[0].Y < HEIGHT)
    {
        // 显示界面
        ShowUi();

        // 方向控制
        while (_kbhit())
        {
            key = _getch();
        }
        switch (key)
        {
        case'D':case'd':dx = 1; dy = 0; break;
        case'A':case'a':dx = -1; dy = 0; break;
        case'W':case'w':dx = 0; dy = -1; break;
        case'S':case's':dx = 0; dy = 1; break;
        }

        // 是否和自身碰撞
        for (int i = 1; i < snake.size; i++)
        {
            if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)
            {
                return;
            }
        }

        // 和食物碰撞
        if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
        {
            // 随机新食物
            InitFood();
            // 身体增长
            snake.size++;
            // 分数增长
            score += 10;
            // 关卡 速度 障碍物
        }

        // 蛇更新坐标
        lx = snake.body[snake.size - 1].X;
        ly = snake.body[snake.size - 1].Y;

        for (int i = snake.size - 1; i > 0; i--)
        {
            snake.body[i].X = snake.body[i - 1].X;
            snake.body[i].Y = snake.body[i - 1].Y;
        }
        // 更新蛇头
        snake.body[0].X += dx;
        snake.body[0].Y += dy;

        if (score > 30)
        {
            Sleep(300);
        }
        else if(score > 50)
        {
            Sleep(100);
        }
        else
        {
            Sleep(500);
        }
        //system("cls");
    }
}

void InitWall()
{
    for (int i = 0; i <= HEIGHT; i++)
    {
        for (int j = 0; j <= WIDTH; j++)
        {
            if (i == HEIGHT)
            {
                putchar('=');
            }
            else if (j == WIDTH)
            {
                putchar('=');
            }
            else
            {
                putchar(' ');
            }
        }
        putchar('\n');
    }
}


int main()
{
    /*
     1.定义蛇的结构体
     2.初始化蛇和食物
     3.开始游戏
          蛇和墙的碰撞
          蛇和自身碰撞
          蛇和食物碰撞
             重新随机食物
             蛇身体增长
             分数增长
          方向键控制
     4.游戏结束
    */

    srand((size_t)time(NULL));

    // 去掉控制台的光标
    CONSOLE_CURSOR_INFO cci;
    cci.dwSize = sizeof(cci);
    cci.bVisible = FALSE;
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);

    InitWall();
    InitFood();
    InitSnake();
    PlayGame();
    

    //getchar();
    return EXIT_SUCCESS;
}

 

标签:body,case,int,void,C语言,贪吃蛇,-----,snake,size
From: https://www.cnblogs.com/gnos1s/p/18099506

相关文章

  • [Kubernetes] Managing Application with Kubernetes - ConfigMaps and Secrets
    IdentifyimportantConfigMapcharacteristics:Helpsdevelopersavoidhard-codingconfigurationvariablesintotheapplicationcode.IsanAPIobjectusedtostorenon-confidentialdatainkey-valuepairs.Doesnotprovidesecrecyorencryption;meantfor......
  • vue/react- 报错Unable to authenticate, need: BASIC realm=“Sonatype Nexus Reposi
    问题描述在vue/react(node.js)项目中,node安装依赖install装包时报错:Unabletoauthenticate,need:BASICrealm=“SonatypeNexusRepositoryManager“如果我们报错差不多,就可以完美解决。解决方法这个问题,其实......
  • vue3 - 最新手机扫码PC网站二维码登录功能,用手机端扫描PC端vue3网页的登录二维码,然后
    效果图在vue3开发中,详细实现“PC电脑网站生成微信登录二维码+手机扫码登录+双端同步数据”,利用扫码实现网站登录功能、用户用手机扫描电脑端二维码进行登录的详细教程步骤(电脑端PC网页、手机端都是vue3开发,支持将手机端改造成微信小程序、uniapp安卓苹果app、H5网页等。)......
  • MySQL - 数据更新场景
      Excel文件数据更新到表A的某两个字段Excel文件中Sheet1页有两列,一列是序号,另一列是手机号。表A中有对应的序号列和手机号列。1、首先,使用Navicat将Excel数据导入数据库,注意修改Excel字段和目标表字段的映射。2、执行以下语句即可完成更新操作。updatetable_aasainne......
  • Docker expose指令和-p 指令指定的端口区别
    expose指令用法该 EXPOSE 指令通知Docker容器在运行时侦听指定的网络端口,可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认为TCP。EXPOSE80/tcpEXPOSE80/udpEXPOSE 指令实际上不会发布端口。它充当构建映像的人员和运行容器的人员之间的一种文档,用于发布要......
  • .NET分布式Orleans - 6 - 事件溯源
    基本概念事件溯源(EventSourcing)是一种设计模式,它记录并存储了应用程序状态变化的所有事件。其核心思想是将系统中的每次状态变化都视为一个事件,并将这些事件以时间顺序的方式持久化存储。这样,通过重放这些事件,我们可以重建系统在任何特定时间点的状态。每个事件通常都包含了......
  • openGaus DB4AI-数据库驱动AI
    DB4AI:数据库驱动AI可获得性本特性自openGauss2.1.0版本开始引入。特性简介DB4AI是指利用数据库的能力驱动AI任务,实现数据存储、技术栈的同构。通过在数据库内集成AI算法,令openGauss具备数据库原生AI计算引擎、模型管理、AI算子、AI原生执行计划的能力,为用户提供普惠AI技术......
  • vue前端根据el-table导出excel
    1.导入xlsx、xlsx-style、file-savernpminstall--savexlsxnpminstall--savexlsx-stylenpminstall--savefile-saver2.防止xlsx-style报错vue.config.js添加chainWebpack(config){config.externals({"./cptable":"varcptable"});//xlsx......
  • Linux - 批量清除失效软连接
     红底白字,并且一闪一闪的都是失效的软连接,需要批量清除它们...1、打印所有失效软连接find./*-typel-exectest!-e{}\;-exececho{}\; 2、批量清除失效软连接find/path/to/search-typel-exectest!-e{}\;-execrm{}\;    — 要养成终生......
  • openGauss Xlog-no-Lock-Flush
    XlognoLockFlush可获得性本特性自openGauss2.0.0版本开始引入。特性简介取消WalInsertLock争抢及WalWriter专用磁盘写入线程。客户价值在保持原有XLog功能不变的基础上,进一步提升系统性能。特性描述对WalInsertLock进行优化,利用LSN(LogSequenceNumber)及LRC(LogRecor......