Python模拟乌龟对对碰游戏与盲盒购买策略分析指南

Python模拟乌龟对对碰游戏,盲盒购买分析

最近乌龟对对碰盲盒游戏备受热捧,我使用Python编写了这款游戏的简单模拟。让我们一起来了解乌龟对对碰游戏规则和盲盒购买分析吧!

一、乌龟对对碰游戏规则介绍

乌龟对对碰游戏

乌龟颜色: 红色、黄色、紫色、橙色、绿色、青色、粉色、玫红。咔色、蓝色 十种颜色。

游戏规则:
游戏开始,用户从上面十个颜色中选择一个幸运色
然后开始游戏,随机初始化化9个颜色的乌龟,每个乌龟都有一个颜色,到一个3×3的方格中。

  1. 如果存在和幸运色一样,用户背包随机增加一个颜色的乌龟
  2. 如果9个乌龟颜色都不一样,用户背包随机增加5个乌龟,并清空棋格
  3. 如果存在横着三个,竖着三个,斜着三个一样的颜色,用户背包随机增加5个乌龟,清出掉对应的乌龟
  4. 如果方格中存在两个相同颜色的乌龟,用户背包随机增加一个颜色的乌龟,并把对应乌龟清除掉
  5. 当背包没有乌龟时,且没有可以碰对的乌龟,则游戏结束,统计用户总共获取的乌龟总数,对应颜色的乌龟数量

