Object-oriented programming for the GAME

please format code with </> button * homework policy * asking questions

help. How do I get the text input code to choose one of the two options and show the game board

import java.util.Random;
import java.util.ArrayList;
import java.util.Scanner;

class Jugador {
    String nombre_;
    String color_;
    boolean logroForma1;
    boolean logroForma2;
    Jugador(String n,String c){
        this.nombre_ = n;
        this.color_ = c;
        this.logroForma1 = false;
        this.logroForma2 = false;
    }

    boolean gane() {
        return logroForma1 && logroForma2;
    }
}

class Ficha {
    Jugador jugador;
    String valor;
    Ficha(Jugador jugador, String tipo) {
        this.jugador = jugador;
        this.valor = tipo;
    }

    String getColor() {
        return jugador.color_;
    }

    void voltear() {
        if("D".equals(valor)){
            valor = "F";
        }else{
            valor = "D";
        }
    }

    @Override
    boolean equals(Object obj) {
        if(!(obj instanceof Ficha)){
            return false;
        }
        Ficha ficha = (Ficha)obj;
        if(!ficha.valor.equals(this.valor)){
            return false;
        }
        return ficha.jugador == this.jugador;
    }
}


class Cancha {
    static final String ANSI_BLACK = "\u001B[30m";
    Ficha [][] fichas;
    int dimencionX;
    int dimencionY;
    Cancha(int x, int y){
        fichas = new Ficha[x][y];
        dimencionX = x;
        dimencionY = y;
    }
    
    void llenarRandom(Jugador jugador, int cantidad){
        Random random = new Random();
        for(int i = 0;i < cantidad;i++){
            String tipo;
            if(random.nextBoolean()){
                tipo = "D";
            }else{
                tipo = "F";
            }
            Ficha ficha = new Ficha(jugador,tipo);
            int x,y;
            do{
                x = random.nextInt(dimencionX);
                y = random.nextInt(dimencionY);
                if(fichas[x][y] == null){
                    fichas[x][y] = ficha;
                    break;
                }
            }while(true);
        }
    }
    
    void llenarPredefinida1(Jugador jugador){
        Ficha ficha1 = new Ficha(jugador,"F");
        Ficha ficha2 = new Ficha(jugador,"F");
        Ficha ficha3 = new Ficha(jugador,"D");
        Ficha ficha4 = new Ficha(jugador,"F");
        fichas[0][0] = ficha1;
        fichas[0][3] = ficha2;
        fichas[2][1] = ficha3;
        fichas[2][2] = ficha4;
    }
    
    void llenarPredefinida2(Jugador jugador){
        Ficha ficha1 = new Ficha(jugador,"D");
        Ficha ficha2 = new Ficha(jugador,"F");
        Ficha ficha3 = new Ficha(jugador,"D");
        Ficha ficha4 = new Ficha(jugador,"F");
        fichas[0][2] = ficha1;
        fichas[3][0] = ficha2;
        fichas[3][1] = ficha3;
        fichas[3][2] = ficha4;
    }

    void mostrar() {
        System.out.print(" ");
        for(int i = 0;i < dimencionX;i++){
            System.out.print("|"+(i+1));
        }
        System.out.println("");
        String separacion = "";
        for(int i = 0;i < dimencionX;i++){
            separacion += "-+";
        }
        separacion +="-";
        System.out.println(separacion);
        for(int i = 0;i < dimencionX;i++){
            System.out.print(ANSI_BLACK + (char)(i+'A'));
            for(int j = 0;j < dimencionY;j++){
                Ficha ficha = fichas[i][j]; 
                if(ficha == null){
                    System.out.print("| ");
                }else{
                    System.out.print("|");
                    System.out.print(ficha.getColor() + ficha.valor);
                }
                
            }
            System.out.println("");
            System.out.println(separacion);
        }
    }
}

class Control {
    Jugador jugador1;
    Jugador jugador2;
    Cancha cancha;
    Control(Jugador jugador1, Jugador jugador2,Cancha cancha){
        this.jugador1 = jugador1;
        this.jugador2 = jugador2;
        this.cancha = cancha;
    }

    boolean hayGanador() {
        return jugador1.gane() || jugador2.gane();
    }
    
    int[] convertir(String es){
        int x = (int)(es.charAt(0)-'A');
        int y = (int)(es.charAt(1)-'1');
        return new int[]{x,y};
    }
    
