แนวทางในการพัฒนาปัญญาประดิษฐ์ ในการเล่นเกม StarCraft II

Phasin Thosaeng
Super AI Engineer
Published in
3 min readMar 31, 2021

StarCraft สู่ StarCraft II

StarCraft เป็นวิดีโอเกมที่ได้รับความนิยมอย่างมากสำหรับเกมในหมวดเกมวางแผนแบบเรียลไทม์ ซึ่งตัวเกมพัฒนาโดย บริษัท Blizzard Entertainment ในปี ค.ศ 1998 เช่นเดียวกับบอร์ดเกมคลาสิคอย่างเช่น หมากรุก หรือ เกมโกะ StarCraft เป็นเกมที่ง่ายต่อการเรียนรู้ แต่ก็ยากมากที่จะเชี่ยวชาญ

เมื่อกาลเวลาผันผ่านแม้ StarCraft จะประสบความสำเร็จอย่างมาก ด้วยความก้าวหน้าทางเทคโนโลยีที่รวดเร็ว StarCraft เริ่มล้าสมัย ต่อมาในปี 2010 Blizzard ได้ประกาศเปิดตัว StarCraft II รอบนี้เกมไม่ได้รับความนิยมอย่างเกมก่อนหน้าเนื่องจากมีคู่แข่งเพิ่มขึ้นมากมาย แต่ก็ยังมีผู้ชมจำนวนมากตั้งตาคอยทัวร์นาเมนต์การแข่งขันที่เราจะได้เห็นกลยุทธ์ในการเล่นที่แปลกใหม่อยู่เสมอ

ความท้าทายในเกม StarCraft II

ทั้ง StarCraft และ StarCraft II ได้ชื่อว่าเป็นเกมกลยุทธ์แบบเรียลไทม์ หมายความว่า เพื่อที่จะเอาชนะคู่แข่งผู้เล่นจะต้องทำการตัดสินใจเชิงกลยุทธ์อย่างต่อเนื่อง เพื่อสร้างระบบเศรษฐกิจ (การเก็บเกี่ยวและสร้างฐานที่มั่น) และ อำนาจทางการทหาร (ฝึกฝนยูนิต และ วิจัยเทคโนโลยี) ให้มีประสิทธิภาพยิ่งกว่าคู่ต่อสู้ของพวกเขา และสร้างกองทัพที่สามารถเอาชนะฝ่ายตรงข้ามของพวกเขาได้ (ทำลายฐานที่มั่นของศัตรู)

ปัญหาการเรียนรู้แบบเสริมกำลังกับเกมกลยุทธ์แบบเรียลไทม์นั้นยากกว่าบอร์ดเกมคลาสิคมากเนื่องจากความซับซ้อนของสถานะและมีคำสั่งหรือการเลือกการ
กระทำการใด ๆ ในเกมนั้นมีความเป็นไปได้มากมาย

อีกทั้งผู้เล่นต้องบริหารจัดการทรัพยากรและกลยุทธทางทหารและควบคุมยูนิตต่าง ๆ ให้ทำงานได้เต็มประสิทธิภาพในเวลาเดียวกัน หรือที่เรียกว่า Marco & Micro นั้นเอง

สภาพแวดล้อมการเรียนรู้ (learning environment)

SC2LE คือสภาพแวดล้อมการเรียนรู้สำหรับการเรียนรู้แบบเสริมกำลัง (Reinforcement Learning) โดยใช้เกม Star Craft II ซึ่งประกอบไปด้วย 3 องค์ประกอบย่อย คือ Star Craft II binary, StarCraft II API และ PySC2

  1. Star Craft II binary คือ ไฟล์เกม StarCraft II พัฒนาโดย บริษัท Blizzard Entertainment
  2. StarCraft II API คือ ส่วนช่วยให้สามารถควบคุมโปรแกรม StarCraft II สามารถใช้สำหรับเริ่มต้นเกม รับข้อมูลการสังเกตการ (observations) ทำการสั่งการ (take actions) และ ดูข้อมูลเกมซ้ำ (replays)
  3. PySC2 คือ ไลบรารีที่พัฒนาด้วยภาษาไพธอนซึ่งจะช่วยติดต่อกับ StarCraft II API เพื่อลดขั้นตอนยุ่งยากในการโต้ตอบระหว่าง เอเจนต์ (agent) และ ตัวเกม StarCraft II

