Descarga la aplicación para disfrutar aún más
Esta es una vista previa del archivo. Inicie sesión para ver el archivo original
Códigos/Arbol navidad.csusing System; namespace arbolNavidad { class MainClass { // solicita altura del arbol, que debe estar en el intervalo [min,max] public static int pideAltura (int min, int max){ int alt; Console.Write ("Altura del arbol: "); alt = int.Parse (Console.ReadLine ()); while (alt<min || alt>max) { Console.Write ("Altura inválida. Debe estar entre {0} y {1}\n", min, max); Console.Write ("Altura del arbol: "); alt = int.Parse (Console.ReadLine ()); } return alt; } // escribe n veces el texto s public static void repiteTexto (int n, string s){ int i; for (i=0; i<n; i++) Console.Write (s); } // numero de blancos en un nivel para un arbol de altura alt public static int numBlancos (int alt, int nivel){ return nivel -alt; } // numero de asteriscos en un nivel para un arbol de altura alt public static int numAsteriscos (int alt, int nivel){ return nivel*2-1; } // dibuja el nivel "nivel" de un arbol de altura alt public static void dibujaNivel(int alt, int nivel){ // dibujamos blancos repiteTexto (numBlancos (alt, nivel), "·"); // dibujamos asteriscos repiteTexto (numAsteriscos (alt, nivel), "*"); // salto de linea Console.WriteLine (); } // metodo ppal public static void Main () { int alt, nivel; alt = pideAltura (0, 30); nivel = 1; while (nivel <= alt) { dibujaNivel (alt, nivel); nivel++; } } } } Códigos/bisiesto.csusing System; namespace bisiesto { class MainClass { public static void Main (string[] args) { int anio; bool bis; Console.Write ("Dame un año: "); anio = int.Parse(Console.ReadLine ()); bis = (anio % 4 == 0) && ((anio % 100 != 0) || (anio % 400 == 0)); Console.WriteLine ("Bisiesto: " + bis); } } } Códigos/claseListaEnlazada.cs class MainClass { //static void verLista(Lista l){ public static void Main (string[] args) { Lista l = new Lista (); for (int i = 0; i < 5; i++) { l.insertaIni (i); l.insertaFin (i + 7); } //verLista (l); } } class Lista{ class Nodo{ public int dato; public Nodo sig; // enlace al siguiente nodo // constructora public Nodo(int e){ dato = e;} } // atributos de la lista enlazada: referencia al primero y al último Nodo pri, ult; // constructora de listas public Lista(){ pri = ult = null; } // obtener primer elto de la lista public void primero(out int e){ if (pri==null) throw new Exception("primero en lista vacia"); e = pri.dato; } // obtener ultimo elto de la lista public void ultimo(out int e){ if (ult==null) throw new Exception("ultimo en lista vacia"); e = ult.dato; } // ver si un elto esta en la lista public bool esta(int e){ Nodo aux= pri; // busqueda: avanzazmos con aux mientras no llegemoa al final y no encontremos elto while (aux!=null && aux.dato!=e) aux=aux.sig; // si no hemos llegado el final, es pq el elto está en la lista return (aux!=null); } // insertar elto al ppio de la lista public void insertaIni(int x){ // si la lista es vacia creamos nodo y apuntamos a el pri y ult if (pri == null) { pri = new Nodo (x); pri.sig = null; ult = pri; } else { // si no es vacia creamos nodo y lo enganchamos al ppio Nodo aux = new Nodo(x); aux.sig = pri; pri = aux; } } // insertar elto al final de la lista public void insertaFin(int x){ // si es vacia creamos nodo y apuntamos a el ppi y ult if (pri == null) { pri = new Nodo (x); pri.sig = null; ult = pri; } else { // si no, creamos nodo apuntado por ult.sig y enlazamos ult.sig = new Nodo (x); ult = ult.sig; ult.sig = null; } } // elimina elto dado de la lista, si esta public void eliminaElto(int x){ // lista vacia if (pri==null) throw new Exception("Elimina elto en lista vacia"); else { // eliminar el primero if (x == pri.dato) { // si solo tienen un elto if (pri == ult) pri = ult = null; // si tiene más de uno else pri = pri.sig; } // eliminar otro distino al primero else { // busqueda Nodo aux = pri; // recorremos lista buscando el ANTERIOR al que hay que eliminar (para poder luego enlazar) while (aux.sig != null && x!=aux.sig.dato) aux = aux.sig; // si lo encontramos if (aux.sig != null) { // si es el ultimo cambiamos referencia al ultimo if (aux.sig == ult) ult = aux; // puenteamos aux.sig = aux.sig.sig; } } } } public void eliminaIni(){ if (pri == null) throw new Exception ("EliminaIni en lista vacia"); else if (pri == ult) pri = ult = null; else pri = pri.sig; } } Códigos/Criba Erastótenes.csusing System; namespace cribaEratostenes { class MainClass { public static void Main () { int n = pideDato ("Límite: ", 2, 99999); int[] v = inicia(n); primos(v); escribePrimos(v); } // devuelve el vector |2|3|4|...|n| static int [] inicia(int n){ int[] v = new int[n-1]; for (int i=0;i<n-1;i++) v[i]=i+2; return v; } static void filtra(int [] v, int pri){ for (int i = pri+1; i < v.Length; i++) if (v [i] % v [pri] == 0) v [i] = 0; } static int sigPrim(int [] v, int from){ while (from < v.Length && v [from] == 0) from++; return from; } static void primos(int [] v){ int from = 0; while (from<v.Length){ filtra (v, from); from = sigPrim (v, from + 1); } } static void escribePrimos(int [] v){ for (int i = 0; i < v.Length; i++) if (v[i]!=0) Console.Write (v [i] + " "); } static int pideDato(string texto, int min, int max){ int dato = min - 1; // valor "por defecto" no válido // para forzar entrada en bucle while (dato < min || dato > max) { // mientras no valido Console.Write ("{0} [{1},{2}]: ", texto, min, max); dato = int.Parse (Console.ReadLine ()); } // fin while return dato; } } } Códigos/Ejemplos de recursión.csusing System; namespace recursion { class MainClass { public static void Main (string[] args) { /* for (int i=1; i<10; i++) Console.WriteLine ("fib " + i + "= " + fib2(i)); */ // Console.WriteLine (mcd(12,30)); //hanoi(3,'a','b','c'); TimeSpan start, stop; long n = 15; start = new TimeSpan(DateTime.Now.Ticks); Console.WriteLine ("fact " + n + "= " + fact(n)); stop = new TimeSpan(DateTime.Now.Ticks); Console.WriteLine("Tiempo: " + stop.Subtract(start).TotalMilliseconds); start = new TimeSpan(DateTime.Now.Ticks); Console.WriteLine ("factFin " + n + "= " + factRecFinal(n)); stop = new TimeSpan(DateTime.Now.Ticks); Console.WriteLine("Tiempo: " + stop.Subtract(start).TotalMilliseconds); } // factorial recursivo: versión elemental (no rec final) static long fact(long n){ if (n == 0) return 1; else return n * fact (n - 1); } // generalización con acumulador de resultado para conseguir rec final static long factRecFinal(long n, long ac){ if (n == 0) return ac; else return factRecFinal (n - 1, ac * n); } // factorial recursivo final static long factRecFinal(long n){ return factRecFinal(n,1); } static int mcd(int a, int b){ if (b == 0) return a; else return mcd (b, a % b); } // fib recursivo version elemental static int fib(int n){ if (n == 1 || n == 2) return 1; else return fib (n - 1) + fib (n - 2); } // fib rec final: generalizacion static int fibFin(int a, int b, int n){ if (n==0) return b; else return fibFin(b,a+b,n-1); } // fib con algoritmo mejorado y además rec final static int fibFin(int n){ if (n==1 || n==2) return 1; else return fibFin(1,1,n-2); } // torres de hanoi static void hanoi(int n, char ori, char aux, char des){ if (n > 0) { hanoi (n - 1, ori, des, aux); Console.WriteLine (ori + " -> " + des); hanoi (n - 1, aux, ori, des); } } // generalización del método de busqueda binaria static bool busqBin(int e, int [] v, int ini, int fin){ // caso base 1: los índices de cruzan -> el elto no está if (ini > fin) return false; else { // posición media int m = (ini + fin) / 2; // caso base 2: se encuentra el elto if (v [m] == e) return true; // búsqueda en la mitad correspondiente else if (e < v [m]) return busqBin (e, v, ini, m - 1); else return busqBin (e, v, m + 1, fin); } } // busqueda binaria de un elto e en un vector ordenado v static bool busqBin(int e, int [] v){ return busqBin (e, v, 0, v.Length); } // potencia x^y static int potencia(int x, int y){ if (y == 0) return 1; else return x * potencia (x, y - 1); } // recursion mutua static bool par(int n){ if (n == 0) return true; else return impar (n - 1); } static bool impar(int n){ if (n == 0) return false; else return par (n - 1); } } } Códigos/Examen febrero.csusing System; namespace masterMind { class MainClass { const int N = 4; public static Random rnd = new Random(); public static void Main (string[] args) { int[] combJug = new int [N]; //int[] combSecr = {3,6,1,6}; //int[]combSecr = {2,6,4,5}; //int[] combSecr = {1,6,4,0}; int[] combSecr = new int [N]; generaComb (combSecr); // Depuracion: para ver la comb secreta /* for (int i = 0; i < combSecr.Length; i++) Console.Write (combSecr [i]); Console.WriteLine(); */ int intento = 0, muertos = 0, heridos; while (muertos < N) { leeCombinacion (combJug); evalua (combSecr, combJug, out muertos, out heridos); Console.Write ("Muertos: {0} Heridos: {1}\n\n", muertos, heridos); intento++; } Console.WriteLine ("Has necesitado {0} intentos", intento); } public static void generaComb(int [] comb){ int [] v = {5,3,1,9,6,0,2,8,4,7}; int i = rnd.Next (0, 10-N+1); // valor aleatorio en [0,10-N] for (int j = 0; j < 4; j++) comb [j] = v [i + j]; } public static bool muerto(int [] combSecr, int [] combJug, int pos){ return combSecr [pos] == combJug [pos]; } public static bool herido(int [] combSecr, int [] combJug, int pos){ bool her; // si es muerto fin, no esta herido if (muerto (combSecr, combJug, pos)) her= false; else { // si no, búsqueda de en el vector (no es necesario exlcuir la propia posicion pos) int i = 0; while (i < N && combJug [pos] != combSecr [i]) i++; her = i<N; } return her; } public static void evalua(int [] combSecr, int [] combJug, out int m, out int h){ m = h = 0; for (int i=0; i<N; i++){ if (muerto(combSecr, combJug, i)) m++; else if (herido(combSecr, combJug, i)) h++; } } public static void leeCombinacion(int [] combJug){ Console.Write ("Tu combinacion ({0} digitos): ", N); int c = int.Parse (Console.ReadLine ()); for (int i = N - 1; i>=0; i--){ combJug [i] = c % 10; c = c / 10; } } /* public static int dameDig(bool [] usados){ int i; do { i = rnd.Next (0, 10); } while(usados [i]); usados [i] = true; return i; } public static void generaComb(int [] comb){ bool[] usados = new bool[10]; for (int i = 0; i < N; i++) usados [i] = false; for (int i = 0; i < N; i++) { comb [i] = dameDig (usados); } } */ public static void generaCombinacion2(int [] comb){ Random rnd = new Random(); // vector de dígitos 0..9 int[] v = new int[10]; // rellenamos con 0..9 for (int i = 0; i < 10; i++) v [i] = i; // permutamos: intercambiamos cada posicion i=0..9 con otra aleatoria en 0..9 for (int i = 0; i < 10; i++) { int j = rnd.Next (0, 10); int tmp = v [i]; v [i] = v [j]; v [j] = tmp; } // nos quedamos con los N primeros for (int i=0; i<N; i++) comb[i]=v[i]; } } } Códigos/monedas.csusing System; namespace monedas { class MainClass { public static void Main (string[] args) { int b500, b200, b100, b50, b20, b10, b5, m2, m1, m50c, m20c, m10c, m5c, m2c, m1c, centimos; Console.Write ("Cuánto dinero quieres? (\"euros,centimos\"): "); // convertimos la cantidad a céntimos para trabajar con enteros // y aritmética modular // Para convertir a entero utilizamos Round y un casting (int) Math.Round() // para evitar errores de redondeo centimos = (int) Math.Round(100 * double.Parse (Console.ReadLine ())); b500 = centimos/50000; centimos = centimos % 50000; b200 = centimos/20000; centimos = centimos % 20000; b100 = centimos/10000; centimos = centimos % 10000; b50 = centimos/5000; centimos = centimos % 5000; b20 = centimos/2000; centimos = centimos % 2000; b10 = centimos/1000; centimos = centimos % 1000; b5 = centimos/500; centimos = centimos % 500; m2 = centimos/200; centimos = centimos % 200; m1 = centimos/100; centimos = centimos % 100; m50c = centimos/50; centimos = centimos % 50; m20c = centimos/20; centimos = centimos % 20; m10c = centimos/10; centimos = centimos % 10; m5c = centimos/5; centimos = centimos % 5; m2c = centimos/2; centimos = centimos % 2; m1c = centimos; Console.WriteLine ("Tu cambio: \n" + "Billetes de 500: " + b500 + "\n" + "Billetes de 200: " + b200 + "\n" + "Billetes de 100: " + b100 + "\n" + "Billetes de 50: " + b50 + "\n" + "Billetes de 20: " + b20 + "\n" + "Billetes de 10: " + b10 + "\n" + "Billetes de 5: " + b5 + "\n" + "Monedas de 2: " + m2 + "\n" + "Monedas de 1: " + m1 + "\n" + "Monedas de 50c: " + m50c + "\n" + "Monedas de 20c: " + m20c + "\n" + "Monedas de 10c: " + m10c + "\n" + "Monedas de 5c: " + m5c + "\n" + "Monedas de 2c: " + m2c + "\n" + "Monedas de 1c: " + m1c + "\n"); } } } Códigos/NkListaEnlazadaSnake.cs class ListaEnlazada{ class Nodo{ public int x,y; public Nodo sig; // enlace al siguiente nodo // constructor public Nodo(int i, int j){ x = i; y = j; } } // atributos de la lista enlazada: referencia al primero y al último Nodo pri, ult, act; // constructora de listas public ListaEnlazada(){ pri = ult = act = null; } // obtener primer elto de la lista public void primero(out int i, out int j){ if (pri==null) throw new Exception("Error primero: lista vacia"); i = pri.x; j=pri.y; } // obtener ultimo elto de la lista public void ultimo(out int i, out int j){ if (ult==null) throw new Exception("Error ultimo: lista vacia"); i = ult.x; j=ult.y; } // ver si un elto esta en la lista public bool esta(int i, int j){ // iniciamos con aux al ppio Nodo aux = pri; // busqueda: avanzazmos con aux mientras no llegemoa al final y no encontremos elto while (aux!=null && (aux.x!=i || aux.y!=j)) aux=aux.sig; // si no hemos llegado el final, es pq el elto está en la lista return (aux!=null); } // insertar elto al ppio de la lista public void insertaIni(int x, int y){ // si la lista es vacia creamos nodo y apuntamos a el pri y ult if (pri == null) { pri = new Nodo (x,y); pri.sig = null; ult = pri; } else { // si no es vacia creamos nodo y lo enganchamos al ppio Nodo aux = new Nodo(x,y); aux.sig = pri; pri = aux; } } // insertar elto al final de la lista public void insertaFin(int x, int y){ // si es vacia creamos nodo y apuntamos a el ppi y ult if (pri == null) { pri = new Nodo (x,y); pri.sig = null; ult = pri; } else { // si no, creamos nodo apuntado por ult.sig y enlazamos ult.sig = new Nodo (x, y); ult = ult.sig; ult.sig = null; } } // elimina elto dado de la lista, si esta public void eliminaElto(int x, int y){ // lista vacia if (pri==null) throw new Exception("Error eliminaElto: lista vacia"); else { // eliminar el primero if (x == pri.x && y == pri.y) { // si solo tiene un elto if (pri == ult) pri = ult = null; // si tiene más de uno else pri = pri.sig; } // eliminar otro distinto al primero else { // busqueda. aux al ppio Nodo aux = pri; // recorremos lista buscando el ANTERIOR al que hay que eliminar (para poder luego enlazar) while (aux.sig != null && (x!=aux.sig.x || y!=aux.sig.y)) aux = aux.sig; // si lo encontramos if (aux.sig != null) { // si es el ultimo cambiamos referencia al ultimo if (aux.sig == ult) ult = aux; // puenteamos aux.sig = aux.sig.sig; } } } } // elimina primer elto de la lista public void eliminaIni(){ if (pri==null) throw new Exception("Error eliminaIni: lista vacia"); if (pri == ult) pri = ult = null; else pri=pri.sig; } // inicizlización del iterador. Lo colocamos al ppio public void iniciaRecorrido(){ act = pri; } public bool dame_actual_y_avanza(out int x, out int y){ x = y = 0; // si estamos al final, ya no hay actual y devolvemos false if (act == null) return false; else { // si no, info del nodo, avanzamos act y devolvemos true x = act.x; y = act.y; act = act.sig; return true; } } /* auxiliar solo para depuración public void verLista(){ Console.Write ("Lista: "); Nodo aux = pri; while (aux != null) { Console.Write ("(" + aux.x + "," + aux.y + ") "); aux = aux.sig; } Console.Write ("\n\n"); } */ } Códigos/NkSnake.csusing System; namespace Practica4 { enum Dir { Norte, Sur, Este, Oeste, Null }; class MainClass { public static void Main(string[] args) { int alto = 5; int ancho = 4; int cont = 0; Estado estado = new Estado(ancho, alto); bool partida = true; estado.dibuja(); while (partida) { if (cont == 25) { estado.ponFruta(); cont = 0; } Dir d = leeEntrada(); estado.cambiaDir(d); partida = estado.avanza(); estado.dibuja(); cont++; System.Threading.Thread.Sleep(500); } if (!partida) { throw new Exception ("Te has chocado"); //Console.WriteLine(Exception); } Console.ReadLine(); } static Dir leeEntrada() { Dir d = Dir.Null; if (Console.KeyAvailable) { string tecla = Console.ReadKey().Key.ToString(); switch (tecla) { case "LeftArrow": d = Dir.Oeste; break; case "UpArrow": d = Dir.Norte; break; case "RightArrow": d = Dir.Este; break; case "DownArrow": d = Dir.Sur; break; } while (Console.KeyAvailable) (Console.ReadKey(false)).KeyChar.ToString(); } return d; } } class Estado { static Random rnd = new Random(); public int fils, cols; ListaEnlazada serp = new ListaEnlazada();//el primer nodo es la cola y el ultimo la cabeza ListaEnlazada frutas = new ListaEnlazada(); public int dirx, diry; public Estado(int ancho, int alto) { serp = new ListaEnlazada(); frutas = new ListaEnlazada(); cols = ancho; fils = alto; serp.insertaIni(ancho / 2, alto / 2);//se crea la serpiente, solo la cabeza dirx = 1; diry = 0; } public bool colision(int x, int y) { if (x == 0 || x > fils || y == 0 || y > cols) {//choque con los muros //throw new Exception("Has chocado con el muro"); return true; } else if (serp.esta(x, y)) {//choque con la serpiente //throw new Exception("Has chocado con la serpiente"); return true; } else return false; } public bool avanza() { int i, j; serp.ultimo(out i, out j);//localizamos la cabeza de la serpiente if (!colision(i + dirx, j + diry)) {//si no hay colision comprobamos si en la siguiente unidad hay una fruta if (frutas.esta(i + dirx, j + diry)) {//añidimos el nodo de cabeza para que aumente de tamaño y la cabeza pase al siguiente nodo serp.insertaFin(i + dirx, j + diry); frutas.eliminaElto(i + dirx, j + diry); } else { //si no hay fruta, eliminamos el nodo de la cola y añadimos una cabeza en la direccion serp.insertaFin(i + dirx, j + diry); serp.eliminaIni(); } return true; } else return false; } //controla las direcciones que puede tomar la serpiente public void cambiaDir(Practica4.Dir dir) { switch (dir) { case Practica4.Dir.Este: dirx = 1; diry = 0; break; case Practica4.Dir.Norte: dirx = 0; diry = -1; break; case Practica4.Dir.Oeste: dirx = -1; diry = 0; break; case Practica4.Dir.Sur: dirx = 0; diry = 1; break; case Practica4.Dir.Null: break; } } //coloca frutas en el tablero mientras este la serpiente public void ponFruta() { int x, y; do { x = rnd.Next(1, fils); y = rnd.Next(1, cols); } while (serp.esta(x, y) || frutas.esta(x, y)); frutas.insertaIni(x, y); } public void dibuja() { Console.BackgroundColor = ConsoleColor.Black; Console.Clear(); Console.SetCursorPosition(0, 0); dibujaTablero(); dibujaSerp(); dibujaFrutas(); } //dibuja los bordes del tablero con los que puede chocar la serpiente public void dibujaTablero() { dibujaFils(); Console.WriteLine(); for (int x = 0; x <= cols; x++) { Console.BackgroundColor = ConsoleColor.Red; Console.Write(" "); Console.SetCursorPosition(2 * fils+2, x); Console.WriteLine(" "); } dibujaFils(); } public void dibujaFils() { Console.BackgroundColor = ConsoleColor.Red; for (int x = 0; x <= fils+1; x++) Console.Write(" "); } //dibuja la serpiente public void dibujaSerp() { int x, y; serp.iniciaRecorrido(); Console.BackgroundColor = ConsoleColor.DarkYellow; Console.ForegroundColor = ConsoleColor.Black; while (serp.dame_actual_y_avanza(out x, out y)) { Console.SetCursorPosition(2 * x, y);//2*x para que sea cuadrado cada parte de la serpiente Console.Write(" "); } //dibujamos la cabeza de la serpiente serp.ultimo(out x, out y); Console.SetCursorPosition(2 * x, y); Console.Write("<>"); } //dibuja la fruta public void dibujaFrutas() { int x, y; frutas.iniciaRecorrido(); while (frutas.dame_actual_y_avanza(out x, out y)) { Console.SetCursorPosition(2 * x, y); Console.BackgroundColor = ConsoleColor.Green; Console.Write(" "); } } }//Fin de la clase Estado class ListaEnlazada { class Nodo { public int x, y; public Nodo sig; // enlace al siguiente nodo // constructor public Nodo(int i, int j) { x = i; y = j; } } // atributos de la lista enlazada: referencia al primero y al último Nodo pri, ult, act; // constructora de listas public ListaEnlazada() { pri = ult = act = null; } // obtener primer elto de la lista public void primero(out int i, out int j) { if (pri == null) throw new Exception("Error primero: lista vacia"); i = pri.x; j = pri.y; } // obtener ultimo elto de la lista public void ultimo(out int i, out int j) { if (ult == null) throw new Exception("Error ultimo: lista vacia"); i = ult.x; j = ult.y; } // ver si un elto esta en la lista public bool esta(int i, int j) { // iniciamos con aux al ppio Nodo aux = pri; // busqueda: avanzazmos con aux mientras no llegemoa al final y no encontremos elto while (aux != null && (aux.x != i || aux.y != j)) aux = aux.sig; // si no hemos llegado el final, es pq el elto está en la lista return (aux != null); } // insertar elto al ppio de la lista public void insertaIni(int x, int y) { // si la lista es vacia creamos nodo y apuntamos a el pri y ult if (pri == null) { pri = new Nodo(x, y); pri.sig = null; ult = pri; } else { // si no es vacia creamos nodo y lo enganchamos al ppio Nodo aux = new Nodo(x, y); aux.sig = pri; pri = aux; } } // insertar elto al final de la lista public void insertaFin(int x, int y) { // si es vacia creamos nodo y apuntamos a el ppi y ult if (pri == null) { pri = new Nodo(x, y); pri.sig = null; ult = pri; } else { // si no, creamos nodo apuntado por ult.sig y enlazamos ult.sig = new Nodo(x, y); ult = ult.sig; ult.sig = null; } } // elimina elto dado de la lista, si esta public void eliminaElto(int x, int y) { // lista vacia if (pri == null) throw new Exception("Error eliminaElto: lista vacia"); else { // eliminar el primero if (x == pri.x && y == pri.y) { // si solo tiene un elto if (pri == ult) pri = ult = null; // si tiene más de uno else pri = pri.sig; } // eliminar otro distinto al primero else { // busqueda. aux al ppio Nodo aux = pri; // recorremos lista buscando el ANTERIOR al que hay que eliminar (para poder luego enlazar) while (aux.sig != null && (x != aux.sig.x || y != aux.sig.y)) aux = aux.sig; // si lo encontramos if (aux.sig != null) { // si es el ultimo cambiamos referencia al ultimo if (aux.sig == ult) ult = aux; // puenteamos aux.sig = aux.sig.sig; } } } } // elimina primer elto de la lista public void eliminaIni() { if (pri == null) throw new Exception("Error eliminaIni: lista vacia"); if (pri == ult) pri = ult = null; else pri = pri.sig; } // inicizlización del iterador. Lo colocamos al ppio public void iniciaRecorrido() { act = pri; } public bool dame_actual_y_avanza(out int x, out int y) { x = y = 0; // si estamos al final, ya no hay actual y devolvemos false if (act == null) return false; else { // si no, info del nodo, avanzamos act y devolvemos true x = act.x; y = act.y; act = act.sig; return true; } } /* auxiliar solo para depuración public void verLista(){ Console.Write ("Lista: "); Nodo aux = pri; while (aux != null) { Console.Write ("(" + aux.x + "," + aux.y + ") "); aux = aux.sig; } Console.Write ("\n\n"); } */ } } Códigos/otrapec.cs/// PRÁCTICA 3 - INTEGRANTES: /// José María Monreal González /// Alejandro Ortega Álvarez /// Roberto Alcázar Morales using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ZDFINAL { class Program { //CONSTANTES const int ANCHO = 15, ALTO = 15; static Random rnd = new Random(); public enum Color { rojo, cyan, verde, amarillo, azul, magenta }; struct Posicion { public int x, y; } //Nuestro struct Visitados con el array posVis de tipo Posicion y los enteros pend y fin. struct Visitados { public Posicion[] posVis; public int pend, fin; } //Método que genera de manera aleatoria utilizando el random ya declarado un color para cada casilla del tablero. public static void genera(Color[,] tab) { for (int i = 0; i < ANCHO; i++) { for (int j = 0; j < ALTO; j++) { tab[i, j] = (Color)rnd.Next(0, 6); } } } //Método encargado de pintar en pantalla el tablero y el panel de selección de colores, además del número de jugadas. public static void dibuja(Color[,] tab, int cont, int juego) { for (int i = 0; i < ALTO; i++) { for (int j = 0; j < ANCHO; j++) { switch (tab[i, j]) { case Color.rojo: Console.BackgroundColor = ConsoleColor.Red; break; case Color.cyan: Console.BackgroundColor = ConsoleColor.Cyan; break; case Color.verde: Console.BackgroundColor = ConsoleColor.Green; break; case Color.amarillo: Console.BackgroundColor = ConsoleColor.Yellow; break; case Color.azul: Console.BackgroundColor = ConsoleColor.Blue; break; case Color.magenta: Console.BackgroundColor = ConsoleColor.Magenta; break; } Console.Write(" "); } Console.WriteLine(); } Console.Write("\n\n\n"); //Dibujado del panel de control Console.BackgroundColor = ConsoleColor.Red; Console.Write(" 1 "); Console.BackgroundColor = ConsoleColor.Cyan; Console.Write(" 2 "); Console.BackgroundColor = ConsoleColor.Green; Console.Write(" 3 "); Console.WriteLine(); Console.BackgroundColor = ConsoleColor.Yellow; Console.Write(" 4 "); Console.BackgroundColor = ConsoleColor.Blue; Console.Write(" 5 "); Console.BackgroundColor = ConsoleColor.Magenta; Console.Write(" 6 "); Console.WriteLine(); //Al terminar restablecemos de nuevo el color por defecto de la consola (negro). Console.BackgroundColor = ConsoleColor.Black; //Escribimos por pantalla las jugadas dependiendo del modo de juego en el que nos encontremos. if (juego == 1) Console.Write("\n Jugadas Restantes: " + cont); else Console.Write("\n Jugadas Totales: " + cont); } //Método que comprueba si la posición dada (pos) se encuentra dentro del array posVis. static bool estaVisitado(Visitados vis, Posicion pos) { int i = 0; while ((i < vis.fin) && (pos.x != vis.posVis[i].x || pos.y != vis.posVis[i].y)) i++; return (i != vis.fin); } //Añade las posiciones adyacentes de la posición dada en el caso de que no estén visitadas anteriormente. static void añadeVecinos(ref Visitados vis, Posicion pos) { Posicion aux = pos; aux.x = pos.x + 1; if (aux.x < ANCHO && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } aux.x = pos.x - 1; if (aux.x >= 0 && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } //Reiniciamos la posición x a su valor inicial. aux.x = pos.x; aux.y = pos.y + 1; if (aux.y < ALTO && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } aux.y = pos.y - 1; if (aux.y >= 0 && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } } //Inicializa pend y fin de Visitados, además de declarar el array posVis. //Este método contiene el algoritmode propagación del color que recorre el array posVis //y va coloreando las posiciones del tablero que correspondan. static void expande(Color[,] tab, Color nuevo) { Visitados vis; vis.posVis = new Posicion[ALTO * ANCHO]; Posicion inicial; inicial.x = 0; inicial.y = 0; vis.posVis[0] = inicial; vis.pend = 0; vis.fin = 1; //Guardamos siempre en old el color antiguo de la casilla de referencia para la posterior comparación. Color old = tab[0, 0]; //Mientras queden posiciones en el array posVis el algoritmo de propagación no termina. //El algoritmo hace una comprobación de la casilla a la que señala vis.pend y comprueba que no sea del color //que el jugador ha pulsado en el momento de la ejecución (nuevo) y que además sea el antiguo. //Si esas dos condiciones se cumplen, "pintará" la casilla del nuevo color y añadirá sus casillas adyacentes al array posVis. while (vis.pend < vis.fin) { if (nuevo != tab[vis.posVis[vis.pend].x, vis.posVis[vis.pend].y] && old == tab[vis.posVis[vis.pend].x, vis.posVis[vis.pend].y]) { tab[vis.posVis[vis.pend].x, vis.posVis[vis.pend].y] = nuevo; añadeVecinos(ref vis, vis.posVis[vis.pend]); } vis.pend++; } } //Método encargado de devolver true/false si se ha terminado o no la partida. static bool finalPartida(Color[,] tab) { Color colorFinal = tab[0, 0]; int i = 0, j = 0, cont = 0; while (i < ANCHO && colorFinal == tab[i, j]) { while (j < ALTO && colorFinal == tab[i, j]) { j++; cont++; } j = 0; i++; } return (cont == ALTO * ANCHO); } //Lee de teclado un número del 1-6 y lo convierte al color correspondiente (casting). static Color leeColor() { return (Color)(Console.ReadKey(true)).KeyChar - '0' - 1; } //MÉTODO PRINCIPAL static void Main(string[] args) { Color[,] tab = new Color[ANCHO, ALTO]; int cont = 0; //Modos de juego: //CLÁSICO: Tienes un máximo de 30 movimientos para terminar la partida //SIN LÍMITES: No hay número máximo de movimientos. Console.WriteLine("Elige el modo de Juego: \n Clásico: 1. \n Sin límites: 2"); int juego = (int)(Console.ReadKey(true)).KeyChar - '0'; genera(tab); //BUCLE PRINCIPAL //Comparación de modos de juego. if (juego == 1) { //Caso base del que partimos. cont = 30; Console.Clear(); dibuja(tab, cont, juego); //Mientras no sea final de partida, hacemos este bucle pidiéndole un color al usuario, //llamando al algoritmo de propagación, modificando el contador y pintando de nuevo el tablero. while (cont > 0 && !finalPartida(tab)) { Color nuevo = leeColor(); expande(tab, nuevo); Console.Clear(); cont--; dibuja(tab, cont, juego); } if (finalPartida(tab)) Console.WriteLine("\n \n Enhorabuena, ¡Has ganado!"); else Console.WriteLine("\n \n ¡Mala suerte! Inténtalo de nuevo"); } else if (juego == 2) { Console.Clear(); dibuja(tab, cont, juego); while (!finalPartida(tab)) { Color nuevo = leeColor(); expande(tab, nuevo); Console.Clear(); cont++; dibuja(tab, cont, juego); } Console.WriteLine("\n \n Enhorabuena, ¡Has ganado!"); } else Console.WriteLine("Modo de juego no válido"); Console.ReadKey(); } } } Códigos/Recorridos y busquedas en arrays unidimensionales. Polinomios.csusing System; namespace polinomios { class MainClass { const int N = 100; struct Monomio { public double coef; public int exp; } struct Polinomio { public Monomio [] mon; public int tam; } static void leeMonomio(out Monomio m){ Console.Write ("Coeficiente: "); m.coef = double.Parse (Console.ReadLine ()); Console.Write ("Exponente: "); m.exp = int.Parse (Console.ReadLine ()); } static void leePolinomio(out Polinomio p){ p.mon = new Monomio[N]; p.tam = 0; Console.Write ("Número de monomios: "); int n = int.Parse (Console.ReadLine ()); Console.WriteLine ("Introduce monomios"); for (int i=0; i<n; i++) { Monomio m; leeMonomio (out m); inserta (m, ref p); } } static void escribePolinomio(Polinomio p){ for (int i = 0; i < p.tam; i++) Console.Write (" + " + p.mon [i].coef + "x^" + p.mon [i].exp); } static void inserta(Monomio m, ref Polinomio p){ if (m.coef != 0) { int i = 0; // busqueda de mon del mismo grado while (i<p.tam && m.exp != p.mon[i].exp) i++; if (i < p.tam) { // monomio encontrado double c = p.mon [i].coef + m.coef; if (c == 0) { // suma nula.... p.mon [i] = p.mon [p.tam - 1]; p.tam--; } else p.mon [i].coef = c; } else { // añadimos m al final if (p.tam==N) { Console.WriteLine ("error: polinomio lleno"); } else { p.mon [p.tam] = m; p.tam++; } } } } static Polinomio suma(Polinomio p1, Polinomio p2){ Polinomio p3; p3.mon = new Monomio[N]; p3.tam = 0; // insertamos uno a uno los monimios de ambos polinomios // el método inserta hará las sumas correspondientes de los monomios del mismo grado for (int i=0; i<p1.tam; i++) inserta (p1.mon [i], ref p3); for (int i=0; i<p2.tam; i++) inserta (p2.mon [i], ref p3); return p3; } static double evalua(Polinomio p, double v){ double ac = 0; // recorrido for (int i=0; i<p.tam; i++) ac += p.mon [i].coef * Math.Pow (v,p.mon [i].exp); return ac; } static int grado(Polinomio p){ int gr = 0; // recorrido for (int i = 0; i < p.tam; i++) if (p.mon [i].exp > gr) gr = p.mon [i].exp; return gr; } static double coef(Polinomio p, int exp){ double c = 0; // búsqueda int i=0; // mientras no llegemos al al final de la estructura // y no encontremos el monomio buscado, avanzar while (i < p.tam && p.mon [i].exp != exp) i++; // notese que no hay problema en utilizar exp como parámetro y nombre de campo // si no hemos llegado al final, hemos parado pq // hemos encontrado el monomio if (i < p.tam) c = p.mon [i].coef; return c; } static Polinomio multiplica(Polinomio p1, Polinomio p2){ Polinomio p3; p3.mon = new Monomio[N]; p3.tam = 0; // recorrido for (int i = 0; i < p1.tam; i++) { // recorrido for (int j = 0; j < p2.tam; j++) { Monomio m; m.coef = p1.mon [i].coef * p2.mon [j].coef; m.exp = p1.mon [i].exp + p2.mon [j].exp; inserta (m, ref p3); } } return p3; } public static void Main () { Polinomio p1, p2; //leePolinomio (out p1); p1.mon = new Monomio[N]; p1.tam=4; for (int i = 0; i < 4; i++) { p1.mon [i].coef = i; p1.mon [i].exp = 2 * i; } escribePolinomio (p1); p2.mon = new Monomio[N]; p2.tam=2; for (int i = 0; i < 2; i++) { p2.mon [i].coef = -i+2; p2.mon [i].exp = i; } Console.WriteLine (); escribePolinomio (p2); Polinomio p3 = multiplica (p1, p2); Console.WriteLine (); escribePolinomio (p3); Console.WriteLine (); //Console.WriteLine ("Eval: "+ evalua (p1, 1)); } } } Códigos/Recorridos y búsquedas en arrays bidimensionales. Matrices.csusing System; namespace arrays2 { class MainClass { // pasando las el tamaño en cada dimension static void escribeMat(int [,] v, int fils, int cols){ // recorrido de un vector bidimensional -> dos for anidados for (int i = 0; i < fils; i++) { for (int j = 0; j < cols; j++) { Console.Write ("{0,3}", v [i, j]); } // al final de cada fila, salto de línea Console.WriteLine (); } } // sin pasar tamaño de cada dimension static void escribeMat2(int [,] v){ // recorrido de un vector bidimensional -> dos for anidados for (int i = 0; i < v.GetUpperBound(0)+1; i++) { for (int j = 0; j < v.GetUpperBound(1)+1; j++) { Console.Write ("{0,3}", v [i, j]); } // al final de cada fila, salto de línea Console.WriteLine (); } } static void sumaMat(int [,] m1, int [,] m2, int [,] m3){ int fils = m1.GetUpperBound(0) + 1, cols = m1.GetUpperBound(1) + 1; for (int i=0; i<fils; i++) for (int j=0; j<cols; j++) m3[i,j] = m1[i,j] + m2[i,j]; } static void sumaMat(int [,] m1, int [,] m2, out int [,] m3){ // matriz de salida, inicialmente null m3 = null; // comprobamos tamañaos if (m1.GetUpperBound (0) != m2.GetUpperBound (0) || m1.GetUpperBound (1) != m2.GetUpperBound (1)) Console.WriteLine ("Error: matrices no coinciden en tamaño\n"); else { int fils = m1.GetUpperBound (0) + 1, cols = m1.GetUpperBound (1) + 1; // creamos la nueva matriz m3 = new int[fils, cols]; // recorrido simultáneo de dos vectores bidimensionales -> dos for anidados for (int i = 0; i < fils; i++) for (int j = 0; j < cols; j++) m3 [i, j] = m1 [i, j] + m2 [i, j]; } } static void buscaNeg(int [,] v, out int x, out int y){ int i = 0, j = 0; int fils = v.GetUpperBound (0) + 1, cols = v.GetUpperBound (1) + 1; bool enc = false; // variable centinela "encontrado" // busqueda en un vector bidimensional -> dos while anidados // barrido por filas i = 0; while (i<fils && !enc) { // control de rango y // barrido por columnas // para cada fila inicializamos columna a 0 j = 0; while (j<cols && !enc) { if (v[i,j]<0) enc = true; else j++; } if (!enc) i++; } // encontrado, devolvemos coordenadas if (enc) { x = i; y = j; // si no, devolvemos coordenadas negativas (no válidas) } else x = y = -1; } static int[,] multiplica(int [,] m1, int [,] m2){ int [,] m3 = null; int fils1 = m1.GetUpperBound (0) + 1; int cols1 = m1.GetUpperBound (1) + 1; int fils2 = m2.GetUpperBound (0) + 1; int cols2 = m2.GetUpperBound (1) + 1; // num_cols(m1) == num_fils(m2) if (cols1 != fils2) Console.WriteLine ("Error: matrices no multiplicables\n"); else { m3 = new int[fils1,cols2]; // para cada fila de m1 for (int i=0; i<fils1; i++) // para cada columna de m2 for (int j = 0; j < cols2; j++){ // m3[i,j] = Sum_1^cols1 m1[i,k]*m2[k,j]; m3[i,j]=0; for (int k=0; k<cols1; k++) m3[i,j] += m1[i,k]*m2[k,j]; } } return m3; } public static void Main (string[] args) { int[,] u = {{1,2,3},{4,5,6} }; //new int[2,3]; int[,] v = {{1,2},{2,1},{1,2}};// new int[3,2]; int[,] r = multiplica (u, v); escribeMat2 (r); } } } Códigos/Snake.cs//PRÁCTICA 4 - SNAKE //Alejandro Ortega Álvarez //José María Monreal González //Roberto Alcázar Morales using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Snake { enum Dir { Norte, Sur, Este, Oeste, Null } class ListaEnlazada { class Nodo { public int x, y; public Nodo sig; // enlace al siguiente nodo // constructor public Nodo(int i, int j) { x = i; y = j; } } // atributos de la lista enlazada: referencia al primero y al último Nodo pri, ult, act; // constructora de listas public ListaEnlazada() { pri = ult = act = null; } // obtener primer elto de la lista //Sirve para conocer las coordenadas del cuerpo de la serpiente public void primero(out int i, out int j) { if (pri == null) throw new Exception("Error primero: lista vacia"); i = pri.x; j = pri.y; } // obtener ultimo elto de la lista public void ultimo(out int i, out int j) { if (ult == null) throw new Exception("Error ultimo: lista vacia"); i = ult.x; j = ult.y; } // ver si un elto esta en la lista public bool esta(int i, int j) { // iniciamos con aux al ppio Nodo aux = pri; // busqueda: avanzazmos con aux mientras no llegemoa al final y no encontremos elto while (aux != null && (aux.x != i || aux.y != j)) aux = aux.sig; // si no hemos llegado el final, es pq el elto está en la lista return (aux != null); } // insertar elto al ppio de la lista public void insertaIni(int x, int y) { // si la lista es vacia creamos nodo y apuntamos a el pri y ult if (pri == null) { pri = new Nodo(x, y); pri.sig = null; ult = pri; } else { // si no es vacia creamos nodo y lo enganchamos al ppio Nodo aux = new Nodo(x, y); aux.sig = pri; pri = aux; } } // insertar elto al final de la lista public void insertaFin(int x, int y) { // si es vacia creamos nodo y apuntamos a el ppi y ult if (pri == null) { pri = new Nodo(x, y); pri.sig = null; ult = pri; } else { // si no, creamos nodo apuntado por ult.sig y enlazamos ult.sig = new Nodo(x, y); ult = ult.sig; ult.sig = null; } } // elimina elto dado de la lista, si esta public void eliminaElto(int x, int y) { // lista vacia if (pri == null) throw new Exception("Error eliminaElto: lista vacia"); else { // eliminar el primero if (x == pri.x && y == pri.y) { // si solo tiene un elto if (pri == ult) pri = ult = null; // si tiene más de uno else pri = pri.sig; } // eliminar otro distinto al primero else { // busqueda. aux al ppio Nodo aux = pri; // recorremos lista buscando el ANTERIOR al que hay que eliminar (para poder luego enlazar) while (aux.sig != null && (x != aux.sig.x || y != aux.sig.y)) aux = aux.sig; // si lo encontramos if (aux.sig != null) { // si es el ultimo cambiamos referencia al ultimo if (aux.sig == ult) ult = aux; // puenteamos aux.sig = aux.sig.sig; } } } } // elimina primer elto de la lista public void eliminaIni() { if (pri == null) throw new Exception("Error eliminaIni: lista vacia"); if (pri == ult) pri = ult = null; else pri = pri.sig; } // inicizlización del iterador. Lo colocamos al ppio public void iniciaRecorrido() { act = pri; } public bool dame_actual_y_avanza(out int x, out int y) { x = y = 0; // si estamos al final, ya no hay actual y devolvemos false if (act == null) return false; else { // si no, info del nodo, avanzamos act y devolvemos true x = act.x; y = act.y; act = act.sig; return true; } } /* auxiliar solo para depuración public void verLista(){ Console.Write ("Lista: "); Nodo aux = pri; while (aux != null) { Console.Write ("(" + aux.x + "," + aux.y + ") "); aux = aux.sig; } Console.Write ("\n\n"); } */ } //CLASE ESTADO class Estado { int fils, cols; ListaEnlazada Serp = new ListaEnlazada(); ListaEnlazada Frutas = new ListaEnlazada(); Random rnd = new Random(); public int dirx, diry; //Se crean las listas de la serp y las frutas y se inicializa la dirección a ESTE public Estado(int ancho, int alto) { fils = alto; cols = ancho; Serp = new ListaEnlazada(); Serp.insertaIni(alto / 2, ancho / 2); Frutas = new ListaEnlazada(); dirx = 1; diry = 0; } //Determina si hay colisión en las posicion x,y public bool colision(int x, int y) { if (x == 0 || x > fils || y == 0 || y > cols || Serp.esta(x, y)) //choca con los bordes return true; else return false; } //Hace avanzar una unidad a la serpiente y, si hay fruta, crece una unidad public void avanza() { int x, y; Serp.ultimo(out x, out y); x += dirx; y += diry; if (!colision(x, y)) { Serp.insertaFin(x, y); if (Frutas.esta(x, y)) Frutas.eliminaElto(x, y); else Serp.eliminaIni(); } else throw new Exception("Choque detectado"); } //Modifica la dirección de la serpiente void cambiaDir(Dir dir) { switch (dir) { case Dir.Oeste: dirx = -1; diry = 0; break; case Dir.Norte: dirx = 0; diry = -1; break; case Dir.Este: dirx = 1; diry = 0; break; case Dir.Sur: dirx = 0; diry = 1; break; case Dir.Null: break; } } //Coloca en el tablero frutas aleatorias public void ponFruta() { { int x, y; do { x = rnd.Next(1, fils); y = rnd.Next(1, cols); } while (Serp.esta(x, y) || Frutas.esta(x, y)); Frutas.insertaIni(x, y); } } //Método útil para llamar en el Dibuja() public void pinta(int x, int y, ConsoleColor Color) { Console.BackgroundColor = Color; Console.SetCursorPosition(2 * x, y); //Dibujado en cuadrados Console.WriteLine(" "); } //Dibuja los bordes, la serpiente y las frutas void dibuja() { Console.BackgroundColor = ConsoleColor.Black; Console.Clear(); Console.SetCursorPosition(0, 0); //Para los bordes del tablero (Rojo) for (int i = 0; i <= fils + 1; i++) //recorre el tablero para buscar los bordes { for (int j = 0; j <= cols + 1; j++) { if (i == 0 || j == 0 || i == fils + 1 || j == cols + 1)//hace que solo pinte los bordes { pinta(i, j, ConsoleColor.Red); } } } //Para la serpiente int x, y; Serp.iniciaRecorrido(); while (Serp.dame_actual_y_avanza(out x, out y)) pinta(x, y, ConsoleColor.Green); //Colocamos la cabeza de la serpiente Serp.ultimo(out x, out y); Console.SetCursorPosition(2 * x, y); Console.Write("<>"); //Para las frutas Frutas.iniciaRecorrido(); while (Frutas.dame_actual_y_avanza(out x, out y)) pinta(x, y, ConsoleColor.Cyan); } class Program { static Dir leeEntrada() { Dir d = Dir.Null; if (Console.KeyAvailable) { string tecla = Console.ReadKey().Key.ToString(); switch (tecla) { case "LeftArrow": d = Dir.Oeste; break; case "UpArrow": d = Dir.Norte; break; case "RightArrow": d = Dir.Este; break; case "DownArrow": d = Dir.Sur; break; } while (Console.KeyAvailable) (Console.ReadKey(false)).KeyChar.ToString(); } return d; } //MÉTODO PRINCIPAL DEL JUEGO public static void Main(string[] args) { int alto = 20; int ancho = 20; int cont = 0; bool partida = true; Estado estado = new Estado(alto, ancho); //Primero creamos un estado con un ancho y largo estado.ponFruta(); //dibuja la primera fruta estado.dibuja(); //dibuja el tablero while (partida) { if (cont == 25) { estado.ponFruta(); cont = 0; } Dir d = leeEntrada(); estado.cambiaDir(d); try { estado.avanza(); estado.dibuja(); cont++; System.Threading.Thread.Sleep(400); } catch { Console.SetCursorPosition(0,estado.cols +5); Console.BackgroundColor = ConsoleColor.Black; Console.WriteLine("¡Te has chocado!"); partida = false; } } Console.ReadKey(); } } } } Códigos/Sopa.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Sopita { struct Par { // representa posiciones y direcciones public int x, y; } struct Sopa { // sopa de letras junto con sus dimensiones public int alto, ancho; // dimensiones public string[] matriz; // array de strings } class Program { static Par[] dirs() { Par [] direcc = new Par [8]; int k = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i != 0 && j != 0) { direcc[k].x = i; direcc[k].y = j; k++; } } } return direcc; } static string DameLetras(Sopa s, Par pos, Par dir, int n) { string pal = null; int i=0; while ((pos.x>0 && pos.x<s.ancho && pos.y>0 && pos.y<s.alto ) && i < n) { pal += s.matriz[pos.x][pos.y]; pos.x += dir.x; pos.y += dir.y; i++; } if (i == n) return pal; else return null; } static bool buscaPos(Sopa s, string pal, out Par pos, Par dir) { Par posicion = new Par(); bool encontrado = false; int i=0; int j=0; while (!encontrado && i < s.ancho) { while (!encontrado && j < s.alto) { posicion.x = i; posicion.y = j; if (string.Compare(pal, DameLetras(s, posicion, dir, pal.Length)) == 0) encontrado = true; j++; } i++; } pos = posicion; return encontrado; } static bool buscaPal(Sopa s, string pal, out Par pos, out Par dir) { Par posicion = new Par(); Par [] direccion = dirs (); bool encontrado = false; int k = 0; while (!encontrado && k < direccion.Length) { if (buscaPos(s, pal, out posicion, direccion[k])) encontrado = true; else k++; } if (encontrado) dir = direccion[k]; else dir = direccion [0]; pos = posicion; return encontrado; } static void resuelve(Sopa s, string[] pals) { int k = 0; Par pos = new Par(); Par dir = new Par(); while (k < pals.Length) { if (buscaPal(s, pals[k], out pos, out dir)) Console.WriteLine("Encontrada " + pals[k] + "en Posicion " + pos.x + "," + pos.y + "dirección" + dir.x + "," + dir.y); else Console.WriteLine("No encontrada " + pals[k]); k++; } } static void leeSopa(Sopa s, string[] pals) { StreamReader entrada = new StreamReader("entrada.txt"); s.alto = int.Parse(entrada.ReadLine()); s.ancho = int.Parse(entrada.ReadLine()); for (int i = 0; i < s.alto; i++) s.matriz[i] = entrada.ReadLine(); int nums= pals.Length; nums = int.Parse(entrada.ReadLine()); for (int j = 0; j < pals.Length; j++) { pals[j] = entrada.ReadLine(); } entrada.Close(); } static void Main(string[] args) { Sopa s; s.alto = 6; s.ancho = 9; s.matriz = new string[] { // sopa de letras del ejemplo "ABCDBARCO" , "EKLMNOPQR" , "HTAVIONOR" , "CGRTUITXB" , "OROHFOVAZ" , "CMPPMEVAN" }; string[] pals = { "COCHE", "AVION", "BARCO", "MOTO", "PATINES" }; resuelve(s, pals); Console.ReadKey(); } } } Códigos/ZyanDrenchFINAL.rar ZDFINAL/.vs/ZDFINAL/v14/.suo ZDFINAL/ZDFINAL/App.config ZDFINAL/ZDFINAL/bin/Debug/ZDFINAL.exe ZDFINAL/ZDFINAL/bin/Debug/ZDFINAL.exe.config ZDFINAL/ZDFINAL/bin/Debug/ZDFINAL.pdb ZDFINAL/ZDFINAL/bin/Debug/ZDFINAL.vshost.exe ZDFINAL/ZDFINAL/bin/Debug/ZDFINAL.vshost.exe.config ZDFINAL/ZDFINAL/bin/Debug/ZDFINAL.vshost.exe.manifest ZDFINAL/ZDFINAL/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache ZDFINAL/ZDFINAL/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs ZDFINAL/ZDFINAL/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs ZDFINAL/ZDFINAL/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs ZDFINAL/ZDFINAL/obj/Debug/ZDFINAL.csproj.FileListAbsolute.txtC:\Users\JCoffee\Desktop\ZDFINAL\ZDFINAL\bin\Debug\ZDFINAL.exe.config C:\Users\JCoffee\Desktop\ZDFINAL\ZDFINAL\bin\Debug\ZDFINAL.exe C:\Users\JCoffee\Desktop\ZDFINAL\ZDFINAL\bin\Debug\ZDFINAL.pdb C:\Users\JCoffee\Desktop\ZDFINAL\ZDFINAL\obj\Debug\ZDFINAL.csprojResolveAssemblyReference.cache C:\Users\JCoffee\Desktop\ZDFINAL\ZDFINAL\obj\Debug\ZDFINAL.exe C:\Users\JCoffee\Desktop\ZDFINAL\ZDFINAL\obj\Debug\ZDFINAL.pdb ZDFINAL/ZDFINAL/obj/Debug/ZDFINAL.csprojResolveAssemblyReference.cache ZDFINAL/ZDFINAL/obj/Debug/ZDFINAL.exe ZDFINAL/ZDFINAL/obj/Debug/ZDFINAL.pdb ZDFINAL/ZDFINAL/Program.cs/// PRÁCTICA 3 - INTEGRANTES: /// José María Monreal González /// Alejandro Ortega Álvarez /// Roberto Alcázar Morales using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ZDFINAL { class Program { //CONSTANTES const int ANCHO = 15, ALTO = 15; static Random rnd = new Random(); public enum Color { rojo, cyan, verde, amarillo, azul, magenta }; struct Posicion { public int x, y; } //Nuestro struct Visitados con el array posVis de tipo Posicion y los enteros pend y fin. struct Visitados { public Posicion[] posVis; public int pend, fin; } //Método que genera de manera aleatoria utilizando el random ya declarado un color para cada casilla del tablero. public static void genera(Color[,] tab) { for (int i = 0; i < ANCHO; i++) { for (int j = 0; j < ALTO; j++) { tab[i, j] = (Color)rnd.Next(0, 6); } } } //Método encargado de pintar en pantalla el tablero y el panel de selección de colores, además del número de jugadas. public static void dibuja(Color[,] tab, int cont, int juego) { for (int i = 0; i < ALTO; i++) { for (int j = 0; j < ANCHO; j++) { switch (tab[i, j]) { case Color.rojo: Console.BackgroundColor = ConsoleColor.Red; break; case Color.cyan: Console.BackgroundColor = ConsoleColor.Cyan; break; case Color.verde: Console.BackgroundColor = ConsoleColor.Green; break; case Color.amarillo: Console.BackgroundColor = ConsoleColor.Yellow; break; case Color.azul: Console.BackgroundColor = ConsoleColor.Blue; break; case Color.magenta: Console.BackgroundColor = ConsoleColor.Magenta; break; } Console.Write(" "); } Console.WriteLine(); } Console.Write("\n\n\n"); //Dibujado del panel de control Console.BackgroundColor = ConsoleColor.Red; Console.Write(" 1 "); Console.BackgroundColor = ConsoleColor.Cyan; Console.Write(" 2 "); Console.BackgroundColor = ConsoleColor.Green; Console.Write(" 3 "); Console.WriteLine(); Console.BackgroundColor = ConsoleColor.Yellow; Console.Write(" 4 "); Console.BackgroundColor = ConsoleColor.Blue; Console.Write(" 5 "); Console.BackgroundColor = ConsoleColor.Magenta; Console.Write(" 6 "); Console.WriteLine(); //Al terminar restablecemos de nuevo el color por defecto de la consola (negro). Console.BackgroundColor = ConsoleColor.Black; //Escribimos por pantalla las jugadas dependiendo del modo de juego en el que nos encontremos. if (juego == 1) Console.Write("\n Jugadas Restantes: " + cont); else Console.Write("\n Jugadas Totales: " + cont); } //Método que comprueba si la posición dada (pos) se encuentra dentro del array posVis. static bool estaVisitado(Visitados vis, Posicion pos) { int i = 0; while ((i < vis.fin) && (pos.x != vis.posVis[i].x || pos.y != vis.posVis[i].y)) i++; return (i != vis.fin); } //Añade las posiciones adyacentes de la posición dada en el caso de que no estén visitadas anteriormente. static void añadeVecinos(ref Visitados vis, Posicion pos) { Posicion aux = pos; aux.x = pos.x + 1; if (aux.x < ANCHO && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } aux.x = pos.x - 1; if (aux.x >= 0 && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } //Reiniciamos la posición x a su valor inicial. aux.x = pos.x; aux.y = pos.y + 1; if (aux.y < ALTO && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } aux.y = pos.y - 1; if (aux.y >= 0 && !estaVisitado(vis, aux)) { vis.posVis[vis.fin] = aux; vis.fin++; } } //Inicializa pend y fin de Visitados, además de declarar el array posVis. //Este método contiene el algoritmode propagación del color que recorre el array posVis //y va coloreando las posiciones del tablero que correspondan. static void expande(Color[,] tab, Color nuevo) { Visitados vis; vis.posVis = new Posicion[ALTO * ANCHO]; Posicion inicial; inicial.x = 0; inicial.y = 0; vis.posVis[0] = inicial; vis.pend = 0; vis.fin = 1; //Guardamos siempre en old el color antiguo de la casilla de referencia para la posterior comparación. Color old = tab[0, 0]; //Mientras queden posiciones en el array posVis el algoritmo de propagación no termina. //El algoritmo hace una comprobación de la casilla a la que señala vis.pend y comprueba que no sea del color //que el jugador ha pulsado en el momento de la ejecución (nuevo) y que además sea el antiguo. //Si esas dos condiciones se cumplen, "pintará" la casilla del nuevo color y añadirá sus casillas adyacentes al array posVis. while (vis.pend < vis.fin) { if (nuevo != tab[vis.posVis[vis.pend].x, vis.posVis[vis.pend].y] && old == tab[vis.posVis[vis.pend].x, vis.posVis[vis.pend].y]) { tab[vis.posVis[vis.pend].x, vis.posVis[vis.pend].y] = nuevo; añadeVecinos(ref vis, vis.posVis[vis.pend]); } vis.pend++; } } //Método encargado de devolver true/false si se ha terminado o no la partida. static bool finalPartida(Color[,] tab) { Color colorFinal = tab[0, 0]; int i = 0, j = 0, cont = 0; while (i < ANCHO && colorFinal == tab[i, j]) { while (j < ALTO && colorFinal == tab[i, j]) { j++; cont++; } j = 0; i++; } return (cont == ALTO * ANCHO); } //Lee de teclado un número del 1-6 y lo convierte al color correspondiente (casting). static Color leeColor() { return (Color)(Console.ReadKey(true)).KeyChar - '0' - 1; } //MÉTODO PRINCIPAL static void Main(string[] args) { Color[,] tab = new Color[ANCHO, ALTO]; int cont = 0; //Modos de juego: //CLÁSICO: Tienes un máximo de 30 movimientos para terminar la partida //SIN LÍMITES: No hay número máximo de movimientos. Console.WriteLine("Elige el modo de Juego: \n Clásico: 1. \n Sin límites: 2"); int juego = (int)(Console.ReadKey(true)).KeyChar - '0'; genera(tab); //BUCLE PRINCIPAL //Comparación de modos de juego. if (juego == 1) { //Caso base del que partimos. cont = 30; Console.Clear(); dibuja(tab, cont, juego); //Mientras no sea final de partida, hacemos este bucle pidiéndole un color al usuario, //llamando al algoritmo de propagación, modificando el contador y pintando de nuevo el tablero. while (cont > 0 && !finalPartida(tab)) { Color nuevo = leeColor(); expande(tab, nuevo); Console.Clear(); cont--; dibuja(tab, cont, juego); } if (finalPartida(tab)) Console.WriteLine("\n \n Enhorabuena, ¡Has ganado!"); else Console.WriteLine("\n \n ¡Mala suerte! Inténtalo de nuevo"); } else if (juego == 2) { Console.Clear(); dibuja(tab, cont, juego); while (!finalPartida(tab)) { Color nuevo = leeColor(); expande(tab, nuevo); Console.Clear(); cont++; dibuja(tab, cont, juego); } Console.WriteLine("\n \n Enhorabuena, ¡Has ganado!"); } else Console.WriteLine("Modo de juego no válido"); Console.ReadKey(); } } } ZDFINAL/ZDFINAL/Properties/AssemblyInfo.csusing System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("ZDFINAL")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ZDFINAL")] [assembly: AssemblyCopyright("Copyright © 2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("36a14081-d8fe-4baf-83f2-6e84d55e5994")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ZDFINAL/ZDFINAL/ZDFINAL.csproj Debug AnyCPU {36A14081-D8FE-4BAF-83F2-6E84D55E5994} Exe Properties ZDFINAL ZDFINAL v4.5.2 512 true AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 AnyCPU pdbonly true bin\Release\ TRACE prompt 4 ZDFINAL/ZDFINAL.sln Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZDFINAL", "ZDFINAL\ZDFINAL.csproj", "{36A14081-D8FE-4BAF-83F2-6E84D55E5994}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {36A14081-D8FE-4BAF-83F2-6E84D55E5994}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36A14081-D8FE-4BAF-83F2-6E84D55E5994}.Debug|Any CPU.Build.0 = Debug|Any CPU {36A14081-D8FE-4BAF-83F2-6E84D55E5994}.Release|Any CPU.ActiveCfg = Release|Any CPU {36A14081-D8FE-4BAF-83F2-6E84D55E5994}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal
Compartir