cametan_42さんのヒントから、breakでなく、19行目return thisに変えてみました。すると良いようです。18行目は多分、ゲームが正常に動く条件のようです。
上の図のように、取れない石を入力すると、while (true)のループから抜けられないようです。
def readをjava版と同じように直してみました。
18行で条件が合うと、return thisします。23行のthisでリターンする時もあったと思います。
Scalaのbreakはjavaのbreakと違うんんですかね?最後はコンピュータが勝つようですが、表示がおかしい?cametan_42さんのブログをもう一度見てみますが、全体の構造が理解できてません。(笑)
ScalaとRubyが似てるなら、ひょっとしたら「return」ってキーワードは必要ないのかも。
RubyはANSI Common Lispと同様に「必ず値を返す」んで、returnは必要ない構造なんで、Scalaもそれと同じ設計方針かもしれません。
> 全体の構造が理解できてません。
僕のブログには何度か書いてますが、REPL(Read-Eval-Print Loop)と言うのはソフトウェアの「設計方針」です。
要は「読み込み部」「評価部」「印字部」と、基本3つの関数を別々に作って、それらを組み合わせてループ構文で回す。
それだけ、です。
ただし、「それだけ」が重要で、ソフトウェアの「開発方針」になる。
逆に言うと、スクリプトはREPL構造を持たないプログラムだ、と言う事が出来ます。まぁ、正確な定義ではないですけどね。
例えば一番簡単な例として次の例を考える。
「入力が"bye"だった時だけ"また来てくださいね!"と表示し、それ以外は入力をそのまま表示するソフトウェアを書け」
例えばPythonだったら以下のようになるでしょう。
# Read(入力部) -> input関数を使えば充分
# Eval(評価部) -> Readが渡してきた値をそのまま返せばいい
def engine(x):
return x
# Print(印字部) -> print関数を使えば充分
# ソフトウェア本体(REPL: Read-Eval-Print Loop)
while True:
x = input(">>> ") # 入力
if x.lowercase() == "bye":
print("また来てくださいね!")
import sys
sys.exit()
else:
print(engine(x)) # REPL本体
このケースの場合、シンプル過ぎるんで、一見、Eval(engine関数)が全く何もしてないように見えるけど、この「形式」は応用が効く。
要は、仮に入力に依って「処理が変更」される場合、評価部内で条件分けしていけば「複雑なソフトウェアを作る」方針が立ちやすい、と。
そういう事です。
ただ、Javaの場合は「単純な関数が作れない/作れない」んでどうしたもんか、ってのが件の記事のネタです。