ไลบรารีเหล่านี้จะแสดงรายการของข้อมูลที่มีข้อมูลคล้ายกับสิ่งที่ผู้เล่นจะสามารถเข้าถึงได้ เช่น ข้อมูลทรัพยาการที่มีในปัจจุบัน และอื่น ๆ พร้อมกับสามารถสั่งงานเกมได้คล้ายกับที่มนุษย์สั่งเกมผ่านเมาส์หรือคีย์บอร์ด เช่น การเลือกยูนิตภายในเกมด้วยการลากเมาส์จากจุด A ถึงจุด B หรือ การสร้างสิ่งก่อสร้าง อีกทั้ง PySC2 มาพร้อมกับมินิเกมที่ใช้ฝึกงานพื้นฐาน เช่น การเคลื่อนที่ของยูนิต, การเก็บทรัพยากร, การสร้างทหาร

ภาพการเปรียบเทียบการส่งคำสั่งระหว่างผู้เล่น (user/agent) กับระบบ

ในการสั่งงานคำสั่งในเกมนั้น StarCraft II นั้นมีจำนวนมาก ซึ่งสามารถตรวจสอบคำสั่งได้จากคำสั่ง

python -m pysc2.bin.valid_actions0/no_op                  ()
1/move_camera (1/minimap [64, 64])
2/select_point (6/select_point_act [4]; 0/screen [84, 84])
3/select_rect (7/select_add [2]; 0/screen [84, 84]; 2/screen2 [84, 84])
4/select_control_group (4/control_group_act [5]; 5/control_group_id [10])
5/select_unit (8/select_unit_act [4]; 9/select_unit_id [500])
6/select_idle_worker (10/select_worker [4])
7/select_army (7/select_add [2])
8/select_warp_gates (7/select_add [2])
9/select_larva ()
...
571/Stop_Battlecruiser_quick (3/queued [2])
572/Research_EnhancedShockwaves_quik (3/queued [2])
Total base actions: 573

ซึ่งคำสั่งเหล่านี้บ้างคำสั่งนั้นยังต้องการอาร์กิวเมนต์เพิ่มเติมสำหรับสั่งการ เช่น การสั่งประเภทการเคลื่อนที่นั้นต้องการพิกัดเป้าหมายที่จะทำการเคลื่อนที่ไป เป็นต้น ซึ่งสามารถศึกษาข้อมูลเกี่ยวกับการใช้งานไลบราลี่เพิ่มเติมได้ที่ https://github.com/deepmind/pysc2/blob/master/docs/environment.md

ชุดมินิเกม (Mini Games)

ในงานวิจัยหลายงานที่สามารถหาอ่านได้มักใช้ชุด Mini Game มาใช้ในงาน
อาจเป็นเพราะความสะดวก ในการอ้างอิงหรือเปรียบเทียบกับงานวิจัยอื่น ๆ ได้ง่ายซึ่งชุดมินิเกมที่ได้รับความนิยมกันมีดังต่อไปนี้

  1. MoveToBeacon
    เริ่มต้นเกมจะมียูนิตนาวิกโยธิน (Marine) หนึ่งตัวโดยต้องทำการบังคับยูนิตนี้ไปยังสัญญาณ (Beacon) บนแผนที่ซึ่งจะเกิดโดยสุ่มเมื่อยูนิตไปถึงสัญญาณจะได้รับรางวัลเพิ่ม 1 คะแนน
  2. MoveToBeacon
    เริ่มต้นเกมจะมียูนิตนาวิกโยธิน (Marine) หนึ่งตัวโดยต้องทำการบังคับยูนิตนี้ไปยังสัญญาณ (Beacon) บนแผนที่ซึ่งจะเกิดโดยสุ่มเมื่อยูนิตไปถึงสัญญาณจะได้รับรางวัลเพิ่ม 1 คะแนน
  3. FindAndDefeatZerglings
    เริ่มต้นเกมเอเจนต์จะได้รับยูนิตนาวิกโยธิน (Marine) 3 ตัว เอเจนต์ต้องทำการสำรวจพื้นที่เพื่อค้นหาและทำลาย Zering แต่ละตัวมินิเกมนี้ต้องการการสำรวจที่มีประสิทธิภาพ
  4. FindAndDefeatZerglings
    เริ่มต้นเกมเอเจนต์จะได้รับยูนิตนาวิกโยธิน (Marine) 3 ตัว เอเจนต์ต้องทำการสำรวจพื้นที่เพื่อค้นหาและทำลาย Zering แต่ละตัวมินิเกมนี้ต้องการการสำรวจที่มีประสิทธิภาพ

