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;
- jugadorConFichasBlancas = fichasBlancas;
- jugadorConFichasNegras = fichasNegras;
- tamanio = tablero.length - 2;
- } else {
- Error cantidadDeFilasYColumnasErronea = new Error(
- "La dimensión del tablero es incorrecta");
- throw cantidadDeFilasYColumnasErronea;
- }
- }
- /**
- * 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;
- }
- }
- 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);
- }
- 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);
- }
- 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)) {
- 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;
- }
- private Casillero colorDeLaFichaActual() {
- Casillero colorActual = Casillero.NEGRAS;
- if (!turnoDeFichasNegras) {
- colorActual = Casillero.BLANCAS;
- }
- return colorActual;
- }
- private boolean sePuedeColocarFichaAlOeste(int fila, int columna) {
- boolean puedeColocar = false;
- if (columna < contarColumnas() - 1
- && tablero[fila][columna + 1] != Casillero.LIBRE
- && tablero[fila][columna + 1] != colorDeLaFichaActual()) {
- for (int x = 0; x + columna < contarColumnas() - 1; x++) {
- if (tablero[fila][columna + 1] != tablero[fila][columna
- + (2 + x)]
- &&
- tablero[fila][columna + (2 + x)] != Casillero.LIBRE) {
- puedeColocar = true;
- }
- }
- }
- return puedeColocar;
- }
- private boolean sePuedeColocarFichaAlNorte(int fila, int columna) {
- boolean puedeColocar = false;
- if (fila < contarFilas() - 1
- && tablero[fila + 1][columna] != Casillero.LIBRE
- && tablero[fila + 1][columna] != colorDeLaFichaActual()) {
- for (int x = 0; x + fila < contarFilas() - 1; x++) {
- if (tablero[fila + 1][columna] != tablero[fila + (2 + x)][columna]
- && tablero[fila + (2 + x)][columna] != Casillero.LIBRE) {
- puedeColocar = true;
- }
- }
- }
- return puedeColocar;
- }
- private boolean sePuedeColocarFichaAlNoroeste(int fila, int columna) {
- boolean puedeColocar = false;
- if (columna < contarColumnas() - 1 && fila < contarFilas() - 1
- && tablero[fila + 1][columna + 1] != Casillero.LIBRE
- && tablero[fila + 1][columna + 1] != colorDeLaFichaActual()) {
- for (int j = 0; j + fila < contarFilas() - 1; j++) {
- for (int i = 0; i + columna < contarColumnas() - 1; i++) {
- if (tablero[fila + 1][columna + 1] != tablero[fila + 2][columna + 2]
- && tablero[fila + (2 + j)][columna + (2 + i)] != Casillero.LIBRE) {
- puedeColocar = true;
- }
- }
- }
- }
- return puedeColocar;
- }
- private void colocarFichaAlOeste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- for (int j = 1; j < tamanio - columna; j++) {
- if (tablero[filaCorregida][columnaCorregida + j] != colorDeLaFichaActual()) {
- tablero[filaCorregida][columnaCorregida + j] = colorDeLaFichaActual();
- } else if (tablero[filaCorregida][columnaCorregida + j] == colorDeLaFichaActual()
- || tablero[filaCorregida][columnaCorregida + j] == Casillero.LIBRE) {
- j = tamanio;
- }
- }
- }
- private void colocarFichaAlNorte(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- for (int j = 1; j < tamanio - fila; j++) {
- if (tablero[filaCorregida + j][columnaCorregida] != colorDeLaFichaActual()) {
- tablero[filaCorregida + j][columnaCorregida] = colorDeLaFichaActual();
- } else if (tablero[filaCorregida + j][columnaCorregida] == colorDeLaFichaActual()
- || tablero[filaCorregida + j][columnaCorregida] == Casillero.LIBRE) {
- j = tamanio;
- }
- }
- }
- private void colocarFichaAlNoroeste(int fila, int columna) {
- int filaCorregida = fila - 1;
- int columnaCorregida = columna - 1;
- for (int j = 1; j + fila < tamanio - fila; j++) {
- if (tablero[filaCorregida + j][columnaCorregida + j] != colorDeLaFichaActual()) {
- tablero[filaCorregida + j][columnaCorregida + j] = colorDeLaFichaActual();
- } else if (tablero[filaCorregida + j][columnaCorregida + j] == colorDeLaFichaActual()
- || tablero[filaCorregida + j][columnaCorregida + j] == Casillero.LIBRE) {
- j = tamanio;
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment