c枚举类型enum注释
时间: 2023-09-05 20:03:35 浏览: 53
枚举类型(enum)是一种特殊的数据类型,它允许我们定义一组相关常量,并在程序中使用这些常量作为取值。每个枚举常量都有一个名称和一个相关的数值。
C语言中,我们可以使用enum关键字来定义一个枚举类型。例如,我们可以定义一个表示星期的枚举类型:
enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
在上面的例子中,我们定义了一个名为Weekday的枚举类型,包括七个枚举常量Monday,Tuesday等。这些枚举常量的默认值是从0开始自增的,也就是Monday的值是0,Tuesday的值是1,以此类推。
枚举常量可以直接使用名称来访问。例如,我们可以使用Weekday.Monday来表示星期一。同时,我们也可以为枚举常量指定特定的值。例如,我们可以将Thursday的值设置为4:
enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday = 4,
Friday,
Saturday,
Sunday
};
枚举类型在代码中的注释通常用来解释枚举常量的含义和用途。注释可以帮助其他程序员更好地理解枚举常量的语义,从而更好地使用和理解代码。
总之,枚举类型是一种方便定义一组相关常量的数据类型。通过枚举类型,我们可以更好地组织和使用常量,并通过注释来解释常量的含义和用途。
相关问题
stm32稳定可靠的按键状态机,并注释代码
以下是一个基于状态机的 STM32 按键检测程序,能够实现稳定可靠的按键检测:
```c
/* 定义按键状态 */
typedef enum {
KEY_RELEASED = 0, // 按键松开状态
KEY_PRESSED, // 按键按下状态
KEY_WAITING, // 等待确认状态
KEY_CONFIRMED // 确认按键状态
} KEY_STATE;
/* 定义按键检测结构体 */
typedef struct {
GPIO_TypeDef* GPIOx; // 按键所在的 GPIO 端口
uint16_t GPIO_Pin; // 按键所在的 GPIO 引脚
KEY_STATE state; // 按键状态
uint16_t confirmCnt; // 确认计数器
} KEY_TypeDef;
/* 定义按键检测函数 */
void KEY_Detect(KEY_TypeDef* key)
{
/* 检测按键状态 */
switch (key->state) {
case KEY_RELEASED: // 松开状态
if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_RESET) {
key->state = KEY_PRESSED; // 检测到按下,状态切换到按下状态
}
break;
case KEY_PRESSED: // 按下状态
if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_SET) {
key->state = KEY_WAITING; // 检测到松开,状态切换到等待确认状态
key->confirmCnt = 0; // 确认计数器清零
}
break;
case KEY_WAITING: // 等待确认状态
if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_RESET) {
if (++key->confirmCnt >= 10) { // 按键确认计数器达到 10,则认为按键已经确认
key->state = KEY_CONFIRMED; // 状态切换到确认状态
}
} else {
key->state = KEY_RELEASED; // 按键被松开,状态切换到松开状态
}
break;
case KEY_CONFIRMED: // 确认状态
if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_SET) {
key->state = KEY_RELEASED; // 状态切换到松开状态
}
break;
default:
break;
}
}
```
使用方法:
1. 在主程序中定义按键结构体数组以及按键引脚、端口等信息:
```c
KEY_TypeDef key1 = {GPIOA, GPIO_PIN_0, KEY_RELEASED, 0};
KEY_TypeDef key2 = {GPIOA, GPIO_PIN_1, KEY_RELEASED, 0};
KEY_TypeDef key3 = {GPIOA, GPIO_PIN_2, KEY_RELEASED, 0};
KEY_TypeDef key4 = {GPIOA, GPIO_PIN_3, KEY_RELEASED, 0};
KEY_TypeDef keys[] = {key1, key2, key3, key4};
```
2. 在主程序的 while 循环中调用按键检测函数:
```c
while (1) {
/* 检测按键状态 */
for (int i = 0; i < sizeof(keys) / sizeof(KEY_TypeDef); i++) {
KEY_Detect(&keys[i]);
if (keys[i].state == KEY_CONFIRMED) {
/* 按键确认,执行相应操作 */
switch (i) {
case 0:
/* do something for key1 */
break;
case 1:
/* do something for key2 */
break;
case 2:
/* do something for key3 */
break;
case 3:
/* do something for key4 */
break;
default:
break;
}
}
}
}
```
注释说明:
1. 定义了一个枚举类型 `KEY_STATE` 表示按键状态,包括松开、按下、等待确认和确认状态。
2. 定义了一个结构体 `KEY_TypeDef` 表示按键,包括按键所在的 GPIO 端口、引脚号、状态以及确认计数器。
3. 在按键检测函数中,使用 switch-case 语句检测按键状态,根据不同的状态进行相应的操作。
4. 在主程序中定义按键结构体数组,并在 while 循环中循环调用按键检测函数,根据每个按键的确认状态执行相应的操作。
用 c语言编写一个贪吃蛇游戏
好的,下面是用C语言编写的简单贪吃蛇游戏的代码。注释已经加得很详细了,希望能帮到你。
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define WIDTH 50 // 地图宽度
#define HEIGHT 20 // 地图高度
#define SNAKE_MAX_LENGTH 100 // 蛇的最大长度
// 蛇的结构体
struct Snake {
int x[SNAKE_MAX_LENGTH]; // 蛇身的x坐标
int y[SNAKE_MAX_LENGTH]; // 蛇身的y坐标
int length; // 蛇的长度
int direction; // 蛇的移动方向
int is_eating; // 蛇是否正在吃食物
};
// 食物的结构体
struct Food {
int x; // 食物的x坐标
int y; // 食物的y坐标
int is_eaten; // 食物是否被吃掉了
};
// 游戏状态的枚举类型
enum GameState {
GAME_RUNNING, // 游戏正在运行
GAME_OVER // 游戏结束
};
// 绘制地图
void draw_map(struct Snake snake, struct Food food) {
int i, j;
system("cls"); // 清屏
// 绘制上边界
for (i = 0; i < WIDTH + 2; i++) {
printf("-");
}
printf("\n");
// 绘制内部地图
for (i = 0; i < HEIGHT; i++) {
printf("|"); // 绘制左边界
for (j = 0; j < WIDTH; j++) {
if (i == snake.y[0] && j == snake.x[0]) { // 绘制蛇头
printf("O");
} else if (i == food.y && j == food.x) { // 绘制食物
printf("*");
} else {
int k;
int is_body = 0;
for (k = 1; k < snake.length; k++) {
if (i == snake.y[k] && j == snake.x[k]) {
printf("+"); // 绘制蛇身
is_body = 1;
break;
}
}
if (!is_body) {
printf(" "); // 绘制空格
}
}
}
printf("|"); // 绘制右边界
printf("\n");
}
// 绘制下边界
for (i = 0; i < WIDTH + 2; i++) {
printf("-");
}
printf("\n");
}
// 初始化蛇
void init_snake(struct Snake *snake) {
snake->x[0] = 10;
snake->y[0] = 10;
snake->length = 3;
snake->direction = 'a';
snake->is_eating = 0;
}
// 初始化食物
void init_food(struct Food *food) {
food->x = rand() % WIDTH;
food->y = rand() % HEIGHT;
food->is_eaten = 0;
}
// 更新蛇的位置
void update_snake(struct Snake *snake) {
int i;
int prev_x = snake->x[0];
int prev_y = snake->y[0];
int next_x, next_y;
// 根据方向更新蛇头的位置
switch (snake->direction) {
case 'a':
snake->x[0]--;
break;
case 'd':
snake->x[0]++;
break;
case 'w':
snake->y[0]--;
break;
case 's':
snake->y[0]++;
break;
}
// 更新蛇身的位置
for (i = 1; i < snake->length; i++) {
next_x = snake->x[i];
next_y = snake->y[i];
snake->x[i] = prev_x;
snake->y[i] = prev_y;
prev_x = next_x;
prev_y = next_y;
}
}
// 检查是否吃到食物
void check_eating(struct Snake *snake, struct Food *food) {
if (snake->x[0] == food->x && snake->y[0] == food->y) {
snake->is_eating = 1;
food->is_eaten = 1;
} else {
snake->is_eating = 0;
}
}
// 更新食物的位置
void update_food(struct Food *food) {
if (food->is_eaten) {
food->x = rand() % WIDTH;
food->y = rand() % HEIGHT;
food->is_eaten = 0;
}
}
// 检查游戏状态
int check_game_state(struct Snake snake) {
// 撞墙
if (snake.x[0] < 0 || snake.x[0] >= WIDTH || snake.y[0] < 0 || snake.y[0] >= HEIGHT) {
return GAME_OVER;
}
// 撞自己
int i;
for (i = 1; i < snake.length; i++) {
if (snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i]) {
return GAME_OVER;
}
}
return GAME_RUNNING;
}
int main() {
struct Snake snake;
struct Food food;
enum GameState game_state = GAME_RUNNING;
srand(time(NULL)); // 初始化随机数
init_snake(&snake);
init_food(&food);
while (game_state == GAME_RUNNING) {
if (kbhit()) { // 检测是否有按键按下
int key = getch();
if (key == 'a' || key == 'd' || key == 'w' || key == 's') {
snake.direction = key;
}
}
update_snake(&snake);
check_eating(&snake, &food);
update_food(&food);
game_state = check_game_state(snake);
draw_map(snake, food);
Sleep(100); // 休眠100毫秒,控制游戏速度
}
printf("Game Over!\n");
return 0;
}
```