Table 3. Available at www.ArduinoGames.com/puzzle.zip.
#include <stdint.h> #include <SeeedTouchScreen.h> #include <TFTv2.h> #include <SPI.h> #define YP A2 #define XM A1 #define YM 14 #define XP 17 TouchScreen ts = TouchScreen(XP, YP, XM, YM); int bc; int br; int c; int c1; int c2; int r; int r1; int r2; int rsd=0; int tc; int tr; int x; int y; int b[5][5]; String s[]={" ","1","2","3","4","5","6","7","8","9","1O","11", "12","13","14","15"," "}; void setup() { Tft.TFTinit(); TFT_BL_ON; // Init TFT library and turn on the backlight Tft.fillScreen(0,239,0,319,BLACK); Tft.drawString("SLIDING PUZZLE GAME",4,10,2,YELLOW); Tft.drawString("TOUCH THE SCREEN",20,160,2,CYAN); Tft.drawString("TO BEGIN PLAYING",20,180,2,CYAN); touchWait(); randomSeed(rsd); Tft.fillScreen(0,238,0,319,BLUE); Tft.fillScreen(1,237,1,25,RED); Tft.drawString("SLIDING PUZZLE GAME",4,6,2,YELLOW); Tft.fillScreen(1,237,26,262,WHITE); Tft.drawLine(1,26,237,26,RED); Tft.drawLine(1,85,237,85,RED); Tft.drawLine(1,144,237,144,RED); Tft.drawLine(1,203,237,203,RED); Tft.drawLine(1,262,237,262,RED); Tft.drawLine(1,26,1,262,RED); Tft.drawLine(60,26,60,262,RED); Tft.drawLine(119,26,119,262,RED); Tft.drawLine(178,26,178,262,RED); Tft.drawLine(237,26,237,262,RED); Tft.fillScreen(50,189,297,317,CYAN); Tft.drawString("NEW GAME",70,300,2,BLACK); newGame(); } void loop(void) { touchWait(); if (touchBox(50,297,189,317)) {newGame();} if (touchBox(1,26,236,261)) {findBlank(); for (r=1;r<5;++r) {for (c=1;c<5;++c) {int yy=(59*r)-33; int xx=(59*c)-58; if (touchBox(xx,yy,(xx+58),(yy+58))) {tr=r; tc=c;}}} if (((tr == br) && (tc != bc)) || ((tr != br) && (tc == bc))) {cellMove(); for (r=1;r<5;++r) {for (c=1;c<5;++c) {cellShow(r,c);}}} if (inOrder()) {Tft.drawString("YOU WIN !!!",55,272,2,WHITE); touchWait(); newGame();} } } void cellMove(void) { while (tr<br) {b[br][bc]=b[br-1][bc]; b [br-1][bc]=16; --br;} while (tr>br) {b[br][bc]=b[br+1][bc]; b[br+1][bc]=16; ++br;} while (tc<bc) {b[br][bc]=b[br][bc-1]; b[br] [bc-1]=16; --bc;} while (tc>bc) {b[br][bc]=b[br][bc+1]; b[br][bc+1]=16; ++bc;} } void cellShow(int rrr, int ccc) { String ss=s[b[rrr][ccc]]; int ssL=ss.length()-1; int xx=(59*c)-57; int yy=(59*r)-32; Tft.fillScreen(xx,xx+55,yy,yy+55,WHITE); char sss[]={0,0,0}; for (int i=0;i<=ssL;++i) {sss[i]=ss.charAt(i);} Tft.drawString(sss,xx+19-(ssL*10),yy+17, 3,BLACK); } void findBlank(void) { for (r=1;r<5;++r) {for (c=1;c<5;++c) {if (b[r][c] == 16) {br=r; bc=c;}}}} boolean inOrder(void) { boolean ordered=true; for (r=1;r<5;++r) {for (c=1;c<5;++c) {if ((b[r][c]) != (((r-1)*4)+c)) {ordered=false;}}} return ordered; } void newGame(void) { Tft.drawString("YOU WIN !!!",55,272,2,BLUE); for (r=1;r<5;++r) {for (c=1;c<5;++c) {b[r][c]=((r-1)*4)+c;}} int rc=0; findBlank(); for (int i=1;i<100;++i) {rc=1-rc; if (rc == 0) {tr=br; tc=random(1,5);} else {tr=random(1,5); tc=bc;} cellMove(); } for (r=1;r<5;++r) {for (c=1;c<5;++c) {cellShow(r,c);}} findBlank(); } boolean touchBox(int x0, int y0, int x1, int y1) { if (x<x0 || x>x1 || y<y0 || y>y1) {return false;} return true;} boolean touchPosition() { Point p = ts.getPoint(); if (p.z > __PRESURE) {x = map(p.x, TS_MINX, TS_MAXX, 0, 240); y = map(p.y, TS_MINY, TS_MAXY, 0, 320); return true;} else {return false;} } boolean touchStatus(void) { int steady=0; boolean newState=false; boolean oldState; while (steady <20) {oldState=newState; Point p = ts.getPoint(); if (p.z > __PRESURE) {newState=true; x = map(p.x, TS_MINX, TS_MAXX, 0, 240); y = map(p.y, TS_MINY, TS_MAXY, 0, 320);} else {newState=false;} if (newState == oldState) {++steady;} else {steady=0;} delay(5); } return newState; } void touchWait(void) { while (!touchStatus()) {++rsd; if (rsd>10000) {rsd=0;}} while (touchStatus()) {} }
44 May 2014