通过绿色和红色LED上的PWM,直观地指示用户取得+5或-5分的进度。具体来说,当分数为零时,关闭指示灯。随着分数增加到+5,逐渐增加绿色LED的亮度,类似地,随着分数下降到-5,逐渐增加红色LED的亮度。分数分别为+5或-5时,可获得最大亮度。 •实现超时功能,用户有时间限制可以键入 回答如果他们没有及时回答,并且被问到一个新的问题,他们就会失去一分。 •一旦用户得分达到+5,则通过添加新术语来增加问题的难度,例如问题11+8−17。用户现在必须达到+10才能完成游戏。
时间: 2024-03-02 13:52:31 浏览: 34
通过PWM控制LED的亮度
以下是一个修改后的串口游戏代码,增加了LED指示灯和超时功能,并且随着分数增加增加了问题的难度:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <wiringPi.h>
#define MAX_BUF_SIZE 256
#define GREEN_LED_PIN 0
#define RED_LED_PIN 1
#define TIMEOUT_SEC 10
int main() {
int score = 0;
char buf[MAX_BUF_SIZE];
int green_led_val = 0, red_led_val = 0;
// 初始化wiringPi库
wiringPiSetup();
// 设置LED引脚模式为输出
pinMode(GREEN_LED_PIN, PWM_OUTPUT);
pinMode(RED_LED_PIN, PWM_OUTPUT);
while (score < 10 && score > -10) {
// 等待串口输入
fgets(buf, MAX_BUF_SIZE, stdin);
// 如果输入的是"g",开始游戏
if (strcmp(buf, "g\n") == 0) {
printf("进入游戏模式\n");
int a, b, ans;
int timeout = TIMEOUT_SEC * 1000; // 超时时间,单位为毫秒
// 生成两个随机数
if (score >= 5 || score <= -5) {
// 如果分数达到+5或-5,添加新术语
a = rand() % 100 + 1;
b = rand() % 100 + 1;
int c = rand() % 100 + 1;
printf("%d + %d - %d = ", a, b, c);
} else {
// 否则按照原来的规则生成问题
do {
a = rand() % 100 + 1;
b = rand() % 100 + 1;
} while (a <= b || a - b >= 10);
printf("%d - %d = ", a, b);
}
// 等待用户输入答案
fflush(stdout); // 刷新缓冲区,确保串口输出能够及时显示
scanf("%d", &ans);
// 判断用户答案是否正确,并更新分数和LED亮度
if (ans == a - b) {
printf("正确\n");
score++;
green_led_val = score * 51; // 51是255/5,将分数映射到PWM占空比
pwmWrite(GREEN_LED_PIN, green_led_val);
} else {
printf("不正确\n");
score--;
red_led_val = -score * 51;
pwmWrite(RED_LED_PIN, red_led_val);
}
// 输出当前分数
printf("当前分数:%d\n", score);
// 如果分数达到+5或-5,重置LED亮度
if (score == 5 || score == -5) {
pwmWrite(GREEN_LED_PIN, 255);
pwmWrite(RED_LED_PIN, 0);
}
// 如果超时,扣除一分并提示用户
while (timeout > 0) {
if (fgets(buf, MAX_BUF_SIZE, stdin)) {
break;
}
delay(100); // 延时100毫秒
timeout -= 100;
}
if (timeout <= 0) {
printf("超时!扣除一分\n");
score--;
red_led_val = -score * 51;
pwmWrite(RED_LED_PIN, red_led_val);
}
}
}
// 判断游戏结束的原因
if (score == 10) {
printf("游戏结束:你赢了!\n");
} else {
printf("游戏结束:你输了!\n");
}
// 关闭LED指示灯
pwmWrite(GREEN_LED_PIN, 0);
pwmWrite(RED_LED_PIN, 0);
return 0;
}
```
以上代码会等待串口输入,如果输入的是"g"字符,就开始游戏。在游戏中,随机生成问题,等待用户输入答案并判断是否正确,更新分数和LED亮度。如果超时,扣除一分并提示用户。当分数达到+5或-5时,添加新术语。当分数达到+10或-10时,游戏结束。
阅读全文