/* $Id: Bingo.java,v 0.1 2002/12/29 18:27:25 remm Exp $ * */ package Bingo; import java.io.*; import java.text.*; import java.util.logging.Logger; import java.util.logging.Level; import java.util.logging.LogManager; /* * @author Nobuhiko Ido */ public class bingoGame { private static final int DEFAULT_ORDER=5; protected static Logger logger = Logger.getLogger(bingoControl.class.getName()); private bingoPlayer player; private String operation; private String figure; private boolean sessionInvalid=false; private boolean playersInvalid=false; public static final int STATE_NULL =0; public static final int STATE_WAIT_OP =1; public static final int STATE_FIND_OP =2; public static final int STATE_THINK =3; public static final int STATE_WAIT_FIG =4; public static final int STATE_READY_FIG =5; public static final int STATE_WIN =6; public static final int STATE_LOOSE =7; public static final int STATE_DRAW =8; public static final int STATE_NO_SESSION_WIN=9; public static final int STATE_NO_SESSION_LOOSE=10; public static final int STATE_NO_SESSION_DRAW=11; public static final int STATE_NO_SESSION=12; public synchronized void stateTransfer(){ bingoPlayer opponent = player.getOpponent(); // (G0)DBG logger.fine("###D###top of stateTransfer:player="+player.getName()+",opponent="+opponent+",operation="+operation+",figure="+figure);//DBG int state = player.getState(); if(operation.equals("time_out")){ // (G1)session time out if(state == STATE_WAIT_OP){ // (G1.1)time out in STATE_WAIT_OP logger.fine("#D#(G1.1)timeout:player_name="+player.getName()+"\n");//DBG playersInvalid = true; }else{ if(opponent.getState() == STATE_NO_SESSION){ logger.fine("#D#(G1.2)timeout:opponent in STATE_NO_SESSION:player_name="+player.getName()+",opponent_name="+opponent.getName()+"\n");//DBG playersInvalid = true; }else{ logger.fine("#D#(G1.3)timeout:opponent not in STATE_NO_SESSION:player_name="+player.getName()+",opponent_name="+opponent.getName()+"\n");//DBG player.setState(STATE_NO_SESSION); } } return; } switch (state) { case STATE_NULL : // (G2)STATE_NULL logger.fine("#D#(G2)new player");//DBG if(operation.equals("registrate")){ logger.fine("#D#(G2)new player name="+player.getName());//DBG opponent=bingoPlayer.getWaitPlayer(); if(opponent == null){ // (G2.1)no opponent logger.fine("#D#(G2.1)no opponent");//DBG player.setState(STATE_WAIT_OP); }else{ // (G2.2)find opponent player.setOpponent(opponent); opponent.setOpponent(player); opponent.setState(STATE_FIND_OP); player.setState(STATE_THINK); player.createGame(DEFAULT_ORDER); opponent.createGame(DEFAULT_ORDER); logger.fine("#D#(G2.2)find opponent. opponent name="+opponent.getName());//DBG } } break; case STATE_WAIT_OP : // (G3)state_wait_op // opponent not yet, or illegal operation logger.fine("#D#(G3)wait opponent");//DBG player.setState(STATE_WAIT_OP); break; case STATE_FIND_OP : // (G3.5)state_find_op int op_state = opponent.getState(); logger.fine("#D#(G3.5)stateop. opponent state="+op_state);//DBG switch (op_state) { case STATE_THINK : case STATE_WAIT_FIG: // (G3.5.1)opponent on game logger.fine("#D#(G3.5.1)opponent on game");//DBG player.setState(STATE_THINK); break; case STATE_NO_SESSION: playersInvalid = true; sessionInvalid = true; break; default: // (G3.5.2)opponent illegal state logger.fine("#D#(G3.5.2)opponent illegal state");//DBG } break; case STATE_THINK : // (G4)state_think op_state = opponent.getState(); logger.fine("#D#(G4)state_think. op_state="+op_state);//DBG if(operation.equals("think")){ player.setFigure(figure); switch (op_state) { case STATE_THINK : case STATE_FIND_OP: case STATE_READY_FIG: // (G4.1)opponent not ready logger.fine("#D#(G4.1)opponent not ready.");//DBG player.setState(STATE_WAIT_FIG); break; case STATE_WAIT_FIG: // (G4.2)opponent ready logger.fine("#D#(G4.2)opponent ready.");//DBG boolean myBingo = player.updateGame(); boolean opBingo = opponent.updateGame(); if(!myBingo){ if(!opBingo){ // (G4.2.1)game on logger.fine("#D#(G4.2.1)game on.");//DBG player.setState(STATE_THINK); opponent.setState(STATE_READY_FIG); }else{ // (G4.2.2)loose logger.fine("#D#(G4.2.2)loose.");//DBG player.setState(STATE_NO_SESSION_LOOSE); opponent.setState(STATE_WIN); sessionInvalid = true; } }else{ if(!opBingo){ // (G4.2.3)win logger.fine("#D#(G4.2.3)win");//DBG player.setState(STATE_NO_SESSION_WIN); opponent.setState(STATE_LOOSE); sessionInvalid = true; }else{ // (G4.2.4)draw logger.fine("#D#(G4.2.4)draw.");//DBG player.setState(STATE_NO_SESSION_DRAW); opponent.setState(STATE_DRAW); sessionInvalid = true; } } break; case STATE_NO_SESSION: playersInvalid = true; sessionInvalid = true; break; default: } }else{ // (G4.3)illegal request logger.fine("#D#(G4.3)illegal request.");//DBG } break; case STATE_WAIT_FIG : // (G5)state_wait_fig op_state = opponent.getState(); logger.fine("#D#(G5)state_wait_fig. op_state="+op_state);//DBG switch (op_state) { case STATE_FIND_OP : case STATE_THINK : case STATE_READY_FIG : // (G5.1)opponent not ready logger.fine("#D#(G5.1)opponent not ready.");//DBG break; case STATE_WAIT_FIG: case STATE_NO_SESSION: sessionInvalid = true; playersInvalid = true; break; default: // (G5.2)illegal state } break; case STATE_READY_FIG : // (G6)state_ready_fig op_state = opponent.getState(); logger.fine("#D#(G6)state_ready_fig. op_state="+op_state);//DBG switch (op_state) { case STATE_THINK : case STATE_WAIT_FIG: // (G6.1)opponent ready logger.fine("#D#(G6.1)opponent ready.");//DBG player.setState(STATE_THINK); break; case STATE_NO_SESSION: sessionInvalid = true; playersInvalid = true; break; default: // (G6.2)illegal state } break; case STATE_WIN : // (G7)state_win logger.fine("#D#(G7)state_win.");//DBG sessionInvalid = true; playersInvalid = true; break; case STATE_LOOSE : // (G8)state_loose logger.fine("#D#(G8)state_loose.");//DBG sessionInvalid = true; playersInvalid = true; break; case STATE_DRAW : // (G9)state_draw logger.fine("#D#(G9)state_draw.");//DBG sessionInvalid = true; playersInvalid = true; break; default: // (G10)state error break; } } public void setPlayer(bingoPlayer player){ this.player = player; } public bingoPlayer getPlayer(){ return(this.player); } public void setOperation(String operation){ this.operation = operation; } public void setFigure(String figure){ this.figure = figure; } public boolean isSessionInvalid(){ return(this.sessionInvalid); } public boolean isPlayersInvalid(){ return(this.playersInvalid); } }