random4degitは、4桁の乱数ですが、同じ数値を使わない。1123とかは出ないようにしてます。dflagがtrueの間は、乱数を作り続けます。
41行目から46行目、注意でした。数字から文字に変えると、サインの分かスペース1個入ります。また、Scalaだとメソッドのリターンの時、thisを書かないとUnitになるくらいが違いですかね?VBだと、クラスの定義にクラスパラメータを取れない。Scalaの場合だと、基本コンストラクタを構成する。てっかメンバー変数になる。のかなあ?
コンピュータの手は乱数を使ってません。Scalaだとprintf使えて、C言語の記憶が使えますが、VBでは使えないでしょう。面倒です。
fib、fib2、fib3とありますが、データの型をDecimalに変更。フィボナッチ数列の128番目までは、大丈夫です。Bigintegerなる型もあるようですが、使い方が分かりません。どうやらfib2、fib3は末尾再帰で、スタックを消費しないようです。コップ本P169に、末尾再帰では、呼び出しのたびに新しいスタックフレームを作ったりしない、とあります。fib(50)でもエラーは起きませんが、実行が中断した感じになります。fib(128)でも同様です。実行が中断した感じに見えるのは、スタックのトラブルが起きているのかもしれません。
Pythonのコードはそのまま、cametanさんのブログからです。
fib(128)を行うと、ものすごく大きな数値になりますが、pythonは何もなかったかのように出力します。
参考したコードをVBで置き換えてみました。
fibは、一番単純なものですが、三項演算子を使ってみました。fib2、fib3はcametanさんのブログからです。VBだとLongとかIntegerの範囲を超えられません。Big Numberとかもあった気はしますが…。全てがそうですが、探せばやる方法はあっても、指定しないと出来ない。そんな感じのことが多い気がします。fib(128)を実行するとエラーは出ませんでしたが、分析とか解析みたいなことが始まりました。オーバーフローしてると思います。静的型付け(Scala,VBなど、多分)、の限界なんですかね?Scalaでもfib(128)はマイナス表示でした。
Visual Studioはpythonも使えますので、例をそのまま貼り付けました。
三項演算子なんとか使えたようです。20行目は代入無しですし、13行目は代入してます。ここはReturnでも良いはずです。cametanさんのブログを良くみてませんでしたね。
cametanさんのブログにあった問題です。Pythonの回答はありました。
20を超えると、最初にOne_Nineteenを呼んで、次にTwenty_Ninetyが呼ばれ、再度One_Nineteenが呼ばれるようです。
Select Caseのオンパレードみたいになりましたので、配列で出来そうなとこは直しました。SuuryoCheckのIfは三項演算子が使えないか、やってみましたが、条件の部分は、良いとして、yesとnoの場合のとこには、演算は書けないようです。例えば、If(<条件>, katisu +=1, katisu = 1)のように。参考にしたサイトでは、dim a = If(…)となってましたので、代入文以外なら良いのかもしれません。
乱数を使っていると言っても、数の出方は同じ傾向のようです。gは勝ちが多いし、çは負けが多いし、pが一番勝ちと負の数が比較的同じのようです。
自分の手を、g、c、pで入力すると、コンピュータの手は乱数なので、どこかで合わせる手続きが必要になるのが、良くないとと言えば、良くないのかもしれません。cametanさんコードから離れてしまったかもしれません。
勝ち負けの判断を二次元のJudgeTableを使ってみました。Hashtableも二次元のTableとそっくりです。
今回直したのは、上のTemotoCardInputのみ。エラーデータだとallcardが変わらないので、それで見つけます。エラーでない状態から始めないといけないので、fflagを使います。
自分は出来てから、分けるのが好きなので、FunctionとSubで分けてみます。
VBの場合、ByValとかByRefとか関数の引数に付きますが、少しあやふやですが、単一の変数以外であれば、例えば配列などの場合は、参照渡しになるようだ、と思ってます。この辺も解釈がいろいろあって、自分の考えもはっきりしませんが、アドレスのコピーが渡されると解釈する方も居るようです。なので値渡し以外無い、とか。
一応動いたので、良いとは思いますが。(笑)
入力データのチェックは、単に入力されたものが、allcardになければエラーで、再入力する、だけで良いように思います。
トランプの数を簡単のために、1から5にします。
エラーチェックを入れると結構複雑になるようなので、取り敢えずは省略。一度入力したらそれを以降無効にするのが、面倒そう。でもないか?文字列にない時はエラーでいけますね。出力が思った以上面倒になったのは、発想が悪いせいかも。
52行目から54行目です。今はトランプの各柄(スペードなど)があれば良いのですが、手持ちのカードの枚数が多くて、トランプの文字列データが消されるものが多くて、例えばスペードのカードが全部、手持ちだった場合を考えてませんね。やっぱり、なにかある(笑)
前回は、出力まで行ってなかったので、追加しました。エラーチェックはしてません。
VBを使うとLoopしてしまいます。言語によってスタイルが決まる?
だいたい課題のとおりだと思いますが、改良するところはあるんでしょうね。(笑)
少し悩んだのがsubstringの使い方、パラメータが2個あると1個目は文字列の位置ですが、2個目は位置ではなく、個数です。