Skip to content
Snippets Groups Projects
Select Git revision
  • 4ff440eaac9aee21bd0a6c7f5ce7927ee4cd9b94
  • master default
2 results

objects-9.c

Blame
  • Forked from Peter Gerwinski / hp
    Source project has a limited visibility.
    TicTacToe.java 4.71 KiB
    package tictactoePraktikum;
    
    /**TicTacToe Spiel
     * 
     * @author Prof. Dr. Christian Weidauer (Hochschule Bochum)
     * @author Volker Schrmann (Hochschule Bochum)
     * Vertiefung Informatik
     *
     */
    public class TicTacToe {
    	
    	private TicTacToeUI ui;
    	
    	final static int ENTSCHIEDEN = 1;
    	final static int UNENTSCHIEDEN = 2;
    	final static int LAEUFT = 3;
    	final static int ABGEBROCHEN = 4;
    
    	private char[] spielerZeichen = new char[2];
    	private char[][] spielbrett = new char [3][3];
    	
    	
    	public TicTacToe(TicTacToeUI ui){
    
    		this.ui = ui;
    		
    		spielerZeichen[0] = 'X';
    		spielerZeichen[1] = 'O';
    		
    		resetSpiel();
    	}
    	
    	/**
    	 * Setzt das Spielfeld wieder in den Ursprungszustand.
    	 */
    	void resetSpiel(){
    		
    		for(char zeile[]: spielbrett )
    		{
    			for (int i = 0; i < zeile.length; i++) {
    				zeile[i] = ' ';				
    			}
    		}
    	}
    	
    	/**
    	 * Zufllige Ermittlung wer das Spiel beginnt.
    	 * @return Array-Index des Spielers, der beginnt
    	 */
    	static int getStartSpieler(){
    		
    		return (int) Math.round( Math.random());
    	}
    	
    	/**
    	 * Bestimmt den Spieler, der als nchstes am Zug ist.
    	 * @param aktuellerSpieler Spieler, der aktuell am Zug ist
    	 * @return Array-Index des nchsten Spielers
    	 */
    	int getNaechstenSpieler(int aktuellerSpieler){
    		
    		return (aktuellerSpieler + 1) % 2;
    	}
    	
    	/**
    	 * Testet, ob das adressierte Feld im Array vorkommt und ob es frei ist.
    	 * @param zeile Zeile des Zuges
    	 * @param spalte Spalte des Zuges
    	 * @return true, falls es vorkommt und frei ist - falls es nicht vorkommt oder belegt ist
    	 */
    	boolean isGueltig(int zeile, int spalte){
    		
    		if(spalte>2||spalte<0
    				||zeile>2||zeile<0
    				||spielbrett[zeile] [spalte] != ' '){
    
    			return false;
    		}
    		else{
    
    			return true;
    		}
    	}
    	
    	/**
    	 * Ist das Spiel unentschieden?
    	 * @return true, falls unentschieden
    	 */
    	boolean isUnentschieden(){
    		
    		boolean unentschieden = true;
    		
    		for (char[] zeile:spielbrett) {
    			for(char spielfeld:zeile){
    		
    				if(spielfeld == ' ')
    					unentschieden = false;
    			}
    		}
    		
    		return unentschieden;
    	}
    	
    	/**
    	 * Bestimmt den aktuellen Spielzustand
    	 * @return
    	 * LAEUFT: Weitere Spielzge mglich
    	 * UNENTSCHIEDEN: Spiel ohne Sieger beendet
    	 * ENTSCHIEDEN: Es gibt einen Gewinner
    	 */
    	int getSpielzustand(){
    		
    		int status = LAEUFT;
    		
    		if (getGewinner() != ' '){
    			
    			return ENTSCHIEDEN;
    		}
    		
    		if (isUnentschieden()){
    			
    			return UNENTSCHIEDEN;
    		}
    		
    		return status;
    	}
    	
    	/**
    	 * Fhrt fr den bergebenen Spieler einen Spielzug durch.
    	 * @param aktuellerSpieler  Spieler, der aktuell am Zug ist
    	 * @return Spielzustand
    	 */
    	int spielzug(int aktuellerSpieler){
    
    		int aktuelleZeile = 0;
    		int aktuelleSpalte= 0;
    		do {
    
    			String zugEingabe = ui.getZugeingabe(spielbrett, spielerZeichen[aktuellerSpieler]);
    
    			if (zugEingabe.equalsIgnoreCase("a")){ 
    				
    				return  ABGEBROCHEN;
    				}
    
    			try{
    				aktuelleZeile = Integer.parseInt(zugEingabe)/10;
    				aktuelleSpalte= Integer.parseInt(zugEingabe)%10;
    			}
    			catch (NumberFormatException nfe){}
    			
    			
    		} while (!isGueltig(aktuelleZeile, aktuelleSpalte));
    		
    		spielbrett[aktuelleZeile][aktuelleSpalte] = spielerZeichen[aktuellerSpieler];
    
    		return getSpielzustand();
    	}
    	
    	/**
    	 * Fhrt ein komplettes Spiel durch.
    	 * @return Spielzustand
    	 */
    	public int spiel(int startSpieler) {
    				
    		resetSpiel();
    
    		int spielzustand = LAEUFT;
    				
    		int aktuellerSpieler = startSpieler; 
    
    		do {
    			
    			spielzustand = spielzug(aktuellerSpieler);
    					
    			aktuellerSpieler = getNaechstenSpieler(aktuellerSpieler); 
    					
    		
    		} while (spielzustand == LAEUFT);
    				
    		return spielzustand;
    	}
    	
    	/**
    	 * Prft ob es einen Gewinner gibt und wer es ist.
    	 * @return Zeichen des Gewinners oder Leerzeichen
    	 */
    	public char getGewinner(){
    		
    		char gewinner = ' ';
    		
    		for(char spieler: spielerZeichen ){
    			
    			for(int i=0; i<3; i++){
    						
    				if ((spielbrett[i][0] + spielbrett[i][1] + 
    						spielbrett[i][0] == 3*spieler) ||
    						(spielbrett[0][i] + spielbrett[1] [i] + 
    								spielbrett[i][2] == 3*spieler)||
    								(spielbrett[0][0] + spielbrett[1][1] + spielbrett[2][2] == 
    									3*spieler) 
    									||(spielbrett[2][0] + spielbrett[1][1] + spielbrett[0][2] == 
    										3*spieler)
    						) {
    				
    					gewinner = spieler;
    					break;
    				}
    			}
    		
    		}
    		
    		return gewinner;
    	}
    	
    	/**
    	 * Gibt das Spielbrett zurck
    	 * @return Spielbrett
    	 */
    	public char[][] getSpielbrett() {
    		return spielbrett;
    	}
    
    	/**
    	 * Setzt das Spielbrett auf die bergebenen Werte.
    	 * @param spielbrett
    	 */
    	public void setSpielbrett(char[][] spielbrett) {
    		this.spielbrett = spielbrett;
    	}
    }