#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx DigitalOut row[] = {PTB18, PTB19, PTC0, PTC4, PTC6, PTC7, PTC10, PTC11}; // 1 = zap DigitalOut red[] = {PTC9, PTC8, PTA5, PTA4, PTA12, PTD3, PTE3, PTE2}; // 0 = zap DigitalOut green[] = {PTC13, PTC16, PTA7, PTA6, PTA14, PTA15, PTA16, PTA17}; // 0 = zap DigitalOut blue[] = {PTA13, PTD2, PTD4, PTD6, PTD7, PTB9, PTE0, PTE1}; // 0 = zap DigitalOut digit[] = {PTE30, PTB20, PTE23, PTE22}; // 0 = zap DigitalOut seg[] = {PTE20, PTE6, PTE16, PTE17, PTE18, PTE19, PTE31, PTE21}; // 1 = zap AnalogIn gamepad(PTB0); Ticker automove; Ticker matrixupdater; int player[8][8]={{0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}}; int dots[8][8] = {{0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}}; int walls[8][8] ={{0,0,0,0,0,0,0,0}, {0,0,1,0,0,1,1,1}, {1,1,0,0,1,0,0,0}, {0,0,0,0,1,0,0,0}, {1,1,0,0,0,0,1,0}, {0,0,1,0,0,0,1,0}, {0,0,1,0,1,1,1,0}, {0,0,0,0,0,0,1,0}}; float wtime = 0.5; // cas mezi barvama (ms) bool pressed = false; int playerX = 3; int playerY = 3; int score = -1; int ascore[4] = {0,0,0,0}; void newdot() { int rX = rand() % 8; int rY = rand() % 8; while(player[rY][rX] == 1 || walls[rY][rX] == 1) { rX = rand() % 8; rY = rand() % 8; } for(int i=0; i<8; i++) { for(int j=0; j<8; j++) { dots[i][j] = 0; } } dots[rY][rX] = 1; score++; int number = score; for(int i = 3; i>=0; i--) { ascore[i] = number % 10; number /= 10; } } void moveR() { if(playerX < 7 && walls[playerY][playerX+1] == 0) playerX++; } void moveD() { if(playerY < 7 && walls[playerY+1][playerX] == 0) playerY++; } void moveU() { if(playerY > 0 && walls[playerY-1][playerX] == 0) playerY--; } void moveL() { if(playerX > 0 && walls[playerY][playerX-1] == 0) playerX--; } void segupdate() { //seg display for(int i=0; i<4; i++) { wait_ms(1); for(int j=0; j<4; j++) { digit[j] = 1; } digit[i] = 0; if(ascore[i] == 0) { seg[0] = 1; seg[1] = 1; seg[2] = 1; seg[3] = 1; seg[4] = 1; seg[5] = 1; seg[6] = 0; seg[7] = 0; } if(ascore[i] == 1) { seg[0] = 0; seg[1] = 1; seg[2] = 1; seg[3] = 0; seg[4] = 0; seg[5] = 0; seg[6] = 0; seg[7] = 0; } if(ascore[i] == 2) { seg[0] = 1; seg[1] = 1; seg[2] = 0; seg[3] = 1; seg[4] = 1; seg[5] = 0; seg[6] = 1; seg[7] = 0; } if(ascore[i] == 3) { seg[0] = 1; seg[1] = 1; seg[2] = 1; seg[3] = 1; seg[4] = 0; seg[5] = 0; seg[6] = 1; seg[7] = 0; } if(ascore[i] == 4) { seg[0] = 0; seg[1] = 1; seg[2] = 1; seg[3] = 0; seg[4] = 0; seg[5] = 1; seg[6] = 1; seg[7] = 0; } if(ascore[i] == 5) { seg[0] = 1; seg[1] = 0; seg[2] = 1; seg[3] = 1; seg[4] = 0; seg[5] = 1; seg[6] = 1; seg[7] = 0; } if(ascore[i] == 6) { seg[0] = 1; seg[1] = 0; seg[2] = 1; seg[3] = 1; seg[4] = 1; seg[5] = 1; seg[6] = 1; seg[7] = 0; } if(ascore[i] == 7) { seg[0] = 1; seg[1] = 1; seg[2] = 1; seg[3] = 0; seg[4] = 0; seg[5] = 0; seg[6] = 0; seg[7] = 0; } if(ascore[i] == 8) { seg[0] = 1; seg[1] = 1; seg[2] = 1; seg[3] = 1; seg[4] = 1; seg[5] = 1; seg[6] = 1; seg[7] = 0; } if(ascore[i] == 9) { seg[0] = 1; seg[1] = 1; seg[2] = 1; seg[3] = 1; seg[4] = 0; seg[5] = 1; seg[6] = 1; seg[7] = 0; } } } void matrix() { // matrix display for(int i=0; i<8; i++) { // clean rows for(int j=0; j<8; j++) { row[j] = 0; } // set row row[i] = 1; // set red for(int j=0; j<8; j++) { if(player[i][j]) red[j] = 1; else if(dots[i][j]) red[j] = 0; else red[j] = !walls[i][j]; } wait_ms(wtime); // clean red for(int j=0; j<8; j++) { red[j] = 1; } // set green for(int j=0; j<8; j++) { if(player[i][j]) green[j] = 0; else if(dots[i][j]) green[j] = 1; else green[j] = !walls[i][j]; } wait_ms(wtime); // clean green for(int j=0; j<8; j++) { green[j] = 1; } // set blue for(int j=0; j<8; j++) { if(player[i][j]) blue[j] = 1; else if(dots[i][j]) blue[j] = 0; else blue[j] = !walls[i][j]; } wait_ms(wtime); // clean blue for(int j=0; j<8; j++) { blue[j] = 1; } } } int main() { matrixupdater.attach(&matrix, 0.002); newdot(); while (true) { // read input float fin = gamepad.read(); while(fin > gamepad.read()+0.01 || fin < gamepad.read()-0.01) { fin = gamepad.read(); } if(fin > 0.9) { if(pressed) automove.detach(); pressed = false; } else if(fin < 0.75 && fin > 0.7 && !pressed) { // up pressed = true; score--; newdot(); } else if(fin < 0.55 && fin > 0.45 && !pressed) { // right if(playerX < 7 && walls[playerY][playerX+1] == 0) playerX++; pressed = true; automove.attach(&moveR, 0.2); } else if(fin < 0.35 && fin > 0.3 && !pressed) { // down if(playerY < 7 && walls[playerY+1][playerX] == 0) playerY++; pressed = true; automove.attach(&moveD, 0.2); } else if(fin < 0.2 && fin > 0.1 && !pressed) { // up if(playerY > 0 && walls[playerY-1][playerX] == 0) playerY--; pressed = true; automove.attach(&moveU, 0.2); } if(fin < 0.04 && !pressed) { // left if(playerX > 0 && walls[playerY][playerX-1] == 0) playerX--; pressed = true; automove.attach(&moveL, 0.2); } // set player position for(int i=0; i<8; i++) { for(int j=0; j<8; j++) { if(i == playerY && j == playerX) player[i][j] = 1; else player[i][j] = 0; } } // check player-dot postitons for(int i=0; i<8; i++) { for(int j=0; j<8; j++) { if(player[i][j] && dots[i][j]) { newdot(); pc.printf("%i ", score); } } } segupdate(); } }