
ジャンケンの履歴が勝利の秘訣?
前回は、ジャンケンを作りました。
今回は、ジャンケンの履歴を表示したら連勝できるかやってみます。
今日のハイライト
連勝数をカウント
以前、「データの保存」という記事の中で何かをカウントするスクリプトを作ったので、これを組み込んで連勝数をカウントするようにします。
Score.gdのコピペ
以前、「プロジェクトをコピペしてはじめる」という記事を書きましたが、シーン単位でも、コピペして使えます。
今回は、Score.tscnとScore.gdをコピペして、プロジェクトフォルダに追加します。
プロジェクトフォルダに追加すると、左下のファイルシステムの中にScore.tscnがあるのでドラッグ&ドロップしてMain_Jankenの子ノードにドラッグ&ドロップすればOK。スクリプトもScore.gdが入ってます。

Score.gdの修正
今回は、ScoreやHigh Scoreよりも、連勝数と最高連勝の表記の方がしっくりくるので、CTRL+Rで置換します。
・"Score: "を"連勝: "にCTRL+Rで置換
・"High Score: "を"最高連勝: "にCTRL+Rで置換

ScoreのLabelを修正
・Score.tscnをクリックして、CountLabelとMaxLabelを確認
・CountLabelのtextを「連勝: 0」、font size: 24、outline: 黒
・MaxLabelを「最高連勝: 0」、font size: 24、color: ピンク、outline: 黒

Main_Jankenのスクリプトを変更
初期設定
・ScoreシーンのPathを追加
@onready var score = $Score
勝敗判定
・func judge()の引き分けなら何もしない
・プレイヤーが勝ったらincreace_count関数を使って連勝をカウントする
・CPUが勝ったらreset_count関数を使って連勝をリセットする
#プレイヤーが勝ち
elif (Global.player_hand == 1 and Global.cpu_hand == 2) or \
(Global.player_hand == 2 and Global.cpu_hand == 3) or \
(Global.player_hand == 3 and Global.cpu_hand == 1):
Global.p_win += 1
Global.win_judge = "あなたの勝ち"
score.increase_count() # 連勝記録をカウント
# CPUの勝ち
else:
Global.win_judge = "CPUの勝ち"
Global.c_win += 1
score.reset_count() # 連勝記録をリセット
連勝記録
F5で実行。連勝を「勝ちでカウント」、「負けでリセット」、「最高連勝を更新」できました。

ジャンケンの履歴を表示
人間は履歴を表示すると傾向を読み取って対策したくなります。
CPUは完全にランダムに手を出すので対策は意味ないのですが、履歴を見ながら次の手を出して勝つと脳汁が出ます。
心理戦で勝つのは最高の快楽の一つで、長い歴史の中で、相手を出し抜いてサバイバルしてきた人間の遺伝子に組み込まれたプログラムには、誰も抵抗できません。
履歴を表示するだけで、ジャンケンが一段上の面白さになるのかどうか実験です!
5つ前までジャンケンの履歴を表示する
配列(Array)、追加(append)、先頭削除(pop_front)を使って過去5文字を保持して表示できます。
Historyシーンを追加
・Main_Jankenの子ノードにHistory(CanvasLayer)を追加
・Historyの子ノードにYourHistory、CPUHistory、WinHistoryのLabelを追加
・YourLabelとCPULabelのtextに✊✌✋✋✊を表記し、fontsizeを24に設定
・WinHistoryのtextにWWWWWを表記
・WinHistoryのTheme OverridesのStylesの新規StyleBoxFlatを選択

Historyのスクリプト
履歴を表示するスクリプト
・Historyにスクリプトを追加
・Arrayで配列を定義
・appendで入力した文字を配列に追加
・pop_frontで5文字を超えたら先頭を消去しラベルを更新
extends CanvasLayer
var recent_hand_p: Array[String] = [] # プレイヤーの過去5手を保存する配列
var recent_hand_c: Array[String] = [] # CPUの過去5手を保存する配列
var recent_result: Array[String] = [] # 過去5回の勝敗を保存する配列
func _ready() -> void:
$YourHistory.hide()
$CPUHistory.hide()
$WinHistory.hide()
func janken_history():
# 履歴用の手を変換
var text_direct = {1: "✊", 2: "✌", 3: "✋"} # 数字とCPUの手を定義
var hand_p = text_direct[Global.player_hand] # 履歴用のプレイヤーの手を変換
var hand_c = text_direct[Global.cpu_hand] # 履歴用のCPUの手を変換
# 勝敗を変換
var win_direct = {"あなたの勝ち":"W", "CPUの勝ち":"L", "引き分け":"ー"} # 勝敗を変換
var result = win_direct[Global.win_judge]
$YourHistory.show()
$CPUHistory.show()
$WinHistory.show()
# 配列処理
recent_hand_p.append(hand_p) # 配列に追加
recent_hand_c.append(hand_c) # 配列に追加
recent_result.append(result) # 配列に追加
# 5つを超えたら古いものを削除
if recent_hand_p.size() > 5:
recent_hand_p.pop_front()
if recent_hand_c.size() > 5:
recent_hand_c.pop_front()
if recent_result.size() > 5:
recent_result.pop_front()
# ラベルを更新
$YourHistory.text = "".join(recent_hand_p)
$CPUHistory.text = "".join(recent_hand_c)
$WinHistory.text = "".join(recent_result)
Main_Jankenのスクリプトの修正
・ラベルを更新するupdate labelにHistoryのJanken_historyを追加
# ラベルを更新
func update_label():
$Win.update_label()
$History.janken_history() # historyスクリプトへ
ジャンケンの履歴を実行
履歴があるとあきらかに思考時間が長くなり、勝つと喜びが増します。

次は、CPUに思考パターンをいれてみます!
じゃんけん関係の検証はオモロイですね。
誰かの参考になれば幸いです。