Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: huchoko en 6 Noviembre 2018, 23:06 pm



Título: Error extraño en programa de C
Publicado por: huchoko en 6 Noviembre 2018, 23:06 pm
Tengo un juego, escrito en C, el cúal se trata del tres en raya.
Tu compites contra la computadora (el juego tiene una seudo IA)
Todo funciona bien, pero si el jugador o la seudo IA pone una ficha en el casillero 5, (el de almedio), se vuelve invisible y se bugea el juego.
Espero que logren leer mi código espagueti.  :)
Saludos.
Código
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. void mainloop(char c[3][3]);
  5. void inum(char c[3][3]);
  6. void tablero(char c[3][3]);
  7. void inusr(char c[3][3]);
  8. void seudoai(char c[3][3]);
  9. int win(char c[3][3]);
  10.  
  11. int main()
  12. {
  13. char c[3][3];
  14. mainloop(c);
  15.  
  16. system("pause");
  17. return 0;
  18. }
  19.  
  20. void mainloop(char c[3][3])
  21. {
  22. int j;
  23. int i = 0;
  24. inum(c);
  25. tablero(c);
  26.  
  27. do
  28. {
  29. system("cls");
  30. tablero(c);
  31. if(i % 2 == 0)
  32. {
  33. inusr(c);
  34. }
  35. else
  36. {
  37. seudoai(c);
  38. }
  39. j = win(c);
  40. ++i;
  41. }while(i <= 9 && j == 2);
  42.  
  43.  
  44. if(j == 0)
  45. {
  46. printf("Ganaste!\n\n");
  47. }
  48. else if(j == 1)
  49. {
  50. printf("Perdiste!\n\n");
  51. }
  52. else
  53. {
  54. printf("Empate!\n\n");
  55. }
  56.  
  57. }
  58.  
  59. void inum(char c[3][3])
  60. {
  61. int i, j;
  62. char aux = '0';
  63.  
  64. for(i = 0; i < 3; ++i)
  65. {
  66. for(j = 0; j < 3; ++j)
  67. {
  68. c[i][j] = ++aux;
  69. }
  70. }
  71. }
  72.  
  73. void inusr(char c[3][3])
  74. {
  75. char aux;
  76. int i, j, k;
  77.  
  78. do
  79. {
  80. do
  81. {
  82. printf("Introduce ficha: ");
  83. fflush(stdin);
  84. scanf("%c", &aux);
  85. }while(aux < '1' || aux > '9');
  86.  
  87. k = 0;
  88.  
  89. switch(aux)
  90. {
  91. case '1':{
  92. i = 0;
  93. j = 0;
  94. if (c[i][j] == 'X' || c[i][j] == 'O')
  95. {
  96. k = 1;
  97. printf("Casilla ocupada!\n\n");
  98. }
  99. break;
  100. }
  101. case '2':{
  102. i = 0;
  103. j = 1;
  104. if (c[i][j] == 'X' || c[i][j] == 'O')
  105. {
  106. k = 1;
  107. printf("Casilla ocupada!\n\n");
  108. }
  109. break;
  110. }
  111. case '3':{
  112. i = 0;
  113. j = 2;
  114. if (c[i][j] == 'X' || c[i][j] == 'O')
  115. {
  116. k = 1;
  117. printf("Casilla ocupada!\n\n");
  118. }
  119. break;
  120. }
  121. case '4':{
  122. i = 1;
  123. j = 0;
  124. if (c[i][j] == 'X' || c[i][j] == 'O')
  125. {
  126. k = 1;
  127. printf("Casilla ocupada!\n\n");
  128. }
  129. break;
  130. }
  131. case '5':{
  132. i = 1;
  133. j = 1;
  134. if (c[i][j] == 'X' || c[i][j] == 'O')
  135. {
  136. k = 1;
  137. printf("Casilla ocupada!\n\n");
  138. }
  139. break;
  140. }
  141. case '6':{
  142. i = 1;
  143. j = 2;
  144. if (c[i][j] == 'X' || c[i][j] == 'O')
  145. {
  146. k = 1;
  147. printf("Casilla ocupada!\n\n");
  148. }
  149. break;
  150. }
  151. case '7':{
  152. i = 2;
  153. j = 0;
  154. if (c[i][j] == 'X' || c[i][j] == 'O')
  155. {
  156. k = 1;
  157. printf("Casilla ocupada!\n\n");
  158. }
  159. break;
  160. }
  161. case '8':{
  162. i = 2;
  163. j = 1;
  164. if (c[i][j] == 'X' || c[i][j] == 'O')
  165. {
  166. k = 1;
  167. printf("Casilla ocupada!\n\n");
  168. }
  169. break;
  170. }
  171. case '9':{
  172. i = 2;
  173. j = 2;
  174. if (c[i][j] == 'X' || c[i][j] == 'O')
  175. {
  176. k = 1;
  177. printf("Casilla ocupada!\n\n");
  178. }
  179. break;
  180. }
  181. }
  182. }while(k == 1);
  183.  
  184. c[i][j] = 'X';
  185. }
  186.  
  187. void seudoai(char c[3][3])
  188. {
  189. int i, j, k;
  190. //char aux;
  191. srand(time(NULL));
  192.  
  193. do
  194. {
  195. i = rand() % 3; // n rand entre 0 y 2
  196. j = rand() % 3;
  197. k = 0;
  198.  
  199. if(c[i][j] == 'X' || c[i][j] == 'O')
  200. {
  201. k = 1;
  202. }
  203. }while(k == 1);
  204. c[i][j] = 'O';
  205. }
  206.  
  207. void tablero(char c[3][3])
  208. {
  209. int i, j;
  210.  
  211. for(i = 0; i < 3; ++i)
  212. {
  213. for(j = 0; j < 3; ++j) //replace ++j with ++i, and have fun!
  214. {
  215. if(j < 2)
  216. {
  217. printf(" %c |", c[i][j]);
  218. }
  219. else
  220. {
  221. printf(" %c ", c[i][j]);
  222. }
  223. }
  224. if(i < 2)
  225. {
  226. printf("\n-----------\n");
  227. }
  228. }
  229. printf("\n\n");
  230. }
  231.  
  232. int win(char c[3][3])
  233. {
  234. if(c[0][0] == 'X' || c[0][0] == 'O')
  235. {
  236. if(c[0][0] == c[0][1] && c[0][0] == c[0][2])
  237. {
  238. if(c[0][0] == 'X')
  239. {
  240. return 0;
  241. }
  242. else
  243. {
  244. return 1;
  245. }
  246. }
  247. else if(c[0][0] == c[1][0] && c[0][0] == c[2][0])
  248. {
  249. if(c[0][0] == 'X')
  250. {
  251. return 0;
  252. }
  253. else
  254. {
  255. return 1;
  256. }
  257. }
  258. }
  259. if(c[1][1] == 'X' || c[1][1] == 'O')
  260. {
  261. if(c[1][1] = c[0][0] && c[1][1] == c[2][2])
  262. {
  263. if(c[1][1] == 'X')
  264. {
  265. return 0;
  266. }
  267. else
  268. {
  269. return 1;
  270. }
  271. }
  272. if(c[1][1] == c[1][0] && c[1][1] == c[1][2])
  273. {
  274. if(c[1][1] == 'X')
  275. {
  276. return 0;
  277. }
  278. else
  279. {
  280. return 1;
  281. }
  282. }
  283. if(c[1][1] == c[2][0] && c[1][1] == c[0][2])
  284. {
  285. if(c[1][1] == 'X')
  286. {
  287. return 0;
  288. }
  289. else
  290. {
  291. return 1;
  292. }
  293. }
  294. if(c[1][1] == c[0][1] && c[1][1] == c[2][1])
  295. {
  296. if(c[1][1] == 'X')
  297. {
  298. return 0;
  299. }
  300. else
  301. {
  302. return 1;
  303. }
  304. }
  305. }
  306. if(c[2][2] == 'X' || c[2][2] == 'O')
  307. {
  308. if(c[2][2] == c[2][0] && c[2][1] == c[2][1])
  309. {
  310. if(c[2][2] == 'X')
  311. {
  312. return 0;
  313. }
  314. else
  315. {
  316. return 1;
  317. }
  318. }
  319. if(c[2][2] == c[0][2] && c[2][2] == c[1][2])
  320. {
  321. if(c[2][2] == 'X')
  322. {
  323. return 0;
  324. }
  325. else
  326. {
  327. return 1;
  328. }
  329. }
  330. }
  331. return 2;
  332. }
  333.  


