贪吃蛇游戏代码解析:每行代码的语法和语义解释
#include 'main.h' // 包含main.h头文件
#include 'ILI9341.h' // 包含ILI9341.h头文件
#include 'MIPI-DBI.h' // 包含MIPI-DBI.h头文件
#include 'Draw.h' // 包含Draw.h头文件
#include 'stdlib.h' // 包含stdlib.h头文件
#include 'rng.h' // 包含rng.h头文件
typdef struct { uint32_t row; // 定义结构体成员row,表示行号 uint32_t col; // 定义结构体成员col,表示列号 } Point; // 定义Point结构体,包含row和col两个成员
Point SnakeHead; // 定义SnakeHead变量,类型为Point结构体 Point SnakeTail; // 定义SnakeTail变量,类型为Point结构体 Point Food; // 定义Food变量,类型为Point结构体 uint32_t SnakeLength = 3; // 定义SnakeLength变量,表示贪吃蛇的长度,初始值为3
uint32_t map[48][2] = {0}; // 定义map数组,大小为48行2列,元素类型为uint32_t,初始值为0 uint32_t dir_list[50] = {0}; // 定义dir_list数组,大小为50,元素类型为uint32_t,初始值为0
uint32_t dir = 3; // 定义dir变量,表示贪吃蛇的移动方向,初始值为3
void aaaa() // 定义aaaa函数,无返回值 { int32_t i,j = 0; // 定义i和j变量,类型为int32_t,初始值为0 uint8_t temp[33] = {0}; // 定义temp数组,大小为33,元素类型为uint8_t,初始值为0
for(i = 0; i < 48; i++) // 循环遍历i从0到47
{
for(j = 0; j < 32; j++) // 循环遍历j从0到31
{
if((map[i][0] >> j) & 0x00000001) // 判断map[i][0]的第j位是否为1
temp[j] = '#'; // 如果为1,将temp[j]赋值为'#'
else
temp[j] = ' '; // 如果为0,将temp[j]赋值为空格
}
printf('%s', temp); // 打印temp数组
for(j = 0; j < 32; j++) // 循环遍历j从0到31
{
if((map[i][1] >> j) & 0x00000001) // 判断map[i][1]的第j位是否为1
temp[j] = '#'; // 如果为1,将temp[j]赋值为'#'
else
temp[j] = ' '; // 如果为0,将temp[j]赋值为空格
}
printf('%s\r\n', temp); // 打印temp数组并换行
}
}
void bbbb(uint32_t dir) // 定义bbbb函数,参数为dir,类型为uint32_t,没有返回值 { static uint32_t pointer = 2; // 定义静态局部变量pointer,初始值为2
dir &= 0x00000003; // 将dir与0x00000003进行位与运算,保留低2位
dir_list[pointer / 16] &= ~(0x00000003 << ((pointer % 16) * 2)); // 将dir_list数组中的对应位置为0
dir_list[pointer / 16] |= (dir << ((pointer % 16) * 2)); // 将dir的值存入dir_list数组中的对应位置
pointer++; // pointer值加1
if(pointer == 800) pointer = 0; // 如果pointer等于800,将pointer赋值为0
}
uint32_t cccc() // 定义cccc函数,返回值类型为uint32_t { static uint32_t pointer = 0; // 定义静态局部变量pointer,初始值为0 uint32_t data = 0; // 定义data变量,类型为uint32_t,初始值为0
data = (dir_list[pointer / 16] >> ((pointer % 16) * 2)) & 0x00000003; // 获取dir_list数组中的对应位置的值
pointer++; // pointer值加1
if(pointer == 800) pointer = 0; // 如果pointer等于800,将pointer赋值为0
return data; // 返回data的值
}
uint32_t dddd(uint32_t min, uint32_t max) // 定义dddd函数,参数为min和max,类型均为uint32_t,返回值类型为uint32_t { uint32_t random_value; // 定义random_value变量,类型为uint32_t
HAL_RNG_GenerateRandomNumber(&hrng, &random_value); // 生成一个随机数,并将其存储在random_value变量中
random_value = random_value % (max + 1 - min) + min; // 将随机数限制在min和max之间
return random_value; // 返回random_value的值
}
void eeee() // 定义eeee函数,无返回值 { uint32_t i = 0; // 定义i变量,类型为uint32_t,初始值为0
do // 执行以下代码块
{
Food.col = dddd(1 + 2, 63 - 2); // 生成一个位于1+2和63-2之间的随机数,赋值给Food.col
Food.row = dddd(1 + 2, 47 - 2); // 生成一个位于1+2和47-2之间的随机数,赋值给Food.row
} while ((map[Food.row][Food.col / 32] >> (Food.col % 32)) & 0x00000001); // 当Food所在位置已被占用时,重新生成Food的位置
Set_region(Food.col * 5, Food.row * 5, Food.col * 5 + 4, Food.row * 5 + 4); // 设置绘制区域为Food所在的位置
for(i = 0; i < 25; i++) // 循环遍历i从0到24
Write_data16(GREEN); // 在绘制区域内绘制绿色
}
void ffff(uint32_t row, uint32_t col) // 定义ffff函数,参数为row和col,类型均为uint32_t,无返回值 { Set_region(col * 5, row * 5, col * 5 + 4, row * 5 + 4); // 设置绘制区域为row和col所在的位置 if( (map[row][col / 32] >> (col % 32)) & 0x0001) // 判断row和col所在位置的值是否为1 for(row = 0; row < 25; row++) // 循环遍历row从0到24 Write_data16(WHITE); // 在绘制区域内绘制白色 else for(row = 0; row < 25; row++) // 循环遍历row从0到24 Write_data16(BLACK); // 在绘制区域内绘制黑色 }
void gggg(uint32_t row, uint32_t col, uint32_t flag) // 定义gggg函数,参数为row、col和flag,类型均为uint32_t,无返回值 { if(flag) // 判断flag的值是否为真 map[row][col / 32] |= (0x00000001 << (col % 32)); // 将row和col所在位置的值设置为1 else map[row][col / 32] &= ~(0x00000001 << (col % 32)); // 将row和col所在位置的值设置为0 }
void Init_Snakegame() // 定义Init_Snakegame函数,无返回值 { int i,j = 0; // 定义i和j变量,类型为int,初始值为0
map[0][0] = 0xffffffff; // 将map[0][0]的值设置为0xffffffff
map[0][1] = 0xffffffff; // 将map[0][1]的值设置为0xffffffff
map[47][0] = 0xffffffff; // 将map[47][0]的值设置为0xffffffff
map[47][1] = 0xffffffff; // 将map[47][1]的值设置为0xffffffff
dir_list[0] = 0x00003f; // 将dir_list[0]的值设置为0x00003f
SnakeLength = 3; // 将SnakeLength的值设置为3
map[24][0] |= 0xE0000000; // 将map[24][0]的值设置为0xE0000000
SnakeHead.row = 24; // 将SnakeHead的row成员的值设置为24
SnakeHead.col = 31; // 将SnakeHead的col成员的值设置为31
SnakeTail.row = 24; // 将SnakeTail的row成员的值设置为24
SnakeTail.col = 29; // 将SnakeTail的col成员的值设置为29
for(i = 0; i < 48; i++) // 循环遍历i从0到47
{
map[i][0] |= 0x00000001; // 将map[i][0]的最低位设置为1
map[i][1] |= 0x80000000; // 将map[i][1]的最高位设置为1
for(j = 0; j < 64; j++) // 循环遍历j从0到63
{
ffff(i, j); // 调用ffff函数,绘制地图上的一个点
}
}
eeee(); // 调用eeee函数,生成食物的位置
}
uint32_t Updata_State() // 定义Updata_State函数,返回值类型为uint32_t { uint32_t temp = 0; // 定义temp变量,类型为uint32_t,初始值为0 static uint32_t last_dir = 3; // 定义静态局部变量last_dir,初始值为3
if(last_dir != dir) // 判断last_dir与dir的值是否相等
{
if((dir + 2 == last_dir) | (dir - 2 == last_dir)) // 判断dir与last_dir的差值是否为2
dir = last_dir; // 如果是,则将dir的值设置为last_dir
}
last_dir = dir; // 将last_dir的值设置为dir
switch (dir) // 根据dir的值进行分支判断
{
case 0: // 如果dir的值为0
SnakeHead.row++; // SnakeHead的row成员加1
break;
case 2: // 如果dir的值为2
SnakeHead.row--; // SnakeHead的row成员减1
break;
case 1: // 如果dir的值为1
SnakeHead.col--; // SnakeHead的col成员减1
break;
case 3: // 如果dir的值为3
SnakeHead.col++; // SnakeHead的col成员加1
break;
default:
break;
}
temp = map[SnakeHead.row][SnakeHead.col / 32]; // 获取SnakeHead所在位置的值
gggg(SnakeHead.row, SnakeHead.col, 1); // 将SnakeHead所在位置的值设置为1
if(!((temp ^ map[SnakeHead.row][SnakeHead.col / 32]) >= 1)) // 判断SnakeHead所在位置的值是否与temp不相等
{
Draw_clear(RED); // 清空屏幕并设置为红色
while(1); // 进入死循环
}
ffff(SnakeHead.row, SnakeHead.col); // 调用ffff函数,绘制SnakeHead所在位置的点
bbbb(dir); // 调用bbbb函数,记录下一次的移动方向
if(SnakeHead.row == Food.row && SnakeHead.col == Food.col) // 判断SnakeHead是否与Food重合
{
SnakeLength++; // SnakeLength加1
eeee(); // 调用eeee函数,生成新的食物位置
}
else
{
gggg(SnakeTail.row, SnakeTail.col, 0); // 将SnakeTail所在位置的值设置为0
ffff(SnakeTail.row, SnakeTail.col); // 调用ffff函数,绘制SnakeTail所在位置的点
switch (cccc()) // 调用cccc函数,获取下一次的移动方向
{
case 0: // 如果返回值为0
SnakeTail.row++; // SnakeTail的row成员加1
break;
case 2: // 如果返回值为2
SnakeTail.row--; // SnakeTail的row成员减1
break;
case 1: // 如果返回值为1
SnakeTail.col--; // SnakeTail的col成员减1
break;
case 3: // 如果返回值为3
SnakeTail.col++; // SnakeTail的col成员加1
break;
default:
break;
}
}
return 1; // 返回1
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // 定义HAL_TIM_PeriodElapsedCallback函数,参数为htim,类型为TIM_HandleTypeDef结构体指针 { //300ms Updata_State(); // 调用Updata_State函数,更新游戏状态 }
void test() // 定义test函数,无返回值 { uint32_t test = 0; // 定义test变量,类型为uint32_t,初始值为0
Init_ILI9341(); // 初始化显示屏
Init_Snakegame(); // 初始化贪吃蛇游戏
while(1) // 执行以下循环
{
KEY_ACTION(); // 处理按键动作
}
原文地址: https://www.cveoy.top/t/topic/Kvp 著作权归作者所有。请勿转载和采集!