協作閣

開源協作部落格

字裡牌間——禁止された言葉①

Bénjī / 2019-03-22 /


《遊戲王》這部作品已經存在了超過20年,從此延伸出的集換式紙牌遊戲在全世界各地傳播著,隨著每一季推出新的卡牌,這個遊戲至少依然保有許多熱愛它的玩家。做為一款競爭型的紙牌遊戲,玩家可以搭配各個時期所發行的遊戲王卡片,組合出千變萬化的戰術來贏得決鬥。

然而,世間萬物皆不盡完美,無論是玩家或是遊戲公司。有的玩家會利用規則、規則以外或卡牌敘述上的漏洞贏得所謂不風光的勝利;遊戲公司也可能做出強度超出平衡、使得決鬥變得可能不需要戰術、靠猜拳的運氣就能贏得決鬥的卡牌。玩家的不完美,或許可以依靠比賽中執法的裁判從中監督,來得到比賽的公平性,而遊戲公司的疏忽,正是本次分析的主角——禁止/制限卡表(卡表)所要負責的事。

1999年,第一個版本的卡表出現了。早期規範及配套措施尚未完善,經過頻繁地更改,在2004年之後,以半年一次的頻率更新一次卡表。2013年9月,分屬於亞洲地區的「遊☆戱☆王オフィシャルカードゲーム デュエルモンスターズ」(OCG),以及歐美地區的「YU-GI-OH! TRADING CARD GAME」(TCG)兩個系統,因為玩家使用習慣、卡片發行不同步等因素,開始各自發布不同的卡表,造成玩家大致上依照所在地區不同,遵循著不同的卡表來交流或比賽。之後,遊戲王進入了決鬥步調更加快速的時期,為了因應更快的賽場環境變化,卡表改以大致每三個月更新一次的頻率。

這次的分析,主要是希望能藉由卡片中效果文的敘述,試圖找到OCG與TCG的卡表中的差異,討論這樣的差異和兩方玩家的習慣之間的關係。

材料收集:

這次分析的卡表,將採用OCG在2019年1月1日生效的卡表,以及TCG同期在2019年1月28日生效的卡表,卡表中每一張卡片的效果文文本進行比對。從Yugioh Fandom中的OCG以及TCG卡表的網頁原始碼中,取得每一張卡片所對應到的連結,並做簡單的分類。

import csv

# set lists
list_OCG_nomi = []
list_TCG_nomi = []
list_onaji = []

# read .csv file
with open('banlist1901.csv', newline='') as csvfile:
    rows = csv.reader(csvfile)
    for row in rows:
        if row[0] == 'OCG':
            list_OCG_nomi.append([row[3],row[2],row[1],row[4]])
        elif row[0] == 'TCG':
            list_TCG_nomi.append([row[3],row[2],row[1],row[4]])

# classify
for card in list_OCG_nomi:
    if card in list_TCG_nomi:
        list_onaji.append(card)
for card in list_onaji:
    list_OCG_nomi.remove(card)
    list_TCG_nomi.remove(card)

在遊戲王的世界中,各個語言下的效果文,在功用上是一樣的,為了分析上的便利性,在此全部以英文版的效果文來分析。

接著,利用request取得每一張卡的效果文文本。

import requests
from bs4 import BeautifulSoup as bs

link_front = "https://yugioh.fandom.com"

def get_card_text(url):
    request = requests.get(url)
    html = request.text
    soup = bs(html)
    # get the card text
    card_text = soup.select('table.collapsible.expanded.navbox-inner td:nth-of-type(2)')[0].text
    card_text = card_text.strip()
    return card_text

for j in range(len(list_OCG_nomi)):
    list_OCG_nomi[j].append(get_card_text(link_front + list_OCG_nomi[j][3]))
for j in range(len(list_TCG_nomi)):
    list_TCG_nomi[j].append(get_card_text(link_front + list_TCG_nomi[j][3]))

# fix data manually
list_TCG_nomi[8][0] = 'Maxx "C"'

材料分析:

