https://en.wikipedia.org/wiki/Connect_Four
किसी को भी 2 खिलाड़ी खेल 4 कनेक्ट याद है? जो लोग ऐसा नहीं करते उनके लिए एक 6x7 बोर्ड था जो एक सतह पर लंबवत था। कनेक्ट 4 का लक्ष्य है, अच्छी तरह से कनेक्ट 4! कनेक्शन को गिना जाता है यदि यह क्षैतिज, विकर्ण या ऊर्ध्वाधर है। आप अपने टुकड़ों को एक स्तंभ के शीर्ष पर एक टुकड़ा डालकर बोर्ड पर रख देते हैं, जहाँ यह उस स्तंभ के नीचे आता है। हमारे नियम कनेक्ट 4 में 3 चीजें बदलते हैं।
- परिवर्तन # 1 जीतना सबसे अधिक अंकों के साथ खिलाड़ी के रूप में परिभाषित किया गया है। आप नियमों की तरह 4 को जोड़कर अंक प्राप्त करते हैं - उस पर बाद में।
- # 2 बदलें आप प्रत्येक दौर में 3 खिलाड़ी हैं।
- # 3 बदलें बोर्ड का आकार 9x9 है।
स्कोरिंग:
स्कोर इस बात पर आधारित है कि आप कितने पंक्ति में हैं। यदि आपके पास पंक्ति समूह में 4 है तो आपको 1 अंक मिलता है। यदि आपके पास पंक्ति समूह में 5 है तो आपको 2 अंक मिलेंगे, एक पंक्ति 3 में 6 और इसी तरह।
उदाहरण:
नोट o
और x
बदल दिए जाते हैं #
और ~
बेहतर विपरीत के लिए क्रमश:
खाली बोर्ड का उदाहरण: (सभी उदाहरण 2 खिलाड़ी मानक आकार बोर्ड हैं)
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|_|_|_|_|
यदि हम टकराव में एक टुकड़ा गिराते हैं d
, तो यह स्थान में उतर जाएगा 1d
।
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|#|_|_|_|
यदि हम अब एक टुकड़े को d
फिर से टकराते हैं , तो वह स्थान पर आ जाएगा 2d
। यहाँ पंक्ति पदों में 4 के उदाहरण दिए गए हैं:
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |~| | | |
3 | | |~|#| | | |
2 | |~|#|~| |#| |
1 |~|#|~|#|_|#|_|
इस मामले में x
1 अंक तिरछे ( 1a 2b 3c 4d
) मिलता है।
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |#| | | |
3 | | | |#| | | |
2 | | | |#| | | |
1 |_|~|_|#|~|_|~|
इस स्थिति में, o
1 बिंदु लंबवत ( 1d 2d 3d 4d
) मिलता है।
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | |#|#|#|#| |
1 |_|_|~|~|~|~|~|
इस स्थिति में o
2 अंक क्षैतिज रूप से ( 1c 1d 1e 1f 1g
) प्राप्त होते हैं और x
1 अंक क्षैतिज रूप से प्राप्त होते हैं ( 2c 2d 2e 2f
)।
a b c d e f g
6 | | |#| | | | |
5 | | |#| | | | |
4 | | |#| | | | |
3 | | |#| | |~| |
2 |~| |#| | |#|~|
1 |~|_|#|~| |~|~|
इस बार x
एक पंक्ति में 6 ( 1c 2c 3c 4c 5c 6c
) के लिए 3 अंक मिलते हैं ।
इनपुट आउटपुट
आपके पास 2d सरणी के माध्यम से बोर्ड तक पहुंच होगी। प्रत्येक स्थान का int
प्रतिनिधित्व एक खिलाड़ी आईडी के साथ किया जाएगा । आप अपने खिलाड़ी आईडी को भी अपने कार्य के लिए पारित कर देंगे। आप अपने कदम को वापसी करके बनाते हैं, जिससे आप अपने टुकड़े को गिराना चाहते हैं। प्रत्येक राउंड 3 खिलाड़ियों को खेलने के लिए चुना जाएगा। खेल के अंत में, सभी खिलाड़ियों ने एक समान राशि का खेल खेला होगा।
फिलहाल 100k राउंड चलाए जाएंगे (ध्यान दें कि इसमें बहुत समय लगता है , आप इसे तेज टर्नअराउंड परीक्षण के लिए कम करना चाह सकते हैं)। कुल मिलाकर विजेता सबसे अधिक जीत वाला खिलाड़ी है।
नियंत्रक यहां पाया जा सकता है: https://github.com/JJ-Atkinson/Connect-n/tree/master ।
एक बॉट लिखना:
बॉट लिखने के लिए आपको Player
कक्षा का विस्तार करना चाहिए । Player
, सार है और लागू करने के लिए एक विधि है int makeMove(void)
। इसमें makeMove
आप यह तय करेंगे कि आप किस टुकड़े को गिराना चाहेंगे। यदि आपने एक अमान्य Coll चुना है (जैसे कि Coll मौजूद नहीं है, तो Coll पहले से ही भरा है), आपकी बारी छोड़ दी जाएगी । में Player
वर्ग आप कई उपयोगी सहायक तरीकों की है। सबसे महत्वपूर्ण लोगों की एक सूची इस प्रकार है:
boolean ensureValidMove(int coll)
: यदि बोर्ड पर टक्कर लगी है और लौटाया नहीं गया है, तो सच लौटें ।int[] getBoardSize()
:[0]
कॉलम की संख्या है, और[1]
पंक्तियों की संख्या है , जहां एक अंतर सरणी लौटें ।int[][] getBoard()
: बोर्ड की एक प्रति लौटाएं। आप इसे इस तरह का उपयोग करना चाहिए:[coll number][row number from bottom]
।- बाकी को खोजने के लिए,
Player
कक्षा को देखें। EMPTY_CELL
: एक खाली सेल का मान
चूंकि यह बहु-थ्रेडेड होगा, इसलिए मुझे random
ज़रूरत पड़ने पर एक फ़ंक्शन भी शामिल किया गया है।
अपने बॉट को डिबग करना:
मैंने एक बॉट को डीबग करना आसान बनाने के लिए कंट्रोलर में कुछ चीजों को शामिल किया है। पहले वाला है Runner#SHOW_STATISTICS
। यदि यह सक्षम है, तो आपको बॉट जीत की गिनती सहित खिलाड़ी समूहों का एक प्रिंटआउट खेला जाएगा। उदाहरण:
OnePlayBot, PackingBot, BuggyBot,
OnePlayBot -> 6
PackingBot -> 5
BuggyBot -> 3
Draw -> 1
आप connectn.game.CustomGame
कक्षा के साथ एक कस्टम गेम भी बना सकते हैं, आप प्रत्येक दौर के स्कोर और विजेता देख सकते हैं। तुम भी अपने आप को मिश्रण के साथ जोड़ सकते हैं UserBot
।
अपना बॉट जोड़ना:
अपने बॉट को लाइनअप में PlayerFactory
जोड़ने के लिए, स्टैटिक ब्लॉक पर जाएं और निम्न लाइन जोड़ें:
playerCreator.put(MyBot.class, MyBot::new);
अन्य बातों पर ध्यान दें:
- सिमुलेशन बहु-थ्रेडेड हैं। यदि आप उसे बंद करना चाहते हैं, तो
Runner#runGames()
इस लाइन पर जाएं और टिप्पणी करें (.parallel()
)। - गेम की संख्या बदलने के लिए,
Runner#MINIMUM_NUMBER_OF_GAMES
अपनी पसंद के अनुसार सेट करें।
बाद में जोड़ा गया:
- बॉट्स के बीच संचार बाधित है।
संबंधित: Play कनेक्ट 4!
================================
स्कोरबोर्ड: (100 000 गेम)
MaxGayne -> 22662
RowBot -> 17884
OnePlayBot -> 10354
JealousBot -> 10140
Progressive -> 7965
Draw -> 7553
StraightForwardBot -> 7542
RandomBot -> 6700
PackingBot -> 5317
BasicBlockBot -> 1282
BuggyBot -> 1114
FairDiceRoll -> 853
Steve -> 634
================================
Player
उपलब्ध सभी विधियों को देखने के लिए कक्षा की जाँच करें ।
ensureValidMove
(जब तक कि आपकी रणनीति पाठ्यक्रम के इस मोड़ को पारित करने के लिए नहीं है)।