ฉันจะซ่อนและปกป้องสายจากเครื่องเล่นใน Unity ได้อย่างไร?


47

ฉันใช้ Unity เพื่อสร้างเกม 2D ซึ่งจะเป็นแบบออฟไลน์โดยสมบูรณ์ (ซึ่งเป็นปัญหา) การเล่นเกมต้องการให้คุณป้อนสตริงบางอย่างในระดับหนึ่งและ Unity คอมไพล์เป็น DLL ซึ่งสามารถย้อนกลับวิศวกรรมได้อย่างง่ายดายดังนั้นจึงเป็น มีวิธีในการป้องกันสตริงเหล่านั้น (เกมออฟไลน์ดังนั้นฉันไม่สามารถดึงข้อมูลจากแหล่งอื่นได้)

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

สามารถ decompiled เช่นนี้: ป้อนคำอธิบายรูปภาพที่นี่


10
แม้ว่าฉันจะเห็นด้วยว่ามันเป็นการต่อสู้ที่คุณไม่สามารถชนะได้อย่างแท้จริงคุณสามารถทำให้มันยากขึ้นด้วยความพยายามเพียงเล็กน้อย obfuscar.codeplex.com
Jacob Persi

46
@Gabriele Huh? การถอดรหัสโค้ด C # ที่ไม่ทำให้ยุ่งเหยิงนั้นเกี่ยวกับเรื่องง่ายอย่างที่มันได้รับ คุณจะได้รับโค้ดที่อ่านได้อย่างสมบูรณ์แบบโดยเปรียบเทียบกับ IDA ที่สร้างขึ้นสำหรับโค้ด C หรือ C ++ ที่ได้รับการปรับปรุง ที่กล่าวว่ามีความพยายามมากพอที่จะเข้าใจรหัสภาษาได้ แต่คำสั่งเรื่องขนาดนั้นยากกว่า ไม่มีความคิดที่ว่า obfuscation ทำงานได้ดี - ถ้ามันทำให้ decompilers ตามปกติ (DotPeek, ILSpy, อย่างอื่น?) barf ในรหัส IL ที่ควรจะแนะนำสิ่งกีดขวางเพื่อให้คนที่อยู่ห่างจากมัน
Voo

15
@GabrieleVierti การดึงข้อความออกจาก DLL นั้นเป็นเรื่องเล็กน้อย: ภายใต้ Linux หรือ Cygwin คุณสามารถทำได้โดยเพียงแค่ชี้stringsโปรแกรมที่มัน
ทำเครื่องหมาย

31
คุณพยายามทำอะไรที่นี่ ดูเหมือนจะเป็นกรณีที่ค่อนข้างรุนแรงของปัญหา XY meta.stackexchange.com/questions/66377/what-is-the-xy-problem สิ่งที่คุณพยายามจะทำสำเร็จ (จากมุมมองการเล่นเกมไม่ใช่มุมมองด้านเทคนิค) แทบจะไม่ได้รับการบริการที่ดีที่สุดโดยการพยายามซ่อนและเข้ารหัสสตริงเหล่านี้ .
GrandOpener

36
ฉันสงสัยว่าการซ่อนสายอักขระนั้นมีจุดประสงค์จริงหรือไม่: เมื่อผู้เล่นบางคนแก้ไขพวกเขาพวกเขาจะแพร่กระจายด้วยวิกิหรือคล้ายกันดังนั้นใครก็ตามที่ต้องการรู้ว่าพวกเขาจะสามารถค้นหาพวกเขาได้อย่างง่ายดาย ใช่โดยการทำให้งงพวกเขาผู้เล่นไม่สามารถเปิด dll ในเท็กซ์เอดิเตอร์และค้นหาสตริง แต่ส่วนใหญ่จะปรึกษา google (หรือเครื่องมือค้นหาที่พวกเขาเลือก) ก่อน ...
hoffmale

คำตอบ:


159

อย่าเก็บสตริงเหล่านั้นจัดเก็บแฮช (cryptographic) ของพวกเขา

ฟังก์ชันแฮช (cryptographic) เช่นการเข้ารหัสเป็นวิธีเปลี่ยนสตริงให้เป็น "gibberish" (เรียกว่าแฮช) แต่ไม่เหมือนกับการเข้ารหัสคุณไม่สามารถรับสตริงต้นฉบับจากแฮชนี้ (เว้นแต่คุณจะสามารถบังคับมันหรือแฮช) ฟังก์ชั่นเสีย) ฟังก์ชันแฮชส่วนใหญ่ (ถ้าไม่ทั้งหมด) ใช้สตริงที่มีความยาวตามอำเภอใจและส่งคืนสตริงที่มีความยาวคงที่ (ขึ้นอยู่กับฟังก์ชัน)