Título: Re: Error extraño en programa de C
Publicado por: AlbertoBSD en 6 Noviembre 2018, 23:56 pm
Buen programa. Encontre el error, pero antes algunas observaciones, todo para bien y para mejorar :D

Agregar Biblioteca de Funcion stdlib para la funcion rand.

Código:
#include<stdlib.h> //para Rand

Aunque no se trate de un  programa que deba de ser ultra eficiente

Te porias ahorrar una comparación en el case del usuario mediante la modificaciones al if



Por ejemplo esta sección de codigo
Código:
			case '1':
i = 0;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}

Podria pasar a ser

Código:
			case '1':
i = 0;
j = 0;
if (c[i][j] != '1')
{
k = 1;
printf("Casilla ocupada!\n\n");
}

Ahorrandote un OR

La funcion tablero en la linea 25 Esta de mas, ya que inmediatamente despues utilizas un cls, aun realmente deberias de evitar las funciones system, en este caso didactico esta justificado, aun asi, el codigo no es compatible en sistemas Linux.

Una cosa mas, las sentencias case: no necesita de llavez {}, no se de donde sacaste eso.


Y el error que indicas  esta en la linea

261

Código:
		if(c[1][1] = c[0][0] && c[1][1] == c[2][2])


Tienes un solo igual, con lo cual estas igualando al valor de la Operacion

Código:
 c[0][0] &&  c[1][1] == c[2][2]

Saludos


Título: Re: Error extraño en programa de C
Publicado por: huchoko en 7 Noviembre 2018, 00:09 am
Gracias! Me funciono, tomaré las consideraciones que me diste.
Saludos