Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package juego;
- /**
- * Juego Reversi
- *
- * Reglas:
- *
- * https://es.wikipedia.org/wiki/Reversi https://es.wikihow.com/jugar-a-Othello
- *
- */
- public class Reversi {
- private Casillero tablero[][];
- private String jugadorConFichasNegras;
- private String jugadorConFichasBlancas;
- private boolean turnoDeFichasNegras = true;
- private int fichasTotales = 0;
- private int tamanio;
- /**
- * pre : 'dimension' es un número par, mayor o igual a 4. post: empieza el
- * juego entre el jugador que tiene fichas negras, identificado como
- * 'fichasNegras' y el jugador que tiene fichas blancas, identificado como
- * 'fichasBlancas'. El tablero tiene 4 fichas: 2 negras y 2 blancas. Estas
- * fichas están intercaladas en el centro del tablero.
- *
- * @param dimensionTablero
- * : cantidad de filas y columnas que tiene el tablero.
- * @param fichasNegras
- * : nombre del jugador con fichas negras.
- * @param fichasBlancas
- * : nombre del jugador con fichas blancas.
- */
- public Reversi(int dimensionTablero, String fichasNegras,
- String fichasBlancas) {
- if ((dimensionTablero >= 4 && dimensionTablero <= 10)
- && dimensionTablero % 2 == 0) {
- tablero = new Casillero[dimensionTablero + 2][dimensionTablero + 2];
- for (int i = 0; i < tablero.length; i++) {
- for (int j = 0; j < tablero[i].length; j++) {
- tablero[i][j] = Casillero.LIBRE;
- }
- }
- tablero[(dimensionTablero / 2)][(dimensionTablero / 2) - 1] = Casillero.NEGRAS;
- tablero[(dimensionTablero / 2) - 1][(dimensionTablero / 2) - 1] = Casillero.BLANCAS;
- tablero[dimensionTablero / 2][dimensionTablero / 2] = Casillero.BLANCAS;
- tablero[(dimensionTablero / 2) - 1][(dimensionTablero / 2)] = Casillero.NEGRAS;
- fichasTotales = dimensionTablero * dimensionTablero;
- tamanio = tablero.length - 2;
- } else {
- Error cantidadDeFilasYColumnasErronea = new Error(
- "La dimensión del tablero es incorrecta");
- throw cantidadDeFilasYColumnasErronea;
- }
- if (fichasBlancas.equals(fichasNegras) || fichasNegras.equals(fichasBlancas) ||
- fichasBlancas.equals("") || fichasNegras.equals("")) {
- Error nombreDeJugadorErronea = new Error(
- "El nombre de unos de los jugadores no es valido");
- throw nombreDeJugadorErronea;
- } else {
- jugadorConFichasBlancas = fichasBlancas;
- jugadorConFichasNegras = fichasNegras;
- }
- }
- /**
- * post: devuelve la cantidad de filas que tiene el tablero.
- */
- public int contarFilas() {
- return tamanio;
- }
- /**
- * post: devuelve la cantidad de columnas que tiene el tablero.
- */
- public int contarColumnas() {
- return tamanio;
- }
- /**
- * post: devuelve el nombre del jugador que debe colocar una ficha o null si
- * terminó el juego.
- */
- public String obtenerJugadorActual() {
- String jugadorActual = null;
- if (turnoDeFichasNegras) {
- jugadorActual = jugadorConFichasNegras;
- } else if (!turnoDeFichasNegras) {
- jugadorActual = jugadorConFichasBlancas;
- }
- return jugadorActual;
- }
- /**
- * pre : fila está en el intervalo [1, contarFilas()], columnas está en el
- * intervalo [1, contarColumnas()]. post: indica quién tiene la posesión del
- * casillero dado por fila y columna.
- *
- * @param fila
- * @param columna
- */
- public Casillero obtenerCasillero(int fila, int columna) {
- int columnaCorregida = columna - 1;
- int filaCorregida = fila - 1;
- return tablero[filaCorregida][columnaCorregida];
- }
- /**
- *
- * @param fila
- * @param columna
- * @return
- */
- public boolean puedeColocarFicha(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- boolean pusoFicha = false;
- if (tablero[filaCorregida][columnaCorregida] == Casillero.LIBRE) {
- if (sePuedeColocarFichaAlOeste(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- if (sePuedeColocarFichaAlNorte(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- if (sePuedeColocarFichaAlNoroeste(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- if (sePuedeColocarFichaAlSur(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- if (sePuedeColocarFichaAlEste(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- if (sePuedeColocarFichaAlSudeste(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- if (sePuedeColocarFichaAlSudoeste(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- if (sePuedeColocarFichaAlNoreste(filaCorregida, columnaCorregida)) {
- pusoFicha = true;
- }
- }
- return pusoFicha;
- }
- /**
- * pre : la posición indicada por (fila, columna) puede ser ocupada por una
- * ficha. 'fila' está en el intervalo [1, contarFilas()]. 'columna' está en
- * el intervalor [1, contarColumnas()]. y aún queda un Casillero.VACIO en la
- * columna indicada. post: coloca una ficha en la posición indicada.
- *
- * @param fila
- * @param columna
- */
- public void colocarFicha(int fila, int columna) {
- int columnaCorregida = columna - 1;
- int filaCorregida = fila - 1;
- if (puedeColocarFicha(fila, columna)) {
- if (turnoDeFichasNegras) {
- tablero[filaCorregida][columnaCorregida] = Casillero.NEGRAS;
- if (sePuedeColocarFichaAlOeste(filaCorregida, columnaCorregida)) {
- colocarFichaAlOeste(fila, columna);
- }
- if (sePuedeColocarFichaAlNorte(filaCorregida, columnaCorregida)) {
- colocarFichaAlNorte(fila, columna);
- }
- if (sePuedeColocarFichaAlNoroeste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlNoroeste(fila, columna);
- }
- if (sePuedeColocarFichaAlEste(filaCorregida, columnaCorregida)) {
- colocarFichaAlEste(fila, columna);
- }
- if (sePuedeColocarFichaAlSur(filaCorregida, columnaCorregida)) {
- colocarFichaAlSur(fila, columna);
- }
- if (sePuedeColocarFichaAlSudeste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlSudeste(fila, columna);
- }
- if (sePuedeColocarFichaAlSudoeste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlSudoeste(fila, columna);
- }
- if (sePuedeColocarFichaAlNoreste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlNoreste(fila, columna);
- }
- turnoDeFichasNegras = !turnoDeFichasNegras;
- } else if (!turnoDeFichasNegras) {
- tablero[filaCorregida][columnaCorregida] = Casillero.BLANCAS;
- if (sePuedeColocarFichaAlOeste(filaCorregida, columnaCorregida)) {
- colocarFichaAlOeste(fila, columna);
- }
- if (sePuedeColocarFichaAlNorte(filaCorregida, columnaCorregida)) {
- colocarFichaAlNorte(fila, columna);
- }
- if (sePuedeColocarFichaAlNoroeste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlNoroeste(fila, columna);
- }
- if (sePuedeColocarFichaAlEste(filaCorregida, columnaCorregida)) {
- colocarFichaAlEste(fila, columna);
- }
- if (sePuedeColocarFichaAlSur(filaCorregida, columnaCorregida)) {
- colocarFichaAlSur(fila, columna);
- }
- if (sePuedeColocarFichaAlSudeste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlSudeste(fila, columna);
- }
- if (sePuedeColocarFichaAlSudoeste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlSudoeste(fila, columna);
- }
- if (sePuedeColocarFichaAlNoreste(filaCorregida,
- columnaCorregida)) {
- colocarFichaAlNoreste(fila, columna);
- }
- turnoDeFichasNegras = !turnoDeFichasNegras;
- }
- }
- }
- /**
- * post: devuelve la cantidad de fichas negras en el tablero.
- */
- public int contarFichasNegras() {
- int cantidadDeFichasNegras = 0;
- for (int i = 0; i < tablero.length; i++) {
- for (int j = 0; j < tablero[i].length; j++) {
- if (tablero[i][j] == Casillero.NEGRAS) {
- cantidadDeFichasNegras++;
- }
- }
- }
- return cantidadDeFichasNegras;
- }
- /**
- * post: devuelve la cantidad de fichas blancas en el tablero.
- */
- public int contarFichasBlancas() {
- int cantidadDeFichasBlancas = 0;
- for (int i = 0; i < tablero.length; i++) {
- for (int j = 0; j < tablero[i].length; j++) {
- if (tablero[i][j] == Casillero.BLANCAS) {
- cantidadDeFichasBlancas++;
- }
- }
- }
- return cantidadDeFichasBlancas;
- }
- /**
- * post: indica si el juego terminó porque no existen casilleros vacíos o
- * ninguno de los jugadores puede colocar una ficha.
- */
- public boolean termino() {
- boolean terminoElJuego = false;
- if (fichasTotales == (contarFichasBlancas() + contarFichasNegras())
- || (contarFichasBlancas() == 0 || contarFichasNegras() == 0) ||
- !puedeColocarElJugadorActual()) {
- terminoElJuego = true;
- }
- return terminoElJuego;
- }
- /**
- * post: indica si el juego terminó y tiene un ganador.
- */
- public boolean hayGanador() {
- boolean hayUnGanador;
- if (ganoElJugadorDeLasFichasBlancas()
- || ganoElJugadorDeLasFichasNegras() && termino() == true) {
- hayUnGanador = true;
- } else {
- hayUnGanador = false;
- }
- return hayUnGanador;
- }
- /**
- * pre : el juego terminó. post: devuelve el nombre del jugador que ganó el
- * juego.
- */
- public String obtenerGanador() {
- String ganador = null;
- if (termino() == true && hayGanador() == true) {
- if (ganoElJugadorDeLasFichasNegras()) {
- ganador = jugadorConFichasNegras;
- } else if (ganoElJugadorDeLasFichasBlancas()) {
- ganador = jugadorConFichasBlancas;
- }
- }
- return ganador;
- }
- /**
- * post: Devuelve si gano el jugador de las fichas negras.
- */
- private boolean ganoElJugadorDeLasFichasNegras() {
- boolean ganoLasFichasNegras = false;
- if ((contarFichasBlancas() < contarFichasNegras() || contarFichasBlancas() == 0)
- && termino() == true) {
- ganoLasFichasNegras = true;
- }
- return ganoLasFichasNegras;
- }
- /**
- * post: Devuelve si gano el jugador de las fichas blancas.
- */
- private boolean ganoElJugadorDeLasFichasBlancas() {
- boolean ganoLasFichasBlancas = false;
- if ((contarFichasNegras() < contarFichasBlancas() || contarFichasNegras() == 0)
- && termino() == true) {
- ganoLasFichasBlancas = true;
- }
- return ganoLasFichasBlancas;
- }
- /**
- * post: Evalua cual es el color de la ficha que esta
- * jugando actualmente.
- */
- private Casillero colorDeLaFichaActual() {
- Casillero colorActual = Casillero.NEGRAS;
- if (!turnoDeFichasNegras) {
- colorActual = Casillero.BLANCAS;
- }
- return colorActual;
- }
- /**
- * post: Evalua si se puede colocar ficha al Oeste de la posicion
- */
- private boolean sePuedeColocarFichaAlOeste(int fila, int columna) {
- int columnaActual = columna + 1;
- boolean puedeColocar = false;
- while (columnaActual <= tamanio
- && tablero[fila][columnaActual] != Casillero.LIBRE
- && tablero[fila][columnaActual] != colorDeLaFichaActual()) {
- columnaActual++;
- if (tablero[fila][columnaActual] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- /**
- * post: Evalua si se puede colocar ficha al Norte de la posicion
- */
- private boolean sePuedeColocarFichaAlNorte(int fila, int columna) {
- int filaActual = fila + 1;
- boolean puedeColocar = false;
- while (filaActual <= tamanio
- && tablero[filaActual][columna] != Casillero.LIBRE
- && tablero[filaActual][columna] != colorDeLaFichaActual()) {
- filaActual++;
- if (tablero[filaActual][columna] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- /**
- * post: Evalua si se puede colocar ficha al sur de la posicion
- */
- private boolean sePuedeColocarFichaAlNoroeste(int fila, int columna) {
- int filaActual = fila + 1;
- int columnaActual = columna + 1;
- boolean puedeColocar = false;
- while (filaActual <= tamanio && columnaActual <= tamanio
- && tablero[filaActual][columnaActual] != Casillero.LIBRE
- && tablero[filaActual][columnaActual] != colorDeLaFichaActual()) {
- filaActual++;
- columnaActual++;
- if (tablero[filaActual][columnaActual] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- private boolean sePuedeColocarFichaAlSur(int fila, int columna) {
- boolean puedeColocar = false;
- int filaActual = fila - 1;
- while (filaActual > 0
- && tablero[filaActual][columna] != Casillero.LIBRE
- && tablero[filaActual][columna] != colorDeLaFichaActual()) {
- filaActual--;
- if (tablero[filaActual][columna] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- /**
- * post: Evalua si se puede colocar ficha al este de la posicion
- */
- private boolean sePuedeColocarFichaAlEste(int fila, int columna) {
- int columnaActual = columna - 1;
- boolean puedeColocar = false;
- while (columnaActual > 0
- && tablero[fila][columnaActual] != Casillero.LIBRE
- && tablero[fila][columnaActual] != colorDeLaFichaActual()) {
- columnaActual--;
- if (tablero[fila][columnaActual] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- /**
- * post: Evalua si se puede colocar ficha al sudeste de la posicion
- */
- private boolean sePuedeColocarFichaAlSudeste(int fila, int columna) {
- boolean puedeColocar = false;
- int columnaActual = columna - 1;
- int filaActual = fila - 1;
- while (columnaActual > 0 && filaActual > 0
- && tablero[filaActual][columnaActual] != Casillero.LIBRE
- && tablero[filaActual][columnaActual] != colorDeLaFichaActual()) {
- columnaActual--;
- filaActual--;
- if (tablero[filaActual][columnaActual] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- /**
- * post: Evalua si se puede colocar ficha al Sudoeste de la posicion
- */
- private boolean sePuedeColocarFichaAlSudoeste(int fila, int columna) {
- boolean puedeColocar = false;
- int columnaActual = columna + 1;
- int filaActual = fila - 1;
- while (columnaActual < tamanio && filaActual > 0
- && tablero[filaActual][columnaActual] != Casillero.LIBRE
- && tablero[filaActual][columnaActual] != colorDeLaFichaActual()) {
- columnaActual++;
- filaActual--;
- if (tablero[filaActual][columnaActual] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- /**
- * post: Evalua si se puede colocar ficha al Noreste de la posicion
- */
- private boolean sePuedeColocarFichaAlNoreste(int fila, int columna) {
- boolean puedeColocar = false;
- int columnaActual = columna - 1;
- int filaActual = fila + 1;
- while (columnaActual > 0 && filaActual < tamanio
- && tablero[filaActual][columnaActual] != Casillero.LIBRE
- && tablero[filaActual][columnaActual] != colorDeLaFichaActual()) {
- columnaActual--;
- filaActual++;
- if (tablero[filaActual][columnaActual] == colorDeLaFichaActual()) {
- puedeColocar = true;
- }
- }
- return puedeColocar;
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al oeste
- */
- private void colocarFichaAlOeste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (columnaCorregida + j < tamanio
- && tablero[filaCorregida][columnaCorregida + j] != colorDeLaFichaActual()) {
- tablero[filaCorregida][columnaCorregida + j] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al norte
- */
- private void colocarFichaAlNorte(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (filaCorregida + j < tamanio
- && tablero[filaCorregida + j][columnaCorregida] != colorDeLaFichaActual()) {
- tablero[filaCorregida + j][columnaCorregida] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al noroeste
- */
- private void colocarFichaAlNoroeste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (filaCorregida + j < tamanio
- && columnaCorregida + j < tamanio
- && tablero[filaCorregida + j][columnaCorregida + j] != colorDeLaFichaActual()) {
- tablero[filaCorregida + j][columnaCorregida + j] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al este
- */
- private void colocarFichaAlEste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (tablero[filaCorregida][columnaCorregida - j] != colorDeLaFichaActual()
- && columnaCorregida - j > 0) {
- tablero[filaCorregida][columnaCorregida - j] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al sur
- */
- private void colocarFichaAlSur(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (filaCorregida - j >= 0
- && tablero[filaCorregida - j][columnaCorregida] != colorDeLaFichaActual()) {
- tablero[filaCorregida - j][columnaCorregida] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al sudeste
- */
- private void colocarFichaAlSudeste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (tablero[filaCorregida - j][columnaCorregida - j] != colorDeLaFichaActual()
- && filaCorregida - j > 0 && columnaCorregida - j > 0) {
- tablero[filaCorregida - j][columnaCorregida - j] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al sudoeste
- */
- private void colocarFichaAlSudoeste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (tablero[filaCorregida - j][columnaCorregida + j] != colorDeLaFichaActual()
- && filaCorregida - j > 0 && columnaCorregida + j < tamanio) {
- tablero[filaCorregida - j][columnaCorregida + j] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: si la posicion del casillero es valida coloca ficha en
- * el casillero posicionado al Noreste
- */
- private void colocarFichaAlNoreste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- int j = 1;
- while (filaCorregida + j < tamanio
- && columnaCorregida - j > 0
- && tablero[filaCorregida + j][columnaCorregida - j] != colorDeLaFichaActual()) {
- tablero[filaCorregida + j][columnaCorregida - j] = colorDeLaFichaActual();
- j++;
- }
- }
- /**
- * post: devuelve si los dos jugadores pueden colocar ficha.
- */
- private boolean puedeColocarElJugadorActual() {
- boolean puedenColocarLosJugadores [][];
- boolean puedeColocar = true;
- int jugadasNoValidas = 0;
- puedenColocarLosJugadores = new boolean[tamanio][tamanio];
- for (int i = 1; i < tamanio; i++) {
- for (int j = 1; j < tamanio; j++) {
- puedenColocarLosJugadores[i][j] = true;
- }
- }
- for (int i = 1; i < tamanio; i++) {
- for (int j = 1; j < tamanio; j++) {
- if (!puedeColocarFicha(i, j)){
- puedenColocarLosJugadores[i][j] = false;
- jugadasNoValidas++;
- }
- }
- }
- if (jugadasNoValidas == ((tamanio*tamanio) - (contarFichasBlancas() + contarFichasNegras()))){
- puedeColocar = false;
- }
- return puedeColocar;
- }
- /*
- * metodo utilizado para hacer pruebas.
- */
- public void setCasillero(int fila, int columna, Casillero casilleroColor) {
- tablero[fila - 1][columna - 1] = casilleroColor;
- }
- }
Add Comment
Please, Sign In to add comment