คุณจะตรวจสอบว่าสตริงที่ผู้ใช้ป้อนเป็นสตริงที่ถูกต้องได้อย่างไร เนื่องจากคุณไม่สามารถรับสตริงที่ถูกต้องจากแฮชสิ่งเดียวที่คุณทำได้คือการแฮชผู้ใช้เดาและเปรียบเทียบกับแฮชที่ถูกต้อง

คำเตือน (โดย Eric Lippert): อย่าใช้ฟังก์ชันที่มีอยู่แล้วภายในGetHashCodeเช่นฟังก์ชัน - ผลลัพธ์อาจแตกต่างกันระหว่างรุ่นและแพลตฟอร์ม. NET ต่าง ๆ กันทำให้โค้ดของคุณใช้งานได้เฉพาะกับเวอร์ชัน. NET Framework และแพลตฟอร์มเฉพาะ


81
นี่เป็นคำตอบที่ดีที่สุดแน่นอน แต่จำไว้ว่าคุณอย่างแน่นอนบวกจะต้องไม่ใช้ในการสร้างอัลกอริทึมกัญชาในสาย มันถูกออกแบบมาเพื่อทำสิ่งหนึ่งและสิ่งเดียวเท่านั้นและนั่นคือการสมดุลตารางแฮช คุณไม่สามารถเก็บแฮชของสตริงและใช้พวกเขาเป็น authenticators ของลับร่วมกันเพราะผู้เขียนรันไทม์ .NET ขอสงวนสิทธิ์ในการเปลี่ยนแปลงขั้นตอนวิธีสตริงคร่ำเครียดในเวลาใดด้วยเหตุผลใด ๆ และในความเป็นจริงพวกเขาได้กระทำในอดีตที่ผ่านมา ใช้แฮชมาตรฐานความแข็งแรง crypto หรือใช้แฮชธรรมดาของคุณเอง
Eric Lippert

4
นี้. เผง หากคุณใช้อัลกอริทึมเช่น sha256 (มีไลบรารีจำนวนมากที่ใช้สิ่งนี้เพื่อให้คุณไม่ต้องเขียนเอง) จากนั้นคุณจะมีสิ่งที่ไม่สามารถแตกหักได้ง่ายและเชื่อถือได้มาก
Micheal Johnson

12
@Michael Johnson ใช้เกลือจะทำให้การใช้เรนโบว์ตารางยากขึ้นและการใช้รหัสผ่านแบบแฮชเช่น bcrypt จะทำให้ช้ากว่ามากและยากที่จะทำลาย แต่ท้ายที่สุดแล้วในตอนท้ายของวันนี้ดูเหมือนจะเป็นความพยายามมากเกินไปที่จะไป; ผู้ใช้ซื้อเกมหากพวกเขาต้องการโกงนั่นคือทางเลือกของตนเอง
Melkor

2
@MichealJohnson: การยืดคีย์อาจทำให้การโจมตีของเดรัจฉานบังคับยากขึ้น (พูดโดยปัจจัยหนึ่งพันล้านหรือมากกว่านั้น) แต่ปัญหาที่แท้จริงของคำตอบนี้ก็คือในบางจุดเกมจะต้องสามารถบอกผู้เล่นว่าพวกเขาต้องการสตริงอะไร เว้นแต่ว่าสายเหล่านั้นเป็นคำตอบของปริศนาที่ผู้เล่นต้องแก้ฉันคิดว่า หรือนอกเสียจากว่ามีการให้สตริงออนไลน์แม้ว่าเกมนั้นจะเป็นออฟไลน์ แต่ก็เหมือนกับคีย์ใบอนุญาตแบบเก่า
Ilmari Karonen

5
@Sentinel นั่นหมายความว่ารูปแบบการเล่นอาจแตกต่างกันไปสำหรับผู้เล่นแต่ละคน เราจำเป็นต้องรู้ว่าสายอักขระชนิดใดที่เรากำลังพูดถึงหากพวกมันอยู่ในหนังสือ / สัญญาณ / บทสนทนาภายในเกมหากพวกมันเป็นคำตอบของปริศนาที่ไม่มีคำตอบที่แท้จริงให้กับผู้เล่นโดยตรง หรือถ้าพวกเขากำลังสร้างแบบสุ่ม และถ้าพวกเขาเป็นคำประโยคหรือตัวอักษรแบบสุ่ม
Micheal Johnson

