‫お帰りなさい｡
‫そして､ このビデオでは､ ちょっとしたチャレンジをして､ 三目並べを作ってみてください｡
‫ここにあるように､ フォームゲームとかではなく､ ただの据え置き型ゲーム｡
‫このように､ 9つの値､ つまり9つのフィールドがあり､ プレイヤー､ 1は後からフィールドを選ぶことができ､ プレイヤー2はフィールドを選ぶことができる､
‫というようになります｡
‫そして､ 例えば､ oneというフィールドがあり､ oneを入力すると､ 今度はohになります｡
‫これはゼロではなく､ ああ､ じゃあプレイヤー2の番だ､ 5を入力しようということですね｡
‫これで､ 5がxに置き換わって､ 見える数字だけが残っていることがわかりますね｡
‫そこで､ 私がプレイヤー1として再び5を入力するとしよう｡
‫入力が正しくないと表示される｡
‫他のフィールドを使用してください｡
‫よし､ じゃあ3つ使ってみるか｡
‫つまり､ プレイヤー2が数字しか入力してはいけないことを理解せず､ Gとか入力してしまったとする｡
‫すると､ Please enter a numberと表示されます｡
‫入力に誤りがあります｡ 他のフィールドを使用してください｡
‫そうだろ？
‫だから､ やはり回すのはプレーヤーですね｡
‫それで､ 彼はどうするつもりなのでしょうか？
‫彼は勝とうとする｡
‫だから､ これは超接戦になりそうです｡
‫プレイヤー2
‫勝つために､ 私たちはあなたのためにプレーしているのです｡
‫そこで彼は3回連続でクロスを上げ､ まあ､ 何かキーを押してゲームをリセットしてください｡
‫任意のキーを押してみる
‫そして､ 私たちは
‫新しいラウンドを迎えました｡
‫だから､ リセット機能も作っておいた方がいい｡
‫よし､ これで大体わかった｡
‫それを構築してみてください｡
‫DX配列を2つ使ったり､ switchやcaseやメソッドを使ったり､ 前回のビデオで触れた様々なことが必要になってくるでしょう｡
‫そのため､ かなり時間がかかりそうですし､ あなたの解決策は私とはまったく異なるものになるかもしれません｡
‫そして､ そう､ 一般的に､ もしあなたが埒があかなかったら､ もしこれがあなたにとって難しすぎるのであれば､ 心配はいらない｡
‫あなたは単に私が行っているすべてのステップを理解しようとすることができますし､ 私が行っているすべてのことを説明するつもりです｡
‫でも､ 本当に自分でやってみるのが一番です｡ 自分でやってみると､
‫自分のスキルを飛躍的に向上させる解決策が見つかるからです｡
‫だから､ それは本当に大事なことなんです｡
‫エラーに遭遇して､ それを自分で修正することができれば､ それが本当の意味での学習となるのです｡
‫だからこそ､ 自分で試してみることが本当に大切なんです｡
‫わかりました｡
‫だから､ 今ビデオを一時停止して､ 試してみてほしいのですが､ これにはかなりの時間がかかります｡
‫だから､ 5分以内には終わらないはずなんです｡
‫まあ､ もしかしたら正解で､ できるかもしれません｡
‫しかし､ そうでない場合は､ 選択したソリューションに応じて､ 1時間以上､ あるいは2時間以上かかるかもしれません｡
‫そして､ 先ほど申し上げたように､ この問題の解決にはさまざまな方法があります｡
‫そして､ これまで学んできたことに近いと思ったものを1つだけ紹介します｡
‫つまり､ これまでみんなが学んできた機能を使っているわけです｡
‫だから､ あまり目新しいことはない｡
‫そうそう､ だから今､ アプリを作ろうと思っているんだ｡
‫わかりました｡
‫だから､ やはり､ 自分で作ってみてほしいですね｡
‫ということで､ プロジェクトファイルnewを作成することにします｡
‫プロジェクト
‫そして､ それをチックタックトーのエクササイズと呼ぶことにしています｡
‫そして､ 再びコンソールアプリになるのです｡
‫さて､ 誰が持っているかをチェックするような複雑なロジックを実行する前に､ まずはとてもシンプルなところから始めてみましょう｡
‫まずは自分たちのプレイフィールドを作るということで､ コンソールライティングまで｡
‫そこで､ 新しいメソッドを作成して､ public static void set fieldと呼び､ メインメソッド内で使用できるように静的のみにしています｡
‫そうでなければ､ set field を使用するために､ object オブジェクトを作成して運動させなければなりません｡
‫でも､ 静止画にするのは全然いいんですよ｡
‫次にset fieldメソッドの中で､ コンソールの右側の行をたくさん書く必要がありますが､ それは次のように見えるでしょう｡
‫引用符､ たくさんの空のフィールド､ パイプ､ いくつかの空のフィールド､ そしてまた､ いくつかの空のフィールドです｡
‫これが1行目なんですね｡
‫そして､ その右の線をもう一度コンソールで表示します｡
‫See Wダブルタップも使えます｡
‫これがクイックバージョンで､ 次に空き地や空きフィールドが2つ､ そしてまたパイプがあります｡
‫そして､ ここで私が行うのは､ 数字を表示できるように準備することです｡
‫そして､ 表示させたい数値は？
‫まあ､ それは後で使ったり､ 作ったりすることになるのですが｡
‫だから､ とりあえず､ 1､ 2､ 3ということです｡
‫しかし､ 後でそれを変更する必要があります｡
‫だから､ 数字を変数に置き換える作業をするリストに加えようと思っているんだ｡
‫なるほど｡
‫さて､ そのロールと同じようなものを作る必要があります｡
‫でも､ ここではアンダースコアをつけています｡ 後でこれでは足りない､ 見栄えが悪いと思ったら､ 簡単に変更することができます｡
‫わかりました｡
‫だから
‫これは結構なことです｡
‫今はそれを何度もやる必要があります｡
‫だから､ それを真似するんです､ 実は｡
‫全部コピーするんです｡
‫そして､ そこに私たちはいます｡
‫そして最後に､ もう一列｡
‫そして､ それはほとんどそうであるべきです｡
‫見てみよう｡
‫このメソッドを set field と呼び､ コンソールでどのように表示されるかを見てみましょう｡
‫本当はコンソールを動かす必要があるのですが､ レッドラインやレッドキーがあればなお良しです｡
‫走らせてみよう｡
‫そして､ そこに私たちはいます｡
‫まだ完全に位置が決まっているわけではないので､ 見てみましょう｡
‫わかりました｡
‫ここで一つ問題なのは､ 5つ必要だということです｡
‫ポイント距離｡
‫だから､ 5つの空白がある｡
‫こちらも同じです｡
‫1､ 2､ 3､ 4､ 5｡
‫それはいいことだ｡
‫では､ これを使って､ それがあった行を置き換えてみましょう｡
‫ここでは､ 見栄えをよくするために､ ちょっとしたテストを行うわけです｡
‫そこで､ ここでも同じ手法で､ この2行をコピーして置き換えることにします｡
‫さて､ この中に､ 両方向に2つずつあるはずだ｡
‫テストしてみよう
‫そして､ そこに私たちはいます｡
‫だから､ もうずいぶん良くなったように見えますね｡
‫1､ 2､ 3
‫その数字は､ やはり後で入れ替えるべきでしょう｡
‫でも､ もうそれでフィールドを設定することができるんです｡
‫ということは､ これはもう､ 後でフィールドをリセットするのに役立つと想像されるかもしれませんね｡
‫了解です｡
‫では次に､ これができたので､ 実際にフィールドを作成する必要があります｡
‫そして､ プレイフィールドは､ まあ､ 番組的にはフィールドであるべきで､ プレイフィールドを作りなさいということです｡
‫そして､ それが何をするかというと､ プレイフィールドを静的に､ あるいは実際には作らないのですが､ プレイフィールドの静的なキャラクターを作ることになるのです｡
‫だから､ ここでも､ まあ､ 整数や文字列を使うことができる｡
‫しかし､ キャラクターは最も資源効率が良いものです｡
‫プレイフィールドを呼び出しますが､ この中に異なる列を用意する必要があります｡
‫つまり､ 1､ 2､ 3で1列､ その次で同じことをする｡
‫だから､ 4､ 5､ 6といった具合に｡
‫そこで､ ちょっとだけ数字を入れ替えてみます｡
‫これは4､ 5､ 6､ 7ということですね｡
‫実はこれ､ 7､ 8､ 9なんです｡
‫そこで､ 私たちは
‫ここは私たちのプレイフィールドです｡
‫さて､ ここで必要なのは､ この数字を実際にプレイフィールドに置き換えてみることです｡
‫このように､ プレイフィールドは一般的にこのように表示されます｡ そして､ この中の数字を後で入れ替えたいと思います｡
‫ユーザーによる
‫わかりました｡
‫そこで､ 1つの代わりに使うのが､ 実はこのプレイフィールドで､ 特定の位置で使うのです｡
‫だから実は､ ここでその部分を取り除くのです｡
‫あとは､ もう少しよく見てください｡
‫これはプレイフィールドで､ プレイフィールドの位置をゼロ､ コンマゼロにする必要があるわけです｡
‫わかりました｡
‫そして今度は､ その2つに対して同じことをするのです｡
‫だから､ ゼロ､ コンマ1､ ゼロコンマ2｡
‫そして､ 2列目は､ 0が1つ､ 1が1つ､ 1が2つです｡
‫この意味がよくわからないという方は
‫つまり､ これが0行目です｡
‫これが1列目です｡
‫そして､ それが2列目です｡
‫だから
‫ロージー・ロウです｡
‫ほら､ じゃあこれは本物だ｡
‫そして今度は､ 2行目も同じようにする必要があります｡
‫これが2つのゼロになるわけです｡
‫これは2つ1つになる｡
‫そして最後に､ 2､ 2､ 2､ 2｡
‫それでは､ もう一度始めましょう｡
‫そして､ やはり同じ結果が得られるはずです｡
‫そこで､ 私たちは
‫1､ 2､ 3､ といった具合に｡
‫素晴らしい｡
‫だから今､ 私たちの土俵や競技場は準備されています｡
‫では､ どのようにユーザーの入力を得ることができるかを確認してみましょう｡
‫そして､ 私たちに必要なのは､ それゆえ､ 創造することなのです｡
‫私たちのプレーヤーとなる変数｡
‫ですから､ プレーヤーは､ 例えばプレーヤー1から始めるとします｡
‫そのため､ プレイヤー2を設定しました｡ なぜ2を設定することに意味があるのかは､ 後ほど説明します｡
‫それから､ ユーザー入力が必要ですが､ inputは0です｡ ここではどのフィールドも0ではないので､
‫これを0に設定します｡
‫だから､ ゼロを使った使い方は､ ここでは素晴らしいことです｡
‫最後に､ 入力が正しいかどうかをチェックするブール値が必要です｡ なぜなら､ 入力が正しくない場合は､
‫プレイヤーに通知して正しい入力を得られるようにしたいからです｡
‫よしっ｡
‫そのためには､ 大きな､ あるいは非常に長いdo while so doを作成する必要があります｡
‫そして､ 何列も並んだ末に野次馬的な発言になるのです｡
‫そして､ この中では私が使うだけです｡
‫本当です｡
‫なぜ､ do while with trueを使うのか｡
‫まあ､ それは､ 私のゲームでは､ ユーザーが常に何かを入力できるようにしたいからなのですが｡
‫そしてこの場合､ 自動化されないコードをここで実行しています｡
‫ユーザーの入力に依存する
‫だから､ 無限ループではないけれど､ ゲームをする限り必ずそうなるんです｡
‫だからこそ､ 「ながら」が必要なのです｡
‫本当です｡
‫わかりました｡
‫次に確認することは､ プレイするのはプレイヤー1なのか､ プレイヤー2なのか､ 誰の番なのか､ ということです｡
‫playerが2であれば､ playerを1に設定し､ それ以外であれば
‫本当はここでエルスを使えばいいんだけど､ 他に｡
‫Player は 2 に等しいので､ els を使うか､ この場合 Player が 2 つの値しか持てないのであれば else を使うか､ どちらかです｡
‫しかし､ 何かの間違いでプレーヤーが2人に増えたら､ 必ずそうなるか､ 増える｡
‫そして､ 常にプレイヤー2であることが､ この問題になるのです｡
‫だから､ other playerが1と同じならplayer twoに切り替わるようにすればいいわけです｡
‫そこで今度は､ 誰の番かによって､ switch case文を実行する必要があります｡
‫だから､ スイッチプレーヤーということになるんです｡
‫では､ 誰の番かによって､ コードを実行してみましょう｡
‫ケースは1つだとします｡
‫つまり､ プレイヤー1のターンということですね｡
‫そして実際に､ ここにコードを追加してみましょう｡
‫限り､ コードを実行します｡
‫プログラムが実行されます｡
‫では､ プレイヤー1人のスターンだとしたら､ どうしたいのか｡
‫さて､ 確認したいことがあります｡
‫何を入力したのでしょうか？
‫そして､ 番号を割り当てる｡
‫では､ その数字にXを割り当ててください｡
‫だから､ ここに私たちのプレイフィールドがあるのです｡
‫これが1､ 2､ 3なんですね｡
‫そして､ 今欲しいのは､ もしプレイヤー1だったら､ これをXに置き換えて欲しいのです｡
‫だから､ 例えば彼が1回入ったら｡
‫そのために､ ここでもう一つスイッチを作ります｡ スイッチの入力に基づいて､ このケースをチェックしたいからです｡
‫1 だから､ プレーヤーは1つのプレーヤーまたはプレイフィールドの位置ゼロゼロをxに置き換えるべきで入力したし､
‫我々は壊したい｡
‫じゃあ､ もういいや｡
‫ちなみにここではまだ文句を言っています｡
‫それは､ ここでこのスイッチのループから抜け出さないからであり､ 抜け出せたからこそ､ 今があるのです｡
‫そこで､ プレイフィールドをxに置き換えてみると､ ここで文字列を使ったために文句が出るので､
‫念のため､ 今はCHAを使っています｡
‫だから､ 過去のアポストロフィーを見ての通りです｡
‫キャラクターのためにあるのであって､ ご存知のようにプレイフィールドにはたくさんのキャラクターがいます｡
‫つまり､ 2Dの配列になっているんですね｡
‫だからこそ､ そういう使い方が必要なんです｡
‫わかりました｡
‫というわけで､ ケース1の場合です｡
‫そして今度は､ 私たちが持っているさまざまなケースに対して､ 同じことをする必要があるのです｡
‫では､ ケース2の場合､ そこに何が必要なのか｡
‫ケース3の1のためにゼロワンを用意する必要がある｡
‫実は､ ケース4はゼロ2なんです｡
‫ゼロが1つであるべきです｡
‫ケース5
‫一人と一匹なんです｡
‫そして､ もし私がここで何をしているのかわからない場合は､ もう一度確認してください｡
‫ローゼロ｡
‫つまり､ これがポジションゼロゼロです｡
‫これがポジションゼロ1､ これがポジションゼロ2......といった具合に｡
‫だから､ ここではこうしているんです｡
‫だから､ 正しい値に置き換えているんだ｡
‫つまり､ 7は2と0の位置にあり､ 8は2と1の位置にあり､ 9は2と2の位置にあるのです｡
‫ということになるんですね｡
‫プレイヤー1が値を入力するとどうなるか｡
‫そして､ 必ずXに置き換わります｡
‫さて､ 次にできることは､ このコード全体をコピーして､ プレイヤー2にも同じことをすることです｡
‫そこで､ 「よし､ これをコピーして､ プレイヤー2に対して実行してみよう」ということになるわけです｡
‫実は､ なぜその方法がベストではないのか､ その理由を説明するためにお見せします｡
‫そこで､ ここにもう一件追加することにします｡
‫ケース､ 2つです｡
‫そして今､ 私たちもそこから脱却する必要があるのです｡
‫だから､ 実はこの休憩はここなんです｡
‫ここにあるべきで､ ここでも同様に壊れる｡
‫そして､ もう一つのスイッチ・ケースもあります｡ このコードをコピーして､ ここに貼り付けることができます｡
‫しかし､ 単純にチェックするメソッドを作るには､ もっといい方法があるのです｡
‫プレイヤー1なのか､ プレイヤー2なのか......実際にはXかOを返すだけです｡
‫では､ このメソッドを作ってみましょう｡
‫public static void, x または O を入力します｡
‫シンプルでいいんです｡
‫そして､ ここで必要なのは整数が必要なことです｡
‫だから整数が必要で､ その一人をプレーヤーと呼ぶことにする｡
‫そこで今度は､ このコードをここから切り離します｡
‫だから､ スイッチ文､ ここで切るから､ ここのあれはもういらないよ｡
‫まだプレーヤーが必要です｡
‫そして､ これから行うのは､ 新しいキャラクターを作ることです｡
‫プレイヤーサインで､ とりあえず空のサインか､ 空ではない文字に設定します｡
‫そして､ この中にあるit's a space in hereです｡
‫では､ playerが1であれば､ 実はここで一列に並べることができるのです｡
‫プレイヤーサインは出る｡
‫X.
‫その他､ プレーヤーが2と等しい場合､ プレーヤー記号はこの場合､ 実はyかoになる｡
‫そして今｡
‫ユーザーの入力も必要です｡
‫だから､ インプットが必要なんだ｡
‫また､ 入力はどのようなタイプだったのでしょうか？
‫入力は整数でしたよね？
‫そこで､ ここでint inputを使い､ このXをプレーヤー側に置き換えてみます｡
‫わかりました｡
‫つまり､ このコードを2回実行する代わりに､ このメソッドを使用することができます｡
‫さて､ このメソッドができたので､ 実はもうswitchケースは必要ありません｡ なぜなら､ ここにはすでにプレーヤーがいるからです｡
‫そこで､ プレイヤー1と言い､ ここにあるコードを実行するだけでよいのです｡
‫では､ そうしましょう｡
‫ここでプレーヤーを設定しましょう｡
‫また､ ここでは少し長いテキストがあるため､ 中括弧を使用する必要がありますし､ 複数行のコードを実行するため､
‫中括弧を使用する必要があります｡
‫だからこそ､ これにエントリーする必要があるのです｡
‫なるほど｡
‫これで､ このswitch caseステートメントをすべて取り除くことができ､ ここでメソッドを呼び出すだけでよくなりました｡
‫つまり､ 呼び出しメソッドはenter x or Oという名前でしたが､ ここではまずプレイヤーにenter X or Oと言うことになります｡
‫よし､ プレイヤーになって､ インプットになって､ これが入力になるんだ｡
‫だから､ プレーヤーとインプットは､ ここで得たいと言うだけです｡
‫だから､ プレイヤーに対しても同じことをするんです｡
‫そして､ XかOのどちらかに設定されます｡
‫そして､ 私のためにきちんとコードを実行してくれます｡
‫ついでに言うと､ このトゥドゥはもう買い換えたので､ もういらないから処分していい｡
‫わかりました｡
‫さて､ まだやっていないので､ ユーザー入力のチェックをしましょう｡
‫そこで､ ここでもうひとつ､ do while do whileを作りたいと思います｡
‫そして､ "While "とは何でしょうか？
‫では､ どのような状態なのでしょうか｡
‫それは､ 入力の正しさが嘘であることです｡
‫だから､ 入力が不正確である限り､ 先に進んで再挑戦したいのです｡
‫ここでは､ プレイヤーにコードを入力してもらい､ ええ､ どうぞという感じです｡
‫だから､ ここのコンソールを入力するんだ｡
‫そうですね｡
‫そして､ ポジションゼロのプレーヤー｡
‫つまり､ プレーヤーは自分のフィールドを選択し､ ユーザーの入力を取得する必要があります｡
‫そこで､ input convert to int 32 を使って､ console dot read line を使ってみることにします｡
‫そこで､ ユーザーの入力を取得し､ 我々の入力に変換したいのです｡
‫つまり､ その文字列を使って整数を作り､ それをinputに格納するのです｡
‫そして､ 今度は入力を使っていきますが､ ここですでに入力を使っている方法ですが､ do whileループなので問題ありません｡
‫それで､ この入力になるんですが､ 入力したものに変更するんです｡
‫だから､ まずゼロになり､ もう一度チェックして､ 入力したものになるんです｡
‫わかりました｡
‫だから､ ここがポイントになるんです｡
‫そして､ 今度は実行してみましょう｡
‫どうなるか見てみましょう｡
‫わかりました｡
‫そうすると､ 今書いた文章が表示されないんです｡
‫だから､ ここの行は全部｡
‫そうですね｡
‫でも､ エンターキーを押せば表示されるんです｡
‫そして､ ここにはまだ読み取りキーがあるからです｡
‫そこで､ フィールドを読み取りキーに設定します｡
‫私たちは以前から､ プログラムやゲームの中身を確認するために､ そのようにしていました｡
‫そして､ 今すぐ処分すれば問題ないのです｡
‫だから
‫Player one Choose your fieldとあるので､ 例えば1つだけ入力します｡ 今度はPlayer to choose
‫your fieldとあるので､ それらの異なるフィールドを使用します｡
‫今､ まだ起きていないことは､ 私たちのテキストがまだ更新されていないことです｡
‫だからそれは､ 私たちが気をつけなければならないことなのです｡
‫さて､ そのためには､ コンソールをクリアする必要があります｡
‫コンソールのドットクリアがここで行われ､ 次に必要なことは､ この実行ループの中にいるたびにフィールドを設定することです｡
‫つまり､ setフィールドはmainの中で一度だけ実行されるのではなく､ doループの中で毎回実行されなければならないのです｡
‫つまり､ ここに単純にフィールドを設定するということです｡
‫それでは､ もう一度実行してみましょう｡
‫単語はあなたのフィールドを選択してくださいと､ 私はちょうど､ 6としましょう｡
‫今度は回転する場所です｡ 4を入力してみましょう｡ 今度はいきなり6が入力されているのがわかりますね｡
‫これで､ 次に何かを入力するときには4つが入力されているはずです｡
‫ですから､ 遅くまで更新されるのは､ ユーザーが入力した後に更新されるのではなく､ 後から更新されるという問題が残っているのです｡
‫では､ どうすればそれを解決できるのか､ 確認してみましょう｡
‫そして､ それはSet Fieldがプレーヤーをチェックする前だからです｡
‫では､ そうしましょう｡
‫今度はプレーヤーをチェックし､ セットフィールドを行います｡
‫では､ もう一度実行してみましょう｡
‫それでは､ 1つのフィールドを選択します｡
‫私はフィールド5を選びますが､ これでゼロになります｡
‫今､ 3はOになり､ 2はXになる､ というように｡
‫だから､ その機能があるのです｡
‫しかし､ まだ不足しているのは､ ユーザーが許可されたものを入力したかどうかをチェックする機能です｡
‫なぜなら､ 私ができることは､ 上書きすることだからです｡
‫そこで､ プレイヤー1が､ これまたプレイヤー1を選ぶとしよう｡
‫だから､ 今見ての通り､ OからXに走ったのです｡
‫プレイヤー1は､ よし､ このフィールドが欲しいから入力しよう､ となるわけです｡
‫そこで今必要なのは､ あるプレイヤーがすでに何かを入力したかどうかをチェックし､ もし入力したなら､ 他のプレイヤーがそのフィールドを上書きすることを許可しない､
‫あるいは許可されないようにすることです｡
‫なぜなら､ ここでは入力が正しいかどうかをチェックし､ ユーザーが正しい値を入力しなかった場合は入力を不正に設定することができるからです｡
‫ところで､ ついでに､ ここにある問題も解決しておきましょう｡
‫だから､ 例えばGを入力すると､ プログラムがクラッシュしてしまうんだ｡
‫つまり､ この入力はエラーを発生させるので､ tryとcatchでそれを取得し､ try catchで問題を解決することができるのです｡
‫そして､ これはとてもとてもシンプルなトライ・キャッチになるのです｡
‫だから､ これ以上複雑にするつもりはない｡
‫そして､ 唯一､ 私が目指すもの｡
‫コンソールの右の行に書き込みます｡
‫番号を入力してください｡
‫だから今､ もし誰かがまた同じことをしたら､ だから私は何でも入力するつもりです｡
‫まだクラッシュはしていませんが､ その後リセットしているのでコンソールに書き込んでいない状態でもあります｡
‫それとも違うのでしょうか？
‫そうそう､ ここで終了文を呼んでいないので､ かなりリセットされていますね｡
‫そこで､ 次にやるべきことは､ 少なくともその矢印を修正することです｡
‫あとは､ 入力が1かどうか､ プレイフィールドを確認します｡
‫その位置で｡
‫つまり､ 1の位置であるゼロゼロは､ まだ1の文字であり､ ここにもう1つのブラケットが必要です｡
‫ということなんですね｡
‫次に､ 入力を設定します｡
‫正解です｡
‫真に迫る｡
‫そして今度は､ 持っているすべてのフィールドに対して､ 同じことをする必要があります｡
‫そうでなければ､ 入力が2に等しく､ そのフィールドのその位置でプレイフィールドがまだ開いている場合､
‫だから0になる｡
‫1はまだ2です｡
‫それでは､ セット入力をお願いします｡
‫同じく真に正しい｡
‫そして､ ここでまた等号が足りなくなった｡
‫だからこれは､ それぞれのケースをキャッチできるように､ 今複数回コピー＆ペーストする必要があるのです｡
‫だから､ 3､ 4､ 5､ 6なんです｡
‫そして､ この中に｡
‫ここでエラーに遭遇しました｡
‫7つです｡
‫8です｡
‫そして9つ｡
‫そして今､ 当然ながら､ ここでもその位置を入れ替える必要があり､ その文字を調整する必要があります｡
‫だから､ 7､ 8､ 9｡
‫これで､ 3はa02でした｡
‫4は1ゼロになった｡
‫それから5が1111で､ 実は6がワンツーと一緒だったんです｡
‫あれはa20でしたね｡
‫2時1分と2時2分｡
‫だから､ 今､ 私たちはすべてが良いときに正しいケースを持って､ 今ここにLSが必要です｡
‫そうでなければ､ 何かが間違っている｡
‫だから､ それをユーザーに知らせたいのです｡
‫そのため､ コンソールの右側のドット行が不正確な入力となります｡
‫別のフィールドを使用してください｡ また､ input correctがfalseに設定されていることを確認することもできます｡
‫そこで､ 実際にできることは､ リージョンを作成することです｡
‫だから､ そのリージョンを呼び出して､ 終了するんです｡
‫ちょうどこの作品の後､ ここと地域｡
‫だから､ そうさせてください｡
‫そして､ この地域が何をやっているのか､ ということもお伝えしていきたいと思います｡
‫これは､ フィールドがすでに取られているかどうかをテストしているのです｡
‫取られたのなら､ 他のことをすればいい｡
‫撮られていないのなら､ どうぞ｡
‫それでは､ もう一度実行してみましょう｡
‫見てみよう｡
‫プレイヤー1が1つ使う｡
‫プレイヤー2がもう一度1を使おうとすると､ 不正な入力と表示される｡
‫他のフィールドを使用してください｡
‫だから､ 彼は2つ使っている｡
‫では､ それを使ってみましょう｡
‫なるほど｡
‫そして､ ご覧のように､ 異なる値を入力するだけで､ すべてがうまくいくようです｡
‫しかし､ ご覧の通り､ プレイヤー1はすでに2勝しているので､ ここでクロスしている｡
‫だから､ それは次に確認しなければならないことなのです｡
‫そこで､ 当選者がいるかどうかを確認する必要があります｡
‫そして､ 新しいリージョンを作成しましょう｡
‫当選を確認するセットフィールドのすぐ下｡
‫そこで､ ここ新地域｡
‫そして､ 直接､ リージョンを終了させる｡
‫そして､ この中にコードチェックの勝利条件を全部入れています｡
‫そして､ どうすればいいのか？
‫では､ 各プレイヤーがどのキャラクターを持っているのかを確認する必要がありますね｡
‫だから､ そのここの選手にサインをしてもらった｡
‫1はX､ 2がOのプレーヤー｡
‫そこで､ 今確認すべきことは｡
‫それとも実は正しい方法だったのでしょうか？
‫そうですね｡
‫プレイ1がXなら､ プレイ2はOです｡
‫つまり､ これが正しい文字なのです｡
‫そこで､ ここで確認しなければならないのは､ 配列で使うか､ 配列で作るかです｡
‫プレイヤーキャラクターは「X」と「O」｡
‫そして今､ 私が持っている各キャラクターについて､ player charsのplayer charごとに､ 勝利条件をチェックしたいのです｡
‫つまり､ Xに対して真であるか､ Oに対して真であるかをチェックするのです｡
‫つまり､ ここでは単純に､ プレイヤー1が勝っているのか､ プレイヤー2が勝っているのかをチェックするのです｡
‫そして､ プレイフィールドゼロゼロがプレイヤーシャルと等しいかどうかをチェックすることでそれを実現するのです｡
‫そして､ プレイフィールド・ゼロワン｡
‫プレイヤーのcharと等しく､ また､ 0-2のプレイフィールドもプレイヤーのcharと等しい｡
‫では､ そのような場合は､ 先にコードを実行してください｡
‫ということで､ ここでは､ とりあえず､ 当選者が出たので見てくださいwみたいなことを書いておきます｡
‫それでは､ if文全体を書く前にテストしてみましょう｡
‫つまり､ プレイヤー1が最初の行を獲得することになる｡ なぜなら､ ここに入力したのはこの行だけだからだ｡
‫そのため､ その行の3つのフィールドすべてで､ the､ 文字が同じである場合｡
‫勝者が決まった｡
‫だから､ ここに設定されているのは､ ほとんどそれだけです｡
‫だから､ よし､ プレイヤー1は1人にしようということになる｡
‫プレイヤー2はプレイヤー1が2､ 5､ 3となり､ 勝者が決まります｡
‫つまり､ 最初の行はゼロかオーで埋め尽くされているわけで､ これは勝者がいるということです｡
‫そして今､ 私たちがしなければならないのは､ それをさまざまな条件に置き換えることです｡
‫だから､ いろいろなポジションで､ ゲームを見れば､ また開き直るしかないんです｡
‫可能な当選条件は､ 1､ 2､ 3､ 4､ 5､ 6､ 7､ 8､ 9です｡
‫次に､ 753159147258と369です｡
‫だから､ 1､ 2､ 3があるんです｡
‫だから6｡
‫プラス2｡
‫つまり､ 勝敗を分ける条件が8つもあるわけで､ ここはかなり重要なポイントです｡
‫ですから､ これをオプションを変えて8回作成する必要があります｡
‫だから､ ここでそれを止めます｡
‫そして､ その都度､ or記号を使う必要があるのは､ それらがorの勝利条件だからです｡
‫だから､ あと6回やるつもりです｡
‫だから､ 1､ 2､ 3､ 4､ 5､ 6､ 7､ 8がある｡
‫それはいいことだ｡
‫そして､ 今､ 私が言ったように､ 異なる条件はゼロ､ ゼロ､ などです｡
‫今度は同じように1列目011と1列目2､ そして3列目222021と2列目2､ あとは上から下に向かって横長のものが並んでいます｡
‫つまり､ ゼロゼロ､ そしてワンゼロ､ ツーゼロというわけです｡
‫では､ 私たちは
‫実は､ 1人と1匹なんです｡
‫ゼロとイチ｡
‫すみません､ ゼロイチです｡
‫テンワンワン､ 1202､ 2､ ワンツー､ 2｡
‫そして今度は対角線上のものです｡
‫だから､ ゼロゼロなんです｡
‫では､ ゼロゼロで確認させてください｡
‫それから1､ 1､ 2､ 2｡
‫そして､ 最後に｡
‫1､ 2､ 1､ 1
‫と｡
‫ゼロが2つ｡
‫だから､ それが8つの条件であるはずです｡
‫あとは誰が持っているかを確認するだけです｡
‫そこで､ ここで確認するのは､ この長い文章です｡
‫もしや｡
‫Player､ char､ player charは×に相当します｡
‫プレイヤー2が1つ持っていることは分かっている｡
‫だから､ 新しいラインのプレーヤー2のコンソール赤い線は1つを持っています｡
‫そして､ ここではそんなふうに､ 実はとても気をつけなければならないことがあるのです｡
‫わかりました｡
‫というわけで､ その一件です｡
‫そしてもうひとつは､ 相手のプレイヤーが持っている場合です｡
‫ここでlsを使うと､ プレイヤー1が1つ持っていると表示されますね｡
‫そして､ ここで脱皮したいとも思っています｡
‫だから､ ここに侵入してください｡
‫では､ 実際に実行してみて､ 再現できるかどうか確認してみましょう｡
‫そこで､ 斜めのものが欲しいとします｡
‫1､ 2､ 5､ 3､ 9で､ プレイヤー1が1を持っていることがわかる｡
‫そこで､ ゲームをリセットして､ 新しいラウンドを作ることができるようにしたいと思います｡
‫だから､ プレイヤーはもう一度走り､ もう一度遊べるようにしなければならない｡
‫また､ カバーしていないのは引き分けなので､ やはり引き分けをカバーする必要があります｡
‫でもその前に､ 勝者が決まったらフィールドをリセットしよう｡
‫そこで､ ブレイクアウトする前に､ フィールドをリセットしたいのです｡
‫つまり､ フィールドをリセットしたり､ フィールドを設定したりするためには､ すでにそのための関数やメソッドが用意されているのです｡
‫それを実現するために､ このset fieldメソッドを作りました｡
‫もう一度､ フィールドを設定するのです｡
‫でも､ まだやっていないのは､ プレイフィールドをリセットしないことです｡ プレイフィールドは現在､ 特定の値に設定されているからです｡
‫だから､ これはXかもしれない､ これはOかもしれない､ といった具合に｡
‫ですから､ 常にリセットできるようにするためには､ それをコピーする必要があります｡
‫そして､ スタンダード版で､ プレイフィールド・イニシャルと呼ぶことにしています｡
‫だから､ 最初はこうで､ これは常に上書きしているんです｡
‫そこで今度は､ リセットを行う別のメソッドが必要になります｡
‫そして､ リセットするメソッドは public static void reset field という名前になる予定です｡
‫そして､ ここで必要なことは､ まず､ プレイフィールドをプレイフィールド初期値に設定することです｡
‫そしてフィールドを設定し､ プレイヤーがフィールドを持つとゲームをリセットします｡
‫つまり､ プレイヤー1が1つ､ プレイヤー2が1つ持っているわけです｡
‫では､ ここだけリセットして､ フィールドをリセットしましょう｡
‫ついでに言うと､ プレイヤーに伝えるか､ ユーザーに「リセットできますよ」と伝えるべきかもしれませんね｡
‫そこで､ コンソール右側のライン､ お願いします､ そして､ または､ ゲームをリセットするために任意のキーを押してください｡
‫と､ ここでは言うだけです｡
‫赤い鍵をコンソールで操作し､ その後､ ゲームをリセットする｡
‫なるほど｡
‫テストしてみよう
‫分野を選択します｡
‫1から5までのスリーナイン
‫プレイヤー1が持っています｡
‫プレイヤーは､ いずれかのキーを押してゲームをリセットしてください｡
‫どのキーを押しても､ そこにあるんです｡
‫ゲームをリセットして､ 今はプレイヤー同士の2ターン制になっています｡
‫こちらもご覧の通り｡
‫分野を選択します｡
‫では､ もう一度やってみましょう｡
‫ご覧のように､ 今は違う順番になっています｡
‫PLAYER 2 1として､ いずれかのキーを押してゲームをリセットしてください｡
‫素晴らしい｡
‫何か間違ったものをここに入力すると､ やはりこのエラーが出ますが､ それはそれでいいんです｡
‫そして､ それこそが私が望んでいたことでした｡
‫だから､ 私はそれをキャッチする｡
‫それでエラーをキャッチしています｡
‫私たちが持っていたキャッチボールを試してみてください｡
‫というわけで､ あとは引き分けがあるかどうかだけです｡
‫そして､ この問題を解決する方法はたくさんあります｡
‫一番簡単なのは､ turnsという変数を作ることです｡ この変数には､
‫すでにプレイしたターンの数を格納するだけです｡
‫エンドターンはゼロに等しい｡
‫つまり､ スタート時は0回転で､ フィールドをリセットしたり､ フィールドを設定したりするたびに､ 回転数を1ずつ増やしていきたいのです｡
‫この方法だから｡
‫いつ呼ばれるの？
‫セットフィールドを確認しよう｡
‫このdo whileループに入るたびに呼び出されます｡
‫しかも､ それはユーザーによる正しい入力があった場合のみです｡
‫さて､ このターン・フィールドがある場合､ ターン・フィールドをリセットすることにも注意する必要があります｡
‫一旦､ フィールドごとに全体をリセットして､ ここが私たちのゲームのフィールドだ､ というような意味です｡
‫でも､ turnsはグローバル変数だからフィールドなんでしょう？
‫だから､ 一度ターンをリセットしたいんです｡
‫つまり､ リセット・フィールドは､ ターンがゼロに等しいと言うことです｡
‫ですから､ あとはこの条件が真であるかどうかだけをチェックすればよいのです｡
‫ここで､ もしもの時の勝利条件が揃ったわけです｡
‫そして､ このif文です｡
‫そして､ ここにWLの文言があります｡
‫だから､ 当選者がいない場合は抽選になるんです｡
‫もっと正確に言うと､ ターンが10と同じなら引き分けです｡
‫だから､ ここで言うことは､ ここでも同じことなのです｡
‫また､ ゲームからの脱却も必要ですし､ ゲームをリセットすることも必要です｡
‫だから､ フィールドをリセットし｡
‫勝敗がつかなかったことをプレイヤーに伝えるべき｡
‫だから､ ここにテキストとしてドローを入力する｡
‫よし､ これでゲームの問題が一つ解決したぞ！まずは､ 引き分けに持ち込もう｡
‫まずは抽選を確認しよう｡
‫だから､ 1､ 2､ 3､ 4｡
‫シックス・ファイブ
‫8､ 9､ 7
‫そして､ 私たちは引き分けを得たと見ています｡
‫それでいいんです｡
‫いずれかのキーを押すと､ ゲームがリセットされます｡
‫それも効果的です｡
‫では､ もう一度やってみましょう｡
‫実は､ 抽選ではなく､ 当選なんです｡
‫そして､ プレイヤー2が1であることを確認します｡
‫エンターキーを押してもゲームがリセットされないのは､ このスタティック変数が関係しています｡
‫このキャラクタープレイフィールドの初期値を削除し､ 静的なローカル変数を作成して､
‫リセットフィールドの内部に配置する必要があります｡
‫そこで､ このプレイフィールドのイニシャルを作成し､ それをプレイフィールドに設定することにします｡
‫では､ もう一度検証してみましょう｡
‫1､ 2､ 3､ 4､ 5､ 6､ 7｡
‫プレイワンは1つです｡
‫よし､ 次は1､ 2､ 3､ 4､ 5､ 6､ 7だ｡
‫プレイ2は､ 鍵盤の下に1つ､ リセットされるのがわかりますね｡
‫さて､ 私が考え出したり､ テストして､ まだ少し誤差があることを確認したものは､
‫2､ 1､ 3です｡
‫4つ､ そして5つ､ 6つ､ 8つ｡
‫そしてご覧のように､ プレーヤーが持っているのに､ そうキャッチしていない､ あるいはここでキャッチしているという状態になっています｡
‫つまり､ プレイヤー2が1を持っていることがわかる｡
‫つまり､ プレイヤー1が000や0と1つずつ持っていても､ です｡
‫ですから､ 私のこの条件にはまだ少し問題があり､ あなたはもう早い段階で気が付いていたかもしれませんね｡
‫そこで､ その解決策を紹介します｡
‫そして､ それがここでの条件となるはずです｡
‫つまり､ ゼロワン､ ならワンワン､ これはワンツーではなく､ ツーワンであるべきなのです｡
‫では､ もう一度テストしてみましょう｡
‫この状態をキャッチするかどうか見てみましょう｡
‫だから､ 1､ 2､ 3､ 5､ 4､ 8｡
‫そして､ 私たちはプレイヤー2を1つのものとして見ています｡
‫よし､ これで決まりだ｡
‫そうそう､ それで結構なんですよ｡
‫私たちのゲームは動いていて､ やるべきことはやっています｡
‫もちろん､ まだまだ改善できる点はあります｡
‫だから例えば､ この文字記号｡
‫だから､ 入力を渡して､ その入力をもう一度確認して､ 文字記号を作ったりしているんです｡
‫でも､ もっと簡単にできるはずです｡
‫だから､ ここではプレーヤーそのものを取り上げることはしない｡
‫しかし､ 私たちが取るのは､ プレイヤー・チャーまたはプレイヤー・サインと呼ばれるキャラクターです｡
‫だから､ これは同じことかもしれないとなるはずです｡
‫だから､ プレーヤーサインはここで使ったからこそ､ より意味があるのです｡
‫そうすれば､ ここですべてのコードを作成する必要はありません｡
‫だから､ それを解消しよう｡
‫そして､ その代わりにこのメソッドを呼び出すと､ ここでは文字を渡しています｡
‫だから､ プレイヤー1には「ああ､ 確か」､ プレイヤー2には「X」と言ったのです｡
‫だから､ それで同じことができる｡
‫そして今､ 私たちはコード行数を少し減らしましたし､ さらにコードを改良して行くこともできます｡
‫しかし､ それは､ このコースでこれまで学んだことに基づいて､ 皆さんが書けるはずのコードにすぎません｡
‫わかりました｡
‫だから､ あなたの場合は全然違うように見えたけど､ なんとかそうしてほしいな｡
‫そして､ あなたの解決策をぜひ教えてください｡
‫また､ 私がここで紹介した解決策を改良した場合､ それも共有してください｡
‫そうそう､ それで結構なんですよ｡
‫かなり長いビデオですが､ 多くのことを学んでいただけたのではないでしょうか｡
‫そして､ 自分でやらなくても､ ただただそれを追いかけ､ 作ろうとしたのでしょう｡
‫それでは､ 次回のビデオで別のトピックをご紹介します｡
‫では､ 現地でお会いしましょう｡