[2021 Spring] CS61A Project 1: The Game of Hog (Phase 3)

项目说明: https://inst.eecs.berkeley.edu/~cs61a/sp21/proj/hog/#phase-3-strategies
Phase1: https://www.cnblogs.com/ikventure/p/14815119.html
Phase2: https://www.cnblogs.com/ikventure/p/14885436.html

Phase 3: Strategies

In the third phase, you will experiment with ways to improve upon the basic strategy of always rolling a fixed number of dice. First, you need to develop some tools to evaluate strategies.

Problem 8


unlock时,注意Sow Sad规则。

def make_averaged(original_function, trials_count=1000):
    """Return a function that returns the average value of ORIGINAL_FUNCTION
    when called.

    To implement this function, you will have to use *args syntax, a new Python
    feature introduced in this project.  See the project description.

    >>> dice = make_test_dice(4, 2, 5, 1)
    >>> averaged_dice = make_averaged(roll_dice, 1000)
    >>> averaged_dice(1, dice)
    3.0
    """
    # BEGIN PROBLEM 8
    "*** YOUR CODE HERE ***"
    def f(*args):
        result = 0
        for i in range(trials_count):
            result += original_function(*args)
        return result / trials_count
    return f
    # END PROBLEM 8

Problem 9


使用字典avgs存放每轮均值和num_rolls。

def max_scoring_num_rolls(dice=six_sided, trials_count=1000):
    """Return the number of dice (1 to 10) that gives the highest average turn score
    by calling roll_dice with the provided DICE a total of TRIALS_COUNT times.
    Assume that the dice always return positive outcomes.

    >>> dice = make_test_dice(1, 6)
    >>> max_scoring_num_rolls(dice)
    1
    """
    # BEGIN PROBLEM 9
    "*** YOUR CODE HERE ***"
    avg = 0
    avgs = {}
    for i in range(1, 11):
        avg = make_averaged(roll_dice, trials_count)(i, dice)
        if avg not in avgs:
            avgs[avg] = i
        else:
            if i < avgs[avg]:
                avgs[avg] = i
    return avgs[max(avgs)]
    # END PROBLEM 9

Problem 10


用之前定义的piggypoints,大于cutoff就return 0,否则返回num_rolls。

def piggypoints_strategy(score, opponent_score, cutoff=8, num_rolls=6):
    """This strategy rolls 0 dice if that gives at least CUTOFF points, and
    rolls NUM_ROLLS otherwise.
    """
    # BEGIN PROBLEM 10
    return 0 if piggy_points(opponent_score) >= cutoff else num_rolls  # Replace this statement
    # END PROBLEM 10

Problem 11


如果0 dice后触发再来一轮,0 dice;如果达到cutoff不再来一轮也选择0 dice;否则,num_rolls。注意使用piggypoints_strategy和more_boar比较方便。

def more_boar_strategy(score, opponent_score, cutoff=8, num_rolls=6):
    """This strategy rolls 0 dice when it triggers an extra turn. It also
    rolls 0 dice if it gives at least CUTOFF points and does not give an extra turn.
    Otherwise, it rolls NUM_ROLLS.
    """
    # BEGIN PROBLEM 11
    return 0 if more_boar(score + piggy_points(opponent_score), opponent_score) \
        else piggypoints_strategy(score, opponent_score, cutoff, num_rolls)
        # Replace this statement
    # END PROBLEM 11

Optional: Problem 12


设计策略让获胜概率更高(由于连接不上服务器,只能测试代码完成度,不能测试胜率)。

def final_strategy(score, opponent_score):
    """Write a brief description of your final strategy.

    *** YOUR DESCRIPTION HERE ***
    """
    # BEGIN PROBLEM 12
    if score <= 80:
        return more_boar_strategy(score, opponent_score, cutoff=8, num_rolls=6)
    elif score <= 90 and score > opponent_score:
        return piggypoints_strategy(score, opponent_score, cutoff=7, num_rolls=1)
    else:
        return 2
    # Replace this statement
    # END PROBLEM 12

project 完成


posted @ 2021-06-15 22:54  ikventure  阅读(1701)  评论(0编辑  收藏  举报