fork download
  1. # your code goes here
Success #stdin #stdout 0.02s 7112KB
stdin
import sys

# 簡易ゲームツリーノード
class Node:
    def __init__(self, value=None, children=None, name=''):
        self.value = value
        self.children = children or []
        self.name = name

# CS2ラウンド戦略の簡易ツリー構築
# レベル1: T側の行動 - Rush A, Rush B, Split
# レベル2: CT側の対応 - Defend A heavy, Defend B heavy, Balanced
# 葉: 仮想的スコア (T側が高いほど良い)
def build_tree():
    # 状況に応じてここを変更(例: 資金少ない時はスコア調整)
    leaves = [
        Node(80, name='Win vs Def A'), Node(20, name='Loss vs Def B'), Node(50, name='Tie vs Bal'),
        Node(30, name='Loss vs Def A'), Node(70, name='Win vs Def B'), Node(50, name='Tie vs Bal'),
        Node(60, name='Win vs Def A'), Node(60, name='Win vs Def B'), Node(40, name='Loss vs Bal')
    ]
    
    ct_responses = [
        Node(None, leaves[0:3], 'Defend A heavy'),
        Node(None, leaves[3:6], 'Defend B heavy'),
        Node(None, leaves[6:9], 'Balanced')
    ]
    
    root = Node(None, [
        Node(None, ct_responses, 'Rush A'),
        Node(None, ct_responses, 'Rush B'),
        Node(None, ct_responses, 'Split')
    ], 'T Strategies')
    
    return root

# Minimax with Alpha-Beta Pruning
def minimax(node, depth, alpha, beta, maximizing):
    if node.value is not None:  # 葉ノード
        return node.value
    
    if maximizing:  # T側 (Max)
        max_eval = -sys.maxsize
        for child in node.children:
            eval_val = minimax(child, depth - 1, alpha, beta, False)
            max_eval = max(max_eval, eval_val)
            alpha = max(alpha, eval_val)
            if beta <= alpha:
                break  # 枝刈り
        return max_eval
    else:  # CT側 (Min)
        min_eval = sys.maxsize
        for child in node.children:
            eval_val = minimax(child, depth - 1, alpha, beta, True)
            min_eval = min(min_eval, eval_val)
            beta = min(beta, eval_val)
            if beta <= alpha:
                break  # 枝刈り
        return min_eval

# 実行例
tree = build_tree()
best_value = minimax(tree, 3, -sys.maxsize, sys.maxsize, True)
print(f"T側の最適値: {best_value}")

# 最適戦略の選択
best_move = None
best_score = -sys.maxsize
for child in tree.children:
    score = minimax(child, 2, -sys.maxsize, sys.maxsize, False)
    if score > best_score:
        best_score = score
        best_move = child.name

print(f"最適戦略: {best_move} (スコア: {best_score})")
stdout
Standard output is empty