二、Python模拟实现

  • 导入依赖
  • import random
    from collections import Counter
    
  • 定义游戏类
  • # 定义颜色列表
    colors = ["Red", "Yellow", "Purple", "Orange", "Green", "Cyan", "Pink", "Magenta", "Brown", "Blue"]
    BOARD_SIZE = 3
    
    class TortoiseGame:
        def __init__(self, lucky_color, buy_toroise_count=9):
            if buy_toroise_count < 9:
                raise ValueError("购买乌龟数量必须大于等于9")
            self.lucky_color = lucky_color
            self.buy_toroise_count = buy_toroise_count - BOARD_SIZE**2
            self.bag = Counter()
            self.board = self.initialize_board()
    
        def initialize_board(self):
            return [[random.choice(colors) for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
        
        # 定义一个函数来打印棋盘
        @staticmethod
        def print_board(board):
            print("-" * 80)
            for row in board:
                print(" | ".join(row))
                print("-" * 17)
    
        def update_board(self):
            # 更新棋盘
            for i in range(BOARD_SIZE):
                for j in range(BOARD_SIZE):
                    if self.board[i][j] == "" and self.buy_toroise_count > 0:
                        add_color = random.choice(colors)
                        # 幸运色,增加一个
                        if add_color == self.lucky_color:
                            self.buy_toroise_count += 1
                        self.board[i][j] = add_color
                        self.buy_toroise_count -= 1
    
        def first_check_lucky_color(self):
            # 1. 如果有和幸运色一样的乌龟
            for row in self.board:
                add_count = row.count(self.lucky_color)
                self.buy_toroise_count += add_count
    
        def check_three_in_a_row(self):
            flag = False
    
            def is_three_in_a_row(cells):
                return len(set(cells)) == 1 and cells[0] != ""
    
            for i in range(BOARD_SIZE):
                # 横向
                if is_three_in_a_row(self.board[i]):
                    flag = True
                    self.buy_toroise_count += 5
                    self.bag.update(self.board[i])
                    self.board[i] = [""] * BOARD_SIZE
    
                # 纵向
                column = [self.board[j][i] for j in range(BOARD_SIZE)]
                if is_three_in_a_row(column):
                    flag = True
                    self.buy_toroise_count += 5
                    self.bag.update(column)
                    for j in range(BOARD_SIZE):
                        self.board[j][i] = ""
    
            # 斜向 \
            diagonal1 = [self.board[i][i] for i in range(BOARD_SIZE)]
            if is_three_in_a_row(diagonal1):
                flag = True
                self.buy_toroise_count += 5
                self.bag.update(diagonal1)
                for i in range(BOARD_SIZE):
                    self.board[i][i] = ""
    
            # 斜向 /
            diagonal2 = [self.board[i][BOARD_SIZE - 1 - i] for i in range(BOARD_SIZE)]
            if is_three_in_a_row(diagonal2):
                flag = True
                self.buy_toroise_count += 5
                self.bag.update(diagonal2)
                for i in range(BOARD_SIZE):
                    self.board[i][BOARD_SIZE - 1 - i] = ""
    
            return flag
    
        def check_two_in_a_row(self):
            flag = False
            for i in range(BOARD_SIZE):
                for j in range(BOARD_SIZE):
                    if self.board[i][j] != "" and sum(row.count(self.board[i][j]) for row in self.board) >= 2:
                        flag = True
                        self.buy_toroise_count += 1
                        self.check_eliminate(self.board[i][j])
    
            # 判断是否全清了,全清+5
            if all(all(cell == "" for cell in row) for row in self.board):
                flag = True
                self.buy_toroise_count += 5
    
            return flag
    
        def check_eliminate(self, remove_color):
            # 对对碰消除
            remove_count = 0
            for i in range(BOARD_SIZE):
                for j in range(BOARD_SIZE):
                    if self.board[i][j] == remove_color:
                        if remove_count == 2:
                            return  # 已经消除两个,不需要再消除
                        else:
                            remove_count += 1
                            self.bag.update([self.board[i][j]])
                            self.board[i][j] = ""
    
        def check_family_portrait(self):
            # 全家福, 9个乌龟颜色都不一样,增加5个乌龟
            if len(set(cell for row in self.board for cell in row)) == BOARD_SIZE**2:
                self.buy_toroise_count += 5
                self.bag.update([cell for row in self.board for cell in row])
                self.board = [[""] * BOARD_SIZE for _ in range(BOARD_SIZE)]
                return True
            else:
                return False
    
        def check_chain(self):
            return any([
                self.check_three_in_a_row(),
                self.check_two_in_a_row(),
                self.check_family_portrait()
            ])
    
        def play(self):
            # 开始游戏
            self.print_board(self.board)
            # 初次检查
            self.first_check_lucky_color()
            self.check_chain()
            while self.buy_toroise_count > 0:
                self.update_board()
                flag = self.check_chain()
                # 判断是否结束, 如过没有乌龟了,且没有对对碰,则结束
                if not flag:
                    self.bag.update(cell for row in self.board for cell in row if cell != "")
                    break
            # 统计结果
            print("总共获取的乌龟总数:", sum(self.bag.values()))
            for color in colors:
                print(color, ":", self.bag[color])
            return sum(self.bag.values())
    
    
  • 运行
  • if __name__ == "__main__":
        lucky_color = input(f"请输入幸运色 ({', '.join(colors)}): ")
        while lucky_color not in colors:
            lucky_color = input(f"请输入幸运色 ({', '.join(colors)}): ")
        buy_toroise_count = int(input("请输入购买乌龟数量 (9, 17, 35): "))
    
        while buy_toroise_count not in [9, 17, 35]:
            buy_toroise_count = int(input("请输入购买乌龟数量 (9, 17, 35): "))
        game = TortoiseGame(lucky_color, buy_toroise_count)
        game.play()
    
    
  • 输出结果
  • ➜  Tortoise python tortoise_game.py
    请输入幸运色 (Red, Yellow, Purple, Orange, Green, Cyan, Pink, Magenta, Brown, Blue): Blue
    请输入购买乌龟数量 (9, 17, 35): 9
    --------------------------------------------------------------------------------
    Blue | Magenta | Pink
    -----------------
    Orange | Green | Blue
    -----------------
    Cyan | Cyan | Orange
    -----------------
    总共获取的乌龟总数: 17
    Red : 1
    Yellow : 2
    Purple : 0
    Orange : 3
    Green : 1
    Cyan : 3
    Pink : 2
    Magenta : 1
    Brown : 1
    Blue : 3
    

    三、购买规格成本对比分析



    直播间玩这个游戏,一般是19.9 购买9个,39.9购买17个, 99.9 购买45个,下面对这三种情况分别运行一万次进行统计

  • 19.9 购买9个规格,最大获取57,最小是11 平均是17点多
  • 39.9购买17个规格,最大获取数是88,最小获取是27,平均38.6个
  • 99.9 购买45个,最大获取数是180,最小获取是86,平均获取数114.8
  • 备注:每次运行最大值可能不太一样,但是运行次数越多平均值越稳定。

    四、小结

    打开淘宝,小号乌龟大概是六七块钱10个,大多是6.8,那就是一个乌龟平均0.68元,直播间平均19.9规格一个乌龟平均1.17元,39.9规格的合1.03元,99.9规格一个乌龟平均0.87,整体是买的越多会越便宜,但是还是不如购物网站买,但是直播间也算提供了情绪价值,这个和直接购买还是不一样的,你会怎么选择呢。

    作者:lanfordxb

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python模拟乌龟对对碰游戏与盲盒购买策略分析指南

    发表回复