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

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

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

スポンサーリンク

終了処理

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

終了条件は

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

これでいいみたい。

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 文の使い方について解説します。 switch 文は対象の式を評価した値を、複数の値の候補と比較して一致するラベルの位置へ処理を移すために使います。 if 文でも同じことが可能ですが、対...

コメント

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