พื้นหลัง
เกมของMorraเป็นเกมที่ง่าย ในเวอร์ชั่น "ดั้งเดิม" ผู้เล่นหลายคนพร้อมกันโยนหมายเลข 0-5 ด้วยมือขณะที่เดายอดรวมของมือทุกคน รุ่นที่ฉันจะใช้ที่นี่ได้รับการแก้ไขเพื่อเพิ่มศักยภาพสำหรับกลยุทธ์ที่ไม่สำคัญและมีการอธิบายไว้ด้านล่าง:
- มีผู้เล่นสองคน
- เหมือนกรรไกรหินกระดาษผู้เล่นเคลื่อนที่ไปพร้อม ๆ กัน
- ในแต่ละเทิร์นผู้เล่นแต่ละคนเลือกหมายเลข 0-5 และเดาว่าคู่ต่อสู้เลือก 0-5 ซึ่งหมายความว่าตัวเลขสองตัวจะถูกส่งออกในแต่ละเทิร์น เพื่อชี้แจงชัดเจนตัวเลขทั้งสองควรอยู่ในช่วง 0-5 โดยรวม
- หากคุณเดาตัวเลือกของคู่ต่อสู้ได้อย่างถูกต้อง แต่ฝ่ายตรงข้ามไม่คาดเดาอย่างถูกต้องคุณจะได้คะแนนจำนวนหนึ่งเท่ากับผลรวมของตัวเลขสองตัวที่เล่น ตัวอย่างเช่นหากตัวเลขที่เล่นเป็น 3 และ 5 การทายถูกต้องจะมีค่า 8 คะแนน
- หากผู้เล่นทั้งสองหรือไม่เดาถูกต้องจะไม่มีการให้คะแนน
- คนที่มีคะแนนมากที่สุดหลังจากรอบ 1,000 ชนะเกมนั้น
การแข่งขัน
ทัวร์นาเมนต์จะดำเนินการในลักษณะวนรอบและจะดำเนินการโดยสร้างคู่ที่เป็นไปได้ของการแข่งขัน สำหรับชัยชนะแต่ละครั้งผู้เข้าแข่งขันจะได้รับ 2 คะแนนชัยชนะ ผลเสมอกันใน 1 คะแนนชัยชนะ ไม่มีการเก็บคะแนนชัยชนะสำหรับการแพ้
ผู้ชนะเลิศการแข่งขันจะต้องเป็นผู้เข้าแข่งขันที่มีคะแนนชัยชนะมากที่สุดกับผู้อื่น
วิธีเข้าร่วม
จะมีสองวิธีในการส่งบอทเข้าแข่งขัน วิธีแรกและเป็นวิธีที่ได้รับความนิยมอย่างมากคือการใช้งานอินเทอร์เฟซ Java ที่มาจากคอนโทรลเลอร์ วิธีที่สองคือการเขียนโปรแกรมอิสระ
เรามาครอบคลุมวิธีการจาวาก่อน อินเทอร์เฟซที่คุณจะต้องใช้คือPlayer
และกำหนดสองวิธี:public String getName()
ระบุบอทของคุณและpublic int[] getMove(String[] args)
ใช้เวลาเป็นแถวหกสตริงargs
mychoices myguesses myscore opponentchoices opponentguesses opponentscore
ตัวอย่างมีดังต่อไปนี้:
042 045 0 324 432 6
ซึ่งหมายความว่าฉันเลือก 0 ในรอบแรกและเดาว่าคู่ต่อสู้ของฉันกำลังจะขว้าง 0 คู่ต่อสู้ของฉันขว้าง 3 และเดาฉันจะโยน 4 ในรอบที่สามคู่ต่อสู้ของฉันเดาถูกว่าฉันจะโยน 2 หมายถึงว่าเขาได้รับ 2 + 4 = 6 คะแนน
วิธีการของคุณจะส่งกลับอาร์เรย์ของจำนวนเต็มสองจำนวนซึ่งเป็นทางเลือกของคุณและเดาตามลำดับ ตัวอย่าง{4,2}
สำหรับการเลือก 4 และเดา 2
นี่คือตัวอย่างของบอท Java ที่สมบูรณ์เขียนเป็นวิธีการ หากคุณต้องการการส่งของคุณจะต้องรวมสิ่งที่เกิดขึ้นในgetMove
วิธีการเท่านั้น
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
เป็นโปรแกรมอิสระ
ขณะนี้ฉันมีข้อ จำกัด ในการสนับสนุนภาษาเพิ่มเติม นอกจาก Java ฉันสามารถยอมรับโปรแกรมที่เขียนใน Python 3.4, Perl 5 หรือ Ruby 2.1.5 หากมีภาษาที่หลายคนดูเหมือนจะต้องการฉันจะทำอย่างดีที่สุดเพื่อเพิ่ม
อินพุตไปยังโปรแกรมของคุณจะเป็นข้อโต้แย้งในบรรทัดคำสั่ง มันอาจมีลักษณะเช่นนี้:
perl awesomebot.plx 042 045 0 324 432 6
ผลลัพธ์ของโปรแกรมของคุณควรเป็นทางเลือกของคุณตามด้วยการเดาของคุณแต่ละรายการตามด้วยช่องว่าง
โปรดรวมคำตอบของคุณในคำสั่งที่แน่นอนที่จำเป็นในการเรียกใช้ โปรดทราบว่าฉันใช้ Windows 8.1
กฎพิเศษ
ออมทรัพย์รัฐและหมดเวลา
โปรแกรมของคุณจะได้รับอนุญาตให้สร้างไฟล์ข้อความหนึ่งไฟล์ในไดเรกทอรีท้องถิ่นซึ่งคุณสามารถเก็บข้อมูลได้ ข้อมูลนี้จะถูกเก็บไว้ตลอดการแข่งขัน แต่จะถูกลบหลังจากนั้น ตั้งชื่อไฟล์ที่ฉันสามารถระบุได้
มีการ จำกัด เวลา 500 มิลลิวินาทีสำหรับรหัสของคุณที่จะตอบกลับ การไม่ตอบกลับภายในเวลาที่กำหนด (หรือย้ายที่ไม่ถูกต้อง) จะส่งผลให้สูญเสียการแข่งขันนั้น ๆ ขณะนี้การส่ง Java มีการหมดเวลาชั่วคราว (ซึ่งฉันอาจอัปเกรดเป็นใช้งาน) ในขณะที่การส่งที่ไม่ใช่ Java มีการหมดเวลาใช้งานที่กระบวนการของพวกเขาถูกยกเลิกหลังจาก 500 มิลลิวินาที
กฎการส่งเพิ่มเติม
- คุณได้รับอนุญาตให้ส่งหลายครั้งตราบใดที่พวกเขาปฏิบัติตามกฎและไม่ติดแท็กทีม
- แต่ละรายการจะต้องไม่ซ้ำกัน คุณไม่สามารถทำสำเนาตรรกะของบ็อตอื่นในภาษาอื่นได้อย่างถูกต้อง
- บอตไม่สามารถโต้ตอบซึ่งกันและกัน (เพื่อสร้างทีมประเภทใดก็ได้)
- คุณไม่สามารถใช้ตรรกะของบอตอื่น ๆ ภายในบอทของคุณเพื่อระบุระบุคู่แข่งของคุณและทำนายการกระทำของมัน แน่นอนคุณสามารถลองกำหนดกลยุทธ์ของคู่ต่อสู้ของคุณ
- อย่าพยายามยุ่งกับคอนโทรลเลอร์ผู้แข่งขันรายอื่นหรือคอมพิวเตอร์ของฉัน อย่าเชื่อมต่อกับแหล่งข้อมูลภายนอก
ผู้ควบคุม
รุ่นปัจจุบันของตัวควบคุมจะพบได้ที่นี่ มันเขียนใน Java 8 ไฟล์ "Tournament" เป็นตัวควบคุมหลักซึ่งมีรายชื่อคู่แข่ง (ถ้าคุณต้องการโฮสต์การแข่งขันของคุณเอง)
ลีดเดอร์บอร์ด
ฉันไม่สามารถอัปเดตกระดานแต้มนำได้บ่อยนัก ฉันค่อนข้างยุ่งในสุดสัปดาห์นี้ โดย "ค่อนข้างยุ่ง" ฉันหมายถึงไม่สามารถเข้าถึงคอมพิวเตอร์จาก 6:30 น. ถึง 21:30 น. นี่คือคะแนนหลังจากวิ่ง 5 ครั้ง บอท "สะท้อน" ยังคงถูกริบเพราะเหตุผลบางอย่าง (อาจเป็นความผิดของฉันฉันยังไม่ได้ตรวจสอบ)
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
เครดิต
ขอบคุณ Rainbolt และ Peter Taylor สำหรับความช่วยเหลือจากผู้ควบคุม