マルバツゲームを作ってみた。
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のコードを理解することから始めてみる。
やってみて、他人と比べて初めて自分の位置がわかる。