|
|
本帖最后由 GiroPetrenko 于 2018-4-28 18:21 编辑
一个模拟GB的游戏机,使用Nokia5110当显示屏,Arduino Nano 当主控,目前没有声音。
目前支持一个游戏,PONG
补充:开始部分的logo还没做出来,不过应该没有影响。
[kenrobot_code]#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <EEPROM.h>
// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
#define Firmware_version "Nope"
int keystate;
int player_y = 12;
/*
Key states:
0 Neutral
1 LEFT
2 RIGHT
3 UP
4 DOWN
5 A
6 B
*/
#define NEU 0
#define LEFT 1
#define RIGHT 2
#define UP 3
#define DOWN 4
#define A 5
#define B 6
// Keypad: LEFT A4
// DOWN A5
// RIGHT A2
// UP A3
// A 9
// B 10
static unsigned char splashscreen[] = {
0x10, 0x10, 0x92, 0x54,
};
void(* HardRST) (void) = 0;
void setup() {
// put your setup code here, to run once:
pinMode(A7, INPUT);
pinMode(A6, INPUT);
pinMode(A5, INPUT);
pinMode(A4, INPUT);
pinMode(10, INPUT);
pinMode(9, INPUT);
display.begin();
display.setContrast(50);
display.display();
display.clearDisplay();
display.println("KirovM-GC");
display.print("Firmware: ");
display.print(Firmware_version);
display.display();
delay(2000);
display.clearDisplay();
display.display();
}
void keyinputmanager() { //Put in loop, reading data constantly.
if(digitalRead(A3) == HIGH) {
keystate = UP;
}
else if(digitalRead(A2) == HIGH) {
keystate = RIGHT;
}
else if(digitalRead(A5) == HIGH) {
keystate = DOWN;
}
else if(digitalRead(A4) == HIGH) {
keystate = LEFT;
}
else if(digitalRead(9) == HIGH) {
keystate = A;
}
else if(digitalRead(10) == HIGH) {
keystate = B;
}
else {
keystate = NEU;
}
}
int Ball_init_x = 42;
int Ball_init_y = 24;
/*
Ball have four state:
1 x--, y-- left up
2 x--, y++ left down
3 x++, y-- right up
4 x++, y++ right down
Ball x state:
1 going left x--
2 going right x++
Ball y state:
1 going up y--
2 going down y++
*/
int ball_x_state = 1;
int ball_y_state = 1;
int enermy_x_pos = 82;
int enermy_y_pos = 2;
int delay_speed = 60;
int timePassed;
int HighScore;
void loop() {
keyinputmanager();
display.clearDisplay();
display.setCursor(0, 0);
timePassed = millis()/1000;
display.print(String(timePassed));
if(timePassed > 15) {
delay_speed = 65;
}
else if(timePassed > 30 ) {
delay_speed = 60;
}
else if(timePassed > 45) {
delay_speed = 55;
}
display.drawLine(0, 8, 84, 8, BLACK);
display.drawLine(1, player_y, 1, player_y + 10, BLACK);
display.drawLine(enermy_x_pos, enermy_y_pos, enermy_x_pos, enermy_y_pos + 15, BLACK);
if(enermy_y_pos + 2 > Ball_init_y && enermy_y_pos > 10) { //AI control start
enermy_y_pos = enermy_y_pos - 2; //AI go up
}
if(enermy_y_pos + 2 < Ball_init_y && Ball_init_y < 33) {
if(Ball_init_y > 33) {
enermy_y_pos = enermy_y_pos - 2;
}
else {
enermy_y_pos = enermy_y_pos + 2;
}
} //AI control end
if(keystate == DOWN && player_y <= 38) { //playercontrol
player_y = player_y + 1;
}
else if(keystate == UP && player_y >= 8) {
player_y = player_y - 1;
}
if(keystate == A) {
display.clearDisplay();
display.println("Scoreboard\ncleared");
EEPROM.write(1, 0);
display.display();
delay(2000);
HardRST();
exit(0);
}
if(keystate == LEFT) {
delay_speed--;
}
if(keystate == RIGHT) {
delay_speed++;
}
display.fillRect(Ball_init_x, Ball_init_y, 2, 2, BLACK);
if(ball_x_state == 1 && Ball_init_x > 0) { //Ball movement
Ball_init_x--;
}
if(ball_y_state == 1 && Ball_init_y > 8) {
Ball_init_y--;
}
if(ball_x_state == 2 && Ball_init_x > 0) {
Ball_init_x++;
}
if(ball_y_state == 2 && Ball_init_x > 0) {
Ball_init_y++;
}
if(Ball_init_y > player_y && Ball_init_y < player_y + 10 && Ball_init_x < 2) { //in range
ball_x_state = 2; //Bounce Back
}
if(Ball_init_x < 1) { //Left-most corner
// player lose
display.println(" You lose!");
display.display();
HighScore = EEPROM.read(1);
if(HighScore > timePassed) {
display.print("Highest score: ");
display.println(String(HighScore));
}
else {
display.println("New High!");
EEPROM.write(1, timePassed);
}
display.display();
exit(0);
}
if(Ball_init_x > 83) {
display.println(" You win!");
display.display();
display.println(" You lose!");
display.display();
HighScore = EEPROM.read(1);
if(HighScore > timePassed) {
display.print("Highest score: ");
display.println(String(HighScore));
}
else {
display.println("New High!");
EEPROM.write(1, timePassed);
}
display.display();
exit(0);
}
if(Ball_init_x > 81 && Ball_init_y > enermy_y_pos && Ball_init_y < enermy_y_pos + 17) {
//Bounced Back
ball_x_state = 1;
}
if(Ball_init_y <= 8) { //Up most corner
// bounce
ball_y_state = 2;
}
if(Ball_init_y >= 47) { //Hit the bottom!
ball_y_state = 1;
}
display.display();
delay(delay_speed);
}[/kenrobot_code] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|