ติดตั้งเครื่องไม้เครื่องมือ

  • StarCraft II
    ก่อนอื่นให้ทำการติดตั้งเกม StarCraft II โดยมีทางเลือกหลายทางโดยจะแนะนำดังนี้ครับ
    - สำหรับ Windows ให้ทำการติดตั้งผ่าน Battle.net ของ Blizzard
    - สำหรับ Linux สามารถติดตั้งเวอร์ชัน headless ซึ่งจะเล็กกว่ามากดาวน์โหลดได้ที่ https://github.com/Blizzard/s2client-proto#downloads
  • PySC2
    สามารถดาวน์โหลดผ่าน PyPI หรือ pip ได้เลยง่าย ๆ
pip install pysc2
  • Library ต่าง ๆ สำหรับ Machine Learning (TensorFlow)
    ตรงนี้สามารถติดตั้งเครื่องมือที่ชื่นชอบจากช่องทางที่ใช้เป็นประจำได้เลยครับ ตัวอย่างเช่น TensorFlow
pip install tensorflow
  • ดาวน์โหลด Mini Game
    สามารถดาวน์โหลดได้ที่นี่ https://github.com/deepmind/pysc2/releases/download/v1.2/mini_games.zip
    เมื่อดาวน์โหลดแล้วให้ทำการแตกไฟล์ไปที่โฟล์ดเดอร์เกม x:\StarCraft II\Maps\เมื่อทำการแตกไฟล์เสร็จจะได้ผลดังนี้ x:\StarCraft II\Maps\mini_games

สำหรับคนที่ไม่ได้ติดตั้งเกมที่โฟลเดอร์ที่ตั้งไว้แบบ default ตอนทำการติดตั้ง ให้ทำการตั้งค่า environment variable ชื่อ SC2PATH ชี้ไปที่โฟลเดอร์เกมครับ ใน linux สามารถใช้ export SC2PATH=~\StarCraftIIได้ง่าย ๆ เลยครับ
สำหรับวิธีการเนื่องจากปัจจุบัน windows มีหลาย os build version ขอให้ใช้ Google เถิดดดดดดดดดดดดดดด
*สำคัญมาก

สุดท้ายในบทคือการทดสอบโดยให้ใช้คำสั่ง

python -m pysc2.bin.agent --map MoveToBeacon

หากท่านพบว่ามีหน้าต่างเกมโผล่ขึ้นมา และมี Marine วิ่งโลดแล่นไปมาก็ขอแสดงความยินดีด้วยครับ

จากบทก่อนหน้าจะพบว่าในการเริ่มเกมจะมีการเรียกใช้ไฟล์ pysc2.bin.agent หากเข้าไปตรวจสอบจะพบหน้าตาประมาณด้านล่าง

ที่มา PySC2: https://github.com/deepmind/pysc2/blob/master/pysc2/bin/agent.py

จากโค้ดจะสังเกตุว่าเราสามารถแก้ไขพารามิเตอร์เกี่ยวกับการตั้งค่าเกมได้หลายอย่างมาก เช่น ขนาดของแผนที่(feature_screen_size), แผนที่ (map) ซึ่งเราได้กำหนดไปแล้วบทก่อนหน้าในส่วนของโค้ดทดสอบรัน, อื่น ๆ และที่สำคัญคือ agent ซึ่งเราจะต้องกำหนดให้ชี้ไปที่ agent ที่จะสร้างขึ้น

เพื่อให้เราสามารถออกแบบโครงสร้าง agent ให้ตรงกับความต้องการของไลบราลี่ PySc2 ที่ใช้ เรามาทำความเข้าใจกับ Base Agent ซึ่งมีติดมากับไลบราลี่จะทำให้เข้าใจมากขึ้นเกี่ยวกับฟังก์ชันที่ agent ต้องมี

ที่มา PySC2: https://github.com/deepmind/pysc2/blob/master/pysc2/agents/base_agent.py

จากโค้ดด้านบนจะเห็นว่ามีฟังก์การทำงานหลัก ๆ อยู่สามฟังก์ชันดังที่แสดงในใค้ด โดยที่ระบบจะเรียกใช้ฟังก์ชัน setup ในครั้งแรกที่เกมเริ่ม, เรียกใช้ฟังก์ชัน reset ตอนจบเกม และที่สำคัญที่สุดคือฟังก์ชัน step จะมีการเรียกใช้ทุกครั้งก่อนจะทำการเปลี่ยนสถานะถัดไป ซึ่งเราจะเขียนโค้ดในการตัดสินใจในการสั่งการในฟังก์ชันนี้

หวังว่าจะเป็นประโยชน์ไม่มากก็น้อยสำหรับท่านผู้อ่าน

ในบทความหน้าเราจะมาทำปัญญาประดิษฐ์ในการเล่นเกม StarCraft II ด้วย TensorFlow และ Keras กัน ติดตามกันเร็ว ๆ นี้

ขอบคุณครับ

--

--