C++ 贪吃蛇二维

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>

int g_Dir = 3;
#define UP         0
#define DOWN  1
#define LEFT       2
#define RIGHT   3

struct FOOD
{
    int X = 0;
    int Y = 0;
    bool State = 0;
}Food;

//方向控制
void SnekeMove()
{
    if (::GetAsyncKeyState(VK_UP) & 1)
        g_Dir = 0;
    if (::GetAsyncKeyState(VK_DOWN) & 1)
        g_Dir = 1;
    if (::GetAsyncKeyState(VK_LEFT) & 1)
        g_Dir = 2;
    if (::GetAsyncKeyState(VK_RIGHT) & 1)
        g_Dir = 3;
}

//主函数
int main()
{
    srand((unsigned int)time(NULL));
    int W = 20;
    int H = 20;
    int Len = 3;
    int Map[20][20] = { 0 };
    int Snake[50][2] = { 0 };
    //Snake[0] = 2;//为蛇头

    for (int i = 0; i < Len; i++)
    {
        Snake[i][0] = Len - i - 1;
    }
    Food.X = W / 2;
    Food.Y = H / 2;
    Map[Food.Y][Food.X] = 2;

    const char *SNAKE[] = { "  ", "■" ,"★"};
    while (true)
    {
        system("cls");
        int x = 0;
        int y = 0;
        for (int i = 0; i < Len; i++)
        {
            // 2 1 0
            // 1 1 1

            // 3 2 1
            // 0 1 1 1
            //这里需要注意
            x = Snake[i][0];
            y = Snake[i][1];
            //这里取决于对二维数组的理解
            //虽然Y始终为0
            //Map[y] 为首地址
            //经过推理得到这几种写法
            //*(Map[y] + x) = 1;
            //Map[y][x] = 1;
            *(Map[0] + x) = 1;
            //Map[0][x] = 1;
        }
        for (int i = 0; i < H; i++)
        {
            for (int j = 0; j < W; j++)
            {
                std::cout << SNAKE[Map[i][j]];
            }
            std::cout << std::endl;
        }
        memset(Map, 0, sizeof(Map));
        SnekeMove();
        for (int i = Len; i > 0; i--)
        {
            Snake[i][0] = Snake[i - 1][0];
        }

        if (g_Dir == UP)
        {
            Snake[0][0] -= W;
        }
        if (g_Dir == DOWN)
        {
            Snake[0][0] += W;
        }
        if (g_Dir == LEFT)
        {
            Snake[0][0]--;
        }
        if (g_Dir == RIGHT)
        {
            Snake[0][0]++;
        }

        Sleep(50);
    }

    //https://www.bilibili.com/video/av29007126/?spm_id_from=333.788.videocard.1
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/YZFHKMS-X/p/11780545.html

时间: 2024-10-16 19:49:47

C++ 贪吃蛇二维的相关文章

小游戏●贪吃蛇1(利用二维数组制作)

利用二维数组编写简单贪吃蛇小游戏,由于是初学C#,用的是单线程,所以蛇不会自动前进 代码及简要分析如下: 1 //定义地图,0为空,1为墙,2为蛇,3为食物 2 int[,] map = new int[15, 15]{ 3 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 4 {1,2,0,0,0,0,0,0,0,0,0,0,0,0,1}, 5 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 6 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

贪吃蛇(二维数组)

这是我思考了一天的游戏,错过了两节课,心痛啊,总用时2个星期,感动!!! import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JButton; import javax.sw

贪吃蛇的java代码分析(二)

代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过程. 让我们逐一分析.首先,整个游戏最基本的元素是地图.在java中用于绘图的类是swing和awt,在这里主要用到swing类.swing中用于窗口显示的类有JFrame及其子类.JFrame可以直接添加组件,但其本质是将组件添加到JFrame中的一个默认面板里,为了代码清晰,我会使用JPanel

[C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义

游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没有出现在世界中(即食物的颜色和世界的颜色相同,因此看不见食物).这就像鬼一样,它可能存在于这个世界上,但我们看不到它. 2. 一个属于世界的食物,具有在这个世界中的位置. 3. 它有颜色和大小. 因此,食物的结构体定义就显而易见了! typedef struct Food { World *worl

贪吃蛇“大作战”(二)

从对象出发看贪吃蛇 在上一篇博客中,我通过逐行分析代码对贪吃蛇的运行机制做了一个简要的介绍:逐行分析后可以看出这个贪吃蛇例程的编写范式更突出面向过程:该例程先是预设食物和贪吃蛇的位置参数,然后通过选择逻辑判断外部命令的值,根据不同的值做出不同的动作,最后在地图上将之前的动作"渲染",达到贪吃蛇"前进"的效果:如此下来,一步一步地根据"看得到的逻辑"实现了贪吃蛇的运行机制. 现在,我从面向对象的编程思维来对这个贪吃蛇运行机制做一个分析.从下面这幅图

游戏开发(一)——控制台 贪吃蛇

贪吃蛇游戏设计中主要需要注意的几点: 1:坐标的定义:定义为左上角为(0,0),向右为x正方向,向下为y正方向 2:蛇的设计, 蛇身:m_body,这里用的是链表(是之前写好的双链表),一个节点就是蛇身的一节 每节蛇身的属性包括x,y坐标:column_x,row_y,x表示在地图上的第几列,y表示在地图上的第几行 蛇有一个属性叫朝向,也就是当前在往上.下.左.右的哪个方向移动:m_forward 蛇的动作有:Turn,转向.转向有个判断,就是不能向相反的方向转,比如本来向上运动,按向下键,是无

使用VB创建贪吃蛇

贪吃蛇作为一个经典游戏,在其开发成功后,有很长一段时间令很多人为之振奋,但随着时间的流逝,贪吃蛇也逐渐淡出人们的视野.本次,我利用VB重现贪吃蛇的创建.主要使用到的控件:Label标签,Command按钮,Timer控件. 以下为创建过程: 贪吃蛇作为一个游戏来说,主要分为6个部分: 地图创建部分: 地图坐标初始化部分: 食物创建部分: 贪吃蛇创建部分: 贪吃蛇移动控制部分: 贪吃蛇吃食物身体变化部分. 在创建之前,我们需要为我们需要的变量进行定义: 1 Private MapXy(4900)

一个简单的“贪吃蛇”小游戏

一个简单的“贪吃蛇”小游戏 页面结构 简单的21x21的方块,页面结构 id为container的div包含所21个class名为row的div,每个row代表贪吃蛇的一整行,每个row中又包含21个div,代表这一行的每一个div方格,如果这个方格是空的话,div的类名为blank,如果这一个方格表示“贪吃蛇”的“食物”,div的类名为food,如果这一个方格表示“蛇”,div的类名为snake. CSS JS 然后我们思考下一个贪吃蛇游戏需要那些参数, 首先,界面中可见的元素无非就是空方格,

JavaScript实现简单贪吃蛇小游戏

之前上Web课,学到JavaScript的时候,老师要求写几个静态页面,要用到JavaScript.想了想就写个贪吃蛇吧.其实之前用pygame写过一次GUI的贪吃蛇,素材都是自己拿画图画的,其丑无比.所以这次还是老老实实用字符吧. 首先,是一些全局变量的定义: 1 <script> 2 var state = 0;//0 wait 1 run 2 over 3 var width = 40; 4 var height = 25; 5 var update = false; 6 var dir