Hola a todos, tengo una consulta para hacerles, sigo traduciendo códigos de java a c#, y entre los que tengo es el de la ruleta rusa, hasta 2 jugadores me funciona bien, pero cuando ingreso más de 2 nunca termina de ejecutar el código sino que queda parado:
acá pongo la relevante del código:
Código C#:
Ver originalnamespace _09_CLASES
{
public class Jugador {
private int id;
private string nombre;
private bool vivo;
public int Id {
get => id;
set => id = value;
}
public string Nombre {
get => nombre;
set => nombre = value;
}
public bool Vivo {
get => vivo;
set => vivo = value;
}
//Contructor
public Jugador(int id) {
this.id = id;
this.nombre = "Jugador " + id;
this.vivo = true;
}
/**
* El jugador dispara el revolver
* @param r
*/
public string disparar(Revolver r) {
string res = "El " + nombre + " se apunta con la pistola\n";
//El jugador se pone el revolver y...
if (r.disparar()) {
this.vivo = false; //muere
res += "El " + nombre + " ha muerto...\n";
} else {
res += "El " + nombre + " se ha librado...\n"; //No muere
}
return res;
}
}
}
Código C#:
Ver originalnamespace _09_CLASES
{
public class Juego {
//atributos
private Jugador[] jugadores;
private Revolver revolver;
//Constructor
public Juego(int numJugadores) {
jugadores = new Jugador[comprobarJugadores(numJugadores)];
crearJugadores();
revolver = new Revolver();
}
//Comprueba que el numero de jugadores esta en el rango correcto
private int comprobarJugadores(int numJugadores) {
//Sino esta en el rango correcto se pone a 6
if (!(numJugadores >= 1 && numJugadores <= 6)) {
numJugadores = 6;
}
return numJugadores;
}
//Crea los jugadores
private void crearJugadores() {
for (int i = 0; i < jugadores.Length; i++) {
jugadores[i] = new Jugador(i + 1);
}
}
//indica si el juego acaba o no
public bool finJuego() {
int enjuego = jugadores.Length;
foreach (Jugador jugadore in jugadores) {
if (jugadore == null) {
enjuego--;
}
}
return enjuego == 1;
}
public string ronda() {
string res = "";
for(int i = 0; i < jugadores.Length; i++){
if(jugadores[i] != null){
res += jugadores[i].disparar(revolver);
if(!jugadores[i].Vivo){
jugadores[i] = null;
}
}
}
return res;
}
public string ganador() {
string res = "";
foreach (Jugador jugadore in jugadores) {
if (jugadore != null) {
res += jugadore;
}
}
return res;
}
}
}
Código C#:
Ver originalnamespace _09_CLASES
{
public class Revolver
{
private int posicionBalaActual;
private int posicionBala;
public int PosicionBalaActual {
get => posicionBalaActual;
set => posicionBalaActual = value;
}
public int PosicionBala {
get => posicionBala;
set => posicionBala = value;
}
//Constructor
public Revolver() {
posicionBalaActual = Metodos.generaNumeroAleatorio(1, 6);
posicionBala = Metodos.generaNumeroAleatorio(1, 6);
}
//Metodos
//Dispara el revolver
public bool disparar() {
bool exito = false;
if (posicionBalaActual == posicionBala) {
exito = true; //Alguien va a morir...
}
siguienteBala();
return exito;
}
//Cambia a la siguiente posicion
public void siguienteBala() {
if (posicionBalaActual == 6) {
posicionBalaActual = 1; //posicion incial
} else {
posicionBalaActual++;
}
}
}
}
Código C#:
Ver originalusing System;
namespace _09_CLASES
{
class Program
{
/**
* https://www.discoduroderoer.es/ejercicios-propuestos-y-resueltos-programacion-orientado-a-objetos-java/
*
* 9. Vamos a hacer el juego de la ruleta rusa en Java.
* Como muchos sabéis, se trata de un número de jugadores que con
* un revolver con un sola bala en el tambor se dispara en la cabeza.
* Las clases a hacer son:
- Revolver:
- Atributos:
- posición actual (posición del tambor donde se dispara,
puede que esté la bala o no)
- posición bala (la posición del tambor donde se encuentra
la bala)
Estas dos posiciones, se generaran aleatoriamente.
- Funciones:
- disparar(): devuelve true si la bala coincide con la
posición actual
- siguienteBala(): cambia a la siguiente posición del tambor
- toString(): muestra información del revolver (posición
actual y donde está la bala)
- Jugador:
- Atributos
- id (representa el número del jugador, empieza en 1)
- nombre (Empezara con Jugador más su ID, “Jugador 1”
por ejemplo)
- vivo (indica si está vivo o no el jugador)
- Funciones:
- disparar(Revolver r): el jugador se apunta y se dispara, si
la bala se dispara, el jugador muere.
- Juego:
- Atributos:
- Jugadores (conjunto de Jugadores)
- Revolver
- Funciones:
- finJuego(): cuando un jugador muere, devuelve true
- ronda(): cada jugador se apunta y se dispara, se informara
del estado de la partida (El jugador se dispara, no ha muerto
en esa ronda, etc.)
* El número de jugadores será decidido por el usuario, pero debe ser entre 1
* y 6. Si no está en este rango, por defecto será 6.
* En cada turno uno de los jugadores, dispara el revólver, si este tiene la
* bala el jugador muere y el juego termina.
* NOTA: Aunque no lo haya comentado, recuerda usar una clase ejecutable
* para probarlo.
*/
static void Main(string[] args) {
Console.Clear();
int jugadores = Mensajes.requestInt("Ingrese cantidad de jugadores");
Juego juego = new Juego(jugadores);
String res = "";
while(!juego.finJuego()){
res += juego.ronda();
}
res += "\nGanador: " + juego.ganador();
res += "\nEl juego ha terminado";
Mensajes.info(res);
}
}
}
Y creo que en esta función están mis problemas:
Código C#:
Ver originalusing System;
namespace _09_CLASES
{
public class Metodos {
public static int generaNumeroAleatorio(int minimo, int maximo) {
Random r = new Random();
int num = r.Next((maximo - minimo + 1) + (minimo));
return num;
}
}
}
Esta es la original de java:
Código Java:
Ver originalpackage ejercicio;
public class Metodos {
/**
* Genera un numero aleatorio entre dos numeros
* @param minimo
* @param maximo
* @return
*/
public static int generaNumeroAleatorio(int minimo, int maximo) {
int num
= (int) Math.
floor(Math.
random() * (maximo
- minimo
+ 1) + (minimo
)); return num;
}
}
Esta es mi situación, espero sus respuestas y saludos.