Advertisement
c_pinoleo01

Untitled

Sep 22nd, 2019
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.73 KB | None | 0 0
  1. /* Universidad de La Frontera
  2. * Ingeniería Civil Electrónica
  3. *
  4. * ICC-202 PROGRAMACION DE COMPUTADORES
  5. *
  6. * Tarea 1
  7. * Autores: Cristian Pinoleo Jara (c.pinoleo01@ufromail.cl)
  8. * Max Cortés Torres (m.cortes09@gmail.com)
  9. *
  10. * Fecha: 22-09-19
  11. *
  12. * Descripción general del programa: El programa consiste en un tablero de seis filas y siete columnas, donde se deben introducir fichas (indicadas con las
  13. * letras A y R de amarillo y rojo). Gana el primer jugador en conseguir alinear cuatro de sus fichas en una línea, ya sea horizontal, vertical u diagonal.
  14. */
  15.  
  16. #include<stdio.h>
  17. #include<stdlib.h>
  18.  
  19. int main(){
  20.  
  21. int tablero[7][7] = {{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0}};
  22. /* Declaración e inicialización del arreglo tipo matriz "tablero" de seis filas por siete columnas (la declaración de siete filas se hizo para evitar
  23. que las jugadas se sobrescribieran en la primera fila, es decir, que la fila cero actúa como borde del tablero. Durante el transcurso del juego, no se considerará la columna cero. */
  24.  
  25. int ficha;
  26. char scanColumna[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //Declaración de variables ficha y columna que más adelante permitirá cambiar el valor de un elemento específico del tablero para introducir fichas. Luego se declararán variables dependientes de scanColumna para evitar dobles jugadas y filtrar las entradas.
  27. int jugador = 0; //Declaración de la variable jugador, que indica el turno del jugador presente, comienza en "0", que indica el jugador 1 y más adelante cambia a "1" que indica el jugador 2, y alterna entre estos dos números durante el resto del programa.
  28. int ganador = 0; //Delaración de la variable ganador, que indica si existe un ganador en el juego, varía entre "0" , "1" y "2", para cero, no existe ganador, para uno el ganador es el jugador 1, y para dos el gaador es el jugador 2.
  29.  
  30.  
  31. for(int i=0; i < 6; i++){
  32. for(int j=0; j < 7; j++){
  33.  
  34. printf("%i ");
  35.  
  36. }
  37. printf("\n");
  38.  
  39. }
  40. system("CLS"); //Limpia la pantalla de código basura generado al compilar el programa.
  41. printf("Conecta 4\n \n");
  42. printf("Bienvenido a Conecta 4.\nEl primer jugador en conseguir que cuatro de sus fichas formen una linea, gana.\n");
  43. printf("Este es su tablero:\n \n");
  44.  
  45. for(int i=0; i < 6; i++){
  46. for(int j=0; j < 7; j++){
  47.  
  48. printf("<O> ");
  49.  
  50. }
  51. printf("\n");
  52. } /* Código que imprime por pantalla el tablero vacío que será usado en el juego. Consiste en un conjunto de bucles "for", el interior imprime un elemento
  53. por columna espaciado para cada valor de "j" que varía desde cero hasta seis, en el bucle exterior, bajo el bucle interior, hay un salto de espacio para
  54. que el la impresión salte un espacio cada vez que se completa una fila para cada valor de "i". */
  55.  
  56. printf("\nEl jugador 1 tendra las fichas amarillas, el jugador 2 las rojas.\n");
  57.  
  58. while(ganador == 0){ //Inicio de bucle principal del juego, que continúa hasta que el valor de ganador sea distinto a cero.
  59.  
  60. printf("Turno: jugador %i \n", jugador+1);
  61.  
  62. printf("Elija una columna (del 1 al 7): \n");
  63. scanf("%s", &scanColumna); //Petición al usuario( puede ser jugador 1 o jugador 2, según corresponda) que ingrese una columna.
  64.  
  65. int k=0;
  66. while(k == 0){ //En caso de que el usuario ingrese una columna no perteneciente al tablero (ya sea un numero o letra) , el programa pedirá que se ingrese otra.
  67.  
  68. int column = (int)scanColumna[0];
  69.  
  70. if(((column < 56) && (column > 48))){
  71. while(scanColumna[1]!=0){
  72. printf("El dato digitado no es un valor correcto. Ingrese un valor numerico correspondiente a alguna columna.\n");
  73. fflush(stdin);
  74. scanf("%s",&scanColumna);
  75. }
  76. k=1;
  77. break;
  78. }
  79. else{
  80. printf("El dato digitado no es un valor correcto. Ingrese un valor numerico correspondiente a alguna columna.\n");
  81. fflush(stdin);
  82. scanf("%s",&scanColumna);
  83. }
  84. }
  85.  
  86.  
  87.  
  88. int columna = (int)scanColumna[0];
  89. columna -=49 ; // A la variable columna se le resta 48 (para utilizarlo como un número de 0 al 7), y una unidad para facilitar su uso más adelante
  90.  
  91. switch(jugador){
  92. case 0:
  93. ficha = 1;
  94. break;
  95.  
  96. case 1:
  97. ficha = 2;
  98. break;
  99. }
  100.  
  101. int l = 1; // Las funciones que implican la variable L están destinadas a indicar al jugador cuando la columna seleccionada está llena, conservando su turno, inicializada en uno.
  102. for (int i = 1; i <7 ; i++){
  103. if (tablero[i][columna] == 0)
  104. {
  105. tablero[i][columna]= ficha;
  106. l = 0;
  107. break;
  108. }
  109.  
  110. } /* Bucle "for" que permite que las fichas "bajen" al final del tablero cuando existen expacios vacíos, si se cumple la condición, el punto donde evaluó será el punto en el cual se ubicará la ficha.
  111. además, el valor de "l" cambiará a cero y las funciones dependientes de esta variable no se realizarán. Si no se cumple la condición, no se crea una ficha en elpacio específico y el valor
  112. de "l" queda intacto. */
  113.  
  114. if(l == 1){
  115. printf("Columna %i llena \n",columna+1);
  116. } // Impresión por pantalla que avida si una columna está llena. se basa en el valor de "l".
  117.  
  118. switch(jugador){ // Condicional Switch que permite introducir distintos números al tablero, dependiendo de cual es el jugador que las introduce.
  119. case 0:
  120.  
  121. ficha = 1;
  122.  
  123. break;
  124.  
  125. case 1:
  126.  
  127. ficha = 2;
  128.  
  129. break;
  130.  
  131. }
  132.  
  133. for(int i=6; i>=1; i--){
  134. for(int j=0; j<7; j++ ){
  135. if(tablero[i][j] == 1){
  136. printf("<A> ", tablero[i][j]);
  137. }
  138. else if(tablero[i][j] == 2){
  139. printf("<R> ", tablero[i][j]);
  140. }
  141. else{
  142. printf("<O> ", tablero[i][j]);
  143. } /* Conjunto de bucles que imprimen el tablero por pantalla, se basa en el conjunto al inicio del programa, pero el bucle interior, posee un condicional
  144. "if" que pregunta si algún espacio tiene los valores uno o dos, si se cumple cualquiera de estas condiciones, la ficha impresa tendrá la letra "R"
  145. para el color rojo asignado al jugador 1 o la letra "A" para el color amarillo asignado al jugador 2. Si la condiciónes no se cumplen se imprime un
  146. espacio vacío, que indica que no hay ficha en aquel lugar. */
  147.  
  148.  
  149. }
  150. printf("\n");
  151.  
  152. }
  153.  
  154. if(l == 1){
  155.  
  156. switch(jugador){
  157. case 0:
  158. jugador = 0;
  159. break;
  160.  
  161. case 1:
  162. jugador = 1;
  163. break;
  164. }
  165.  
  166. }
  167. else{
  168. switch(jugador){
  169. case 0:
  170. jugador = 1;
  171. break;
  172.  
  173. case 1:
  174. jugador = 0;
  175. break;
  176. }
  177.  
  178.  
  179. } // Condicional que permite alternar los turnos de los jugadores. Toma en cuenta si el turno utilizado por el jugador se "perdió" por una columna llena.
  180.  
  181. int segundobreak=0; //Variable que permite terminar el bucle siguiente después de cumplirse la condición en el bucle anidado inicializada en cero.
  182.  
  183. for(int j=0; j<7; j++){
  184.  
  185.  
  186. for(int i=6; i>0; i--){
  187.  
  188.  
  189. if((tablero[i][j]==tablero[i-1][j]) && (tablero[i-1][j]==tablero[i-2][j]) && (tablero[i-2][j]==tablero[i-3][j]) && (tablero[i][j]!= 0)){
  190. if(tablero[i][j]==1){
  191. ganador = 1;
  192. segundobreak = 1;
  193. break;
  194. }
  195. else{
  196. ganador = 2;
  197. segundobreak = 1;
  198. break;
  199. }
  200.  
  201. }
  202. }
  203.  
  204. if(segundobreak == 1){
  205. break;
  206. }
  207.  
  208. } /* Conjunto de bucles "for" que permiten encontrar un ganador verticalmente. El bucle interior se guía por la variable "i" que indica las filas del elemento
  209. del tablero, y la función de este es evaluar la condición "si existen cuatro elementos iguales, consecutivos y distintos de cero" (de esta manera se
  210. verifica que los elementos deben ser una ficha, ya que cero es el estado vacío), si la condición se cumple entonces se evalúa si el elemento también es uno
  211. si esto se cumple, entonces ganador será igual a uno, si no se cumple, ganador será igual a dos, la variable segundobreak igual a uno (que influye en el bucle exterior)
  212. y un break(que detiene el bucle interior), si no se cumple, el bucle continúa sin ejecutar instrucciones. El bucle exterior se guía por la variable "j" que indica
  213. la columna del elemento del tablero contiene un condicional "if" que pregunta si el valor de la variable "segundobreak" es uno, si la condición se cumple, se detiene
  214. el bucle interior. Si no se cumple, el bucle continúa sin ejecutar instrucciones. */
  215.  
  216. for(int i=1; i<7; i++){
  217.  
  218.  
  219. for(int j=0; j<5; j++){
  220.  
  221.  
  222. if((tablero[i][j]==tablero[i][j+1]) && (tablero[i][j+1]==tablero[i][j+2]) && (tablero[i][j+2]==tablero[i][j+3]) && (tablero[i][j]!= 0)){
  223. if(tablero[i][j]==1){
  224. ganador = 1;
  225. segundobreak = 1;
  226. break;
  227. }
  228. else{
  229. ganador = 2;
  230. segundobreak = 1;
  231. break;
  232. }
  233. }
  234. }
  235.  
  236. if(segundobreak == 1){
  237. break;
  238. }
  239.  
  240. } /* Conjunto de bucles "for", encargados de verificar si existe un ganador horizontalmente. El sistema es muy similar al verificador vertical.
  241. El bucle revisa cada posición en el tablero, y compara las posiciones a la derecha para revisar si son iguales. De ser asi (y no ser ceros,
  242. para eso la ultima condición), se declara ganador al jugador cuyas fichas forman horizontalmente una línea de cuatro. Si no se cumple, no
  243. se ejecuntan las instrucciones del bucle, y se continúa con el programa. */
  244.  
  245. for(int i=1; i<5; i++){
  246.  
  247.  
  248. for(int j=0; j<5; j++){
  249.  
  250.  
  251. if((tablero[i][j]==tablero[i+1][j+1]) && (tablero[i+1][j+1]==tablero[i+2][j+2]) && (tablero[i+2][j+2]==tablero[i+3][j+3]) && (tablero[i][j]!=0)){
  252. if(tablero[i][j]==1){
  253. ganador = 1;
  254. segundobreak = 1;
  255. break;
  256. }
  257. else{
  258. ganador = 2;
  259. segundobreak = 1;
  260. break;
  261. }
  262. }
  263. }
  264.  
  265. if(segundobreak == 1){
  266. break;
  267. }
  268. } /* Conjunto de bucles "for", encargados de verificar si existe un ganador diagonalmente de izquierda a deracha diagonalmente. Las posición de cada ficha es comparado con la que se encuentra una unidad a
  269. la derecha u una unidad hacia abajo, es decir, que que para cualquier posición inicial se evalúa la que se encuentra en "fila inicial mas uno" y "columna inicial mas uno". Si exsten cuatro fichas
  270. iguales consecutivas de forma diagonal distintas de cero (que indica un espacio vacío), entonces se para a la siguiente condición, que pregunra si la ficha original evaluada tiene el valor de uno. En
  271. este caso, se declara un ganador, que será el jugador 1. En el caso contrario, el ganador delarado será el jugador 2. */
  272.  
  273. for(int i=7; i>3; i--){
  274.  
  275.  
  276. for(int j=0; j<5; j++){
  277.  
  278.  
  279. if((tablero[i][j]==tablero[i-1][j+1]) && (tablero[i-1][j+1]==tablero[i-2][j+2]) && (tablero[i-2][j+2]==tablero[i-3][j+3]) && (tablero[i][j]!=0)){
  280. if(tablero[i][j]==1){
  281. ganador = 1;
  282. segundobreak = 1;
  283. break;
  284. }
  285. else{
  286. ganador = 2;
  287. segundobreak = 1;
  288. break;
  289. }
  290. }
  291. }
  292.  
  293. if(segundobreak == 1){
  294. break;
  295. }
  296. } /* Par de bucles "for" que revisan diagonalmente si existe un ganador. El sistema de revisión es similar a los anteriores,
  297. se compara cada ficha con la ficha diagonal superior derecha, luego estas se comparan con su respectiva diagonal superior derecha,
  298. y finalmente se compara esta última con su diagonal superior derecha. Si todas son iguales, y todas son distintas a 0, se declara
  299. un ganador (el jugador cuyas fichas forman la diagonal).*/
  300.  
  301. }
  302. printf("Tenemos un ganador!! El jugador %i es el vencedor.", ganador); // código que imprime la existencia de un ganador y también imprime dicho ganador.
  303.  
  304. return 0;
  305. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement