2 คะแนน โดย GN⁺ 2025-01-02 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • DOOM CAPTCHA เป็น CAPTCHA เชิงทดลองเพื่อการศึกษาและความบันเทิง ที่ให้ผู้ใช้ เล่น DOOM® ด้วยตัวเอง เพื่อพิสูจน์ว่าเป็นมนุษย์
  • การทำงานหลักคือคอมไพล์พอร์ต Doom ขั้นต่ำเป็น WebAssembly ด้วย Emscripten และเชื่อมลูปเกมภาษา C เข้ากับ UI ภาษา JavaScript
  • สถานะเกมที่จำเป็นต่อการตัดสิน CAPTCHA เช่น การเกิดและการตายของผู้เล่น รวมถึงการกำจัดศัตรู จะถูกส่งไปยัง UI ผ่าน JavaScript callback
  • ตัวเลือกการรันเริ่มต้นตั้งไว้เป็น -skill 5, -fast, -warp e1m1, -nomenu เพื่อเข้าสู่การต่อสู้ที่ยากทันทีโดยไม่มีเมนู
  • เพื่อการใช้งานอย่างถูกกฎหมาย ได้ปรับให้เข้ากันได้กับ shareware wad อย่าง doom1.wad และสามารถดูซอร์สโค้ดกับลิงก์สร้าง UI ด้วย v0 ได้

โครงสร้างการรัน Doom ในรูปแบบ CAPTCHA

  • DOOM CAPTCHA คือ CAPTCHA ที่ให้ผู้ใช้ เล่น DOOM® เพื่อพิสูจน์ว่าเป็นมนุษย์
  • การใช้งานทำโดยใช้ Emscripten คอมไพล์พอร์ต Doom ขั้นต่ำเป็น WebAssembly
  • มีการจัดโครงสร้างให้ลูปเกมที่ใช้ C อย่าง g_game.c และ UI CAPTCHA ที่ใช้ JavaScript สามารถส่งสถานะระหว่างกันได้
  • จุดเริ่มต้นคือพอร์ต Doom ขั้นต่ำที่ใช้ SDL ซึ่งสามารถคอมไพล์เป็น WebAssembly ได้อย่างมีประสิทธิภาพ
  • เพื่อการใช้งานอย่างถูกกฎหมาย จึงปรับบิลด์ให้เข้ากันได้กับ doom1.wad ซึ่งเป็น wad เวอร์ชัน shareware

การปรับเกมให้เหมาะกับ CAPTCHA

  • การจัดการเมนูและการคืนชีพ

    • เพิ่มแฟล็กการรันที่ไม่เป็นทางการเพื่อทำให้การดำเนินเกมเรียบง่ายตามโฟลว์ของ CAPTCHA
    • -nomenu: ข้ามเมนูหลักใน m_menu.c แล้วเข้าสู่เกมทันที
    • -autoreborn: ทำให้ผู้เล่นคืนชีพอัตโนมัติหลังตายไป 2 วินาทีใน p_mobj.c
  • อีเวนต์เกมที่ส่งไปยัง UI

    • UI ของ CAPTCHA รับสถานะเกมผ่าน JavaScript callback เพื่อนำไปใช้ในโฟลว์การตัดสิน
    • onPlayerBorn: ถูกเรียกเมื่อผู้เล่นเกิดหรือคืนชีพ
    • onPlayerKilled: ถูกเรียกเมื่อผู้เล่นตาย
    • onEnemyKilled: ถูกเรียกเมื่อผู้เล่นหลักกำจัดศัตรู
  • ระดับความยากเริ่มต้น

    • เปลี่ยนแฟล็กการรันเริ่มต้นใน d_main.c เพื่อให้เริ่มต้นในสถานการณ์ที่ยากขึ้น
    • -skill 5: ตั้งค่าระดับความยากเป็น "Nightmare!"
    • -fast: ทำให้เกมยากขึ้น
    • -warp e1m1: เริ่มเกมจากจุดที่มีแอ็กชัน
    • -nomenu: ป้องกันไม่ให้ผู้เล่นเปิดเมนูหลักได้