106

สิ่งที่คุณพยายามทำคือไร้ประโยชน์และไร้ประโยชน์

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

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

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


38
วิศวกรรมย้อนกลับเป็นเกมของตัวเอง! นี่เป็นคำตอบที่ถูกต้องเพียงข้อเดียว - ไม่ควรซ่อนข้อมูลในเกมผู้เล่นเดี่ยวทุกวันนี้ผู้เล่นจะเข้าถึงได้หากต้องการ
Mephy

27
@TheBinaryGuy ความปลอดภัยจากอะไร ผู้ใช้ของคุณจะเล่นเกมแบบออฟไลน์ มีภัยคุกคามอะไรที่เปิดเผยรหัสที่มีอยู่? ในที่สุดผู้เล่นควรจะค้นพบมันต่อไปเพื่อให้สามารถเล่นเกมได้! กฎความปลอดภัยที่สำคัญคือคุณต้องระบุการรักษาที่คุณกำลังปกป้อง สิ่งนี้เรียกว่า "รูปแบบการคุกคาม"
jpmc26

7
@ TheBinaryGuy นอกเหนือจากประเด็นอื่น ๆ แล้วฉันยังตั้งคำถามถึงความรู้สึกของการใช้รหัสผ่าน "คงที่" - แม้ว่าจะไม่ได้ค้นหารหัสออนไลน์ / ผ่านวิศวกรรมย้อนกลับเพียงแค่เล่นเกมครั้งที่สองจะช่วยให้ผู้เล่นข้ามผ่านได้โดยตรง ส่วนต่างๆของเกม (เนื่องจากทราบรหัสแล้ว) หากคุณต้องการที่จะ "บังคับ" ผู้เล่นที่จะได้รับรหัสเหล่านี้คุณต้องทำการเปลี่ยนแปลงในแต่ละ playthrough (เช่น: มีรูปแบบการสุ่ม)
UnholySheep

6
คำตอบนี้มีข้อดีอยู่บ้าง แต่ย่อหน้าที่สองนั้นไม่ถูกต้อง คุณไม่จำเป็นต้องเข้ารหัสสตริง คุณสามารถแฮชมันได้ หากผู้เล่นสามารถทำลายแฮชแล้วเขาจะถูกปล้นบัญชีธนาคารแทนที่จะได้รับการว่าจ้างจาก FBI หรืออะไรทำนองนั้น ประเด็นอื่น ๆ ที่ถูกต้องว่า
เปโดร A

5
@Hamsterrific ฉันเดาคำตอบสมมติว่าคุณต้องการเก็บสายอักขระจริงเช่นเพื่อแสดงให้ผู้เล่นเห็นในบางจุดซึ่งหมายความว่าการแฮ็กจะไม่ทำ
แฟรงก์ฮอปกินส์

4

หากสิ่งนั้นเป็นที่ต้องการจริงๆแล้วแทนที่จะ hashing คุณอาจพิจารณาสร้างสตริงจากค่าอินพุตตัวเลขที่รันไทม์

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

ยกเว้น ... ยกเว้นถ้ารหัสของคนอื่นไม่ได้ผลสำหรับคุณ ซึ่งคุณสามารถทำได้เล็กน้อย - ไม่ใช่การป้องกันการงัดแงะ 100% แต่ยากสำหรับผู้ใช้โดยเฉลี่ย สิ่งใดที่เรียบง่ายเหมือนกับ "ตัวสร้างชื่อ Elven ออนไลน์" จะทำ (สามารถทำได้ง่ายๆโดยพลการไม่จำเป็นต้องใช้เอ็นจิ้นมาร์คอฟข้อความมากนักการดึง 4-5 พยางค์จากรายการแบบสุ่มนั้นดีพอ)

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

หรือคุณอาจใช้หมายเลขซีเรียลของเกมซึ่งไม่ซ้ำใครและจะใช้งานได้หากผู้ใช้เปลี่ยนฮาร์ดแวร์ (แดกดันอย่างไรก็ตามนี่อาจเป็นการส่งเสริมการละเมิดลิขสิทธิ์เนื่องจากรหัสปลดล็อคที่แชร์ใช้งานได้กับ serials ที่ละเมิดลิขสิทธิ์ แต่ไม่ใช่สำหรับลูกค้าที่ถูกกฎหมาย!)

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

ดังนั้น ... ก่อนที่คุณจะทำอะไรแบบนั้นให้คิดให้ถี่ถ้วนว่าคุณต้องการสิ่งนั้นจริงๆหรือไม่และต้องการอะไร อาจเป็นไปได้ว่าการมีสตริงที่มนุษย์อ่านได้ (หรือทำให้ "อ่านไม่ได้" กับ xor) นั้นดีพอและเป็นที่ต้องการอย่างแน่นอน


