我正在使用 Arduino Uno 制作一个基本的体育比赛记分员(壁球/球拍)。
目标是 2 个按钮,每个玩家都有一个按钮,他们可以用它来增加分数。
这很简单,但是如果两个玩家碰巧同时达到 10[score],他们需要选择达到 13 或 15。
scoreDecide()
我的问题是它正在监听调用函数之前按下的最后一个按钮。
例如,player1 在 9(左键)上,player2 在 10(右键)上。
player1 按下他们的左键将他们最多带到 10,scoreDecide()
被自动调用为循环识别它是 10/10[score]。
player2 决定按下右键,选择 15 作为得分,但实际上已经选择了左键值,因为这是调用scoreDecide()
func 之前最后按下的值,这意味着 13 实际上被设置为target
,按下右键实际上是增加 player2 的值分数。
我的代码如下,到目前为止我已经花了 8 个小时,但我是 Arduino 的新手,没有运气。
// Squash Scorer, by @MrWigster
// Squash scoring is fairly easy for the most part, however at 10-10 the first player to have reached 10 must decide whether to play until 13 or 15, as the winner must always have a 2 point lead.
// For this reason we need to include logic to let the players choose what score to play until.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Setting up Switches, 1 for each player to press.
const int switchPlayer1 = 7;
const int switchPlayer2 = 6;
//Setting up LEDs, 1 representing each player.
const int led1 = 9;
const int led2 = 10;
//Players names
String player1 = "Bob";
String player2 = "Alex";
//Sets up initial values for switches
int switchStatePlayer1 = 0;
int switchStatePlayer2 = 0;
int prevSwitchState1 = 0;
int prevSwitchState2 = 0;
int p1score = 0;
int p2score = 0;
int winner;
// Initial Target score to get to
int target = 10;
void setup() {
lcd.begin(16,2);
pinMode(switchPlayer1,INPUT);
pinMode(switchPlayer2,INPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
lcd.print(player1);
lcd.print(" Vs ");
lcd.print(player2);
lcd.setCursor(0,1);
lcd.print("SquashScorer 0.1");
}
void loop() {
// If LED is still on, turn it off.
if((digitalRead(led1) == HIGH) || (digitalRead(led2) == HIGH)){
delay(200);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
}
// If players scores are the same, and it's at the target score to change
if ((p1score == p2score) && (p1score == target)){
// Where we call the new target deciding function
delay(50); // Trying to give time for button to reset???
target = scoreDecide(); // Main code that isn't working
}
if ((target == 15) || (target == 13) || (target == 10)) {
switchStatePlayer1 = digitalRead(switchPlayer1);
if (switchStatePlayer1 != prevSwitchState1){
if(switchStatePlayer1 == HIGH){
digitalWrite(led1, HIGH);
p1score = p1score++;
//Deciding if this was winning point
if (
(p1score == target +1) || (p2score == target +1)
&& (p1score != p2score)
) {
winner = whoWins(player1);
}
// Writes the new score on the board
newScore();
}
}
prevSwitchState1 = switchStatePlayer1;
switchStatePlayer2 = digitalRead(switchPlayer2);
if (switchStatePlayer2 != prevSwitchState2){
if(switchStatePlayer2 == HIGH){
digitalWrite(led2, HIGH);
p2score = p2score++;
//Deciding if this was winning point
if (
(p1score == target +1) || (p2score == target +1)
&& (p1score != p2score)
) {
winner = whoWins(player2);
}
// Writes the new score on the board
newScore();
}
}
prevSwitchState2 = switchStatePlayer2;
}
}
// Let the player(s) decide which score to go up to, either 13 or 15.
int scoreDecide() { // This function doesn't seem to work, its already getting a value before the player gets to choose, based on whatever player last reached TARGET.
lcd.clear();
lcd.setCursor(0,0);
// Give the players the info about which score they can choose
lcd.print(target + 3);
lcd.print(" OR ");
lcd.print(target + 5);
switchStatePlayer1 = digitalRead(switchPlayer1);
if (switchStatePlayer1 != prevSwitchState1){
if(switchStatePlayer1 == LOW){
target = target + 3;
delay(1000);
return target;
}
}
prevSwitchState1 = switchStatePlayer1;
switchStatePlayer2 = digitalRead(switchPlayer2);
if (switchStatePlayer2 != prevSwitchState2){
if(switchStatePlayer2 == LOW){
target = target + 5;
delay(1000);
return target;
}
}
prevSwitchState2 = switchStatePlayer2;
}
void newScore(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bob Alex");
lcd.setCursor(0,1);
lcd.print(p1score);
lcd.print(" Target:");
lcd.print(target);
lcd.print(" ");
lcd.print(p2score);
}
void ledflash(){
for (int i=0;i<5;i++){
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
delay(500);
}
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
}
int whoWins(String player){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(player);
lcd.setCursor(0,1);
lcd.print("is the Winner!");
ledflash();ledflash();
delay(10000);
p1score = 0;
p2score = 0;
target = 10;
}