ซอร์สและเงื่อนไขการใช้งาน

  • สามารถดู ผลลัพธ์การสร้าง UI ด้วย v0 และ ซอร์สโค้ด ได้
  • โปรเจกต์นี้อ้างอิงจากเวอร์ชัน DOOM® shareware ที่เผยแพร่สำหรับการใช้งานที่ไม่ใช่เชิงพาณิชย์ และ DOOM® เป็นเครื่องหมายการค้าจดทะเบียนของ id Software LLC

1 ความคิดเห็น

 
GN⁺ 2025-01-02
ความคิดเห็นจาก Hacker News
  • พยายามเล่นตามวิธีที่ตั้งใจไว้แล้ว แต่มันยากเกินไป เลยสามารถ ผ่านแบบใช้ทริก ได้ด้วยการยืนอยู่ที่จุดเริ่มต้นแล้วจัดการเฉพาะศัตรูที่โผล่มาจากด้านขวา

    • ถ้าเงื่อนไขเริ่มต้นเป็นแบบนั้น นั่นไม่ใช่ทริก แต่เป็นยุทธวิธีมาตรฐาน เวลาเหลือแค่ปืนพกหรือมีกระสุนอาวุธอื่นไม่พอก็ใช้วิธีนี้กัน
      ในเกมพวกนี้ ความแม่นของปืนพก ดีแบบเหลือเชื่อ ยิงจากระยะไกลทีละไม่กี่นัดก็เก็บศัตรูได้ ส่วนศัตรูในนี้ใช้ปืนลูกซอง ซึ่งไร้ประสิทธิภาพมากในระยะไกล เกมจำลองการกระจายของกระสุนลูกซองให้กว้างเกินจริง ดังนั้นแม้ศัตรูไกล ๆ จะเล็งตรงเป๊ะ ความเสียหายก็น้อยมาก
      สมัยก่อนตอนเล่นบน NetWare LAN ของมหาวิทยาลัย แค่รักษาระยะห่างไว้ก็ชนะคนที่ถืออาวุธแรงกว่าแต่แม่นน้อยกว่าได้แล้ว ปกติก็ปืนลูกซองหรือปืนลูกซองสองลำกล้องในเวอร์ชันหลัง ๆ และทุกคนมองว่าอันนั้นสะใจที่สุด
      มันใช้ได้ดีจนกว่าจะมีใครอ้อมมาติดหลังในระยะประชิด และถ้าตายแล้วเกิดใหม่ในตำแหน่งดี ๆ ก็หาเจ้านั่นเจอเร็วแล้วแก้แค้นด้วยปืนพกได้ ใช้กับเครื่องยิงจรวดก็ได้เหมือนกัน ตราบใดที่ไม่โดนยิงตรง ๆ หรือไม่ได้อยู่ในจุดที่ความเสียหายจากแรงระเบิดของลูกที่ยิงพลาดจะทำแผนพังง่าย ๆ
      พูดแบบยุคเก่า นี่เป็นวิธีที่ใช้ได้ใน เกมแนว DOOM จำนวนมากและเกมสืบทอดของมัน แม้แต่ใน HL2 ปืนพกพื้นฐานก็ยิงได้ไม่จำกัดตามจำนวนครั้งที่กดปุ่มยิง และไม่มีช่วงหน่วงขั้นต่ำระหว่างนัดเหมือนอาวุธอื่น จึงใช้ได้ผลดี
    • นี่ไม่ใช่ด่านแรก แต่เงื่อนไขอาวุธตอนเข้าด่านนั้นถูกต้องแล้ว
      แถมยังใช้คีย์บอร์ดอย่างเดียว ปุ่มลูกศรซ้ายขวาจะหมุนตัวละคร แต่ใน เกมยิงมุมมองบุคคลที่หนึ่ง สมัยใหม่ เราชินกับการใช้มันเคลื่อนที่ซ้ายขวาแล้วใช้เมาส์หมุน ทำให้รีเฟล็กซ์รวน
    • ถ้าทุกอย่างรันอยู่ฝั่ง ไคลเอนต์ ก็ไม่จำเป็นต้องใช้ทริกด้วยซ้ำ เซิร์ฟเวอร์ไม่มีทางตรวจสอบได้ว่าฆ่าศัตรูครบจำนวนที่ต้องการจริงหรือไม่
    • ผมก็ทำแบบเดียวกัน กดลูกศรถอยหลังเพื่อถอย แล้วกดสเปซบาร์ทุก ๆ 1 วินาทีก็จบ ผ่านไปสัก 30 วินาที CAPTCHA ก็ถูกแก้ได้
    • การให้เริ่มด่านนี้แบบ เริ่มด้วยปืนพก นี่โหดไปหน่อย อย่างน้อยควรให้ปืนลูกซองมาด้วย
  • ฝีมือด้านเทคนิค +100, การใช้งาน -100. ทริปย้อนความทรงจำ +10 และได้ตระหนักรู้ด้วยว่าตอนนี้ฉันเล่นเกมไม่เป็นแล้ว

    • นี่คือด่านลับ E1M9 ที่ปกติจะเจอหลัง E1M3 ถ้าเล่นตามเส้นทางปกติ ถึงจุดนี้ก็น่าจะได้ปืนลูกซอง, chaingun, เครื่องยิงจรวด และอาจรวมถึงเกราะแล้ว
      การให้เริ่มด่านนี้ด้วยปืนพกอย่างเดียว และดูเหมือนเป็นระดับ Ultra-Violence หรือ Nightmare นี่แทบจะขอให้โดนยิงตายชัด ๆ
    • ถ้าไม่มีการหันมุมมองด้วยเมาส์จะยากขึ้นมาก ผมใช้เกิน 10 ครั้งกว่าจะผ่าน และใน Overwatch ผมอยู่ระดับ Diamond
    • ก็ไม่รู้เหมือนกันว่ามันปลอดภัยจากบอตจริง ๆ แค่ไหน สมัยนี้น่าจะสร้าง AI ที่เล่น DOOM ได้เก่งพอ ๆ กับมนุษย์แล้ว
    • ตลกดีที่คีย์บอร์ดของผมไม่มีปุ่มลูกศร ถึงจะผูกไว้ในเลเยอร์อื่นแล้ว แต่ก็ไม่ค่อยเข้ากับการตั้งค่านี้
      ถ้าการทำงานนี้รองรับ WASD ซึ่งตอนนี้เป็นมาตรฐานแล้ว และยิงด้วยปุ่มซ้ายของเมาส์ได้เหมือนต้นฉบับ การพิสูจน์ว่าผมเป็นมนุษย์ก็คงง่ายขึ้นเยอะ
  • เป็นด่านที่ยาก และถ้าจำไม่ผิดเป็นหนึ่งในด่านลับ รู้สึกเหมือนเปิด -fast อยู่ด้วย และยิ่งยากขึ้นมากเพราะ เคลื่อนที่ซ้ายขวา ไม่ได้ แต่ก็น่ารักมาก

    • ใช่แล้ว นี่คือ E1M9 ด่านลับของเวอร์ชันแชร์แวร์ และเป็นระดับ Nightmare
      ถ้ากด Alt ค้างตามวิธีสมัยก่อน จะเคลื่อนที่ซ้ายขวาได้
      ในเครื่องผมเสียงออกมาสูงผิดปกติ ไม่รู้ทำไม แต่ก็ไม่ใช่ปัญหาใหญ่ เพราะมันเข้ากับประสบการณ์บ้าบอนี้ดี
    • บน Firefox ใน Linux เคลื่อนที่ซ้ายขวาได้ อาจเป็นเพราะระบบปฏิบัติการหรือการตั้งค่าเบราว์เซอร์ไปบล็อกไว้
    • มันยากขนาดนั้นจริงเหรอ? ผมเตรียมจะบ่นเบา ๆ ว่าบนมือถือเล่นไม่ได้ แต่การควบคุมบนหน้าจอกลับใช้ได้ดี และไม่มีปัญหาอะไรในการเก็บสามตัวทันที
      แต่ก็จริงว่าช่วงหลังผมเล่น Classic Doom ค่อนข้างเยอะ
    • ถ้ากด Alt ค้างไว้ จะเคลื่อนที่ซ้ายขวาได้แน่นอน อย่างน้อยของผมก็ได้
    • ใช่ E1M9 ขึ้นชื่อว่ายากแบบร้ายกาจถ้า เริ่มด้วยปืนพก ผมเห็นปุ๊บก็รู้เลย เผยให้เห็นว่าตอนเด็ก ๆ ใช้เวลากับ Doom ไปมากแค่ไหน
  • มอนสเตอร์เยอะเกินไป ต้องลอง 3–4 ครั้งถึงผ่าน เหมือน CAPTCHA จริง ๆ

    • เพราะงั้นผมเลยมองว่าเป็นงานล้อเลียน
    • เหมือน CAPTCHA จริง ๆ ตรงที่เป็นนรกสำหรับคนพิการ 10 เต็ม 10
  • สัตว์ประหลาดแบบไหนกันที่ไม่ให้ WASD แถมอย่างน้อยก็ไม่ให้ยิงด้วย Ctrl? แต่ก็เป็น CAPTCHA ที่เท่ดี

    • ijkl;
  • ทุกครั้งที่ต้องแก้ CAPTCHA เพื่อเข้าสู่ระบบคอนโซล AWS ผมมักคิดว่า เป้าหมายที่มันพยายามกันไว้น่าจะทำอัตโนมัติได้ง่าย ๆ แต่ผู้ใช้ส่วนใหญ่ต้องทรมานกับ “ฟีเจอร์” นี้
    โมเดลโอเพนซอร์สบางตัวแก้ของพวกนั้นได้โดยไม่ต้องมีด่านเฝ้าประตูแบบ “ความปลอดภัย AI” ด้วยซ้ำ
    Apple เสนอทางออกสำหรับ CAPTCHA ไว้แล้ว[1] ผมกำลังรอให้มันกลายเป็นมาตรฐานและถูกใช้กันแพร่หลาย
    [1] https://support.apple.com/en-us/102591

    • วิธีคือ “แทนที่จะให้ต้องกรอก CAPTCHA เมื่อเข้าสู่ระบบแอปหรือเว็บไซต์ เซิร์ฟเวอร์ของ Apple จะยืนยันอุปกรณ์และ Apple Account จากนั้นส่งการยืนยันนี้ไปยังเซิร์ฟเวอร์ออกโทเคนของบุคคลที่สามที่ Apple ตรวจสอบแล้ว และเซิร์ฟเวอร์นั้นจะสร้าง โทเคนการเข้าถึงแบบส่วนตัว เพื่อยืนยันผู้ใช้กับแอปหรือเว็บไซต์”
      เรื่องนี้ไม่ได้ดีกว่าด้านความเป็นส่วนตัวอย่างชัดเจนเลย และยังให้อำนาจควบคุมกับ Apple มากขึ้น ผมยอมเสียเวลาเพิ่มอีก 3 วินาทีกับ CAPTCHA ดีกว่า
    • “ไม่จำเป็นต้องทำ CAPTCHA ให้เสร็จ แค่เข้าสู่ระบบแอปหรือเว็บไซต์ก็พอ” งั้นขอผ่าน ไม่ต้องการ
      ผมอ่านประโยคนั้นแล้วก็หยุดอ่านเอกสารซัพพอร์ตของ Apple ทันที
  • เกร็ดเล็กน้อย: ผู้สร้าง Doom เคยเล่นทดสอบเองเพื่อยืนยันว่าแต่ละด่านสามารถเคลียร์ได้แม้เริ่มด้วย ปืนพกกับกระสุน 50 นัด เท่านั้น

  • การให้เครดิตผู้สร้าง Doom Captcha ต้นฉบับ ในรีโพ GitHub เป็นเรื่องที่ถูกต้องแล้ว ทุกวันนี้ความคาดหวังต่ออุตสาหกรรมซอฟต์แวร์โดยรวมต่ำสุดเป็นประวัติการณ์ เลยรู้สึกดีที่ได้เห็น
    ต้นฉบับเมื่อไม่กี่ปีก่อนอยู่ที่นี่
    https://vivirenremoto.github.io/doomcaptcha
    https://github.com/vivirenremoto/doomcaptcha

  • อันนี้ยากนะ ผมคงไม่ใช่มนุษย์แล้วมั้ง
    ไม่ได้เล่น Doom มานานเกินไป และถ้าไม่มีการเคลื่อนที่ซ้ายขวาก็แทบเป็นไปไม่ได้

    • มีคนพูดไว้ที่อื่นแล้วเหมือนกัน แต่กด Alt + ซ้าย/ขวา จะ เคลื่อนที่ซ้ายขวา ได้
    • เดินหน้าไปล่อมอนสเตอร์ แล้วรีบกลับไปยังจุดเริ่มต้น ใช้ที่กำบัง จากนั้นค่อย ๆ ยิงจากไกลทีละตัว ง่ายเลย
  • อันนี้สร้างด้วย v0 ผู้ช่วย AI ของ Vercel
    ลิงก์แชตอยู่ที่นี่: https://v0.dev/chat/4X85A52Dzde?b=b_tOXbbZzZPgT&f=0

    • คำว่า “with” ตรงนี้แบกรับความหมายไว้ค่อนข้างมาก ผมไล่อ่านล็อกแล้วดูเหมือนสิ่งที่ผู้ช่วย AI ทำมีแค่การออกแบบ UI และไม่ได้ implement ตัวเกมจริง ๆ
      ฟังดูน่าประทับใจได้ก็จริง แต่ถ้าไม่นับการเพิ่มปฏิสัมพันธ์เล็ก ๆ อย่างปุ่มที่แสดง “loading” อยู่ไม่กี่วินาที ในเชิงฟังก์ชันก็ไม่ได้ต่างจาก ตัวออกแบบ UI แบบลากแล้ววาง อย่าง winforms มากนัก ส่วนบรรพบุรุษของมันอย่าง Visual Basic ก็มีมาตั้งแต่ยุค 90 แล้ว
    • ไม่เห็นส่วน JS เลย ดูเหมือนใช้ผู้ช่วยแค่สร้างเลย์เอาต์ ส่วน การรวม DOOM จริง ๆ ไม่ได้ใช้
      ถึงอย่างนั้น แชตนั้นพออ่านไปสักพักก็ทรมานอยู่ดี ใจความประมาณว่า “จัดข้อความในปุ่มให้อยู่กึ่งกลาง”, “ยังไม่กลางเลย ทำให้กลาง”, “ขอร้องล่ะ ทำให้ข้อความอยู่กึ่งกลาง”
    • ผมอ่านแชตแล้ว ทั้งหมดมีแต่การแก้รายละเอียดเลย์เอาต์ และดูเหมือนไม่มีจุดที่ DOOM ถูกฝังเข้าไปจริง ๆ เลย ไม่เข้าใจว่าให้ AI ทำส่วนง่าย แล้วเขียนโค้ดส่วนยากเองหรือเปล่า
    • อย่างที่คนอื่นชี้ไว้ นั่นเป็นแค่การตั้งค่า UI เท่านั้น
      รีโพที่มีซอร์สส่วนที่เหลืออยู่ที่นี่: https://github.com/rauchg/doom-captcha
      ต้องแก้ Doom ด้วยเพื่อปรับบางอย่าง เช่น ข้ามเมนูและเพิ่ม callback ที่จำเป็น