rsoc/dayandnight/mysnake.c

93 lines
3.5 KiB
C
Raw Normal View History

2024-08-04 14:43:38 +08:00
#include <stdio.h>
#include <rtthread.h>
#include <stdbool.h>
#include "my_func.h"
#include "mysnake.h"
#include <time.h>
2024-08-04 20:14:20 +08:00
#include <rtatomic.h>
2024-08-04 14:43:38 +08:00
#define LCD_MAX 240
#define SNAKE_SIZE 20
#define SNAKE_MAX LCD_MAX / SNAKE_SIZE
2024-08-04 23:00:22 +08:00
rt_atomic_t now_direction = 3;
2024-08-04 14:43:38 +08:00
// bool snake_table[SNAKE_MAX][SNAKE_MAX] = {0};
// struct My_snake
// {
// int x;
// int y;
// }snake_list[SNAKE_MAX*SNAKE_MAX] = {0};
// /* rt_event_t 是指向事件结构体的指针类型 */
// typedef struct My_snake* my_snake_t;
void snake_entry(void *parameter)
2024-08-04 14:43:38 +08:00
{
2024-08-04 20:14:20 +08:00
system("irq");
time_t t;
/* 初始化随机数发生器 */
srand((unsigned)time(&t));
2024-08-04 23:13:09 +08:00
int snake_list[SNAKE_MAX+1][2] = {0};
int snake_direction[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; // 上,左,下,右
2024-08-04 23:00:22 +08:00
int snake_food[2];
bool food_flag = false;
char snake_dirshow[4][7] = {"upup", "left", "down", "rigt"};
2024-08-04 18:45:11 +08:00
char tmp[10];
2024-08-04 14:43:38 +08:00
int snake_head = 2, snake_tail = 0, former_head; // 蛇头,蛇尾
2024-08-04 23:00:22 +08:00
int snake_len = 3;
2024-08-04 14:43:38 +08:00
snake_list[1][0] = SNAKE_MAX / 2;
snake_list[1][1] = SNAKE_MAX / 2;
snake_list[0][0] = snake_list[1][0] - 1;
snake_list[0][1] = snake_list[1][1];
snake_list[2][0] = snake_list[1][0] + 1;
snake_list[2][1] = snake_list[1][1];
// snake_table[snake_list[0][0]][snake_list[0][1]] = 1;
// snake_table[snake_list[1][0]][snake_list[1][1]] = 1;
// snake_table[snake_list[2][0]][snake_list[2][1]] = 1;
snake_address(snake_list[0][0], snake_list[0][1], SNAKE_SIZE, BLACK);
snake_address(snake_list[1][0], snake_list[1][1], SNAKE_SIZE, BLACK);
snake_address(snake_list[2][0], snake_list[2][1], SNAKE_SIZE, BLACK);
2024-08-04 23:00:22 +08:00
snake_food[0] = rand() % SNAKE_MAX;
snake_food[1] = rand() % SNAKE_MAX;
snake_address(snake_food[0], snake_food[1], SNAKE_SIZE, GREEN);
int new_direction = 0;
2024-08-04 14:43:38 +08:00
while (1)
{
2024-08-04 23:00:22 +08:00
// if(snake)
2024-08-04 20:14:20 +08:00
// new_direction = rand() % 3;
// now_direction = (now_direction+3+new_direction)%4;//防止反向,走回头路
2024-08-04 18:49:15 +08:00
2024-08-04 14:43:38 +08:00
former_head = snake_head;
snake_head = (snake_head + 1) % (SNAKE_MAX);
2024-08-04 18:49:15 +08:00
2024-08-04 23:00:22 +08:00
snake_list[snake_head][0] = (snake_list[former_head][0] + snake_direction[now_direction][0] + SNAKE_MAX) % (SNAKE_MAX);
snake_list[snake_head][1] = (snake_list[former_head][1] + snake_direction[now_direction][1] + SNAKE_MAX) % (SNAKE_MAX);
2024-08-04 23:13:09 +08:00
sprintf(tmp, "(%d,%d)", snake_list[snake_head][0], snake_list[snake_head][1]);
2024-08-04 23:00:22 +08:00
// rt_kprintf("head:%d,%d\n", snake_list[snake_head][0], snake_list[snake_head][1]);
lcd_show_string(20, 20, 16, snake_dirshow[now_direction]);
lcd_show_string(20 + 16 * 4, 20, 16, tmp);
rt_thread_mdelay(900);
2024-08-04 18:49:15 +08:00
snake_address(snake_list[snake_head][0], snake_list[snake_head][1], SNAKE_SIZE, BLACK);
2024-08-04 23:00:22 +08:00
if (snake_list[snake_head][0] == snake_food[0] && snake_list[snake_head][1] == snake_food[1])
{
snake_food[0] = rand() % SNAKE_MAX;
snake_food[1] = rand() % SNAKE_MAX;
snake_address(snake_food[0], snake_food[1], SNAKE_SIZE, GREEN);
snake_len++;
2024-08-04 23:13:09 +08:00
sprintf(tmp, "%d", snake_len);
lcd_show_string(100, 105, 32, tmp);
if (snake_len >= SNAKE_MAX-2)
{
snake_address(snake_list[snake_tail][0], snake_list[snake_tail][1], SNAKE_SIZE, WHITE);
snake_tail = (snake_tail + 1) % (SNAKE_MAX);
}
2024-08-04 23:00:22 +08:00
}
else
{
snake_address(snake_list[snake_tail][0], snake_list[snake_tail][1], SNAKE_SIZE, WHITE);
snake_tail = (snake_tail + 1) % (SNAKE_MAX);
}
2024-08-04 14:43:38 +08:00
}
}