    boolean entradaValida(String arg){
        char letra = arg.charAt(0);
        char numero = arg.charAt(1);
        if('A' <= letra && letra < (cancha.dimencionY+'A')){
            if('1' <= numero && numero < (cancha.dimencionX+'1')){
                return true;
            }
        }
        return false;
    }

    boolean jugadaValida(String jugada) {
        String [] res = jugada.split(" ");
        for(int i = 1;i < res.length;i++){
            if(!entradaValida(res[i])){
                return false;
            }
        }
        return true;
    }

    boolean jugadaPermitida(Jugador jugador, String jugada) {
        String [] res = jugada.split(" ");
        System.out.println(res.length);
        if("I".equals(res[0])){
            int a[] = convertir(res[1]);
            int x = a[0];
            int y = a[1];
            if(cancha.fichas[x][y] != null){
                if(cancha.fichas[x][y].jugador == jugador){
                    cancha.fichas[x][y].voltear();
                    return true;
                }
            }
        }
        if("M".equals(res[0])){
            int a[] = convertir(res[1]);
            int b[] = convertir(res[2]);
            int x1 = a[0];
            int y1 = a[1];
            int x2 = b[0];
            int y2 = b[1];
            Ficha  fichas [][] = cancha.fichas;
            if(fichas[x1][y1] != null){
                if(fichas[x1][y1].jugador == jugador){
                    if(Math.abs(x1-x2) <= 1 && Math.abs(y1-y2) <= 1){
                        Ficha ayuda = fichas[x2][y2];
                        fichas[x2][y2] = fichas[x1][y1];
                        fichas[x1][y1] = ayuda;
                        return true;
                    }
                }
            }
        }
        return false;
    }
    
    int[][][] ganadoras = {
        {
            {1,1,1,1},
            {0,0,0,0},
            {0,0,0,0},
            {0,0,0,0}
        },
        {
            {1,0,0,0},
            {1,0,0,0},
            {1,0,0,0},
            {1,0,0,0}
        },
        {
            {1,1,0,0},
            {1,1,0,0},
            {0,0,0,0},
            {0,0,0,0}
        }    
    };

    void jugadasGanadoras() {
        for(int i = 0;i < cancha.dimencionX;i++){
            for(int j = 0;j < cancha.dimencionY;j++){
                for (int ll = 0;ll < ganadoras.length;ll++) {
                    int[][] ganadora = ganadoras[ll];
                    Ficha ficha = null;
                    int conteo = 0;
                    for(int x = 0;x < ganadora.length && i+x < cancha.dimencionX;x++){
                        for(int y = 0;y < ganadora[0].length && j+y < cancha.dimencionY;y++){
                            if(ganadora[x][y] == 0){
                                continue;
                            }
                            Ficha esg = cancha.fichas[i+x][j+y];
                            if(esg == null){
                                continue;
                            }
                            if(ficha == null){
                                ficha = esg;
                                conteo++;
                            }else{
                                if(ficha.equals(esg)){
                                    conteo++;
                                }
                            }
                        }
                    }
                    if(conteo == 4){
                        if(ficha != null){
                          System.out.println(ficha.jugador.color_+"El jugador:"+ficha.jugador.nombre_);
                          System.out.println(ficha.jugador.color_+"logro una figura");
                          if(ll == 2){
                              ficha.jugador.logroForma2 = true;
                          }else{
                              ficha.jugador.logroForma1 = true;
                          }
                        }  
                    }
                }
            }
        }
    }
}


String ANSI_GREEN = "\u001B[32m";
String ANSI_BLUE = "\u001B[34m";