คุณนึกภาพกระบวนการอะไร หากโปรแกรมสร้างค่าแฮชหลังจากดาวน์โหลดแล้วจะต้องมีสตริงที่ไม่ได้แฮชเมื่อดาวน์โหลด ดังนั้นเซิร์ฟเวอร์จะสอบถามลูกค้าเพื่อระบุข้อมูลแล้วสร้างเซิร์ฟเวอร์ฝั่งแฮช
สะสม

@ การคำนวณ: เซิร์ฟเวอร์ใด ถามว่า "ออฟไลน์สมบูรณ์" ซึ่งอาจหมายถึงโปรแกรมบน DVD (หรืออาจจะเป็นการดาวน์โหลด) บวกด้วยหมายเลขซีเรียล ดังนั้นคุณมีกิจกรรม 1,2,3,4 ซึ่งต้องมีรหัสผ่าน คุณคำนวณเช่นhash(serial + 1)เพื่อให้ได้ตัวเลขที่สอดคล้องกับรหัสแรก จากนั้นให้ป้อนคำนั้นลงในโปรแกรมสร้างคำซึ่งดึงว่าหนึ่งพยางค์จากรายการ 16 สำหรับแต่ละอินพุต 4 บิต ที่นั่นคุณไปแต่ละคำ "" สำหรับผู้ใช้ทุกคน
Damon

หากเป็นการดาวน์โหลดแสดงว่าเป็นการดาวน์โหลดจากเซิร์ฟเวอร์ หากโปรแกรมคำนวณhash(serial+1) หลังจากดาวน์โหลดแล้วจะหยุดการคำนวณของผู้ใช้hash(serial+1)อย่างไร เมื่อดาวน์โหลดโปรแกรมแล้วผู้ใช้จะสามารถเข้าถึงทุกสิ่งที่โปรแกรมทำ
สะสม

@Acccumulation: ไม่มีอะไรป้องกันไม่ให้ผู้ใช้จากครั้งแรก decompiling โปรแกรมhash(serial + 1)และจากนั้นการคำนวณ แล้วอะไรล่ะ นี่ไม่ใช่ปัญหา. ดูสิถ้ามีคนลงทุนหนึ่งถึงสองชั่วโมง (อาจเป็น 6-8 ชั่วโมงสำหรับ "ผู้ใช้" ทั่วไปที่ไม่มีพื้นหลังผู้พัฒนาซอฟต์แวร์) เพื่อโกงตัวเองเอาล่ะ ... ให้เขา มันใช้งานได้กับคนคนหนึ่ง แต่ไม่ใช่สำหรับทุกคนและมันไม่สามารถแข่งขันได้ ... ดังนั้นไม่มีปัญหา
เดมอน

3

หากคุณไม่จำเป็นต้องแสดงสตริงความคิดคร่ำครวญน่าจะเป็นหนทางที่จะไป หากในอีกทางหนึ่งคุณจะต้องแสดงให้ผู้ใช้มีวิธีอื่นที่คุณสามารถหลีกเลี่ยงพวกเขาปรากฏใน DLL ของคุณโดยตรง

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

คุณอาจจะมีสายอักขระที่ประกอบด้วยคำไม่กี่คำ แต่ท้ายที่สุดก็มีคำสั่งที่แตกต่างกัน ตัวอย่างเช่นคุณอาจต้องการ 2 สตริงต่อไปนี้:

  1. หมีเดินผ่านบ้านของฉัน
  2. บ้านของฉันปกป้องฉันจากหมี

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

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


4
ดังนั้นแทนที่จะค้นหาฟังก์ชันที่อ้างอิงถึงสตริงที่ระบุคุณจะพบฟังก์ชันที่อ้างอิงอาร์เรย์ด้วยดัชนีแล้วสร้างสตริงขึ้นมาใหม่ ที่ดูเหมือนจะไม่เกินการป้องกันพิเศษ 30 วินาที สิ่งที่จะป้องกันคือใครบางคนเพียงแค่ใช้stringsกับผู้ปฏิบัติ
Voo

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

นี่เป็นเพียงรูปแบบการเข้ารหัสที่น้อยลงหรือไม่
Arturo Torres Sánchez

2
เดี๋ยวก่อนไม่เข้ารหัสแม้แต่ตัวเดียว เพียงแค่เข้ารหัส
Arturo Torres Sánchez

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