Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int* criarTorre(int n){ // cria as tres torres em um array de 60 posições
  4. int i, c = 20 - n;
  5. static int torre[60];
  6.  
  7. for (i = 0; i < 60; i++){ // coloca 0s nas 60 posições
  8. torre[i] = 0;
  9. }
  10.  
  11. for (i = 19; i >= c; i--){ // coloca os discos de 1 a n na primeira torre
  12. torre[i] = n;
  13. n--;
  14. }
  15.  
  16. return torre;
  17. }
  18.  
  19. void printTorre(int* t, int n){
  20. int i;
  21. int c = 20 - n;
  22.  
  23. printf("\n\n");
  24. for (i = c; i < 20; i++){
  25. printf("| %d | | %d | | %d |\n", t[i], t[i + 20], t[i + 40]);
  26. }
  27. printf("\n\n");
  28. }
  29.  
  30. int verifResposta(int* t, int n){ // checar se a torre atual é equivalente a torre da resposta
  31. int i;
  32. int c;
  33. int r[20]; // array resposta de 20 elementos
  34. int k = 20 - n; // posição k do array, onde está o valor 1
  35.  
  36. for (i = 0; i < 20; i++){ // enchendo a matriz de zeros
  37. r[i] = 0;
  38. }
  39.  
  40. for (i = 19; i >= k; i--){ // coloca os valores de 1 a n, a partir da posição k
  41. r[i] = n;
  42. n--;
  43. }
  44.  
  45. for (i = 0; i < 20; i++){ // sempre que um elemento do array resposta for igual ao do array da torre 3, um contador é incrementado
  46. if (r[i] == t[i + 40]){
  47. c++;
  48. }
  49. }
  50. if (c == 20){ // se, para as 20 posições do array 3, tivermos 20 elementos iguais ao vetor resposta, então o jogador vence
  51. return 1;
  52. }
  53. else{
  54. return 0; // caso contrário, continua jogando
  55. }
  56. }
  57.  
  58. int verifDisco(int* t, int o, int pec){ // verifica a presença do disco na torre e se ele pode se mexer
  59. int i;
  60. if (o == 1){
  61. for(i = 0; i < 20; i++){
  62. if (t[i] == pec){
  63. if (t[i-1] == 0 || i == 0){ // se a posição anterior aquele disco for 0, ou se o disco está no topo da torre, ele pode se mexer
  64. return 1;
  65. }
  66. else{
  67. return 0;
  68. }
  69. }
  70. }
  71. }
  72. else if (o == 2){
  73. for(i = 20; i < 40; i++){
  74. if (t[i] == pec){
  75. if (t[i-1] == 0 || i == 0){
  76. return 1;
  77. }
  78. else{
  79. return 0;
  80. }
  81. }
  82. }
  83. }
  84. else if (o == 3){
  85. for(i = 40; i < 60; i++){
  86. if (t[i] == pec){
  87. if (t[i-1] == 0 || i == 0){
  88. return 1;
  89. }
  90. else{
  91. return 0;
  92. }
  93. }
  94. }
  95. }
  96. }
  97.  
  98. int verifTorreZerada(int* t, int o, int x){
  99. if (o == 1){
  100. if (t[19] != 0){ // se o último disco for não-nulo, então a torre é não-nula
  101. return 1;
  102. }
  103. else{ // se não, então a torre é nula
  104. return 0;
  105. }
  106. }
  107. else if (o == 2){
  108. if (t[39] != 0){
  109. return 1;
  110. }
  111. else{
  112. return 0;
  113. }
  114. }
  115. else if (o == 3){
  116. if (t[59] != 0){
  117. return 1;
  118. }
  119. else{
  120. return 0;
  121. }
  122. }
  123. }
  124.  
  125. int verifTransf(int*t, int d, int p){
  126. int i;
  127. if (d == 1){
  128. for (i = 19; i >= 0; i--){ // começando de baixo para cima na torre
  129. if (t[i - 1] == 0){ // se a próxima posição estiver vazia e...
  130. if (t[i] > p || t[i] == 0){ // ... se o disco do topo for maior que o disco atual...
  131. return 1; // ... é possível transferir
  132. }
  133. else{
  134. return 0;
  135. }
  136. }
  137. }
  138. }
  139. else if (d == 2){
  140. for (i = 39; i >= 20; i--){
  141. if (t[i - 1] == 0){
  142. if (t[i] > p || t[i] == 0){
  143. return 1;
  144. }
  145. else{
  146. return 0;
  147. }
  148. }
  149. }
  150. }
  151. else if (d == 3){
  152. for (i = 59; i >= 40; i--){
  153. if (t[i - 1] == 0){
  154. if (t[i] > p || t[i] == 0){
  155. return 1;
  156. }
  157. else{
  158. return 0;
  159. }
  160. }
  161. }
  162. }
  163. }
  164.  
  165. int moverDiscos(int *t, int d, int p, int o){
  166. int i;
  167. if (d == 1){
  168. for (i = 19; i >= 0; i--){ // começando de baixo para cima na torre
  169. if (t[i] == 0){ // se a posição tiver vazia, o disco é transferido e o loop é interrompido
  170. t[i] = p;
  171. break;
  172. }
  173. }
  174. }
  175. else if (d == 2){
  176. for (i = 39; i >= 20; i--){
  177. if (t[i] == 0){
  178. t[i] = p;
  179. break;
  180. }
  181. }
  182. }
  183. else if (d == 3){
  184. for (i = 59; i >= 40; i--){
  185. if (t[i] == 0){
  186. t[i] = p;
  187. break;
  188. }
  189. }
  190. }
  191.  
  192. if (o == 1){
  193. for (i = 0; i < 20; i++){ // para eliminar o disco da torre de origem, basta zerar
  194. if (t[i] == p){
  195. t[i] = 0;
  196. }
  197. }
  198. }
  199. else if (o == 2){
  200. for (i = 20; i < 40; i++){
  201. if (t[i] == p){
  202. t[i] = 0;
  203. }
  204. }
  205. }
  206. else if (o == 3){
  207. for (i = 40; i < 60; i++){
  208. if (t[i] == p){
  209. t[i] = 0;
  210. }
  211. }
  212. }
  213. return t;
  214. }
  215.  
  216. int main()
  217. {
  218. int x; // variável que guarda a quantidade de discos
  219. int ori, des, pec; // variáveis de torres, ori: torre de origem; des: torre de destino; pec: peça a mexer
  220. int vd, vtz; // variáveis verificadoras, vd: verifica disco na torre; vtz: verifica torres zeradas
  221. int vt, vr = 0; // variáveis verificadoras, vt: verifica possib. de transferencia; vr: verifica resposta
  222. int counter = 0; // contador de rodadas
  223.  
  224. int menu;
  225.  
  226. printf("------------------------------\n");
  227. printf("--------TORRES DE HANOI-------\n");
  228. printf("------------------------------\n\n");
  229.  
  230.  
  231. printf("Digite a quantidade de discos: ");
  232. scanf("%d", &x);
  233. while(x <= 0 || x > 20){
  234. printf("ALERTA: Limite de discos = 20\n\n");
  235. printf("Digite a quantidade de discos: ");
  236. scanf("%d", &x);
  237. }
  238.  
  239. int* torre = criarTorre(x); // ponteiro que guarda o array da torre
  240.  
  241. printTorre(torre, x);
  242.  
  243. while(vr == 0){ // enquanto a verificadora de resposta retornar 0, o jogador continua jogando
  244. counter++; // contador de rodadas
  245. printf("-----------------------------\n\n");
  246. printf("Rodada %d\n\n", counter);
  247.  
  248. printf("Qual a torre de origem? "); // usuário informa a torre de origem
  249. scanf("%d", &ori);
  250. vtz = verifTorreZerada(torre, ori, x); // verificar se a torre possui discos
  251. while(ori < 1 || ori > 3 || vtz == 0){
  252. printf("ALERTA: Escolha uma torre nao-nula: {1, 2, 3}\n");
  253. printf("Qual a torre de origem? ");
  254. scanf("%d", &ori);
  255. vtz = verifTorreZerada(torre, ori, x);
  256. }
  257.  
  258. printf("Qual o disco a mover? "); // escolher o disco a mover
  259. scanf("%d", &pec);
  260. vd = verifDisco(torre, ori, pec); // verificar se o disco está na torre e no topo
  261. while(pec < 1 || pec > x || vd == 0){
  262. printf("ALERTA: Disco invalido\n");
  263. printf("Qual o disco a mover? ");
  264. scanf("%d", &pec);
  265. vd = verifDisco(torre, ori, pec);
  266. }
  267.  
  268. printf("Qual a torre de destino? "); // usuário informa a torre de destino
  269. scanf("%d", &des);
  270. vt = verifTransf(torre, des, pec); // verificar se o disco do topo da torre de destino é maior que o disco que se deseja transferir
  271. while(vt == 0){
  272. printf("Impossivel colocar disco maior acima de menor\n");
  273. printf("Qual a torre de destino? ");
  274. scanf("%d", &des);
  275. vt = verifTransf(torre, des, pec);
  276. }
  277.  
  278. torre = moverDiscos(torre, des, pec, ori); // mover disco entre as torres de origem e destino
  279.  
  280. printTorre(torre, x);
  281. vr = verifResposta(torre, x); // verificar a resposta
  282. }
  283.  
  284. printf("------------------------------\n");
  285. printf("------------PARABENS----------\n");
  286. printf("------------------------------\n\n");
  287. printf("Torres de hanoi com %d discos, completados em %d rodadas.\n", x, counter);
  288.  
  289. return 0;
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement