TürmeVonHanoi.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <string>
  4. #include <windows.h>
  5. using namespace std;
  6. int spielzugpruefung(int staebe[3][4], int usereingaben[]){
  7. int x;
  8. int temp[2];
  9. if (staebe[usereingaben[0]][0] == 0){
  10. x = 0;
  11. }
  12. else if (staebe[usereingaben[1]][0] > 0){ //Der Stab der zweiten Usereingabe hat mindestens einen Ring
  13. for (int y = 0; y < 2; y++){
  14. x = 0;
  15. while (staebe[usereingaben[y]][3 - x] < 1 && x < 3){ //Es wird zweimal von oben gezählt, wie viele ringfreie Stufen bei beiden Stäben der Usereingaben vorhanden sind
  16. x++;
  17. }
  18. temp[y] = x;
  19. }
  20. if (staebe[usereingaben[0]][3 - temp[0]] < staebe[usereingaben[1]][3 - temp[1]]){ //Ist der Ring, der herauf gelegt wird, kleiner als der, der auf dem heraufzulegenden Stab ist
  21. x = 1;
  22. }
  23. else{
  24. x = 0;
  25. }
  26. }
  27. else{ //Ansonsten ist der Tausch direkt möglich
  28. x = 1;
  29. }
  30. return x;
  31. }
  32. void druck(int staebe[3][4])
  33. {
  34. string labels[4] = {" || ", " <==> ", " <====> ", " <======>"};
  35. system("cls");
  36. for (int x = 3; x >= 0; x--){
  37. for (int y = 0; y < 3; y++){
  38. cout << labels[staebe[y][x]];
  39. }
  40. cout << endl;
  41. }
  42. }
  43. int main(){
  44. int spielzuege = 0;
  45. bool run;
  46. int tausch[3];
  47. int usereingaben[2];
  48. int staebe[3][4];
  49. for(int x = 0 ; x < 4; x++){
  50. staebe[0][x] = 3-x;
  51. }
  52. for (int x = 1; x < 3; x++){
  53. for (int y = 0; y < 4; y++){
  54. staebe[x][y] = 0;
  55. }
  56. }
  57. do{
  58. druck(staebe);
  59. for (int x = 0; x < 2; x++){
  60. run = true;
  61. if (x){
  62. cout << "Auf welchen Turm moechten Sie einen Stab legen?";
  63. }
  64. else{
  65. cout << "Von welchem Turm moechten Sie einen Stab entfernen?";
  66. }
  67. do{
  68. cin >> usereingaben[x];
  69. usereingaben[x]--; //Anpassung zum Index
  70. if (usereingaben[x] < 3 && usereingaben[x] >= 0){ //Überprüfung des Zahlenbereichs
  71. run = false;
  72. cout << endl;
  73. }
  74. else{
  75. cout << "ERROR" << endl;
  76. }
  77. } while (run);
  78. }
  79. run = spielzugpruefung(staebe, usereingaben);
  80. if (run){
  81. spielzuege++;
  82. for (int z = 0; z <= 1; z++){
  83. tausch[2] = 1;
  84. while (staebe[usereingaben[z]][3 - tausch[2]] < 1 && tausch[2] < 4){
  85. tausch[2]++;
  86. }
  87. tausch[z] = tausch[2];
  88. }
  89. tausch[2] = staebe[usereingaben[0]][3 - tausch[0]]; //Tauschen der Ringe
  90. staebe[usereingaben[0]][3 - tausch[0]] = 0;
  91. staebe[usereingaben[1]][4 - tausch[1]] = tausch[2];
  92. if (staebe[1][2] == 0 && staebe[2][2] == 0){ //Wenn der 2.te Index im Array der Stäbe 2 u. 3 leer ist, geht es weiter, ansonsten wäre das Rätsel gelöst
  93. run = false;
  94. }
  95. }
  96. else{
  97. cout << "ERROR.." << endl;
  98. Sleep(1400);
  99. }
  100. }while (run == false);
  101. druck(staebe);
  102. cout << "Sie loesten das Raetsel in " << spielzuege << " Spielzuegen!" << endl;
  103. }