打印
[应用相关]

C语言STM32贪吃蛇框架

[复制链接]
46|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoqizi|  楼主 | 2024-12-19 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        对于一般的贪吃蛇都是内存占用太多了(例如/):

                1.Map内存

                2.蛇身储存

                3.控制内存

        但是对于STM32的这点内存来说是不划算的(STM32F103c8t6 20KB SRAM)

         而我们可以优化一定的内存,例如删除《蛇身储存》

                从示例代码中可以看到一行Map定义:

int face[ROW][COL]; //标记游戏区各个位置的状态
                在这行代码中使用了int定义了一个二维数组

                int的位数是32位,而在代码中却只表示了0 & 1

                        所以我们可以将这个数组和蛇的定义一起解决

                        我们的蛇一般长度不会超过65535(我的代码用u8解决,因为我显示在OLED屏幕,且行列为16x16)

                        所以我们可以使用u16解决;

在头我们用了一个和数组类型相同的量来定位蛇头

每次游戏动作都对整个数组小于65535(65535设为食物标识)且大于0的数进行减去1

贪吃蛇的行列我搞混了(本人初1,英语词汇量不好),不过没事,读者改改就好了

下面的代码只能容纳下16x16的地图,最大长度小于254

随机食物没有测试,stm32f1核心板坏了,操作上下左右和边界碰撞没问题

#include "tcs/tcs.h"
#include "APP_API.h"
#include <stdlib.h>
u8 map[TCS_COL][TCS_ROW];
//0 up 1 down 3 left 4 right
u8 TCS_Head_FX = TCS_FX_RIGHT;
u8 TCS_Now_LEN = 6;
u8 m;
//H8 bit col L8 bit row
u16 TCS_find_node(u8 node)
{
    for(u8 a = 0;a < TCS_COL;a++)
        for(u8 b = 0;b < TCS_ROW;b++)
            if(map[a][b] == node)
                return (a << 8) + b;
}

void TCS_Set_node(u8 col,u8 row,u8 v)
{
    if((col < TCS_COL) && (row < TCS_ROW))
        map[col][row] = v;
}

u8 TCS_Get_Head_Col()
{
    u8 col,row,a,flag;
    flag = 0;
    for(col = 0;(col < TCS_COL) && (flag == 0);col++)
        for(row = 0;(row < TCS_ROW) && (flag == 0);row++)
            if(map[col][row] == TCS_Now_LEN)
                flag = 1;
    if(flag == 1)
        return col;
    else
        return TCS_COL + 1;
}

u8 TCS_Get_Head_Row()
{
    u8 col,row,a,flag;
    flag = 0;
    for(col = 0;(col < TCS_COL) && (flag == 0);col++)
        for(row = 0;(row < TCS_ROW) && (flag == 0);row++)
            if(map[col][row] == TCS_Now_LEN)
                flag = 1;
    if(flag == 1)
        return row;   
    else
        return TCS_ROW + 1;
}

void TCS_node_del(u8 v)
{
    u16 t = 0;
    u8 c = 0,r = 0;
    for(u8 a = 0;a < TCS_COL;a++)
        for(u8 b = 0;b < TCS_ROW;b++)
            if(map[a][b] != 0)
                map[a][b]--;

}

u16 TCS_Round(u16 min,u16 max)
{
    u16 v1;
    v1 = ADC_GetConversionValue(ADC1);
    srand(v1 << 16 + cut);
    return (rand() % (max - min)) + min;
}

void TCS_Create_Food(u16 xy)
{
    u8 x,y;
    x = xy >> 8;
    y = xy & 0xff;
    if((x < TCS_COL) & (y < TCS_COL))
        map[x][y] = 255;
}
void TCS_Show_A_22Dip(u8 c,u8 r,u8 v)
{
    OLED_DrawPoint(2 * c + 1,2 * r + 1,v);
    OLED_DrawPoint(2 * c + 1 + 1,2 * r + 1,v);
    OLED_DrawPoint(2 * c + 1,2 * r + 1 + 1,v);
    OLED_DrawPoint(2 * c + 1 + 1,2 * r + 1 + 1,v);
}

void TCS_Show_Map()
{
    for(u8 a = 0;a < TCS_COL;a++)
        for(u8 b = 0;b < TCS_ROW;b++)
            if(map[a][b] != 0)
                TCS_Show_A_22Dip(b,a,1);
            else
                TCS_Show_A_22Dip(b,a,0);
    OLED_DrawLine(0,0,TCS_COL * 2 + 1,0);//x
    OLED_DrawLine(0,0,0,TCS_ROW * 2 + 1);//y
    OLED_DrawLine(0,TCS_COL * 2 + 1,TCS_COL * 2 + 1,TCS_COL * 2 + 1);//x
    OLED_DrawLine(TCS_ROW * 2 + 1,0,TCS_COL * 2 + 1,TCS_ROW * 2 + 1);//y
}

