King of the Hill: Bank Heist


15

ตัวอย่างการรันเพิ่ม 4/11

ชี้แจงกฎ 4/8: การส่งทั้งหมดจะแข่งขันในทัวร์นาเมนต์ยักษ์ฟรีสำหรับทุกการแข่งขันซึ่งประกอบด้วยการแข่งขันมากที่สุดเท่าที่คอมพิวเตอร์ของฉันสามารถทำงานได้ใน 48 ชั่วโมง

ใครก็ตามที่ใช้เวลาดูลำธารบน Twitch นั้นทราบถึงความชุกของDeepBotและอาจคุ้นเคยกับเกมพนันBank Heist การแข่งขัน King of the Hill ครั้งนี้ได้รับแรงบันดาลใจโดยตรงจากเกม ไม่ต้องกังวลไป ฉันคิดว่าฉันได้เพิ่มข้อบกพร่องในรุ่นนี้มากพอที่จะทำให้สิ่งต่าง ๆ น่าสนใจ

ตัวอย่างรวดเร็ว

#####GAME 13: 16 players######

Round 1:
gunHeCK bet 0.
PassivePanga bet 69.
SnitcherKing bet 1.
Lurker bet 0.
OC'sRandomTpyos bet 1.
MonisAddiction bet 69.
RaysFive01K bet 28.
LimeadeSneaktar bet 1.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
HeCKuSumer bet 185.

Round 2
HeCKuSumer decided to !guncheck.
LimeadeSneaktar decided to double cross.
MonisAddiction decided to all in.
OC'sRandomTpyos decided to acquire intel.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.
PassivePanga decided to !guncheck.

