First Commit
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
261
include/fonts.h
Normal file
261
include/fonts.h
Normal file
@@ -0,0 +1,261 @@
|
||||
#pragma once
|
||||
|
||||
MD_MAX72XX::fontType_t pingpong_font[] PROGMEM =
|
||||
{
|
||||
0, // 0
|
||||
0, // 1
|
||||
0, // 2
|
||||
0, // 3
|
||||
0, // 4
|
||||
0, // 5
|
||||
0, // 6
|
||||
0, // 7
|
||||
0, // 8
|
||||
0, // 9
|
||||
0, // 10
|
||||
0, // 11
|
||||
0, // 12
|
||||
0, // 13
|
||||
0, // 14
|
||||
0, // 15
|
||||
0, // 16
|
||||
0, // 17
|
||||
0, // 18
|
||||
0, // 19
|
||||
0, // 20
|
||||
0, // 21
|
||||
0, // 22
|
||||
0, // 23
|
||||
0, // 24
|
||||
0, // 25
|
||||
0, // 26
|
||||
0, // 27
|
||||
0, // 28
|
||||
0, // 29
|
||||
0, // 30
|
||||
0, // 31
|
||||
0, // 32
|
||||
0, // 33
|
||||
0, // 34
|
||||
0, // 35
|
||||
0, // 36
|
||||
0, // 37
|
||||
0, // 38
|
||||
0, // 39
|
||||
0, // 40
|
||||
0, // 41
|
||||
0, // 42
|
||||
0, // 43
|
||||
0, // 44
|
||||
0, // 45
|
||||
0, // 46
|
||||
0, // 47
|
||||
5, 126, 129, 129, 129, 126, // 48
|
||||
5, 132, 130, 255, 128, 128, // 49
|
||||
5, 194, 161, 145, 137, 134, // 50
|
||||
5, 66, 129, 137, 137, 118, // 51
|
||||
5, 12, 10, 9, 255, 8, // 52
|
||||
5, 71, 137, 137, 137, 113, // 53
|
||||
5, 126, 137, 137, 137, 114, // 54
|
||||
5, 1, 241, 9, 5, 3, // 55
|
||||
5, 118, 137, 137, 137, 118, // 56
|
||||
5, 78, 145, 145, 145, 126, // 57
|
||||
0, // 58
|
||||
0, // 59
|
||||
8, 24, 60, 126, 219, 153, 24, 24, 24, // 60
|
||||
8, 0, 24, 24, 24, 24, 24, 24, 0, // 61
|
||||
8, 24, 24, 24, 153, 219, 126, 60, 24, // 62
|
||||
0, // 63
|
||||
0, // 64
|
||||
0, // 65
|
||||
0, // 66
|
||||
0, // 67
|
||||
0, // 68
|
||||
0, // 69
|
||||
0, // 70
|
||||
0, // 71
|
||||
0, // 72
|
||||
0, // 73
|
||||
0, // 74
|
||||
0, // 75
|
||||
0, // 76
|
||||
0, // 77
|
||||
0, // 78
|
||||
0, // 79
|
||||
0, // 80
|
||||
0, // 81
|
||||
0, // 82
|
||||
0, // 83
|
||||
0, // 84
|
||||
0, // 85
|
||||
0, // 86
|
||||
0, // 87
|
||||
0, // 88
|
||||
0, // 89
|
||||
0, // 90
|
||||
0, // 91
|
||||
0, // 92
|
||||
0, // 93
|
||||
0, // 94
|
||||
0, // 95
|
||||
0, // 96
|
||||
0, // 97
|
||||
0, // 98
|
||||
0, // 99
|
||||
0, // 100
|
||||
0, // 101
|
||||
0, // 102
|
||||
0, // 103
|
||||
0, // 104
|
||||
0, // 105
|
||||
0, // 106
|
||||
0, // 107
|
||||
0, // 108
|
||||
0, // 109
|
||||
0, // 110
|
||||
0, // 111
|
||||
0, // 112
|
||||
0, // 113
|
||||
0, // 114
|
||||
0, // 115
|
||||
0, // 116
|
||||
0, // 117
|
||||
0, // 118
|
||||
0, // 119
|
||||
0, // 120
|
||||
0, // 121
|
||||
0, // 122
|
||||
0, // 123
|
||||
0, // 124
|
||||
0, // 125
|
||||
0, // 126
|
||||
0, // 127
|
||||
0, // 128
|
||||
0, // 129
|
||||
0, // 130
|
||||
0, // 131
|
||||
0, // 132
|
||||
0, // 133
|
||||
0, // 134
|
||||
0, // 135
|
||||
0, // 136
|
||||
0, // 137
|
||||
0, // 138
|
||||
0, // 139
|
||||
0, // 140
|
||||
0, // 141
|
||||
0, // 142
|
||||
0, // 143
|
||||
0, // 144
|
||||
0, // 145
|
||||
0, // 146
|
||||
0, // 147
|
||||
0, // 148
|
||||
0, // 149
|
||||
0, // 150
|
||||
0, // 151
|
||||
0, // 152
|
||||
0, // 153
|
||||
0, // 154
|
||||
0, // 155
|
||||
0, // 156
|
||||
0, // 157
|
||||
0, // 158
|
||||
0, // 159
|
||||
0, // 160
|
||||
0, // 161
|
||||
0, // 162
|
||||
0, // 163
|
||||
0, // 164
|
||||
0, // 165
|
||||
0, // 166
|
||||
0, // 167
|
||||
0, // 168
|
||||
0, // 169
|
||||
0, // 170
|
||||
0, // 171
|
||||
0, // 172
|
||||
0, // 173
|
||||
0, // 174
|
||||
0, // 175
|
||||
0, // 176
|
||||
0, // 177
|
||||
0, // 178
|
||||
0, // 179
|
||||
0, // 180
|
||||
0, // 181
|
||||
0, // 182
|
||||
0, // 183
|
||||
0, // 184
|
||||
0, // 185
|
||||
0, // 186
|
||||
0, // 187
|
||||
0, // 188
|
||||
0, // 189
|
||||
0, // 190
|
||||
0, // 191
|
||||
0, // 192
|
||||
0, // 193
|
||||
0, // 194
|
||||
0, // 195
|
||||
0, // 196
|
||||
0, // 197
|
||||
0, // 198
|
||||
0, // 199
|
||||
0, // 200
|
||||
0, // 201
|
||||
0, // 202
|
||||
0, // 203
|
||||
0, // 204
|
||||
0, // 205
|
||||
0, // 206
|
||||
0, // 207
|
||||
0, // 208
|
||||
0, // 209
|
||||
0, // 210
|
||||
0, // 211
|
||||
0, // 212
|
||||
0, // 213
|
||||
0, // 214
|
||||
0, // 215
|
||||
0, // 216
|
||||
0, // 217
|
||||
0, // 218
|
||||
0, // 219
|
||||
0, // 220
|
||||
0, // 221
|
||||
0, // 222
|
||||
0, // 223
|
||||
0, // 224
|
||||
0, // 225
|
||||
0, // 226
|
||||
0, // 227
|
||||
0, // 228
|
||||
0, // 229
|
||||
0, // 230
|
||||
0, // 231
|
||||
0, // 232
|
||||
0, // 233
|
||||
0, // 234
|
||||
0, // 235
|
||||
0, // 236
|
||||
0, // 237
|
||||
0, // 238
|
||||
0, // 239
|
||||
0, // 240
|
||||
0, // 241
|
||||
0, // 242
|
||||
0, // 243
|
||||
0, // 244
|
||||
0, // 245
|
||||
0, // 246
|
||||
0, // 247
|
||||
0, // 248
|
||||
0, // 249
|
||||
0, // 250
|
||||
0, // 251
|
||||
0, // 252
|
||||
0, // 253
|
||||
0, // 254
|
||||
0, // 255
|
||||
};
|
||||
70
lib/Game/src/game.cpp
Normal file
70
lib/Game/src/game.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
#include "game.h"
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void printScore(int* score) {
|
||||
cout << "(" << score[0] << ", " << score[1] << ")" << endl;
|
||||
}
|
||||
|
||||
void resetScore(int* score) {
|
||||
*score = 0;
|
||||
*(score+1) = 0;
|
||||
}
|
||||
|
||||
void won(int player) {
|
||||
cout << "Player " << player+1 << " has won!" << endl;
|
||||
}
|
||||
|
||||
int checkWin(int* score, int player) {
|
||||
if (*(score+player) < 11) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
else if (*(score+player) >= 21) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
else {
|
||||
if (*(score+abs(player-1)) <= *(score+player)-2 ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int scored(int* score, int player) {
|
||||
if (checkWin(score, player) == 1) {
|
||||
*(score+player) = *(score+player) + 1;
|
||||
checkWin(score, player);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int removePoint(int* score, int player) {
|
||||
if (*(score+player) > 0) {
|
||||
*(score+player) = *(score+player) - 1;
|
||||
checkWin(score, abs(player-1));
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
int servingPlayer(int* score, int serving) {
|
||||
if (score[0] < 11 && score[1] < 11) {
|
||||
return (((((score[0]+score[1])%4)/2)+serving)%2); // based on the variable serving (which represents the starting serve player, 0 or 1) a 1 or 0 is returned.
|
||||
}
|
||||
else{
|
||||
return ((((score[0]+score[1])%2)+serving)%2);
|
||||
}
|
||||
}
|
||||
13
lib/Game/src/game.h
Normal file
13
lib/Game/src/game.h
Normal file
@@ -0,0 +1,13 @@
|
||||
void printScore(int* score);
|
||||
|
||||
void resetScore(int* score);
|
||||
|
||||
void won(int player);
|
||||
|
||||
int checkWin(int* score, int player);
|
||||
|
||||
int scored(int* score, int player);
|
||||
|
||||
int removePoint(int* score, int player);
|
||||
|
||||
int servingPlayer(int* score, int serving);
|
||||
17
platformio.ini
Normal file
17
platformio.ini
Normal file
@@ -0,0 +1,17 @@
|
||||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:denky32]
|
||||
platform = espressif32
|
||||
board = denky32
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
majicdesigns/MD_MAX72XX@^3.5.1
|
||||
majicdesigns/MD_Parola@^3.7.3
|
||||
144
src/main.cpp
Normal file
144
src/main.cpp
Normal file
@@ -0,0 +1,144 @@
|
||||
#include <Arduino.h>
|
||||
#include <game.h>
|
||||
#include <MD_MAX72xx.h>
|
||||
#include <MD_Parola.h>
|
||||
#include "../include/fonts.h"
|
||||
|
||||
// Hardware SPI:
|
||||
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
|
||||
#define MAX_DEVICES 4
|
||||
#define SS_PIN 5
|
||||
#define DATA_PIN 23
|
||||
#define CLK_PIN 18
|
||||
#define B1_IN 26
|
||||
#define B2_IN 25
|
||||
|
||||
using namespace std;
|
||||
|
||||
// Create a new instance of the MD_MAX72XX class:
|
||||
MD_Parola matrix = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, SS_PIN, MAX_DEVICES);
|
||||
|
||||
int score[2]= {0, 0};
|
||||
|
||||
bool start = false;
|
||||
|
||||
int serving;
|
||||
|
||||
bool game = true;
|
||||
|
||||
char servingChar = '=';
|
||||
|
||||
char displayOut[5] = {'0','0',servingChar,'0','0'};
|
||||
|
||||
int convertASCII(int score);
|
||||
|
||||
char setServeChar(char servingChar, int* score, int serving);
|
||||
|
||||
void setDisplay(int* score, MD_Parola* matrix, char* displayOut);
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
// put your setup code here, to run once:
|
||||
|
||||
pinMode(B1_IN, INPUT_PULLUP);
|
||||
|
||||
pinMode(B2_IN, INPUT_PULLUP);
|
||||
|
||||
// Intialize the object:
|
||||
matrix.begin();
|
||||
// Set the intensity (brightness) of the display (0-15):
|
||||
matrix.setIntensity(15);
|
||||
// Clear the display:
|
||||
matrix.displayClear();
|
||||
|
||||
matrix.setTextAlignment(PA_CENTER);
|
||||
|
||||
matrix.setFont(pingpong_font);
|
||||
|
||||
Serial.begin(9600);
|
||||
|
||||
|
||||
while (digitalRead(B1_IN) == 1 && digitalRead(B2_IN) == 1) {
|
||||
|
||||
|
||||
}
|
||||
if (digitalRead(B1_IN) == 0) {
|
||||
while (digitalRead(B1_IN) == 0) {}
|
||||
serving = 0;
|
||||
displayOut[2] = setServeChar(servingChar, score, serving);
|
||||
setDisplay(score, &matrix, displayOut);
|
||||
delay(500); // to avoid calling twice
|
||||
}
|
||||
|
||||
if (digitalRead(B2_IN) == 0) {
|
||||
while (digitalRead(B2_IN) == 0) {}
|
||||
serving = 1;
|
||||
displayOut[2] = setServeChar(servingChar, score, serving);
|
||||
setDisplay(score, &matrix, displayOut);
|
||||
delay(500); // to avoid calling twice
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
while (game == true) {
|
||||
|
||||
while (digitalRead(B1_IN) == 1 && digitalRead(B2_IN) == 1) {
|
||||
|
||||
|
||||
}
|
||||
if (digitalRead(B1_IN) == 0) {
|
||||
while (digitalRead(B1_IN) == 0) {} // Only execute add point on button release
|
||||
scored(score, 0);
|
||||
if (checkWin(score, 0) == 0) {
|
||||
displayOut[2] = servingChar;
|
||||
game = false;
|
||||
}
|
||||
else {
|
||||
displayOut[2] = setServeChar(servingChar, score, serving);
|
||||
delay(500); // to avoid calling twice
|
||||
}
|
||||
setDisplay(score, &matrix, displayOut);
|
||||
}
|
||||
|
||||
if (digitalRead(B2_IN) == 0) {
|
||||
while (digitalRead(B2_IN) == 0) {} // Only execute add point on button release
|
||||
scored(score, 1);
|
||||
if (checkWin(score, 1) == 0) {
|
||||
displayOut[2] = servingChar;
|
||||
game = false;
|
||||
}
|
||||
else {
|
||||
displayOut[2] = setServeChar(servingChar, score, serving);
|
||||
delay(500); // to avoid calling twice
|
||||
}
|
||||
setDisplay(score, &matrix, displayOut);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// put function definitions here:
|
||||
|
||||
int convertASCII(int score) {
|
||||
return(score+48);
|
||||
}
|
||||
|
||||
char setServeChar(char servingChar, int* score, int serving) {
|
||||
return (servingChar + 1 - 2*(servingPlayer(score, serving)));
|
||||
}
|
||||
|
||||
void setDisplay(int* score, MD_Parola* matrix, char* displayOut) {
|
||||
for (int i = 0; i < 2; i++) {
|
||||
displayOut[i*3] = convertASCII((*(score+i) - (*(score+i)%10)) / 10);
|
||||
displayOut[(i*3)+1] = convertASCII(*(score+i)%10);
|
||||
}
|
||||
matrix->print(displayOut);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user