void TCS_FX_Set(u8 fx)
{
    if(TCS_Head_FX != fx)
        if((fx + 1 != TCS_Head_FX) && (fx - 1 != TCS_Head_FX))
            TCS_Head_FX = fx;
}

u8 TCS_Head_Cheak()
{
    if(TCS_Get_Head_Col() < 0)
        return 1;
    if(TCS_Get_Head_Col() >= TCS_COL)
        return 1;
    if(TCS_Get_Head_Row() < 0)
        return 1;
    if(TCS_Get_Head_Row() > TCS_ROW)
        return 1;
    return 0;
}

void TCS_FX_Add()
{
    u8 now_c,now_r;
    now_c = TCS_Get_Head_Col();
    now_r = TCS_Get_Head_Row();
    if(TCS_Head_FX == TCS_FX_UP)
        if((map[now_c][now_r - 1] != 255))
            TCS_Now_LEN ++;
    else if(TCS_Head_FX == TCS_FX_DOWN)
        if((map[now_c][now_r + 1] != 0) && (map[now_c][now_r + 1] != 255))
            TCS_Now_LEN ++;
    else if(TCS_Head_FX == TCS_FX_LEFT)
        if((map[now_c - 1][now_r] != 0) && (map[now_c - 1][now_r] != 255))
            TCS_Now_LEN ++;
    else if(TCS_Head_FX == TCS_FX_RIGHT)
        if((map[now_c + 1][now_r] != 0) && (map[now_c + 1][now_r] != 255))
            TCS_Now_LEN ++;
}
void Map_Clear()
{
    for(u8 a = 0;a < TCS_COL;a++)
        for(u8 b = 0;b < TCS_ROW;b++)
            map[a][b] = 0;
}
void TCS_Init()
{
    OLED_Clear();
    Map_Clear();
    TCS_Set_node(TCS_COL / 2,TCS_ROW / 2,TCS_Now_LEN);
    TCS_Show_Map();
}

void TCS_Main()
{
    TCS_Init();
    while(1)
    {
        m++;
        if(m == 200)
            m = 0;


        if(m % 7 == 0)
        {
            if(GPIO_ReadInputDataBit(OK_GPIO,OK_KEY) == 0)
                TCS_Init();
            if(GPIO_ReadInputDataBit(UP_GPIO,UP_KEY) == 0)
                TCS_FX_Set(TCS_FX_UP);
            if(GPIO_ReadInputDataBit(DOWN_GPIO,DOWN_KEY) == 0)
                TCS_FX_Set(TCS_FX_DOWN);
            if(GPIO_ReadInputDataBit(LEFT_GPIO,LEFT_KEY) == 0)
                TCS_FX_Set(TCS_FX_LEFT);
            if(GPIO_ReadInputDataBit(RIGHT_GPIO,RIGHT_KEY) == 0)
                TCS_FX_Set(TCS_FX_RIGHT);
        }
        if(m % 40 == 0)
        {
            TCS_FX_Add();
            TCS_node_del(255);
            TCS_Show_Map();
            if(TCS_Head_Cheak() == 1)
            {
                OLED_ShowString(0,2,"Game Over");
                OLED_ShowString(0,3,"Wait OK");
                while(GPIO_ReadInputDataBit(OK_GPIO,OK_KEY) == 1)
                    ;
                TCS_Init();
            }
        }
        OLED_ShowNum(0,7,TCS_Get_Head_Row(),2);
        OLED_ShowNum(62,7,TCS_Get_Head_Col(),2);
        APP_Delay(10);

    }
}

头文件(虽然col和row加了注释,但是还是搞混了)

#ifndef _TCS_H_
#define _TCS_H_

#include "stm32f10x.h"

#define TCS_MAX_LENHT 255
#define TCS_COL 16 //列
#define TCS_ROW 16 //行

#define TCS_FX_UP 0
#define TCS_FX_DOWN 1
#define TCS_FX_LEFT 3
#define TCS_FX_RIGHT 4

u16 TCS_find_node(u8 node);
void TCS_Set_node(u8 col,u8 row,u8 v);
void TCS_Show_A_22Dip(u8 x,u8 y,u8 v);
void TCS_Show_Map();
void TCS_Main();

#endif
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_61933391/article/details/144516784

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

4128

帖子

3

粉丝