-
Notifications
You must be signed in to change notification settings - Fork 30
/
Pong.ino
140 lines (110 loc) · 2.71 KB
/
Pong.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Tomás de Camino
// www.funcostarica.org
//Utiliza Feather y Pantalla OLED
// Boton C incrementa velocidad de bola
// Boton A disminuye velocidad
// Boton B reinicia juego
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BUTTON_A 9
#define BUTTON_B 6
#define BUTTON_C 5
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
//pad position
int X1 = 11, X2 = 11;
//ball position and direction
int ballX = 16, ballY = 64;
int dirX = 1, dirY = 1;
int ballSpeed = 1;
//score
int playerA = 0, playerB = 0;
void setup() {
//prepara display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setRotation(1);
display.clearDisplay();
//botones
pinMode(BUTTON_A, INPUT_PULLUP);
pinMode(BUTTON_B, INPUT_PULLUP);
pinMode(BUTTON_C, INPUT_PULLUP);
//pad pins
pinMode(A0, INPUT);
pinMode(A1, INPUT);
}
void loop() {
//si aprieta B reinicia
if (!digitalRead(BUTTON_B)) reiniciaPong();
//cambia el grado de dificultad (velocidad de la bola)
(digitalRead(BUTTON_A)) ? : ballSpeed--;
(digitalRead(BUTTON_C)) ? : ballSpeed++;
//limpia pantalla
display.clearDisplay();
//linea de el medio
display.drawLine(0, 64, 34, 64, WHITE);
//dibuja los pads
X1 = map(analogRead(A0), 0, 1023, 31, 3);
X2 = map(analogRead(A1), 0, 1023, 3, 31);
drawPad(X2, 124);
drawPad(X1, 0);
//mueve la bola
movedrawBall();
//verifica donde esta la bola y rebota
bounceBall();
//puntos en pantalla
display.setRotation(0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor( 68, 0);
display.println(playerA);
display.setCursor( 52, 0);
display.println(playerB);
display.setRotation(1);
//redibuja la pantalla
display.display();
}
void drawPad(int x, int y) {
display.fillRect(x - 3, y, 6, 2, WHITE);
}
void movedrawBall() {
//mueve la bola
ballX += dirX * ballSpeed;
ballY += dirY * ballSpeed;
//dibuja la bola
display.fillRect(ballX, ballY, 3, 3, WHITE);
}
//Este procedimiento es lo principal del juego
void bounceBall() {
//rebota en los bordes de X
(ballX >= 0 && ballX < 30) ? : dirX *= -1;
//bordes de Y son puntos
if (ballY < 0) {
playerB++;
initBall();
}
if (ballY > 124) {
playerA++;
initBall();
}
//revisa si pega en los pads y rebota
int d1 = ballX - X1;
int d2 = ballX - X2;
(ballY == 0 && abs(d1) <= 2) ? : dirY *= -1;
(ballY == 124 && abs(d2) <= 2) ? : dirY *= -1;
}
void initBall() {
ballX = 16;
ballY = 64;
(random(4) >= 2) ? dirX = 1 : dirX = -1;
(random(4) >= 2) ? dirY = 1 : dirY = -1;
}
void reiniciaPong() {
ballX = 16;
ballY = 64;
(random(4) >= 2) ? dirX = 1 : dirX = -1;
(random(4) >= 2) ? dirY = 1 : dirY = -1;
playerA = 0;
playerB = 0;
}