Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // The Tower of Hanoi is a mathematical game. v.1.0, Author: Szerzetes, Licenc: free
- // https://en.wikipedia.org/wiki/Tower_of_Hanoi
- #define A_key 12 // 1. button
- #define B_key 11 // 2. button
- #define C_key 10 // 3. button
- #define tonePin 8 // speaker
- #define toneButton 500 //
- #define toneDuration 100 //
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h> // https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
- byte a1[8] = {
- B00100,
- B00100,
- B00100,
- B00100,
- B11111,
- B11111,
- B11111,
- B11111,
- };
- byte a2[8] = {
- B00111,
- B00111,
- B00111,
- B00111,
- B11111,
- B11111,
- B11111,
- B11111,
- };
- byte a3[8] = {
- B00000,
- B00000,
- B00000,
- B00000,
- B00111,
- B00111,
- B00111,
- B00111,
- };
- byte a4[8] = {
- B11100,
- B11100,
- B11100,
- B11100,
- B11111,
- B11111,
- B11111,
- B11111,
- };
- byte a5[8] = {
- B00000,
- B00000,
- B00000,
- B00000,
- B11100,
- B11100,
- B11100,
- B11100,
- };
- byte a6[8] = {
- B00100,
- B00100,
- B00100,
- B00100,
- B00100,
- B00100,
- B00100,
- B00100,
- };
- byte a7[8] = {
- B11111,
- B11111,
- B11111,
- B11111,
- B11111,
- B11111,
- B11111,
- B11111,
- };
- byte a8[8] = {
- B00000,
- B00000,
- B00000,
- B00000,
- B11111,
- B11111,
- B11111,
- B11111,
- };
- // addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
- byte towers[4][7] {
- {0,5,4,3,2,1,0},
- {0,5,4,3,2,1,0},
- {0,0,0,0,0,0},
- {0,0,0,0,0,0},
- };
- byte tower[6] {0,0,0,0,0};
- byte Disk,tmp,stepNumber;
- void setup()
- {
- Serial.begin(115200);
- Serial.println("Start");
- pinMode(A_key,INPUT);
- pinMode(B_key,INPUT);
- pinMode(C_key,INPUT);
- digitalWrite(A_key,HIGH);
- digitalWrite(B_key,HIGH);
- digitalWrite(C_key,HIGH);
- lcd.begin(16,4);
- lcd.createChar(1, a1);
- lcd.createChar(2, a2);
- lcd.createChar(3, a3);
- lcd.createChar(4, a4);
- lcd.createChar(5, a5);
- lcd.createChar(6, a6);
- lcd.createChar(7, a7);
- lcd.createChar(8, a8);
- welcome();
- lcd.setCursor(0,1);
- lcd.print(" Hanoi Tower ");
- while (!KeyPress()) { }
- while (KeyPress()) { }
- stepNumber=0;
- } // end setup
- void loop() {
- Draw();
- again1:
- tmp=KeyPress();
- if (tmp==0) goto again1;
- upDisk(tmp);
- delay(100);
- Serial.print("Removed disk ");
- Serial.print(Disk);
- Serial.print(" size from ");
- Serial.print(tmp);
- Serial.print(". tower ");
- while (KeyPress()) { }
- again2:
- tmp=KeyPress();
- if (tmp==0) goto again2;
- downDisk(tmp);
- if (Disk!=0) goto again2;
- checkWin();
- delay(100);
- Serial.print("and put onto ");
- Serial.print(tmp);
- Serial.print(". tower. Steps: ");
- Serial.println(stepNumber);
- while (KeyPress()) { }
- } // loop end
- void checkWin() {
- byte B=0,C=0;
- for (byte i=5;i>=1;i--) {
- B=B+towers[2][i];
- C=C+towers[3][i];
- } // end for
- if (B==15 or C==15) {
- Serial.println(" ");
- Serial.println("WIN");
- lcd.clear();
- lcd.print(" WIN");
- lcd.setCursor(4,1);
- lcd.print("Steps: ");
- lcd.print(stepNumber);
- while (KeyPress()) { }
- while (!KeyPress()) { }
- asm volatile ( "jmp 0");
- } // end if
- } // end checkWin
- void downDisk(byte TowerNumber) {
- stepNumber++;
- if (towers[TowerNumber][1]==0) {
- towers[TowerNumber][1]=Disk;
- Disk=0;
- return;
- } // end if
- for (byte i=5;i>=1;i--) {
- if (towers[TowerNumber][i]!=0) {
- if (towers[TowerNumber][i]<Disk) {stepNumber--;return;}
- towers[TowerNumber][i+1]=Disk;
- Disk=0;
- Draw();
- return;
- } //end if
- } // end for
- } // end downDisk
- void upDisk(byte TowerNumber) {
- Disk=0;
- for (byte i=5;i>=1;i--) {
- if (towers[TowerNumber][i]!=0) {
- Disk=towers[TowerNumber][i];
- towers[TowerNumber][i]=0;
- Draw();
- DrawDisk(TowerNumber,Disk);
- return;
- } // end if
- } // end for
- } //end upDisk
- byte KeyPress() {
- byte KeyPressed;
- KeyPressed=0;
- if (digitalRead(A_key)==0){
- KeyPressed=1;
- tone(tonePin,toneButton,toneDuration);
- delay(150);
- while(!digitalRead(A_key));
- }
- if (digitalRead(B_key)==0){
- KeyPressed=2;
- tone(tonePin,toneButton,toneDuration);
- delay(150);
- while(!digitalRead(B_key));
- }
- if (digitalRead(C_key)==0){
- KeyPressed=3;
- tone(tonePin,toneButton,toneDuration);
- delay(150);
- while(!digitalRead(C_key));
- }
- return KeyPressed;
- } // end KeyPress
- void Draw() {
- lcd.clear();
- for (byte j=1;j<=3;j++) {
- for (byte i=1;i<=3;i++) {
- lcd.setCursor(1+(j-1)*5,4-i);
- DrawTower(j,i);
- for (byte k=1;k<=5;k++) {
- lcd.write(tower[k]);
- } // end for k
- } //end for i
- } //end for j
- } // draw end
- void DrawDisk(byte tow, byte disk) {
- lcd.setCursor(1+(tow-1)*5,0);
- switch (disk) {
- case 5:
- tower[1]=8;
- tower[2]=8;
- tower[3]=8;
- tower[4]=8;
- tower[5]=8;
- break;
- case 4:
- tower[1]=3;
- tower[2]=8;
- tower[3]=8;
- tower[4]=8;
- tower[5]=5;
- break;
- case 3:
- tower[1]=32;
- tower[2]=8;
- tower[3]=8;
- tower[4]=8;
- tower[5]=32;
- break;
- case 2:
- tower[1]=32;
- tower[2]=3;
- tower[3]=8;
- tower[4]=5;
- tower[5]=32;
- break;
- case 1:
- tower[1]=32;
- tower[2]=32;
- tower[3]=8;
- tower[4]=32;
- tower[5]=32;
- break;
- } // end switch
- for (byte k=1;k<=5;k++) {
- lcd.write(tower[k]);
- } // end for k
- } // end DrawDisk
- void DrawTower(byte tow, byte row) {
- if (towers[tow][row*2-1]==5) {
- switch (towers[tow][row*2]) {
- case 4:
- tower[1]=2;
- tower[2]=7;
- tower[3]=7;
- tower[4]=7;
- tower[5]=4;
- break;
- case 3:
- tower[1]=8;
- tower[2]=7;
- tower[3]=7;
- tower[4]=7;
- tower[5]=8;
- break;
- case 2:
- tower[1]=8;
- tower[2]=2;
- tower[3]=7;
- tower[4]=4;
- tower[5]=8;
- break;
- case 1:
- tower[1]=8;
- tower[2]=8;
- tower[3]=7;
- tower[4]=8;
- tower[5]=8;
- break;
- case 0:
- tower[1]=8;
- tower[2]=8;
- tower[3]=1;
- tower[4]=8;
- tower[5]=8;
- break;
- } // end switch
- } // end if
- if (towers[tow][row*2-1]==4) {
- switch (towers[tow][row*2]) {
- case 3:
- tower[1]=3;
- tower[2]=7;
- tower[3]=7;
- tower[4]=7;
- tower[5]=5;
- break;
- case 2:
- tower[1]=3;
- tower[2]=2;
- tower[3]=7;
- tower[4]=4;
- tower[5]=5;
- break;
- case 1:
- tower[1]=3;
- tower[2]=8;
- tower[3]=7;
- tower[4]=8;
- tower[5]=5;
- break;
- case 0:
- tower[1]=3;
- tower[2]=8;
- tower[3]=1;
- tower[4]=8;
- tower[5]=5;
- break;
- } // end switch
- } // end if
- if (towers[tow][row*2-1]==3) {
- switch (towers[tow][row*2]) {
- case 2:
- tower[1]=32;
- tower[2]=2;
- tower[3]=7;
- tower[4]=4;
- tower[5]=32;
- break;
- case 1:
- tower[1]=32;
- tower[2]=8;
- tower[3]=7;
- tower[4]=8;
- tower[5]=32;
- break;
- case 0:
- tower[1]=32;
- tower[2]=8;
- tower[3]=1;
- tower[4]=8;
- tower[5]=32;
- break;
- } // end switch
- } // end if
- if (towers[tow][row*2-1]==2) {
- switch (towers[tow][row*2]) {
- case 1:
- tower[1]=32;
- tower[2]=3;
- tower[3]=7;
- tower[4]=5;
- tower[5]=32;
- break;
- case 0:
- tower[1]=32;
- tower[2]=3;
- tower[3]=1;
- tower[4]=5;
- tower[5]=32;
- break;
- } // end switch
- } // end if
- if (towers[tow][row*2-1]==1) {
- tower[1]=32;
- tower[2]=32;
- tower[3]=1;
- tower[4]=32;
- tower[5]=32;
- } // end if
- if (towers[tow][row*2-1]==0) {
- tower[1]=32;
- tower[2]=32;
- tower[3]=6;
- tower[4]=32;
- tower[5]=32;
- } // end if
- } // end DrawTower
- void welcome() {
- int hh=160;
- lcd.setCursor(0,0);
- lcd.print(" *");
- tone(tonePin,659,hh);
- delay(hh);
- lcd.print(" *");
- tone(tonePin,587,hh);
- delay(hh);
- lcd.print(" **");
- tone(tonePin,370,hh*2);
- delay(hh);
- lcd.print(" **");
- tone(tonePin,415,hh*2);
- delay(hh);
- lcd.setCursor(0,1);
- lcd.print(" *");
- tone(tonePin,554,hh);
- delay(hh);
- lcd.print(" *");
- tone(tonePin,494,hh);
- delay(hh);
- lcd.print(" **");
- tone(tonePin,294,hh*2);
- delay(hh);
- lcd.print(" **");
- tone(tonePin,330,hh*2);
- delay(hh);
- lcd.setCursor(0,2);
- lcd.print(" *");
- tone(tonePin,494,hh);
- delay(hh);
- lcd.print(" *");
- tone(tonePin,440,hh);
- delay(hh);
- lcd.print(" **");
- tone(tonePin,277,hh*2);
- delay(hh);
- lcd.print(" **");
- tone(tonePin,330,hh*2);
- delay(hh);
- lcd.setCursor(0,3);
- lcd.print("* ** * * ** *");
- tone(tonePin,440,hh*4);
- lcd.setCursor(0,0);
- lcd.print(" Hanoi Tower ");
- delay(500);
- lcd.setCursor(0,0);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print(" Hanoi Tower ");
- delay(500);
- lcd.setCursor(0,1);
- lcd.print(" ");
- lcd.setCursor(0,2);
- lcd.print(" Hanoi Tower ");
- delay(500);
- lcd.setCursor(0,2);
- lcd.print(" ");
- lcd.setCursor(0,3);
- lcd.print(" Hanoi Tower ");
- delay(500);
- lcd.setCursor(0,3);
- lcd.print(" ");
- delay(500);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement