テスト駆動開発 プログラミング Java

2進数を使うと判定がシンプルになる!(じゃんけんプログラム編)

投稿日:

概要

仕事で2進数を使った判定処理について学んだので共有したくて執筆しました。
仕事上で設計したロジックは本記事で紹介するものより複雑でしたが、本質的な部分は変わらないので使って頂けると思います。

説明用にじゃんけんの判定ロジックを実装例としました。
テストコードも作成しましたので、併せてご覧頂ければと思います。

2進数についてはご存じである前提で進めさせていただきます。
もし理解に不安がありましたら、以下のサイトがわかり易いので参照ください。
ゆるゆるプログラミング – ビット演算

仕様

  • じゃんけんの判定は3人以上に対応できること。
  • 勝ったプレイヤーは勝ち数を保持すること。

実装

Handクラス

じゃんけんの手を保持するクラスです。

  • じゃんけんの手
  • 2進数で表現しています。

Playerクラス

じゃんけんのプレイヤークラスです。
じゃんけんの手と勝ち数を保持します。

  • notifyResultメソッド
  • 進行役から勝ちを宣言された場合、自身の勝ち数を1つ増やします。

GameMasterクラス

じゃんけんゲームの進行役です。
じゃんけんの結果を判定します。

  • judgeメソッド
  • プレイヤー全員の手をビットフラグでresult変数に保持します。
    – 全員が違う手を出せば、0b111になります。
    – 勝敗の決まる手の組み合わせであれば、いずれかが0となります(※勝ち判定パターンのいずれかに該当)
    – 勝った手を出したプレイヤーには、勝ち数を増やすように勝ちを通知します。

  • winHandメソッド
  • じゃんけんした結果がいずれかの勝ちパターンになる場合、勝ちになる手を返します。
    誰も勝っていない場合、0を返すことで誰も勝ち判定になりません。

プレイヤーの人数がどれだけ増えても、result変数の結果が和集合で集約されるだけなので、判定するプレイヤーの手をequalsで判定したりする必要が無く、非常にシンプルになります!

テストコード

TestGameMaster

主に進行役(GameMasterクラス)のじゃんけん判定(judgeメソッド)のテストコードです。
プレイヤーが2人の場合と3人の場合でテストケースを作成しています。

  • 自分の手を決める
  • Handクラスの手がプレイヤーに正しくセットされたかをテストしています。

  • じゃんけんの結果を判定する_2人
  • テストデータとして、勝つ方と負ける方のプレイヤーがいます。
    勝つ方のプレイヤーの勝ち数が増えていることで動作の正当性をテストしています。

  • じゃんけんの結果を判定する_3人
  • 3人いる場合、引き分けが2パターンと勝ちが2パターンあります。
    – 引き分け:全員が違う手、または全員が同じ手
    – 勝ち  :1人だけ勝つ、または2人が勝つ
    これらも、プレイヤーの勝ち数を数えることで動作の正当性をテストしています。

※プレイヤーが4人、5人と増えても試験のパターンは3人の場合と基本的に変わらないので実施していません。

まとめ

  • 2進数を使うと最終的な結果である和集合(論理和)で判定が容易にできる。
  • テストコードを書くことで、ロジックの正当性を試験できる。

2進数の判定を使うシーンはあまりないかもしれませんが、複雑なドメインや判定処理で利用できそうなシーンがありましたら、ぜひ活用してみて下さい!

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-テスト駆動開発, プログラミング, Java
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

【Java】オブジェクト指向の練習題材(成績オブジェクト)

前回記事、オブジェクト指向とは何なのかを簡単に説明してみるの練習題材です。 ここでは2つのオブジェクトを作成していきます。 成績オブジェクト:教科と点数などを保持 生徒オブジェクト:氏名と成績を保持 …

ExcelをA1セルに揃えて拡大率100%にするツール

(追記:2021年8月18日) サブフォルダを処理対象にするかどうかを選択できるように改修しました。   たくましゅくじょさんのところで公開されていた、 「エクセルで全シートの拡大率を100%にしA1 …

難しい,困難,頭を抱える

オブジェクト指向が難しいと思うならこれを読め!

オブジェクト指向はJava、JavaScript、PHP、Python、Rubyなどなど 色んな言語で使われているパラダイム(考え方)です。 上から順に追っていくだけ(手続き型)ではわからない仕組みに …

ModelからBindingResultが消える原因と対処方法

環境 Java(SpringFramework) Thymeleaf 状況 更新画面でバリデーションエラーにより更新が失敗したというようなケースにおいて、 BuindingResultにFormのエラ …

【SpringBoot入門】#12~ 削除機能の実装

概要 ダイアログでOK押下された場合の削除処理を実行します。 画面からリクエストされた書籍情報IDをキーに、論理削除を実装します。 システム開発ではほとんどの場合、論理削除を行います。 物理削除するの …

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。