对于一般的贪吃蛇都是内存占用太多了(例如/):
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
|
共1人点赞
|