Mes: octubre 2024
Kata: Dilema del prisionero
El Dilema del prisionero es un clásico de la teoría de juegos. El enunciado clásico es así:
<i>La policía arresta a dos sospechosos. No hay pruebas suficientes para condenarlos y, tras haberlos separado, los visita a cada uno y les ofrece el mismo trato. Si uno confiesa y su cómplice no, el cómplice será condenado a la pena total, diez años, y el primero será liberado. Si uno calla y el cómplice confiesa, el primero recibirá esa pena y será el cómplice quien salga libre. Si ambos confiesan, ambos serán condenados a seis años. Si ambos lo niegan, todo lo que podrán hacer será encerrarlos durante un año por un cargo menor.</i>
Lo curioso del caso es que la mejor estrategia conjunta es callarse, pero la mejor estrategia individual es confesar. El juego se ha transformado en una versión en la que los participantes ganan dinero dependiendo de lo que elijan. La matriz de pago suele ser la siguiente:
Cooperar | Desertar | |
---|---|---|
Cooperar | 3, 3 | -5, 5 |
Desertar | 5, -5 | -1, -1 |
Cada jugador elige de antemano lo que va a hacer. Si los dos han decidido cooperar gana cada uno 3€. Si los dos deciden desertar pierden cada uno 1€. Si uno deserta y el otro coopera el que deserta gana 5€ y el que coopera pierde 5€.
Como es imaginable hay muchas estrategias si tenemos que jugar varias veces este juego. Podemos cooperar siempre, desertar siempre, reaccionar a lo que haga el otro jugador, jugar al azar…
Para probar diferentes estrategias vamos a programar un juego que permita varios jugadores, cada uno con su estrategia, y los va a enfrentar uno a uno con la matriz de pagos puesta más arriba. Los enfrentamientos tienen 50 rondas cada uno. Al final de cada enfrentamiento los jugadores habrán ganado o perdido dinero. Se sumarán los importes y se mostrará una clasificación.
Por ejemplo, tenemos los jugadores Pánfilo, cuya estrategia es cooperar siempre, Maquiavelo, que siempre deserta y Tuntún, que elige al azar. Se enfrentarían siguiendo el esquema:
Maquiavelo-Pánfilo
Maquiavelo-Tuntún
Pánfilo-Tuntún
Cada enfrentamiento implica jugar 50 veces seguidas al dilema del prisionero. Por ejemplo, en Maquiavelo Pánfilo sería algo como esto:
Maquiavelo: Deserta | Pánfilo: Coopera (Maquiavelo gana 5€ y Pánfilo pierde 5€)
Maquiavelo: Deserta | Pánfilo: Coopera (Maquiavelo gana 5€ y Pánfilo pierde 5€)
(Así 50 veces) El resultado final es que Maquiavelo habrá ganado 250 € y Pánfilo habrá perdido 250 €
Una vez realizados todos los enfrentamientos se mostrará el ranking por dinero obtenido.
Para la realización del ejercicio pensad primero en el enfoque: Qué clases vais a implementar, si conviene utilizar interfaces, etcétera.
Ejercicio LINQ sintaxis query
Con la sintaxis de query obtener el nombre y la nota de los alumnos ordenados por edad descendente y nota descendente
También los alumnos aprobados ordenados por edad (todo el objeto)
Ejercicios LINQ
Con la lista de los alumnos de ejemplo obtener:
- Los alumnos cuyo nombre empieza por ‘o’
- ¿Cuántos alumnos hay aprobados?
- Obtener una lista con el nombre de los aprobados
- ¿Hay algún alumno que haya sacado un 10?
- Obtener la media de las notas de los alumnos que han aprobado
- Lo mismo para los suspendidos
- Mostrar el nombre y la edad de los tres alumnos con mejor nota
Números complejos
Ruleta Solid
Tenemos una lista de alumnos
Tenemos cinco apartados en SOLID
Crear un programa que aleatoriamente asigne a cada alumno una letra
Desglose ejercicio cartas
Carta: número y palo
Baraja: colección de cartas
crear la baraja
mezclar la baraja
sacar carta
Jugador: nombre y una mano-> n cartas
Juego: Baraja
Jugadores
repartir cartas
Mus: Baraja Española y 4 jugadores
Grande, pequeña, pares y juego
Poker: Baraja Francesa y n jugadores entre 2 y 10
Escala de valores escalera de color hasta pareja
Github c#
Ejercicio sobrecargas
Vamos a hacer una clase Futbolista con las siguientes propiedades
Nombre, Goles
Las ponemos en el constructor obligatorias
Vamos a sobrecargar los comparadores (>,<,>=,<=, == y !=) para que nos comparen los futbolistas por el número de goles.
Además sobrecargamos el toString para que nos muestre el nombre del futbolista y sus goles y el GetHashCode para que nos devuelva el hash combinado del nombre y el número de goles
Juegos de cartas
Vamos a desarrollar una serie de clases para jugar a la baraja.
Una baraja se compone de cartas, que suelen tener un palo y un valor.
Hay dos tipos de barajas clásicas. La francesa, de 52 cartas y la española, de 40. Cada una tiene sus palos y su numeración.
Con la baraja española podemos jugar a juegos como el MUS y con la francesa a juegos como el póquer.
Quiero poder hacer partidas de mus y póquer y me gustaría tener unas clases que me puedan representar los valores de esas partidas e incluso saber que jugador es el que gana.
Por ejemplo, tengo que tener una baraja y de esa baraja tendré que poder barajarla (aleatorizarla) y repartir cartas (obtener cartas de la baraja).
En el caso del mus tengo 4 jugadores y se reparten 4 cartas a cada uno. Hay cuatro comprobaciones: Grande, pequeña, pares y juego. Tendríamos que poder saber cual de los 4 jugadores gana en cada apartado.
En el caso del póquer tenemos un número indeterminado de jugadores (entre 2 y…). Se reparten 5 cartas y tendríamos que saber qué jugador es el que gana. Aquí sólo tenemos una comprobación.
Tengo que identificar que clases voy a implementar. Si tendré o no herencia. Por ejemplo puedo tener una clase abstracta carta de la que deriven española y francesa. Lo mismo con las barajas. De los jugadores querré saber, como mínimo, el nombre y su mano (las cartas que le han tocado)
Hagamos un primer esqueleto sin implementar la funcionalidad, aunque sí indicándola.
En la baraja francesa el valor de una carta es su número, en la española es su número excepto si es un 11 o un 12, que es 10.
Una baraja debe tener todas las cartas. Si es española del 1 al 12 de cada palo (oros, copas, spadas y bastos). Si es francesa del 1 al 13 de cada palo (picas, diamantes, corazones y tréboles).
Una baraja debería poder desordenar las cartas.