void draw(){
    ArrayList<String> usuarios = new ArrayList<String>();
    String nombre1 = "";
    String nombre2 = "";
    Scanner leer = new Scanner(System.in);
    boolean pasar = true;
    int opcion;
    String ayuda;
    do{
        System.out.println("ingresa la opcion");
        System.out.println("1) registrar un usuario");
        System.out.println("2) escoger un usuario");
        opcion = leer.nextInt();
        switch(opcion){
            case 1:{
                System.out.println("ingresa el nombre del jugador");
                ayuda = leer.next();
                System.out.println("usuario registrado");
                usuarios.add(ayuda);
                break;
            }
            case 2:{
                if(usuarios.size() >= 2){
                    System.out.println("Listando usuarios");
                    int i = 0;
                    for(String es:usuarios){
                        System.out.println(i + ") " + es);
                        i++;
                    }
                    System.out.println("ingresa dos numeros para escoger los usuarios");
                    int a,b;
                    a = leer.nextInt();
                    b = leer.nextInt();
                    if(a == b){
                        System.out.println("escoge dos usuarios diferentes");
                        break;
                    }
                    if(a >= usuarios.size() || b >= usuarios.size()){
                        System.out.println("ingresa indices dentro de la lista de usuarios");
                        break;
                    }
                    nombre1 = usuarios.get(a);
                    nombre2 = usuarios.get(b);
                    pasar = false;
                }else{
                    System.out.println("no hay usuarios suficientes registrados");
                }
                break;
            }
        }
    }while(pasar);
    
    System.out.println("los jugadores son");
    System.out.println(ANSI_GREEN+"jugador1:"+nombre1);
    System.out.println(ANSI_BLUE +"jugador2:"+nombre2);
    
    Jugador jugador1 = new Jugador(nombre1,ANSI_GREEN);
    Jugador jugador2 = new Jugador(nombre2,ANSI_BLUE);
    
    Cancha cancha = new Cancha(4,4);
    System.out.println("desea jugar con una cancha random?(S/N)");
    String n = leer.next();
    if("S".equals(n)){
        cancha.llenarRandom(jugador1, 4);
        cancha.llenarRandom(jugador2, 4);
    }else{
        cancha.llenarPredefinida2(jugador1);
        cancha.llenarPredefinida1(jugador2);
    }

    cancha.mostrar();
    
    Control control = new Control(jugador1,jugador2,cancha);
    boolean turno = true;
    Jugador jug;
    while(!control.hayGanador()){
        if(turno){
            jug = jugador1;
            System.out.println("El turno del jugador:"+jugador1.nombre_);
            System.out.println(jugador1.color_+"Escribe una jugada");
        }else{
            System.out.println("El turno del jugador:"+jugador2.nombre_);
            System.out.println(jugador2.color_+"Escribe una jugada");
            jug = jugador2;
        }
        String jugada;
        do{
            jugada = leer.nextLine();
            if(control.jugadaValida(jugada)){
                if(control.jugadaPermitida(jug,jugada)){
                    break;
                }
            }
            System.out.println(jug.color_+"jugada no valida");
        }while(true);
        turno=!turno;
        control.jugadasGanadoras();
        cancha.mostrar();
    }
    
    if(jugador1.gane()){
        System.out.println(jugador1.color_+"GANO el jugador:"+jugador1.nombre_);
    }else{
        System.out.println(jugador2.color_+"GANO el jugador:"+jugador2.nombre_);
    }
    leer.close();
}
1 Like

Hello!

please note that draw() loops automatically.

And the screen is not updated throughout but only at its end.

Because of this I guess that you don’t need while in your draw() function and that they hinder your Sketch from working

I can’t fully understand since I don’t know Spanish. My apologies.

Also you don’t use text() or key.

see Language Reference (API) \ Processing 3+

My Idea

I assume that you want to do a Menu followed by a game.

This is done with a state variable. It shows the Sketch whether we are

  • in state to show the menu or
  • play the game.

It is used in draw() but also in keyPressed() (and in mousePressed() if you had that).

Chrisir


final int MENU = 0; 
final int GAME = 1; 
int state = MENU; 

// one example what the user decides in the menu
String control1 = "0"; 

void setup() {
  size(1800, 900);
}

void draw() {
  background(0); 
  switch(state) {

  case MENU:
    background(0);
    text("=== MENU ===", 200, 100); 
    text("1. make...", 100, 200); 
    text("2. say...", 100, 400); 
    break;

  case GAME:
    background(110);
    text(control1, 200, 200); 
    break;
  }//switch
}//function 

void keyPressed() {

  switch(state) {

  case MENU:
    switch(key) {

    case '1':
      control1 = "GHlkd";
      state = GAME; 
      break; 

    case '2':
      control1 = "Here";
      state = GAME;
      break;
    }//inner switch 
    break;

  case GAME:
    // to do 
    state=MENU;
    key=0; // kill ESC
    break;
  }//switch
}//func
//