Advertisement
Szerelo

Arduino Hanoi Tower playable game with 5 disks, on 16*4 LCD

Jun 23rd, 2018
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.69 KB | None | 0 0
  1. // The Tower of Hanoi is a mathematical game. v.1.0, Author: Szerzetes, Licenc: free
  2. // https://en.wikipedia.org/wiki/Tower_of_Hanoi
  3.  
  4. #define A_key 12  //  1. button
  5. #define B_key 11  //  2. button
  6. #define C_key 10  //  3. button
  7. #define tonePin 8  //  speaker
  8. #define toneButton 500  //  
  9. #define toneDuration 100  //
  10.  
  11. #include <Wire.h>
  12. #include <LiquidCrystal_I2C.h> // https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
  13.  
  14. byte a1[8] = {
  15.   B00100,
  16.   B00100,
  17.   B00100,
  18.   B00100,
  19.   B11111,
  20.   B11111,
  21.   B11111,
  22.   B11111,
  23. };
  24. byte a2[8] = {
  25.   B00111,
  26.   B00111,
  27.   B00111,
  28.   B00111,
  29.   B11111,
  30.   B11111,
  31.   B11111,
  32.   B11111,
  33. };
  34. byte a3[8] = {
  35.   B00000,
  36.   B00000,
  37.   B00000,
  38.   B00000,
  39.   B00111,
  40.   B00111,
  41.   B00111,
  42.   B00111,
  43. };
  44. byte a4[8] = {
  45.   B11100,
  46.   B11100,
  47.   B11100,
  48.   B11100,
  49.   B11111,
  50.   B11111,
  51.   B11111,
  52.   B11111,
  53. };
  54. byte a5[8] = {
  55.   B00000,
  56.   B00000,
  57.   B00000,
  58.   B00000,
  59.   B11100,
  60.   B11100,
  61.   B11100,
  62.   B11100,
  63. };
  64. byte a6[8] = {
  65.   B00100,
  66.   B00100,
  67.   B00100,
  68.   B00100,
  69.   B00100,
  70.   B00100,
  71.   B00100,
  72.   B00100,
  73. };
  74. byte a7[8] = {
  75.   B11111,
  76.   B11111,
  77.   B11111,
  78.   B11111,
  79.   B11111,
  80.   B11111,
  81.   B11111,
  82.   B11111,
  83. };
  84. byte a8[8] = {
  85.   B00000,
  86.   B00000,
  87.   B00000,
  88.   B00000,
  89.   B11111,
  90.   B11111,
  91.   B11111,
  92.   B11111,
  93. };
  94.  
  95. //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
  96. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  97.  
  98. byte towers[4][7] {
  99.   {0,5,4,3,2,1,0},
  100.   {0,5,4,3,2,1,0},
  101.   {0,0,0,0,0,0},
  102.   {0,0,0,0,0,0},
  103. };
  104. byte tower[6] {0,0,0,0,0};
  105. byte Disk,tmp,stepNumber;
  106.  
  107. void setup()
  108. {
  109.   Serial.begin(115200);
  110.   Serial.println("Start");
  111.   pinMode(A_key,INPUT);
  112.   pinMode(B_key,INPUT);
  113.   pinMode(C_key,INPUT);
  114.   digitalWrite(A_key,HIGH);
  115.   digitalWrite(B_key,HIGH);
  116.   digitalWrite(C_key,HIGH);
  117.   lcd.begin(16,4);
  118.   lcd.createChar(1, a1);
  119.   lcd.createChar(2, a2);
  120.   lcd.createChar(3, a3);
  121.   lcd.createChar(4, a4);
  122.   lcd.createChar(5, a5);
  123.   lcd.createChar(6, a6);
  124.   lcd.createChar(7, a7);
  125.   lcd.createChar(8, a8);
  126.  
  127.   welcome();
  128.   lcd.setCursor(0,1);
  129.   lcd.print("  Hanoi Tower  ");
  130.   while (!KeyPress()) { }
  131.   while (KeyPress()) { }
  132.   stepNumber=0;
  133. } // end setup
  134.  
  135. void loop() {
  136.   Draw();
  137. again1:
  138.   tmp=KeyPress();
  139.   if (tmp==0) goto again1;
  140.   upDisk(tmp);
  141.   delay(100);
  142.   Serial.print("Removed disk ");
  143.   Serial.print(Disk);
  144.   Serial.print(" size from ");
  145.   Serial.print(tmp);
  146.   Serial.print(". tower ");
  147.   while (KeyPress()) { }
  148. again2:
  149.   tmp=KeyPress();
  150.   if (tmp==0) goto again2;
  151.   downDisk(tmp);
  152.   if (Disk!=0) goto again2;
  153.   checkWin();
  154.   delay(100);
  155.   Serial.print("and put onto ");
  156.   Serial.print(tmp);
  157.   Serial.print(". tower. Steps: ");
  158.   Serial.println(stepNumber);
  159.   while (KeyPress()) { }
  160. } // loop end
  161.  
  162. void checkWin() {
  163.   byte B=0,C=0;
  164.   for (byte i=5;i>=1;i--) {
  165.     B=B+towers[2][i];
  166.     C=C+towers[3][i];
  167.   } // end for
  168.   if (B==15 or C==15) {
  169.     Serial.println(" ");
  170.     Serial.println("WIN");
  171.     lcd.clear();
  172.     lcd.print("      WIN");
  173.     lcd.setCursor(4,1);
  174.     lcd.print("Steps: ");
  175.     lcd.print(stepNumber);
  176.     while (KeyPress()) { }
  177.     while (!KeyPress()) { }
  178.     asm volatile ( "jmp 0");
  179.   } // end if
  180. } // end checkWin
  181.  
  182. void downDisk(byte TowerNumber) {
  183.   stepNumber++;
  184.   if (towers[TowerNumber][1]==0) {
  185.     towers[TowerNumber][1]=Disk;
  186.     Disk=0;
  187.     return;
  188.   } // end if
  189.   for (byte i=5;i>=1;i--) {
  190.     if (towers[TowerNumber][i]!=0) {
  191.       if (towers[TowerNumber][i]<Disk) {stepNumber--;return;}
  192.       towers[TowerNumber][i+1]=Disk;
  193.       Disk=0;
  194.       Draw();
  195.       return;
  196.     }  //end if
  197.   } // end for
  198. } // end downDisk
  199.  
  200. void upDisk(byte TowerNumber) {
  201.   Disk=0;
  202.   for (byte i=5;i>=1;i--) {
  203.     if (towers[TowerNumber][i]!=0) {
  204.       Disk=towers[TowerNumber][i];
  205.       towers[TowerNumber][i]=0;
  206.       Draw();
  207.       DrawDisk(TowerNumber,Disk);
  208.       return;
  209.     }  // end if
  210.   } // end for
  211. } //end upDisk
  212.  
  213. byte KeyPress() {
  214.   byte KeyPressed;
  215.   KeyPressed=0;
  216.   if (digitalRead(A_key)==0){
  217.     KeyPressed=1;
  218.     tone(tonePin,toneButton,toneDuration);
  219.     delay(150);
  220.     while(!digitalRead(A_key));
  221.   }
  222.   if (digitalRead(B_key)==0){
  223.     KeyPressed=2;
  224.     tone(tonePin,toneButton,toneDuration);
  225.     delay(150);
  226.     while(!digitalRead(B_key));
  227.   }
  228.   if (digitalRead(C_key)==0){
  229.     KeyPressed=3;
  230.     tone(tonePin,toneButton,toneDuration);
  231.     delay(150);
  232.     while(!digitalRead(C_key));
  233.   }
  234.   return KeyPressed;
  235. } // end KeyPress
  236.  
  237. void Draw() {
  238.   lcd.clear();
  239.   for (byte j=1;j<=3;j++) {
  240.     for (byte i=1;i<=3;i++) {
  241.       lcd.setCursor(1+(j-1)*5,4-i);
  242.       DrawTower(j,i);
  243.       for (byte k=1;k<=5;k++) {
  244.         lcd.write(tower[k]);
  245.       } // end for k
  246.     } //end for i
  247.   } //end for j
  248. } // draw end
  249.  
  250. void DrawDisk(byte tow, byte disk) {
  251.   lcd.setCursor(1+(tow-1)*5,0);
  252.   switch (disk) {
  253.     case 5:
  254.       tower[1]=8;
  255.       tower[2]=8;
  256.       tower[3]=8;
  257.       tower[4]=8;
  258.       tower[5]=8;
  259.     break;
  260.     case 4:
  261.       tower[1]=3;
  262.       tower[2]=8;
  263.       tower[3]=8;
  264.       tower[4]=8;
  265.       tower[5]=5;
  266.     break;
  267.     case 3:
  268.       tower[1]=32;
  269.       tower[2]=8;
  270.       tower[3]=8;
  271.       tower[4]=8;
  272.       tower[5]=32;
  273.     break;
  274.     case 2:
  275.       tower[1]=32;
  276.       tower[2]=3;
  277.       tower[3]=8;
  278.       tower[4]=5;
  279.       tower[5]=32;
  280.     break;
  281.     case 1:
  282.       tower[1]=32;
  283.       tower[2]=32;
  284.       tower[3]=8;
  285.       tower[4]=32;
  286.       tower[5]=32;
  287.     break;
  288.   } // end switch
  289.   for (byte k=1;k<=5;k++) {
  290.     lcd.write(tower[k]);
  291.   } // end for k
  292. }  // end DrawDisk
  293.  
  294. void DrawTower(byte tow, byte row) {
  295.   if (towers[tow][row*2-1]==5) {
  296.     switch (towers[tow][row*2]) {
  297.       case 4:
  298.         tower[1]=2;
  299.         tower[2]=7;
  300.         tower[3]=7;
  301.         tower[4]=7;
  302.         tower[5]=4;
  303.       break;
  304.       case 3:
  305.         tower[1]=8;
  306.         tower[2]=7;
  307.         tower[3]=7;
  308.         tower[4]=7;
  309.         tower[5]=8;
  310.       break;
  311.       case 2:
  312.         tower[1]=8;
  313.         tower[2]=2;
  314.         tower[3]=7;
  315.         tower[4]=4;
  316.         tower[5]=8;
  317.       break;
  318.       case 1:
  319.         tower[1]=8;
  320.         tower[2]=8;
  321.         tower[3]=7;
  322.         tower[4]=8;
  323.         tower[5]=8;
  324.       break;
  325.       case 0:
  326.         tower[1]=8;
  327.         tower[2]=8;
  328.         tower[3]=1;
  329.         tower[4]=8;
  330.         tower[5]=8;
  331.       break;      
  332.     } // end switch
  333.   } // end if
  334.   if (towers[tow][row*2-1]==4) {
  335.     switch (towers[tow][row*2]) {
  336.       case 3:
  337.         tower[1]=3;
  338.         tower[2]=7;
  339.         tower[3]=7;
  340.         tower[4]=7;
  341.         tower[5]=5;
  342.       break;
  343.       case 2:
  344.         tower[1]=3;
  345.         tower[2]=2;
  346.         tower[3]=7;
  347.         tower[4]=4;
  348.         tower[5]=5;
  349.       break;
  350.       case 1:
  351.         tower[1]=3;
  352.         tower[2]=8;
  353.         tower[3]=7;
  354.         tower[4]=8;
  355.         tower[5]=5;
  356.       break;
  357.       case 0:
  358.         tower[1]=3;
  359.         tower[2]=8;
  360.         tower[3]=1;
  361.         tower[4]=8;
  362.         tower[5]=5;
  363.       break;      
  364.     } // end switch
  365.   } // end if
  366.   if (towers[tow][row*2-1]==3) {
  367.     switch (towers[tow][row*2]) {
  368.       case 2:
  369.         tower[1]=32;
  370.         tower[2]=2;
  371.         tower[3]=7;
  372.         tower[4]=4;
  373.         tower[5]=32;
  374.       break;
  375.       case 1:
  376.         tower[1]=32;
  377.         tower[2]=8;
  378.         tower[3]=7;
  379.         tower[4]=8;
  380.         tower[5]=32;
  381.       break;
  382.       case 0:
  383.         tower[1]=32;
  384.         tower[2]=8;
  385.         tower[3]=1;
  386.         tower[4]=8;
  387.         tower[5]=32;
  388.       break;      
  389.     } // end switch
  390.   } // end if
  391.   if (towers[tow][row*2-1]==2) {
  392.     switch (towers[tow][row*2]) {
  393.       case 1:
  394.         tower[1]=32;
  395.         tower[2]=3;
  396.         tower[3]=7;
  397.         tower[4]=5;
  398.         tower[5]=32;
  399.       break;
  400.       case 0:
  401.         tower[1]=32;
  402.         tower[2]=3;
  403.         tower[3]=1;
  404.         tower[4]=5;
  405.         tower[5]=32;
  406.       break;      
  407.     } // end switch
  408.   } // end if
  409.   if (towers[tow][row*2-1]==1) {
  410.     tower[1]=32;
  411.     tower[2]=32;
  412.     tower[3]=1;
  413.     tower[4]=32;
  414.     tower[5]=32;
  415.   } // end if
  416.   if (towers[tow][row*2-1]==0) {
  417.     tower[1]=32;
  418.     tower[2]=32;
  419.     tower[3]=6;
  420.     tower[4]=32;
  421.     tower[5]=32;
  422.   } // end if
  423. } // end DrawTower
  424.  
  425. void welcome() {
  426.   int hh=160;
  427.   lcd.setCursor(0,0);
  428.   lcd.print("  *");
  429.   tone(tonePin,659,hh);  
  430.   delay(hh);
  431.   lcd.print("  *");
  432.   tone(tonePin,587,hh);  
  433.   delay(hh);
  434.   lcd.print("  **");
  435.   tone(tonePin,370,hh*2);  
  436.   delay(hh);
  437.   lcd.print("  **");
  438.   tone(tonePin,415,hh*2);
  439.   delay(hh);
  440.    
  441.   lcd.setCursor(0,1);
  442.   lcd.print(" *");
  443.   tone(tonePin,554,hh);  
  444.   delay(hh);
  445.   lcd.print("  *");
  446.   tone(tonePin,494,hh);  
  447.   delay(hh);
  448.   lcd.print("  **");
  449.   tone(tonePin,294,hh*2);  
  450.   delay(hh);
  451.   lcd.print("  **");
  452.   tone(tonePin,330,hh*2);  
  453.   delay(hh);
  454.  
  455.   lcd.setCursor(0,2);
  456.   lcd.print("   *");
  457.   tone(tonePin,494,hh);  
  458.   delay(hh);
  459.   lcd.print("  *");
  460.   tone(tonePin,440,hh);  
  461.   delay(hh);
  462.   lcd.print("  **");
  463.   tone(tonePin,277,hh*2);  
  464.   delay(hh);
  465.   lcd.print("  **");
  466.   tone(tonePin,330,hh*2);  
  467.   delay(hh);
  468.  
  469.   lcd.setCursor(0,3);
  470.   lcd.print("*  **   *  *  **  *");
  471.   tone(tonePin,440,hh*4);  
  472.   lcd.setCursor(0,0);
  473.   lcd.print("  Hanoi Tower  ");
  474.   delay(500);
  475.   lcd.setCursor(0,0);
  476.   lcd.print("               ");
  477.   lcd.setCursor(0,1);
  478.   lcd.print("  Hanoi Tower  ");
  479.   delay(500);
  480.   lcd.setCursor(0,1);
  481.   lcd.print("               ");
  482.   lcd.setCursor(0,2);
  483.   lcd.print("  Hanoi Tower  ");
  484.   delay(500);
  485.   lcd.setCursor(0,2);
  486.   lcd.print("               ");
  487.   lcd.setCursor(0,3);
  488.   lcd.print("  Hanoi Tower  ");
  489.   delay(500);
  490.   lcd.setCursor(0,3);
  491.   lcd.print("                ");
  492.   delay(500);
  493. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement