リバーシの終了処理を作りたい(+パスの処理も)

スポンサーリンク
スポンサーリンク

終了の判断を作りたい。今はプレイヤー任せ。

スポンサーリンク

終了処理

終了処理の中に、パスの処理も含まれるみたいなので、どっちも作っていきたい。

終了条件は

  • マスが全部埋まる
    • 石数の多いほうが勝ち
    • 同数の場合は引き分け
  • それ以外
    • どちらか一色になる
    • どちらもパスする

これでいいみたい。

checkFinish()

void checkFinish (){
    int AllStone = BlackStoneCount + WhiteStoneCount;
    TextView ttv = parentView.findViewWithTag("turn");

    switch(AllStone){
        case(64):
            if(BlackStoneCount > WhiteStoneCount) {
                ttv.setText("黒の勝ちです");
            }else if(BlackStoneCount < WhiteStoneCount) {
                ttv.setText("白の勝ちです");
            }else{
                ttv.setText("引き分けです");
            }
            return;

        default:
             if(BlackStoneCount == 0){
                 ttv.setText("白の勝ちです");
                 return;
             }else if(WhiteStoneCount == 0){
                 ttv.setText("黒の勝ちです");
                 return;
             }

             if(!canPutStone()){
                 PlayerTurn = PlayerTurn * (-1);
                 setTurn();
                 scanBoard();
             }

             if(!canPutStone()){
                 if(BlackStoneCount > WhiteStoneCount) {
                     ttv.setText("黒の勝ちです");
                 }else if(BlackStoneCount < WhiteStoneCount) {
                     ttv.setText("白の勝ちです");
                 }else{
                     ttv.setText("引き分けです");
                 }
             }
    }
}
private boolean canPutStone(){
    String s;

    for(TextView[] cc : CellArray) {
        for (TextView c : cc) {
            s = c.getText().toString();

            if(s.equals("*")){ return true; }
        }
    }
    return false;
}

ちょっと冗長な気もする。上の終了条件を順にコード化しただけ。

最後2ブロックがパスの処理で、canPutStone()で置ける場所があるかの判定を行い、手番を入れ替え、置き石表示を更新し、もう一度置ける場所があるか判断する。これでずっと俺のターン時にも対応できてるはず。

なかなかサクサク行った。ただなんかリバーシ作るの飽きてきたな。

追記

思ったんだけど、マスが全部埋まる場合も、オール一色になる場合も、盤面に「*」は表示されていないわけで。ていうことは、パスと、終了だけでいいのでは…?

つまり

void checkFinish() {
    TextView ttv = parentView.findViewWithTag("turn");

    if (!canPutStone()) {
        PlayerTurn = PlayerTurn * (-1);
        setTurn();
        scanBoard();
    }

    if (!canPutStone()) {
        if (BlackStoneCount > WhiteStoneCount) {
            ttv.setText("黒の勝ちです");
        } else if (BlackStoneCount < WhiteStoneCount) {
            ttv.setText("白の勝ちです");
        } else {
            ttv.setText("引き分けです");
        }
    }
}

こうね。動いたよおい。ちくしょうめ。

参考

オセロの基本的ルール2(終局時)
オセロの基本的なルールその2。こちらは主に勝敗の決め方について紹介します。こちらの続きになります。基本的には、お互いが打っていき、全てのマスが埋まったら終局となる。ただ、埋まらずに終わる場合もある(後述)。対局が終わる条件は次の通りです。目
switch文 - 条件分岐 - Java入門
複数の選択肢を用意し一致する箇所の処理を実行するswitch文の使い方について確認します

コメント

タイトルとURLをコピーしました