首先,我們先觀察,屬於「禁止卡」(不可以該卡片來構築牌組)的項目中,兩種卡表的差異:

import pandas
forb_cmp = [] #matrix
forb_cmp_num = [] #y-axis
for card in list_OCG_nomi:
    if card[2] == 'Forbidden':
        status_cmp = 'Unlimited'
        for card_cmp in list_TCG_nomi:
            if card_cmp[0] == card[0]:
                status_cmp = card_cmp[2]
        forb_cmp.append(card[0:3]+[status_cmp])
        forb_cmp_num.append('')
for card in list_TCG_nomi:
    if card[2] == 'Forbidden':
        status_cmp = 'Unlimited'
        for card_cmp in list_OCG_nomi:
            if card_cmp[0] == card[0]:
                status_cmp = card_cmp[2]
        forb_cmp.append(card[0:2]+[status_cmp]+[card[2]])
        forb_cmp_num.append('')
#make table
x_axis = ['Card name', 'Type', 'Status in OCG', 'Status in TCG']
pandas.DataFrame(forb_cmp, forb_cmp_num, x_axis)
Card name Type Status in OCG Status in TCG
Amazoness Archer Monster Forbidden Unlimited
Blackwing - Steam the Cloak Monster Forbidden Unlimited
Cannon Soldier Monster Forbidden Unlimited
Cannon Soldier MK-2 Monster Forbidden Unlimited
Glow-Up Bulb Monster Forbidden Unlimited
Number 95: Galaxy-Eyes Dark Matter Dragon Monster Forbidden Unlimited
Summon Sorceress Monster Forbidden Unlimited
Toon Cannon Soldier Monster Forbidden Unlimited
Wind-Up Hunter Monster Forbidden Unlimited
Divine Sword - Phoenix Blade Spell Forbidden Unlimited
Dragonic Diagram Spell Forbidden Unlimited
Raigeki Spell Forbidden Limited
Zoodiac Barrage Spell Forbidden Unlimited
Life Equalizer Trap Forbidden Unlimited
Magical Explosion Trap Forbidden Limited
Astrograph Sorcerer Monster Limited Forbidden
Blaster, Dragon Ruler of Infernos Monster Unlimited Forbidden
Daigusto Emeral Monster Unlimited Forbidden
Denglong, First of the Yang Zing Monster Semi-Limited Forbidden
Djinn Releaser of Rituals Monster Unlimited Forbidden
Double Iris Magician Monster Limited Forbidden
Fairy Tail - Snow Monster Semi-Limited Forbidden
Grinder Golem Monster Limited Forbidden
Maxx "C" Monster Unlimited Forbidden
Morphing Jar 2 Monster Unlimited Forbidden
Number 42: Galaxy Tomahawk Monster Unlimited Forbidden
Number 86: Heroic Champion - Rhongomyniad Monster Unlimited Forbidden
Performapal Skullcrobat Joker Monster Limited Forbidden
Samsara Lotus Monster Unlimited Forbidden
Supreme King Dragon Starving Venom Monster Unlimited Forbidden
Tempest, Dragon Ruler of Storms Monster Limited Forbidden
Topologic Gumblar Dragon Monster Unlimited Forbidden
Tribe-Infecting Virus Monster Unlimited Forbidden
True King Lithosagym, the Disaster Monster Unlimited Forbidden
Wind-Up Carrier Zenmaity Monster Unlimited Forbidden
Chicken Game Spell Unlimited Forbidden
Harpie's Feather Duster Spell Limited Forbidden
Kaiser Colosseum Spell Unlimited Forbidden
Pot of Avarice Spell Unlimited Forbidden
Rank-Up-Magic Argent Chaos Force Spell Unlimited Forbidden
Soul Charge Spell Limited Forbidden
Super Rejuvenation Spell Unlimited Forbidden
That Grass Looks Greener Spell Semi-Limited Forbidden
Self-Destruct Button Trap Unlimited Forbidden
Vanity's Emptiness Trap Limited Forbidden