hola
unknown
c_cpp
a year ago
19 kB
3
Indexable
#include <VGAXUtils.h> #include <math.h> #define FNT_NANOFONT_HEIGHT 6 #define FNT_NANOFONT_SYMBOLS_COUNT 95 VGAX vga; VGAXUtils vgaU; //data size=570 bytes const unsigned char fnt_nanofont_data[FNT_NANOFONT_SYMBOLS_COUNT][1+FNT_NANOFONT_HEIGHT] PROGMEM={ { 1, 128, 128, 128, 0, 128, 0, }, //glyph '!' code=0 { 3, 160, 160, 0, 0, 0, 0, }, //glyph '"' code=1 //{ 5, 80, 248, 80, 248, 80, 0, }, //glyph '#' code=2 { 5, 248, 248, 248, 248, 248, 0, }, //glyph '#' code=2 { 5, 120, 160, 112, 40, 240, 0, }, //glyph '$' code=3 { 5, 136, 16, 32, 64, 136, 0, }, //glyph '%' code=4 { 5, 96, 144, 104, 144, 104, 0, }, //glyph '&' code=5 { 2, 128, 64, 0, 0, 0, 0, }, //glyph ''' code=6 { 2, 64, 128, 128, 128, 64, 0, }, //glyph '(' code=7 { 2, 128, 64, 64, 64, 128, 0, }, //glyph ')' code=8 { 3, 0, 160, 64, 160, 0, 0, }, //glyph '*' code=9 { 3, 0, 64, 224, 64, 0, 0, }, //glyph '+' code=10 { 2, 0, 0, 0, 0, 128, 64, }, //glyph ',' code=11 { 3, 0, 0, 224, 0, 0, 0, }, //glyph '-' code=12 { 1, 0, 0, 0, 0, 128, 0, }, //glyph '.' code=13 { 5, 8, 16, 32, 64, 128, 0, }, //glyph '/' code=14 { 4, 96, 144, 144, 144, 96, 0, }, //glyph '0' code=15 { 3, 64, 192, 64, 64, 224, 0, }, //glyph '1' code=16 { 4, 224, 16, 96, 128, 240, 0, }, //glyph '2' code=17 { 4, 224, 16, 96, 16, 224, 0, }, //glyph '3' code=18 { 4, 144, 144, 240, 16, 16, 0, }, //glyph '4' code=19 { 4, 240, 128, 224, 16, 224, 0, }, //glyph '5' code=20 { 4, 96, 128, 224, 144, 96, 0, }, //glyph '6' code=21 { 4, 240, 16, 32, 64, 64, 0, }, //glyph '7' code=22 { 4, 96, 144, 96, 144, 96, 0, }, //glyph '8' code=23 { 4, 96, 144, 112, 16, 96, 0, }, //glyph '9' code=24 { 1, 0, 128, 0, 128, 0, 0, }, //glyph ':' code=25 { 2, 0, 128, 0, 0, 128, 64, }, //glyph ';' code=26 { 3, 32, 64, 128, 64, 32, 0, }, //glyph '<' code=27 { 3, 0, 224, 0, 224, 0, 0, }, //glyph '=' code=28 { 3, 128, 64, 32, 64, 128, 0, }, //glyph '>' code=29 { 4, 224, 16, 96, 0, 64, 0, }, //glyph '?' code=30 { 4, 96, 144, 176, 128, 112, 0, }, //glyph '@' code=31 { 4, 96, 144, 240, 144, 144, 0, }, //glyph 'A' code=32 { 4, 224, 144, 224, 144, 224, 0, }, //glyph 'B' code=33 { 4, 112, 128, 128, 128, 112, 0, }, //glyph 'C' code=34 { 4, 224, 144, 144, 144, 224, 0, }, //glyph 'D' code=35 { 4, 240, 128, 224, 128, 240, 0, }, //glyph 'E' code=36 { 4, 240, 128, 224, 128, 128, 0, }, //glyph 'F' code=37 { 4, 112, 128, 176, 144, 112, 0, }, //glyph 'G' code=38 { 4, 144, 144, 240, 144, 144, 0, }, //glyph 'H' code=39 { 3, 224, 64, 64, 64, 224, 0, }, //glyph 'I' code=40 { 4, 240, 16, 16, 144, 96, 0, }, //glyph 'J' code=41 { 4, 144, 160, 192, 160, 144, 0, }, //glyph 'K' code=42 { 4, 128, 128, 128, 128, 240, 0, }, //glyph 'L' code=43 { 5, 136, 216, 168, 136, 136, 0, }, //glyph 'M' code=44 { 4, 144, 208, 176, 144, 144, 0, }, //glyph 'N' code=45 { 4, 96, 144, 144, 144, 96, 0, }, //glyph 'O' code=46 { 4, 224, 144, 224, 128, 128, 0, }, //glyph 'P' code=47 { 4, 96, 144, 144, 144, 96, 16, }, //glyph 'Q' code=48 { 4, 224, 144, 224, 160, 144, 0, }, //glyph 'R' code=49 { 4, 112, 128, 96, 16, 224, 0, }, //glyph 'S' code=50 { 3, 224, 64, 64, 64, 64, 0, }, //glyph 'T' code=51 { 4, 144, 144, 144, 144, 96, 0, }, //glyph 'U' code=52 { 3, 160, 160, 160, 160, 64, 0, }, //glyph 'V' code=53 { 5, 136, 168, 168, 168, 80, 0, }, //glyph 'W' code=54 { 4, 144, 144, 96, 144, 144, 0, }, //glyph 'X' code=55 { 3, 160, 160, 64, 64, 64, 0, }, //glyph 'Y' code=56 { 4, 240, 16, 96, 128, 240, 0, }, //glyph 'Z' code=57 { 2, 192, 128, 128, 128, 192, 0, }, //glyph '[' code=58 { 5, 128, 64, 32, 16, 8, 0, }, //glyph '\' code=59 { 2, 192, 64, 64, 64, 192, 0, }, //glyph ']' code=60 { 5, 32, 80, 136, 0, 0, 0, }, //glyph '^' code=61 { 4, 0, 0, 0, 0, 240, 0, }, //glyph '_' code=62 { 2, 128, 64, 0, 0, 0, 0, }, //glyph '`' code=63 { 3, 0, 224, 32, 224, 224, 0, }, //glyph 'a' code=64 { 3, 128, 224, 160, 160, 224, 0, }, //glyph 'b' code=65 { 3, 0, 224, 128, 128, 224, 0, }, //glyph 'c' code=66 { 3, 32, 224, 160, 160, 224, 0, }, //glyph 'd' code=67 { 3, 0, 224, 224, 128, 224, 0, }, //glyph 'e' code=68 { 2, 64, 128, 192, 128, 128, 0, }, //glyph 'f' code=69 { 3, 0, 224, 160, 224, 32, 224, }, //glyph 'g' code=70 { 3, 128, 224, 160, 160, 160, 0, }, //glyph 'h' code=71 { 1, 128, 0, 128, 128, 128, 0, }, //glyph 'i' code=72 { 2, 0, 192, 64, 64, 64, 128, }, //glyph 'j' code=73 { 3, 128, 160, 192, 160, 160, 0, }, //glyph 'k' code=74 { 1, 128, 128, 128, 128, 128, 0, }, //glyph 'l' code=75 { 5, 0, 248, 168, 168, 168, 0, }, //glyph 'm' code=76 { 3, 0, 224, 160, 160, 160, 0, }, //glyph 'n' code=77 { 3, 0, 224, 160, 160, 224, 0, }, //glyph 'o' code=78 { 3, 0, 224, 160, 160, 224, 128, }, //glyph 'p' code=79 { 3, 0, 224, 160, 160, 224, 32, }, //glyph 'q' code=80 { 3, 0, 224, 128, 128, 128, 0, }, //glyph 'r' code=81 { 2, 0, 192, 128, 64, 192, 0, }, //glyph 's' code=82 { 3, 64, 224, 64, 64, 64, 0, }, //glyph 't' code=83 { 3, 0, 160, 160, 160, 224, 0, }, //glyph 'u' code=84 { 3, 0, 160, 160, 160, 64, 0, }, //glyph 'v' code=85 { 5, 0, 168, 168, 168, 80, 0, }, //glyph 'w' code=86 { 3, 0, 160, 64, 160, 160, 0, }, //glyph 'x' code=87 { 3, 0, 160, 160, 224, 32, 224, }, //glyph 'y' code=88 { 2, 0, 192, 64, 128, 192, 0, }, //glyph 'z' code=89 { 3, 96, 64, 192, 64, 96, 0, }, //glyph '{' code=90 { 1, 128, 128, 128, 128, 128, 0, }, //glyph '|' code=91 { 3, 192, 64, 96, 64, 192, 0, }, //glyph '}' code=92 { 3, 96, 192, 0, 0, 0, 0, }, //glyph '~' code=93 { 4, 48, 64, 224, 64, 240, 0, }, //glyph '£' code=94 }; static const char str10[] PROGMEM="#"; static const char str11[] PROGMEM=" [!]TETRIS XTREME[!]"; static const char str12[] PROGMEM="Presiona un boton para"; static const char str15[] PROGMEM=" COMENZAR"; static const char str13[] PROGMEM="Game"; static const char str14[] PROGMEM="Over!"; boolean boton = 0; boolean boton_1 = 0; boolean boton_2 = 0; boolean boton_3 = 0; boolean boton_4 = 0; int block[4][2]={{0,0},{0,0},{0,0},{0,0}}; //va a ser para las fichas int blockExt[4][2]={{0,0},{0,0},{0,0},{0,0}}; //para los monitores 4:3 int blockOld[4][2]={{0,0},{0,0},{0,0},{0,0}}; //las fichas antiguas que ya están en la pantalla int blockTmp[4][2]={{0,0},{0,0},{0,0},{0,0}}; int blockTr[4][2]={{0,0},{0,0},{0,0},{0,0}}; int yLine[4] = {0,0,0,0}; int yLineTmp[4] = {0,0,0,0}; int yCounter = 0; int x = 60; int y = 6; int z = 10; int puntuacion; //la puntuacion int noLoop = (-1); int reloj = 1; int delta = 0; int color = 1; int colorAnterior; int bloqueActual; int bloqueSiguiente; int choque; int noDelete = 0; int k = 0; int a = 40; int b = 10; int counterMenu = 0; unsigned long tiempo = 0; int velocidad = 14; //14; void processInputs() { //para que sirve esto if(boton_1 == 1) { boton_2 = digitalRead(A2); boton_3 = digitalRead(A3); boton_4 = digitalRead(A4); boton_1 = 0; vga.delay(25); } else{ if(boton_2 == 1) { boton_1 = digitalRead(A1); boton_3 = digitalRead(A3); boton_4 = digitalRead(A4); boton_2 = 0; vga.delay(25); } else{ if(boton_3 == 1) { boton_1 = digitalRead(A1); boton_2 = digitalRead(A2); boton_4 = digitalRead(A4); boton_3 = 0; vga.delay(25); } else{ if(boton_4 == 1) { boton_1 = digitalRead(A1); boton_2 = digitalRead(A2); boton_3 = digitalRead(A3); boton_4 = 0; //vga.delay(25); } else{ boton_1 = digitalRead(A1); boton_2 = digitalRead(A2); boton_3 = digitalRead(A3); boton_4 = digitalRead(A4); } } } } boton = boton_2 || boton_4; } void clearInputs() { //cuando se usa boton_1 = 0; boton_2 = 0; boton_3 = 0; boton_4 = 0; boton = 0; } void drawMenu() { while (boton_1 == 0 && boton_2 == 0 && boton_3 == 0 && boton_4 == 0) { //Mientras que no pulsemos ningun botón processInputs(); vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str11, 28, 8, (counterMenu%3) + 1); vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str12, 28, 28, (counterMenu%3) + 1); vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str15, 35, 40, (counterMenu%3) + 1); vga.delay(200); counterMenu++; } vga.clear(0); drawGameScreen(); drawpuntuacion(puntuacion); } void drawpuntuacion(int i) { if (i > 39){ puntuacion = 0; i = 0; velocidad = velocidad - 4; if (velocidad < 3){ velocidad = 2; } } vgaU.draw_line(20, 10, 20, 50, 3); vgaU.draw_line(20, 50, 20, 50 - i, 1); vgaU.draw_line(19, 10, 22, 10, 3); vgaU.draw_line(19, 50, 22, 50, 3); } void drawGameScreen() { //Dibujamos el borde de la pantalla del tetris vgaU.draw_line(44,0,78,0,3); vgaU.draw_line(44,59,78,59,3); vgaU.draw_line(44,0,44,59,3); vgaU.draw_line(78,0,78,60,3); } void blockDef(int i) { //Definición de las fichas if (i == 1){ //El cuadrado block[0][0] = 0; block[0][1] = 0; block[1][0] = 1; block[1][1] = 0; block[2][0] = 0; block[2][1] = 1; block[3][0] = 1; block[3][1] = 1; color = 1; } if (i == 2){ //La L block[0][0] = -1; block[0][1] = 0; block[1][0] = 0; block[1][1] = 0; block[2][0] = 1; block[2][1] = 0; block[3][0] = -1; block[3][1] = 1; color = 2; } if (i == 3){ //La J block[0][0] = -1; block[0][1] = 0; block[1][0] = 0; block[1][1] = 0; block[2][0] = 1; block[2][1] = 0; block[3][0] = 1; block[3][1] = 1; color = 3; } if (i == 4){ //El palo block[0][0] = -1; block[0][1] = 0; block[1][0] = 0; block[1][1] = 0; block[2][0] = 1; block[2][1] = 0; block[3][0] = 2; block[3][1] = 0; color = 1; } if (i == 5){ //La S block[0][0] = -1; block[0][1] = 0; block[1][0] = 0; block[1][1] = 0; block[2][0] = 0; block[2][1] = 1; block[3][0] = 1; block[3][1] = 1; color = 2; } if (i == 6){ //La Z block[0][0] = -1; block[0][1] = 1; block[1][0] = 0; block[1][1] = 1; block[2][0] = 0; block[2][1] = 0; block[3][0] = 1; block[3][1] = 0; color = 3; } if (i == 7){ //La T block[0][0] = -1; block[0][1] = 0; block[1][0] = 0; block[1][1] = 0; block[2][0] = 0; block[2][1] = 1; block[3][0] = 1; block[3][1] = 0; color = 1; } } void blockExtension() { //Extension para los monitores 4:3 porque sino no se ve correctamente for (int i = 0; i < 4; i++){ blockExt[0][0] = block[0][0]*3; blockExt[0][1] = block[0][1]*2; blockExt[1][0] = block[1][0]*3; blockExt[1][1] = block[1][1]*2; blockExt[2][0] = block[2][0]*3; blockExt[2][1] = block[2][1]*2; blockExt[3][0] = block[3][0]*3; blockExt[3][1] = block[3][1]*2; } } void blockRotation(int reloj){ //Para los giros guardamos la información actual en la variable for (int i = 0; i < 4; i++){ blockOld[0][0] = block[0][0]; blockOld[0][1] = block[0][1]; blockOld[1][0] = block[1][0]; blockOld[1][1] = block[1][1]; blockOld[2][0] = block[2][0]; blockOld[2][1] = block[2][1]; blockOld[3][0] = block[3][0]; blockOld[3][1] = block[3][1]; } for (int i = 0; i < 4; i++){ //Modificamos la información actual de acuerdo a la información de la variable almacenada block[0][0] = blockOld[0][1]*reloj; block[0][1] = -blockOld[0][0]*reloj; block[1][0] = blockOld[1][1]*reloj; block[1][1] = -blockOld[1][0]*reloj; block[2][0] = blockOld[2][1]*reloj; block[2][1] = -blockOld[2][0]*reloj; block[3][0] = blockOld[3][1]*reloj; block[3][1] = -blockOld[3][0]*reloj; } } void blockTranslation(int x, int y) { //Para las traslaciones for (int i = 0; i < 4; i++){ blockTr[0][0] = blockExt[0][0] + x; blockTr[0][1] = blockExt[0][1] + y; blockTr[1][0] = blockExt[1][0] + x; blockTr[1][1] = blockExt[1][1] + y; blockTr[2][0] = blockExt[2][0] + x; blockTr[2][1] = blockExt[2][1] + y; blockTr[3][0] = blockExt[3][0] + x; blockTr[3][1] = blockExt[3][1] + y; } } void delBlock(){ if (noDelete == 1) {noDelete = 0;} else { for (int i = 0; i < 4; i++){ vgaU.draw_line(blockTr[i][0],blockTr[i][1],blockTr[i][0] + 3,blockTr[i][1],0); vgaU.draw_line(blockTr[i][0],blockTr[i][1] + 1,blockTr[i][0] + 3,blockTr[i][1] + 1,0); } } } void drawBlock(){ //Para darle color a la ficha for (int i = 0; i < 4; i++){ vgaU.draw_line(blockTr[i][0],blockTr[i][1],blockTr[i][0] + 3,blockTr[i][1], color); vgaU.draw_line(blockTr[i][0],blockTr[i][1] + 1,blockTr[i][0] + 3,blockTr[i][1] + 1, color); } for (int i = 0; i < 4; i++){ blockTmp[0][0] = blockTr[0][0]; blockTmp[0][1] = blockTr[0][1]; blockTmp[1][0] = blockTr[1][0]; blockTmp[1][1] = blockTr[1][1]; blockTmp[2][0] = blockTr[2][0]; blockTmp[2][1] = blockTr[2][1]; blockTmp[3][0] = blockTr[3][0]; blockTmp[3][1] = blockTr[3][1]; } } void drawBlockTmp(){ //Para que la copia tambien tenga color for (int i = 0; i < 4; i++){ vgaU.draw_line(blockTmp[i][0],blockTmp[i][1],blockTmp[i][0] + 3,blockTmp[i][1], color); vgaU.draw_line(blockTmp[i][0],blockTmp[i][1] + 1,blockTmp[i][0] + 3,blockTmp[i][1] + 1, color); } } void checkBlock(){ //Para ver si esta bien el bloque choque = 0; for (int i = 0; i < 4; i++){ choque = choque + vga.getpixel(blockTr[i][0], blockTr[i][1]) + vga.getpixel(blockTr[i][0] + 2, blockTr[i][1]); } } void replaceBlock(){ blockExtension(); blockTranslation(x, y); checkBlock(); if (choque == 0){ drawBlock(); } else { drawBlockTmp(); checkForFullLine(); noLoop = 0; noDelete = 1; if (y < 6) { gameOver(); } } vga.delay(50); } void gameOver(){ //Reestablece los parametros cuando hemos perdido noLoop = -1; puntuacion = 0; velocidad = 14; clearInputs(); tiempo = 0; while (boton_1 == 0 && boton_2 == 0 && boton_3 == 0 && boton_4 == 0) { processInputs(); vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str13, 92, 30, 1); vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str14, 92, 38, 1); vga.delay(200); } vga.clear(0); } void drawbloqueSiguiente(){ //Dibuja la siguiente dicha en la derecha blockExtension(); blockTranslation(100, 10); vgaU.draw_line(95, 8, 112, 8, 0); vgaU.draw_line(95, 9, 112, 9, 0); vgaU.draw_line(95, 10, 112, 10, 0); vgaU.draw_line(95, 11, 112, 11, 0); vgaU.draw_line(95, 12, 112, 12, 0); vgaU.draw_line(95, 13, 112, 13, 0); vgaU.draw_line(95, 14, 112, 14, 0); vgaU.draw_line(95, 15, 112, 15, 0); drawBlock(); } void checkBlockTranslation(){ x = x + delta; blockExtension(); blockTranslation(x, y); checkBlock(); if (choque == 0){ drawBlock(); } else { x = x - delta; blockExtension(); blockTranslation(x, y); drawBlock(); } vga.delay(50); } void checkBlockRotation(){ blockExtension(); blockTranslation(x, y); checkBlock(); if (choque == 0){ drawBlock(); } else { reloj = +1; blockRotation (reloj); blockExtension(); blockTranslation(x, y); drawBlock(); } vga.delay(50); } void checkForFullLine() { //Mira si la linea está completa for (int i = 0; i < 4; i++){ for (int j = 45; j < 76; j += 3) { if (vga.getpixel(j, blockTmp[i][1]) >0){k++; } } if (k == 11) { //si está completa la borra vgaU.draw_line(45, blockTmp[i][1], 78, blockTmp[i][1], 0); vgaU.draw_line(45, blockTmp[i][1] + 1, 78, blockTmp[i][1] + 1, 0); yLineTmp[yCounter] = blockTmp[i][1]; yLine[yCounter] = blockTmp[i][1]; yCounter++; } k = 0; } if (yLineTmp[yCounter - 1] < yLine[0]) { for (int i = 0; i < yCounter; i++) { yLine[i] = yLineTmp[yCounter - i - 1]; } } for (int i = 0; i < yCounter; i++){ //Mueve las fichas una linea abajo for (int y = yLine[i] - 2; y > 0; y = y - 2) { for (int x = 45; x < 76; x += 3) { colorAnterior = vga.getpixel(x, y); if (colorAnterior > 0) { vgaU.draw_line(x, y , x + 3, y , 0); vgaU.draw_line(x, y + 1, x + 3, y + 1, 0); vgaU.draw_line(x, y + 2, x + 3, y + 2, colorAnterior); vgaU.draw_line(x, y + 3, x + 3, y + 3, colorAnterior); } } } } if (yCounter != 0) {puntuacion = puntuacion + 2*int(pow(2, yCounter));} drawpuntuacion(puntuacion); yCounter = 0; } void setup() { pinMode(A1, INPUT); //Para que vaya a la derecha/izquierda pinMode(A2, INPUT); //Para girar la figura pinMode(A3, INPUT); //Para que vaya a la derecha/izquierda pinMode(A4, INPUT); //Para que bajen más rapido vga.begin(); randomSeed(analogRead(A5)); } void loop() { //Programa principal processInputs(); if (noLoop < 1){ // Generamos nuevas fichas bloqueActual = bloqueSiguiente; if (noLoop == -1 ) { //Solo ocurre al principio del juego drawMenu(); while (boton_1 == 0 && boton_2 == 0 && boton_3 == 0 && boton_4 == 0) { bloqueActual = int(random(7)) + 1; processInputs(); } } drawGameScreen(); drawpuntuacion(puntuacion); bloqueSiguiente = int(random(8)); blockDef(bloqueSiguiente); drawbloqueSiguiente(); blockDef(bloqueActual); x = 57; y = 3; boton_1 = 1; noLoop = 1; } if (boton_2 == 1){ //Rotar if (boton_2 == 1) {reloj = -1;} delBlock(); blockRotation (reloj); checkBlockRotation(); } if (boton_1 == 1 || boton_3 == 1){ //Trasladar if (boton_1 == 1){delta = 3;} if (boton_3 == 1){delta = -3;} delBlock(); checkBlockTranslation(); } tiempo ++; if (tiempo % velocidad > velocidad - 2 || boton_4 == 1){ //Caida de las fichas if (velocidad < 3) {velocidad = 2;} y = y + 2; delBlock(); replaceBlock(); } vga.delay(10 + 2*velocidad); }
Editor is loading...
Leave a Comment