読者です 読者をやめる 読者になる 読者になる

マルバツゲームを作ってみた。

Java

http://ja.doukaku.org/
でやっていたマルバツゲーム(ランダムプレーヤー同士)を作っては見たものの
先にJavaを挙げた方のあまりのレベルの違いにこちらでアップすることにします。
ああ、さらすのに強くならなきゃなあ。

日本語、英語が混ざってたり醜くてごめんなさい。

import java.lang.*;
import java.util.Random;

//Main method of OX game. Now it shows only flow of game.
class OXgame{
    public static void main(String[] args){
	int winOfFirst = 0;
	int winOfLast = 0;
	int draw = 0;
	String result;
	Judgment j = new Judgment();
	
	for(int i = 0; i < 10000; i++){
	    result = j.gameStart();
	    if(result.equals("o")) winOfFirst++;
	    else if(result.equals("x"))  winOfLast++;
	    else draw++;   		
	    // System.out.println(j.getResult());
	}
	System.out.println("Win of first is " + winOfFirst);
	System.out.println("Win of last is " + winOfLast);
	System.out.println("Draw is " + draw);
    }
}
//This class is abstract class to get moving of player.
//Each player have to extend this class
//Each player overwride these methods
abstract class AbstractPlayer{
   String turn;

    void setTurn(String turn){ this.turn = turn; }
    String getTurn(){ return turn; }
    abstract void attack(Goban go); 
}


								     
class Player extends AbstractPlayer{
    
    void attack(Goban go){
	//3未満の数をランダムで作成
	Random r = new Random();
	int h;
	int w;
       
	//loop by decision putting place
	while(true){
	h = r.nextInt(3);
	w = r.nextInt(3);
	if(go.getMark(h,w)) break;
	}
	go.setMark(h,w,turn);
    }
} 
	//This class is to manage games.
class Judgment{
    static final String FIRST_TURN = "o";
    static final String LAST_TURN = "x"; 
    static final String EMPTY = "-"; 
  
    String gameStart(){
	Goban go = new Goban();
	Player p1 = new Player();
	Player p2 = new Player();
	String flag = FIRST_TURN;
	
	//initialize goban
	go.initialize();
	//decide players turn
	this.decisionTurn(p1,p2);
	
	while(true){
	    //Now first or last.
	    if(flag.equals(p1.getTurn())) p1.attack(go);
	    else p2.attack(go);
	    //check result 
	    if(this.checkResult(flag,go)) return flag;    
	    //check mass is empty or not
	    if(this.isFull(go)) return EMPTY;
	    //opposite flag
	    flag = flag.equals(FIRST_TURN) ? LAST_TURN : FIRST_TURN;
	}
    }
    //decide players turn
    void decisionTurn(Player p1,Player p2){
	p1.setTurn(FIRST_TURN);	
	p2.setTurn(LAST_TURN);
    }
    
    //check mass is full or not 
    boolean isFull(Goban go){
	for(int i = 0; i < go.getHeight(); i++){
	    for(int j = 0; j < go.getWidth(); j++){
		if(EMPTY.equals(go.mass[i][j])) return false;
	    }
	}    
	return true;
    }
    
    //check result Which is win?
    //This checker is foolish and  not good.
    boolean checkResult(String flag,Goban go){
	int i;
	int j;

	//Tuple
	for(i = 0; i < go.getHeight(); i++){
	    for(j = 0; j < go.getWidth(); j++){
		if(!flag.equals(go.mass[i][j])) break;
		if(j == 2)  return true;
	    }
	}    
	//Column
	for(i = 0; i < go.getWidth(); i++){
	    for(j = 0; j < go.getWidth(); j++){
		if(!flag.equals(go.mass[j][i])) break;
		if(j == 2)  return true;
	    }
	} 
	//skew
	for(i = 0; i < go.getWidth(); i++){
	    if(!flag.equals(go.mass[i][i])) break;
	    if(i == 2)  return true;
	}
	if(flag.equals(go.mass[2][0]) && flag.equals(go.mass[1][1]) && flag.equals(go.mass[0][2])) return true;
	    
	return false;	    
    }
}

//マスの管理,出力,初期化をするクラス
class Goban{
    static final int HEIGHT = 3;
    static final int WIDTH = 3;
    String[][] mass = new String[HEIGHT][WIDTH];

    //initialization of mass
    void initialize(){
	for(int i = 0; i < HEIGHT;i++){
	    for(int j = 0; j < WIDTH; j++){
		mass[i][j] = "-";
	    }	  
	}
    }
    //output mass
    void writeGoban(){
	for(int i = 0; i < HEIGHT;i++){
	    for(int j = 0; j < WIDTH; j++){
		System.out.print(mass[i][j]);
	    }
	    System.out.println("");
	}  
    }    
    //check mass[h][w] is empty or not
    boolean getMark(int h,int w){ 
	return mass[h][w] == Judgment.EMPTY ? true : false; 
    }
    //set mark to mass[h][w]
    void setMark(int h,int w,String turn){ mass[h][w] = turn; }
    int getHeight(){ return HEIGHT; }
    int getWidth(){ return WIDTH; }
}

このプログラムのだめなとこ

  • Enumを使ってない。(ターンの部分は使ったほうが見やすい、変更しやすい)
  • 縦横斜めで3つそろってるか?の判定がアホすぎ。

の2点ですかね。ほかも多々あるでしょうが・・

まずは先にアップされてたJavaのコードを理解することから始めてみる。

やってみて、他人と比べて初めて自分の位置がわかる。