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