Results
PassivePanga failed. :(
SnitcherKing failed. :(
OC'sRandomTpyos was successful, and may gain ¥0
MonisAddiction failed. :(
RaysFive01K was successful, and may gain ¥0
LimeadeSneaktar was successful, and may gain ¥1
HeCKuSumer failed. :(

Results:
0. KaylorrCriterion: 3600
1. Lurker: 3600
2. gunHeCK: 3600
3. SnitcherKing: 3586
4. PassivePanga: 2634
5. LimeadeSneaktar: 2496
6. HeCKuSumer: 1909
7. HardHatUmar: 490
8. RaysFive01K: 255
9. OC'sRandomTpyos: 170
10. MonisAddiction: 0

(In this round, 7 players joined the heist, but the dice only rolled right for 3 of them. Of those, only LimeadeSneaktar brought any home--having stolen it from OcsRandomTpyos. RaysFive01K won significantly more, but deposited it all at the bank before leaving. At this point, the players who did not heist are doing well, living off their day jobs.)

#####GAME 14: 231 players######

Round 1:
Lurker bet 0.
HeCKuSumer bet 190.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
MonisAddiction bet 0.
OC'sRandomTpyos bet 1.
gunHeCK bet 0.
LimeadeSneaktar bet 1.
RaysFive01K bet 25.
PassivePanga bet 69.
SnitcherKing bet 1.

Round 2
PassivePanga decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
HeCKuSumer decided to !guncheck.
SnitcherKing decided to finger.
RaysFive01K decided to deposit.
LimeadeSneaktar decided to double cross.

Results
HeCKuSumer failed. :(
OC'sRandomTpyos failed. :(
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
PassivePanga failed. :(
SnitcherKing failed. :(

Results:
0. KaylorrCriterion: 3840
1. Lurker: 3840
2. gunHeCK: 3840
3. SnitcherKing: 3825
4. PassivePanga: 2805
5. LimeadeSneaktar: 2495
6. HeCKuSumer: 1959
7. HardHatUmar: 490
8. MonisAddiction: 240
9. RaysFive01K: 229
10. OC'sRandomTpyos: 161

Six players heisted--but should have been paying more attention to the rabble and backed out, because the probabilities dropped too low to win, and all failed.


#####GAME 15: 300 players######

Round 1:
OC'sRandomTpyos bet 1.
Lurker bet 0.
SnitcherKing bet 1.
MonisAddiction bet 69.
LimeadeSneaktar bet 1.
gunHeCK bet 0.
HardHatUmar bet 0.
RaysFive01K bet 22.
KaylorrCriterion bet 0.
HeCKuSumer bet 195.
PassivePanga bet 69.

Round 2
HeCKuSumer decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
MonisAddiction decided to all in.
PassivePanga decided to !guncheck.
LimeadeSneaktar decided to double cross.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.

Results
OC'sRandomTpyos failed. :(
SnitcherKing failed. :(
MonisAddiction was successful, and may gain ¥0
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
HeCKuSumer failed. :(
PassivePanga failed. :(

And here, the probabilities dropped too low to win again--except for MonisAddiction, who went all in, and therefore avoided the probability modification incurred by the rabble backing out. No winnings are listed here, because a player who wins going all in immediately adds all winnings to its holdings without any possible modification by other players' actions.

กฎของเกม

โครงสร้างการแข่งขัน / เกม

  • ทัวร์นาเมนต์จะประกอบด้วยเกมจำนวนหนึ่งที่เลือกสุ่มอย่างสม่ำเสมอระหว่าง 1,000 และ 1100 ซึ่งทุกการแข่งขันที่จริงจังจะมีการแข่งขันพร้อมกันในแบบฟรีสำหรับทุกคน
  • ผู้เล่นทุกคนเริ่มเกมแรกด้วย 240 เครดิตและแต่ละเกมที่ตามมาด้วยจำนวนเครดิตที่มีในตอนท้ายของเกมก่อนหน้า
  • แต่ละเกมจะดำเนินการใน 2 รอบและในแต่ละรอบผู้เล่นจะถูกเรียกตามลำดับที่กำหนดอย่างเท่าเทียมกันโดยการสุ่มเพื่อทำการตัดสินใจ:
    • ในรอบแรกผู้เล่นสามารถจ่ายเครดิตจำนวนเต็มใด ๆ ระหว่าง 0 และการถือครองเครดิตในปัจจุบันเพื่อการมีส่วนร่วมในการปล้นธนาคาร
    • ในรอบที่สองผู้เล่นแต่ละคนที่ได้รับเลือกให้เข้าร่วมในการปล้นโดยการวางเดิมพันอย่างน้อยหนึ่งเครดิต (ต่อไปนี้จะเรียกว่า "ผู้พิทักษ์") อาจตัดสินใจที่จะปล่อยให้การเดิมพันของพวกเขาขี่ม้า (และในขณะนั้น ยกเลิกการปล้นหรือไปทั้งหมด (ตัวเลือกเหล่านี้อธิบายเพิ่มเติมด้านล่าง)
  • ขึ้นอยู่กับจำนวนผู้ชำระเงินและจำนวนเครดิตที่จ่ายไปหนึ่งในห้าของธนาคารจะถูกเลือกเพื่อใช้ในการปล้น การเลือกนี้มีผลต่อความน่าจะเป็นของชัยชนะและอัตราการจ่ายเงินที่กำหนด (ธนาคารอธิบายไว้ด้านล่าง)
  • ทายาทแต่ละคนที่ไม่ได้เลือกประสงค์จะชนะเดิมพันของธนาคารคูณด้วยอัตราเดิมพันการเดิมพัน (แก้ไข) ของธนาคาร (ปัดเศษลง) หรือแพ้การเดิมพัน โปรดทราบว่าความสำเร็จหรือความล้มเหลวของผู้เล่นแต่ละคนจะถูกกำหนดเป็นรายบุคคล - บางคนจะประสบความสำเร็จเมื่อคนอื่นล้มเหลว
  • ผู้เล่นทุกคนไม่ว่าพวกเขาจะเข้าร่วมหรือไม่ประสบความสำเร็จหรือล้มเหลวจากนั้นได้รับการตรวจเช็ค (ยกเว้นมีอธิบายไว้ด้านล่าง)
  • โปรดทราบว่ามันเป็นไปไม่ได้ที่จะออกจากเกมอย่างถาวร ที่เลวร้ายที่สุดผู้เล่นอาจต้องรอเกมเพื่อรับการตรวจเช็คครั้งต่อไป
  • หลังจาก 1,000-1100 เกมผู้เล่นที่มีจำนวนเครดิตมากที่สุดจะถูกประกาศให้เป็นผู้ชนะในทัวร์นาเมนต์นั้น
  • ทัวร์นาเมนต์จะถูกทำซ้ำโดยไม่ระบุจำนวนครั้ง (มากที่สุดเท่าที่สามารถคำนวณได้ใน 48 ชั่วโมง) และรายได้ของผู้เล่นในทัวร์นาเมนท์ทั้งหมดจะถูกรวมเพื่อตัดสินผู้ชนะการแข่งขันโดยรวม

รอบการเดิมพันที่สอง

  • ผู้เล่นใด ๆ ที่ได้ทำการเดิมพันในเชิงบวกในรอบแรกอาจเข้าร่วมในรอบที่สอง
  • ในรอบนี้ผู้เล่นอาจ:
    • ตอบกลับด้วยสตริง "back out" เพื่อยกเลิกการเดิมพัน การทำเช่นนี้จะทำให้การเดิมพันเป็นศูนย์สำหรับการปล้นในปัจจุบันและลดความน่าจะเป็นที่ผู้เล่นที่เหลือในการปล้นจะประสบความสำเร็จเล็กน้อย โดยการเลือกตัวเลือกนี้ผู้เล่นจะลืมค่าตอบแทน 240 เครดิตซึ่งตามหลังการปล้นเพื่อลงโทษผู้เล่นที่เหลือที่ตกอยู่ในความเสี่ยง (heisters ที่เหลือจะประสบความสำเร็จด้วยความน่าจะเป็นเท่ากับความน่าจะเป็นของธนาคารคูณด้วยส่วนของ heisters ที่ไม่ได้ "ถอยออก")
    • ตอบกลับด้วยสตริง "ทั้งหมดใน" เพื่อระเบิดการถือครองเครดิตทั้งหมด - และนำเงินกู้ payday ออกจาก paycheck เครดิต 240 ถัดไป - เพื่อซื้ออุปกรณ์ที่ดีที่สุดและ intel สำหรับการปล้นและไปคนเดียวปืนที่โดดเด่นโดยไม่ต้อง พึ่งพาใครก็ได้ โอกาสในการได้รับชัยชนะของผู้เล่นไม่สามารถได้รับผลกระทบจากผู้เล่นคนอื่นที่หลุดออกจากการปล้นและเงินรางวัลจะถูกขโมยโดยผู้เล่นสองคน การจ่ายเงินที่ชนะจะได้รับการพิจารณาราวกับว่าการเดิมพันเป็นการถือครองเครดิตทั้งหมดรวมกับ 240 ในขณะที่การสูญเสียจะทำให้การถือครองเป็นศูนย์
    • ตอบกลับด้วยสตริงอื่น ๆ (รวมถึงสตริงที่ว่างเปล่า) เพื่อที่จะยึดติดกับการเดิมพันก่อนหน้าและผ่านไปกับการปล้นตามปกติ (คำตอบที่แนะนำ: "! guncheck") คำตอบบางอย่างจะมีผลข้างเคียงเพิ่มเติม:
      • คำตอบของ "เปลี่ยนงาน" จะทำให้ผู้เล่นออกจากงาน เริ่มต้นรอบนี้ในตอนท้ายของแต่ละรอบผู้เล่นจะมีโอกาส 5% ที่จะได้รับการว่าจ้างในตำแหน่งใหม่ หากประสบความสำเร็จผู้เล่นจะได้รับการว่าจ้างและได้รับเงินเดือนแรกทันที แต่ละงานใหม่รับประกันว่าจะจ่ายมากกว่า 5% (ปัดเศษลง) อย่างแน่นอน การกระทำนี้จะสำเร็จไม่ว่าการปล้นจะสำเร็จหรือไม่
      • คำตอบของ "ซื้อ Intel" จะถ้าปล้นสำเร็จทำให้ผู้เล่นที่จะใช้จ่ายทั้งหมดของเงินรางวัลจากการปล้นที่จะได้รับการเสริมต่อการใช้จ่ายบัตรเครดิตดังนั้นในการต่อรองสำหรับธนาคารที่ถูก heisted 0.00001 สำหรับผู้เล่นที่มีเพียง การปรับราคาต่อรองนี้เป็นแบบถาวร ตัวอย่างเช่นหากผู้เล่นเลือกการกระทำนี้เมื่อทำการปล้นธนาคาร 1 และชนะ 6969 เครดิตในการปล้นโอกาสของธนาคาร 1 สำหรับผู้เล่นนั้นจะเพิ่มขึ้นอย่างถาวรโดย 0.06969 และผู้เล่นจะไม่ได้รับอะไรจากการปล้น
      • คำตอบของ "ผู้พิทักษ์การซื้อ" จะทำให้ผู้เล่นซื้อเจ้าหน้าที่รักษาความปลอดภัยคนหนึ่งในธนาคารที่ถูกขโมย เพื่อแลกกับการลดถาวร 1 เครดิตใน paycheck ของผู้เล่น (ผู้คุมสินบนปกติ) ผู้เล่นจะได้รับ "ถาวร" เพิ่มโอกาสในชัยชนะที่ธนาคารนั้น (เนื่องจากผู้พิทักษ์ "ลืมที่จะพูดถึง" ผู้เล่นตำรวจเมื่อ ถาม) ความน่าจะเป็นจะเพิ่มขึ้น 1% จากความแตกต่างระหว่างความน่าจะเป็นชัยชนะปัจจุบันของผู้เล่นที่ธนาคารนั้นและ 100% การกระทำนี้จะสำเร็จแม้ว่าการปล้นจะล้มเหลว หมายเหตุ: หากในเวลาใด ๆ ผู้เล่นมีเครดิตไม่เพียงพอที่จะจ่ายเงินสินบนของผู้คุมได้ทันทีและ "ถาวร" จะสูญเสียโบนัสความน่าจะเป็นจำนวนมากเท่ากับจำนวนสินบนที่ไม่สามารถจ่ายได้
      • การตอบกลับของ "เงินฝาก" จะเกิดขึ้นหากการปล้นสำเร็จปล่อยให้ผู้เล่นชนะทั้งหมดในบัญชีที่ธนาคารที่ได้รับการรักษา เครดิตจะไม่สามารถเข้าถึงได้สำหรับวัตถุประสงค์ใด ๆ หรือไม่ถูกนับรวมกับคะแนนของผู้เล่นจนกว่าจะถอนออก บัญชีนี้จะจ่ายดอกเบี้ยในอัตรา 0.14% ต่อเกม
      • คำตอบของ "ถอนตัว" จะเกิดขึ้นถ้าผู้ปล้นสำเร็จจะเพิ่มเงินรางวัลทั้งหมดของบัญชีของผู้เล่นที่ธนาคารที่ได้รับ บัญชีจะมีผลเป็นศูนย์ โปรดทราบว่าการชนะเพิ่มเติมเหล่านี้สามารถถูกขโมยโดยผู้เล่นคู่
      • คำตอบของ "double cross" จะทำหนึ่งในสองสิ่งต่อไปนี้:
        • หากจำนวนผู้เล่นที่เล่น "double cross" มากที่สุด 1 / 10th (ปัดลง) จำนวนผู้เล่นแบบ non-rabble ทั้งหมดที่ตัดสินใจผ่านการปล้นครั้งนั้น (หรือมากกว่าหนึ่งครั้งหากมีผู้เล่นน้อยกว่า 10 คน ) ผู้เล่นจะได้รับเงินชนะเพิ่มเติมเท่ากับจำนวนเงินชนะทั้งหมดของผู้ที่ไม่ได้เป็นผู้ชนะคู่ที่หารด้วยจำนวนผู้เล่นที่มีผู้ชนะสองคน (ปัดเศษลง) ผู้ที่ไม่ได้เป็นครอสคู่ทั้งหมดในกรณีนี้จะได้รับ 0 เครดิตจากการปล้น กล่าวอีกนัยหนึ่งนักบิดคู่นี้ขโมยเครดิตของคนอื่นและแบ่งให้เท่า ๆ กัน
        • หากจำนวนผู้เล่นที่เล่น "double cross" เกินขีด จำกัด ผู้เล่นจะไม่ได้รับเงินชนะ (หากการปล้นสำเร็จ) ตัดการจ่ายเงินครึ่งหนึ่งและถูกไล่ออกจากงาน (ดูที่ "เปลี่ยนงาน".) ผู้ที่ไม่ได้เป็นผู้เล่นสองคน (รวมถึงการเล่นแรบเบอร์) ในกรณีนี้จะได้รับโบนัสการจ่ายเงินรางวัลของการชนะทั้งหมดของผู้ที่ทำสองครั้งทั้งหมดหารด้วยจำนวนผู้ที่ไม่ได้เป็นคู่ กล่าวอีกนัยหนึ่งการสมคบคิดใหญ่เกินไปที่จะเก็บความลับผู้สมคบคิดถูกคัดค้านและถูกแยกออกจากการปล้นและทุกคนก็แบ่งเงินเดิมพันเพื่อการลงโทษและชื่อเสียงของพวกเขาในเรื่องการค้าขายก็ทำให้งานของพวกเขาสกปรก
      • คำตอบของ "นิ้ว" (ในขณะที่ "นิ้วนิ้วแมวป่าข้าม - สองนิ้ว") จะถ้าขโมยประสบความสำเร็จให้ผู้เล่นที่มีโอกาสแปด (วาดอย่างสม่ำเสมอด้วยการเปลี่ยนจากชุดที่ไม่ใช่ - หมอฟัน) เพื่อระบุ - Crosser ซึ่งยังไม่ได้รับการยืนยันมาแล้วดังนั้น
        • แต่ละคู่ที่ระบุว่าวิธีนี้จะจ่ายเงินให้ fingerer ทันที 25% ของการถือเครดิตปัจจุบัน (ปัดเศษลง) แทนการถูกยิงตกงานและตัดเงินเดือนครึ่งหนึ่ง (เพราะเจ้านายไม่ยอมทนพฤติกรรมที่ไม่ดี) และสูญเสียความน่าจะเป็น 5% ของชัยชนะที่ธนาคารจะได้รับการรักษา (ในขณะที่ผู้ดูแลคนอื่นมีความสงสัยเป็นพิเศษในอนาคตและมีแนวโน้มที่จะโยนมันไว้ใต้รถบัส Double-crossers ระบุว่าวิธีนี้ไม่ส่งผลกระทบต่อการ double-cross นั้นประสบความสำเร็จสำหรับ cross-double อื่น ๆ แต่พวกเขาไม่ได้รับเครดิตที่ถูกขโมยใด ๆ จาก double-cross และการบอกว่าเครดิตที่ถูกขโมยจะถูกแจกจ่ายกลับไปที่ไม่ใช่ ดับเบิล crossers
        • หากไม่มีการระบุครอสคู่ด้วยวิธีนี้สนิชจะได้รับการเย็บร้อยเพื่อเสียเวลาของทุกคน - และจ่ายเงินรางวัลครึ่งหนึ่งจากการปล้นในปัจจุบันใช้เวลาตัด 5% ในการจ่ายเงินเดือน (หัวหน้าลดชั่วโมงของ tattletale) 5% ของอัตราต่อรองการเดิมพันที่ธนาคารปัจจุบัน (เนื่องจากผู้ดูแลคนอื่น ๆ มีโอกาสน้อยที่จะใจกว้าง / ยุติธรรมกับการชนะของพวกเขาในอนาคต) ครึ่งหนึ่งของเงินรางวัลที่ชนะจะสูญเสียไปจะถูกส่งไปยังผู้เล่นสองคนที่ยังไม่ได้จับคู่หากว่าผู้เล่นที่ประสบความสำเร็จหรือผู้ที่ไม่ได้ลงเล่นสองครั้ง

ธนาคาร

ธนาคารถูกเลือกโดยใช้ดัชนีnumheisters + int(totalamountbet/100000)โดยที่ผู้เล่นคือจำนวนผู้เล่นที่เดิมพันเป็นเงินเดิมพันบวกในรอบที่ 1 และจำนวนเงินเดิมพันทั้งหมดคือผลรวมของเงินเดิมพันของผู้เล่นทุกคน กล่าวอีกอย่างหนึ่งแสนเครดิตนั้นดีเท่ากับ heister เพิ่มเติม 1 คน จากดัชนีนี้หนึ่งในธนาคารต่อไปนี้จะถูกเลือกธนาคารที่มีเกณฑ์สูงสุดที่ดัชนีตรงหรือสูงกว่า:

Bank             Index Threshold   Victory Prob.  Bet Odds
----             ---------------   -------------  --------
0:Municipal                    0           0.540      0.80
1:City                        20           0.488      1.10
2:State                       40           0.425      1.30
3:National                    60           0.387      1.65
4:Federal Reserve             80           0.324      1.95

โปรดทราบว่าเมื่อการแข่งขันดำเนินต่อไปความน่าจะเป็นที่จะถึงระดับสูงสุดของธนาคารจะเพิ่มขึ้นเนื่องจากจำนวนผู้เล่นแต่ละคนสามารถเดิมพันแนวโน้มสูงขึ้น โปรดทราบว่าสิ่งเหล่านี้เป็นเพียงแค่อัตราเดิมพันเริ่มต้นและความน่าจะเป็นก่อนที่พวกเขาจะได้รับการแก้ไขโดยการกระทำใด ๆ "ซื้อ intel" หรือ "ซื้อการ์ด" ด้วยความน่าจะเป็นและอัตราเดิมพันเริ่มต้นเฉพาะธนาคารซิตี้และเนชั่นแนลเท่านั้นที่คาดว่าจะชนะมากกว่าที่คาดการณ์ไว้

The Rabble

  • ทัวร์นาเมนต์นี้มีผู้เล่นอีก 500 คนเรียกว่า "rabble" ซึ่งเข้าร่วมเป็นผู้เล่นปกติในการปล้น แต่ไม่ได้คะแนนในตอนท้าย สิ่งเหล่านี้จะทำให้เกมแต่ละเกมแตกต่างกันและคาดเดาได้น้อยกว่าและทำให้สามารถเข้าถึงธนาคารที่มีความเสี่ยง / ได้รับรางวัลมากกว่าแม้จะมีผู้เล่นเพียงไม่กี่คนเท่านั้น
  • แต่ละเกมจะมีชุดย่อยของ rabble บางส่วนที่จะเข้าร่วมเลือกโดยสุ่มอย่างสม่ำเสมอบนชุดย่อยของ rabble ทั้งหมด
  • Rabble ทั้งหมดใช้กลยุทธ์ต่อไปนี้:
    • สุ่มเลือกที่จะเดิมพันด้วยความน่าจะเป็นเท่ากับความน่าจะเป็นที่จะประสบความสำเร็จในธนาคารซึ่งจะถูกเลือกโดยขึ้นอยู่กับการตัดสินใจของผู้เล่นที่ได้ทำการตัดสินใจรอบนี้แล้ว
    • หากเดิมพันจำนวนที่ไม่ใช่ศูนย์ให้เลือกจำนวนเงินต่อไปนี้ที่ใหญ่ที่สุดซึ่งจะไม่เกินจำนวนการถือครองในปัจจุบัน: 69, 420, 6969, 80085
    • ในรอบที่สอง "ถอยออก" ที่มีความน่าจะเป็นเท่ากับ 5% บวก 50% ของสัดส่วนของผู้เดิมพันที่สำรองไว้แล้วไม่เช่นนั้นจะหยุดตามปกติ (โปรดทราบว่านี่หมายถึงผู้เล่นยุคแรกในรอบที่สองที่ออกมาข้างนอกสามารถมีเอฟเฟกต์แบบเรียงซ้อนขนาดใหญ่ในกลุ่มผู้ชมได้ - ให้ความสนใจและพร้อมสำหรับการปล้นเพื่อยุบก่อนที่มันจะเริ่ม)

อินพุตและเอาต์พุต

ในรอบสองโปรแกรมจะได้รับข้อมูลต่อไปนี้ในว่าคำสั่งนี้เป็นข้อโต้แย้งบรรทัดคำสั่ง ยกเว้นจะระบุไว้เป็นอย่างอื่นค่าทั้งหมดเป็นจำนวนเต็มที่ไม่มีทศนิยม

  1. หมายเลขเกมปัจจุบัน (ดัชนีเป็นศูนย์)
  2. จำนวนรอบของเกมปัจจุบัน (1 หรือ 2)
  3. จำนวนผู้เล่นในเกมปัจจุบัน (รวมถึงตัวสั่น)
  4. จำนวนผู้เล่นที่หันมาแล้วในรอบนี้
  5. จำนวนนักอนุรักษ์ที่มีส่วนได้ส่วนเสียเป็นบวก (ในรอบที่สองนี่จะเป็นจำนวนรวมของผู้ที่ได้ซื้อในรอบแรก)
  6. จำนวนเครดิตทั้งหมดที่ลงทุนไปแล้ว (ในรอบที่สองนี้จริงจะเป็นจำนวนรวมของสินเชื่อการลงทุนในรอบแรก - โดยเฉพาะอย่างยิ่งมันไม่ได้รวมกว่าเดิมพันเริ่มต้นของ "ทั้งหมดใน" heisters และไม่รวมถึงเงินเดิมพันของ "กลับออกมาว่า" heisters.)
  7. จำนวนผู้ได้รับการยืนยันในรอบที่สอง (กล่าวคือไม่ได้ "ถอยออก") นี่จะเป็นศูนย์ในระหว่างรอบแรก
  8. หมายเลข (ทำดัชนีเป็นศูนย์) ของธนาคารที่จะได้รับการแก้ไข (ในรอบแรกธนาคารที่จะได้รับการแก้ไขหากไม่มีใครเดิมพัน)
  9. จำนวนเครดิตที่ผู้เล่นสามารถใช้งานได้ในปัจจุบัน
  10. จำนวนเครดิตที่ผู้เล่นเดิมพันในรอบแรก (นี่จะเป็นศูนย์เสมอในรอบแรก)
  11. จำนวนเครดิตที่ผู้เล่นจะได้รับใน paycheck ในตอนท้ายของแต่ละเกม
  12. 1 หากผู้เล่นได้รับ paycheck ในขณะนี้ 0 หากผู้เล่นตกงาน
  13. อันดับของผู้เล่นในกระดานผู้นำ (ไม่รวมถึงการก่อกวน) ในตอนท้ายของเกมก่อนหน้าซึ่งมีการจัดทำดัชนี 1 รายการ (กำหนดให้เป็น 1 + จำนวนผู้เล่นที่มีเครดิตมากกว่าในเวลานั้นเช่นระหว่างเกมแรกผู้เล่นทุกคนมีอันดับ 1)
  14. จำนวนเฉลี่ยของเครดิตที่ผู้เล่นทุกคนถือ (ไม่รวมถึงการเล่นแรบเบอร์) (แสดงเป็นเลขทศนิยม)
  15. ค่าเบี่ยงเบนสัมบูรณ์โดยเฉลี่ยในจำนวนเครดิตที่ผู้เล่นทุกคนถือ (ไม่รวมถึงตัวสั่น) (แสดงเป็นเลขทศนิยม)
  16. จำนวนเครดิตสูงสุดที่ถือโดยผู้เล่นใด ๆ (เช่นจำนวนเครดิตที่ถือโดยผู้เล่นอันดับที่ 1 ไม่รวมถึงการใช้เล่ห์เหลี่ยม)
  17. จำนวนเครดิตที่ผู้เล่นเก็บไว้ในบัญชีธนาคาร 0
  18. บัญชีธนาคาร 1
  19. บัญชีธนาคาร 2
  20. บัญชีธนาคาร 3
  21. บัญชีธนาคาร 4
  22. ความน่าจะเป็นของผู้เล่นแต่ละคนในชัยชนะที่ธนาคาร 0
  23. ความน่าจะเป็นของธนาคาร 1
  24. ความน่าจะเป็นของธนาคาร 2
  25. ความน่าจะเป็นของธนาคาร 3
  26. ความน่าจะเป็นของธนาคาร 4
  27. อัตราการจ่ายของผู้เล่นแต่ละคนจะเกิดขึ้นเมื่อการปล้นสำเร็จที่ธนาคาร 0
  28. ธนาคาร 1 อัตราต่อรอง
  29. ธนาคาร 2 อัตราต่อรอง
  30. ธนาคาร 3 อัตราต่อรอง
  31. ธนาคาร 4 อัตราต่อรอง

ในรอบแรกของเกมโปรแกรมผู้เล่นจะต้องพิมพ์เพื่อ stdout จำนวนเต็มระหว่าง 0 และจำนวนเครดิตทั้งหมดในบัญชีของผู้เล่นนั้น จำนวนเงินเดิมพันใด ๆ ที่มากกว่ายอดเครดิตคงเหลือจะถือเป็นเงินเดิมพันสูงสุด เอาท์พุทอื่น ๆ (หรือเงื่อนไขข้อผิดพลาด) จะถูกตีความว่าเป็นศูนย์เดิมพัน

ในรอบที่สองของเกมโปรแกรมผู้เล่นจะต้องพิมพ์เพื่อ stdout สตริงตามที่อธิบายไว้ในส่วน "รอบเดิมพันที่สอง" ด้านบน เงื่อนไขข้อผิดพลาดที่นี่จะถูกนำไปใช้เป็นการกระทำเริ่มต้น: ผ่านการปล้นตามปกติ

ตัวควบคุม

การแข่งขันจะดำเนินการโดยใช้ตัวควบคุมนี้ ตัวอย่าง ธ ปท. ยังคงถูกทดสอบ รหัสเพิ่มเติมที่จะมา อย่าลังเลที่จะส่งการแก้ไขข้อบกพร่อง (บน GitHub) จะได้รับการอัปเดตหากมีการเปลี่ยนแปลงกฎใด ๆ เช่นกัน

ในการใช้งานทัวร์นาเมนต์เดี่ยวในเครื่องของคุณเองให้เพิ่ม line ไปที่ rival.txt จากนั้นใช้:

python bankheist.py 1000

กฎการประกวด

  • ผู้เล่นสามารถส่งโปรแกรมผู้เล่นจำนวนเท่าใดก็ได้ในภาษาใด ๆ ที่มีให้โดยอิสระซึ่งโปรแกรมที่อาจได้รับการโต้แย้งในบรรทัดคำสั่ง
  • การส่งต้องมีคำแนะนำที่ชัดเจนสำหรับการรวบรวมโปรแกรมและเรียกใช้บนพีซีของฉันรวมถึงชื่อของเครื่องมือที่จำเป็นและคำสั่งที่แน่นอน การส่งต้องมีคำสั่งอย่างน้อยหนึ่งคำสั่งซึ่งเรียกใช้งานโปรแกรมและอาจมีอาร์กิวเมนต์บรรทัดคำสั่งต่อท้ายโดยตรง
  • การส่งจะต้องมีชื่อเฉพาะเพื่อระบุ (ซึ่งไม่มีช่องว่าง)
  • โปรแกรมจะต้องทำงานในระยะเวลาอันสั้นพอสมควร (ฉันไม่ได้ตั้งค่าขอบเขตบนของสิ่งที่ถือว่าสมเหตุสมผล แต่ฉันจะแนะนำผู้สร้างรายการใด ๆ ที่ดูเหมือนว่าจะมีเวลาดำเนินการเกินมาตรฐานเพื่อเพิ่มความเร็ว)
  • โปรแกรมอาจไม่สามารถอ่านหรือเขียนไฟล์ได้ และไม่อาจใช้วิธีอื่นใดในการเก็บข้อมูลระหว่างการรัน ประเด็นของความท้าทายนี้คือการตัดสินใจที่ซับซ้อนบนพื้นฐานของข้อมูลที่ จำกัด / สรุป
  • กฎเหล่านี้ใด ๆ และทั้งหมดอาจมีการเปลี่ยนแปลงได้ตลอดเวลาหากจำเป็น ข้อความจะถูกเพิ่มที่ด้านบนของโพสต์นี้แสดงการเปลี่ยนแปลงใด ๆ
  • การประกวดครั้งนี้จะสิ้นสุดลงไม่เร็วกว่าหนึ่งสัปดาห์หลังจากที่ผ่านมาผู้ใช้ส่งโพสต์หรือเธอของเขาส่งครั้งแรก การดัดแปลงของผลงานที่มีอยู่ได้รับอนุญาตตลอดเวลาจนถึงการแข่งขันสิ้นสุดลง ฉันจะทำให้ดีที่สุดเพื่ออัปเดตกำหนดเวลาปัจจุบันในข้อความที่ด้านบนของโพสต์นี้
  • การประกวดครั้งนี้จะสิ้นสุดไม่ช้ากว่าหนึ่งสัปดาห์หลังจากครั้งสุดท้ายที่มีการเปลี่ยนแปลงกฎถ้ามี ฉันจะทำให้ดีที่สุดเพื่อแสดงความคิดเห็นสำหรับผู้ใช้ที่ได้รับผลกระทบจากการเปลี่ยนแปลงกฎใด ๆ
  • คุณเดิมพันที่ดีกว่าฉันจะเข้าร่วมการแข่งขันนี้ด้วยตัวเอง ;)

ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
เดนนิส

อาจเป็นเพราะฉันไม่คุ้นเคยกับเกม twitch หรือ heist แต่มีกฎมากมายที่อาจแสดงให้เห็นได้ดีที่สุดกับตัวอย่างการทำงานขนาดเล็ก ในขณะนี้ดูเหมือนว่าไม่สามารถเข้าถึงได้มาก
Moogie

ราชาแห่งขุนเขา? ฉันไม่เคยได้ยินชื่อนี้มาหลายปีแล้ว
Beta Decay

คำตอบ:


6

ตัวอย่างบางส่วนของ "โปรแกรมที่ไม่ดี"

นี่คือบอทบางตัวที่ฉันเขียนเพื่อทดสอบคอนโทรลเลอร์ ส่วนใหญ่พวกเขาเพียงทำสิ่งที่จำเป็นขั้นต่ำเพื่อทดสอบประเภทของการกระทำที่เฉพาะเจาะจง ทั้งนี้ขึ้นอยู่กับระดับการมีส่วนร่วมใน KotH นี้ไม่ว่าจะอยู่ในระดับใดก็ตามจนถึงระดับเล็กน้อยในการแข่งขันรอบสุดท้ายเนื่องจากกลยุทธ์ในเกมจำนวนมากจะมาจากการรับมือกับพฤติกรรมของบอทที่แตกต่างกันมากมาย

ฉันรวมพวกเขาทั้งหมดที่นี่ส่วนใหญ่เป็นตัวอย่าง "การใช้งาน"

Lurker

ไม่เคยเดิมพัน หากคุณไม่ได้ตีสิ่งนี้ให้ทบทวนกลยุทธ์ของคุณใหม่

print 0

PassivePanga

เดิมพัน 69 เสมอ

import sys


round = int(sys.argv[2])
myyattas = int(sys.argv[9])
if round == 1:
    if myyattas > 69:
        print "69"
    else:
        print "0"
else:
    print "!guncheck"

KaylorrCriterion

ทำการเดิมพันของ Kelly ถ้าหากว่าตรงตามเกณฑ์ของ Kelly เนื่องจากสิ่งนี้ไม่ค่อยเกิดขึ้นกับการทำ "ซื้อ intel" และ "ซื้อการ์ด" ก่อนสิ่งนี้มักได้รับผลลัพธ์เช่นเดียวกับ Lurker

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]



if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    if alreadyplayed < 0.37*numbet or numbet==0:
        print "!guncheck"
    else:
        p,b = get_bank(numbet,yattasbet)
        realp = p*numready/float(alreadyplayed)
        f = (realp*(b+1)-(1-240./(myyattas+240.)))/b
        print "!guncheck" if f>0 else "back out"

gunHeCK

ทำการเดิมพันของ Kelly หากจำนวนผู้ได้รับแต่งตั้งจนถึงขณะนี้แสดงให้เห็นว่าการเดิมพันนั้นตรงตามเกณฑ์ของ Kelly (แต่อย่าถอยออกหากผิด) โดยทั่วไปแล้วจะแย่กว่า Lurker

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]

if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    print "!gunHeCK"

Moni'sAddiction

ไปที่ "all in" เว้นแต่จะชนะแล้ว

import sys
import random


round = int(sys.argv[2])
myrank = int(sys.argv[13])
mybet = int(sys.argv[10])

if round == 1:
    if random.random()<0.1:
        print 1
    else:
        print 69
else:
    if myrank>1:
        print "all in"
    else:
        if mybet==1:
            print "back out"
        else:
            print "!guncheck"

HeCKuSumer

เดิมพันส่วนที่คงที่เล็กน้อยเสมอ

import sys

round = int(sys.argv[2])
myyattas = int(sys.argv[9])

if round==1:
    print int(0.1*myyattas)
else:
    print "!guncheck"

OC'sRandomTpyos

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

import sys
import ast
import random

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if game<800 or myrank>3:
        print 1
    else:
        print myyattas/4
else:
    if game<800:
        if hired:
            print "change jobs"
        else:
            print random.choice(["acquire intel","buy guard"])
    else:
        if myrank>3:
            print "all in"
        else:
            print "!guncheck"

HardHatUmar

เปลี่ยนงานเมื่อทำได้สำหรับทัวร์นาเมนต์ส่วนใหญ่ หลีกเลี่ยงการเดิมพันเกินความจำเป็นขั้นต่ำ ไม่ค่อยดี แต่ไม่ค่อยดี

import sys

game = int(sys.argv[1])
round = int(sys.argv[2])
hired = int(sys.argv[12])

if round==1:
    if game < 900 and hired:
        print 1
    else:
        print 0
else:
    print "change jobs"

LimeadeSneaktar

เปลี่ยนงานทุกครั้งที่ทำได้ในช่วงแรกของการแข่งขัน ใช้จ่ายทุก ๆ เกมข้ามคู่กัน ค่อนข้างดีแม้เทียบกับ SnitcherKing อาจเป็นไปได้ว่าค่าโดยสารจะแย่ลงเมื่อบอทอื่น ๆ จำนวนมากข้ามคู่และใช้นิ้ว ถ้าไม่ - กฎอาจต้องเปลี่ยน

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round==1:
    print 1
else:
    if hired and game<900:
        print "change jobs"
    else:
        print "double cross"

SnitcherKing

เดิมพันขั้นต่ำเสมอและใช้นิ้วเสมอ ทำได้ค่อนข้างดีในทัวร์นาเมนต์ขนาดเล็กที่มี LimeadeSneaktar

import sys

round = int(sys.argv[2])

if round == 1:
    print 1
else:
    print "finger"

RaysFive01K

ค่อนข้างซับซ้อน - และดังนั้นจึงค่อนข้างดี ข้อได้เปรียบส่วนใหญ่มาจากการฝากเงินรางวัลทั้งหมดในทัวร์นาเมนต์ช่วงต้น (ปกป้องพวกเขาจากผู้เล่นสองคน) ในขณะที่ขับรถขึ้นโอกาสในการชนะ (และการเปลี่ยนงานเพื่อจ่ายเงินให้กับการ์ด เมื่อพวกเขาได้รับความสนใจอย่างมากและความน่าจะเป็นที่จะไม่สามารถถอนเงินได้นั้นอยู่ในระดับที่ต่ำมาก - แม้ว่าการสูญเสียผู้เล่นสองคนจะเป็นความเสี่ยงที่ร้ายแรง) นี่จะเป็นทัวร์นาเมนท์แน่นอนและอาจจะใช่หรือไม่ใช่คู่แข่งที่จริงจังก็ได้

import sys
import ast
import random
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round ==1:
    if game < 900:
        print myyattas/10
    else:
        print 1
else:
    if game < 500 and hired:
        print random.choice(["change jobs","finger","buy guard"])
    elif game < 900:
        print "deposit"
    elif bankholdings[bankid]>0:
        print "withdraw"
    else:
        if alreadyplayed/float(numplayers)<0.5:
            print "finger"
        else:
            print "back out"

ฉันอนุมัติชื่อเหล่านี้ <insert Twitch & Panga memes>
CAD97

2

โลนจอห์น

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,creditsbet,numready,bankid,mycredits,mybet,mypayment,hired,myrank,mu_credits,sigma_credits,max_credits = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if mycredits > 100 or hired:
        print(int(mycredits)/2)
    else:
        print(0)
else:
    if bankprobs[int(bankid)] > 0.6:
        print("all in")
    elif int(mypayment) > 50 :
        print("buy guard")
    elif int(mycredits) > 200 and int(game) < 900 and hired == "1":
        print("change jobs")
    elif bankprobs[int(bankid)] * (float(numready)+1)/(float(alreadyplayed)+1) < 0.30:
        print "withdraw"
    else:
        print "!guncheck"

ติดสินบนจนกระทั่งเขามีโอกาสชนะ

เปลี่ยนงานเมื่อเขาต้องการเงินมากขึ้นเพื่อติดสินบนผู้คุม


ผู้เล่นนี้เรียกว่าอะไร?
quintopia

@quintopia ops! ฉันลืมฉันไปจนหมดโพสต์! เพิ่มชื่อและการอธิบายแล้ว
MegaTom

ดี คุณไม่จำเป็นต้องทำตัวพิมพ์ดีดทั้งหมด ทุกอย่างเป็นประเภทที่ถูกต้องจากการถูกประเมินจากค้างคาว ซึ่งหมายความว่าเงื่อนไขhired == "1"จะเป็นเท็จเสมอและจะไม่เปลี่ยนงาน
quintopia

ฉันเพิ่งวิ่งในรอบเดียวกับคนอื่น ๆ ทั้งหมดที่ฉันทำ มาในสถานที่สุดท้าย โชคร้าย :(
quintopia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.