他の人がすでに指摘しているように、このコードは、数値をインクリメントすると、そのバイナリ表現の最下位ビットがオンとオフを交互に繰り返すという事実に基づいています。
IMO、読みやすさの欠如は、主に大きな問題の兆候です。コードのロジックは実際には最高ではありません。私は少し違うことをするだろうと思います。これは、メンバー関数へのいくつかのポインターが実際に意味をなし、コードをかなり単純化するまれなケースの1つです。
実際の型がわからないので、それgame
が型のオブジェクトへのポインタであると仮定しますGame
。そこから、1番目と2番目のプレーヤーのメンバー関数へのポインターを定義し、1つの動きではなく、1つの動きのペアで構成されるループを作成するという非常に簡単な問題です(または、視点によっては、実際には1つの動きのようになります)反復ごとの完全な移動)。
typedef void (Game::*pmf)();
pmf first_player = &Game::human_move;
pmf second_player = &Game::computer_move;
if (game->comp_first)
std::swap(first_player, second_player);
for ( ; game->boxes_left > 0; game->turns+=2) {
game->*first_player();
game->*second_player();
}
残念ながら、これによりコードがはるかにクリーンでシンプルになりますが、Javaへの変換がかなり難しくなります。Javaには、C++のメンバー関数へのポインターに直接類似したものがありません。通常の代替手段は、インターフェースを定義し、次にそのインターフェースを実装する匿名クラスを定義することです。それをすべて行う前に、コードが少し重複しているものから始める方がおそらく簡単です。
if (game->comp_first)
for (; game->boxes_left > 0; game->turns+=2) {
game->computer_move();
game->player_move();
}
else
for (; game->boxes_left > 0; game->turns+=2) {
game->player_move();
game->computer_move();
}
...このコードは高度な機能を使用していないため、Javaなどの低レベル言語に変換するのは簡単です。メンバー関数へのポインターを使用すると最もクリーンな結果が得られることは私には明らかなようですが、それでもこの最後のバージョンは、最初に使用したものよりもかなりクリーンだと思います。
もう1つ詳細を追加する必要があると思います。状況によっては、1人のプレイヤーだけが移動した後にループを終了しなければならない場合があります。実装しているゲームでそれが可能な場合は、次のように2行を変更します。
game->*first_player();
game->*second_player();
代わりに、各移動関数がブール値を返すようにして、その移動後にさらに再生が可能かどうかを示します。ループ本体は次のようになります。
if (game->*first_player())
game->*second_player();