/* PART1 Arduino Play Tetris Game The Tetris game uno fitted to the inside, and then connect a LCD and a ADK can be played */ #include #include #define blocksize 6 #define xmax 16 #define ymax 28 #define LCD_BL 2 UTFT mlcd(ITDB18SP, 4, 3, 7, 6, 5); //get lcd controler(model,data,clk,cs,rst,control) Timer timer; extern uint8_t SmallFont[]; // blockType // turnState byte level = 1; byte levelid; byte blockType; byte score = 0; byte turnState; byte x = 0; byte y = 0; byte i = 0; byte j = 0; byte flag = 0; //x=0-15,y=0-27; byte map1[xmax][ymax]; // S?Z?L?J?I?O?T byte shapes[8][4][16] = { // i { {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 } }, // s { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }, // z { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, // j { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // o { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // l { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // _| { { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 } }, // t { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } } }; // legitimacy detect byte blow(byte x, byte y, byte blockType, byte turnState) { for (byte a = 0; a < 4; a++) { for (byte b = 0; b < 4; b++) { if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map1[x + b + 1][y + a] == 1)) || ((shapes[blockType][turnState][a * 4 + b] == 1) && (map1[x + b + 1][y + a] == 2))) { return 0; } } } return 1; } void drawwall() { for (i = 0; i < (xmax - 1); i++) { map1[i][(ymax - 2)] = 2; } for (j = 0; j < (ymax - 1); j++) { map1[(xmax - 2)][j] = 2; map1[0][j] = 2; } } void newmap() { for (i = 0; i < (xmax - 1); i++) { for (j = 0; j < (ymax - 1); j++) { map1[i][j] = 0; } } } // judgment over byte gameover(byte x, byte y) { if (blow(x, y, blockType, turnState) == 0) { return 1; } return 0; } void newblock() { blockType = (byte) ((random()) % 8); turnState = (byte) ((random()) % 4); x = 4; y = 0; if (gameover(x, y) == 1) { mlcd.setColor(255, 0, 0); mlcd.print("GAME OVER", 10, 70); while (!pause()); newmap(); drawwall(); score = 0; mlcd.setColor(0, 0, 0); mlcd.print("GAME OVER", 10, 70); paint(); } } void paint() { //Videos have been fixed block for (j = 0; j < (ymax - 1); j++) { for (i = 0; i < (xmax - 1); i++) { if (map1[i][j] == 2) { mlcd.setColor(255, 0, 255); mlcd.drawRect(i * blocksize + 1, j * blocksize + 1, i * blocksize + blocksize, j * blocksize + blocksize); } else if (map1[i][j] == 1) { mlcd.setColor(255, 255, 0); mlcd.drawRect(i * blocksize + 1, j * blocksize + 1, i * blocksize + blocksize, j * blocksize + blocksize); } else { mlcd.setColor(0, 0, 0); mlcd.drawRect(i * blocksize + 1, j * blocksize + 1, i * blocksize + blocksize, j * blocksize + blocksize); } } } mlcd.setFont(SmallFont); mlcd.setColor(255, 0, 0); mlcd.print("sco", 98, 10); //Display Score mlcd.setColor(255, 255, 0); mlcd.printNumI(score, 96, 26, 4); mlcd.setColor(255, 0, 0); mlcd.print("lev", 98, 100); //Display level mlcd.setColor(255, 255, 0); mlcd.printNumI(level, 105, 115, 2); } void turn() { byte tempturnState = turnState; turnState = (turnState + 1) % 4; if (blow(x, y, blockType, turnState) == 1) { turnState = tempturnState; blockundraw(0); turnState = (turnState + 1) % 4; blockdraw(); } if (blow(x, y, blockType, turnState) == 0) { turnState = tempturnState; } } void left() { if (x > 0) if (blow(x - 1, y, blockType, turnState) == 1) { blockundraw(0); x = x - 1; blockdraw(); } } void right() { if (blow(x + 1, y, blockType, turnState) == 1) { blockundraw(0); x = x + 1; blockdraw(); } } void delline() { byte c = 0; for (byte b = 0; b < (ymax - 1); b++) { for (byte a = 0; a < (xmax - 1); a++) { if (map1[a][b] == 1) { c = c + 1; if (c == (xmax - 3)) { score += (xmax - 3); if (score >= 1000)nextlevel(); for (byte d = b; d > 0; d--) { for (byte e = 0; e < (xmax - 2); e++) { map1[e][d] = map1[e][d - 1]; } } paint(); } } } c = 0; } } // add to map void add(byte x, byte y, byte blockType, byte turnState) { int j = 0; for (byte a = 0; a < 4; a++) { for (byte b = 0; b < 4; b++) { if (map1[x + b + 1][y + a] == 0) { map1[x + b + 1][y + a] = shapes[blockType][turnState][j]; } ; j++; } } } void down() { if (blow(x, y + 1, blockType, turnState) == 1) { blockundraw(0); y = y + 1; blockdraw(); } ; if (blow(x, y + 1, blockType, turnState) == 0) { add(x, y, blockType, turnState); blockundraw(1); delline(); newblock(); } ; } void blockdraw() { for (j = 0; j < 16; j++) { if (shapes[blockType][turnState][j] == 1) { mlcd.setColor(0, 0, 255); mlcd.drawRect((j % 4 + x + 1) * blocksize + 1, (j / 4 + y) * blocksize + 1, (j % 4 + x + 1) * blocksize + blocksize, (j / 4 + y) * blocksize + blocksize); } } } void blockundraw(byte a) { if (a)mlcd.setColor(255, 255, 0); else mlcd.setColor(0, 0, 0); for (j = 0; j < 16; j++) { if (shapes[blockType][turnState][j] == 1) { mlcd.drawRect((j % 4 + x + 1) * blocksize + 1, (j / 4 + y) * blocksize + 1, (j % 4 + x + 1) * blocksize + blocksize, (j / 4 + y) * blocksize + blocksize); } } } #define buttonA 0 #define buttonB 47 #define buttonC 91 #define buttonD 132 #define buttonE 546 // ADK listener void keyListener() { pause(); int value = analogRead(A0); if (value < 150 && value > 100) { delay(140); right(); } else if (value > 500 && value < 600) { down(); } if (value < 20) { delay(150); turn (); } else if (value > 70 && value < 100) { delay(140); left(); } } int pause() { int value = analogRead(A0); if (value > 30 && value < 60) { delay(550); value = 0; while (!(value > 30 && value < 60)) { value = analogRead(A0); } delay(150); return 1; } else return 0; } void nextlevel() { level++; timer.stop(levelid); newmap(); drawwall(); score = 0; paint(); newblock(); levelid = timer.every((500 / level), timelisten); } // AUTO GAME void timelisten() { blockundraw(0); if (blow(x, y + 1, blockType, turnState) == 1) { y = y + 1; delline(); } if (blow(x, y + 1, blockType, turnState) == 0) { if (flag == 1) { add(x, y, blockType, turnState); blockundraw(1); delline(); newblock(); flag = 0; } flag = 1; }; blockdraw(); } void setup() { pinMode(A0, 0); //ADK pin A0 pinMode(LCD_BL, OUTPUT); digitalWrite(LCD_BL, HIGH); srand(1024); mlcd.InitLCD(0); mlcd.setFont(SmallFont); mlcd.clrScr(); //refresh the lcd newblock(); newmap(); drawwall(); timer.every(500, timelisten); //AUTO GAME timer.every(10, keyListener); //ADK listen paint(); } void loop() { timer.update(); }