सी # लाठी प्रोटोटाइप
मुझे अपने कोड पर कुछ प्रतिक्रिया चाहिए, मैं C # के साथ कोडिंग करने के लिए नया हूं लेकिन मुझे Lua और Python पर कुछ ज्ञान है। क्या ऐसा कुछ है जिसे मुझे और अधिक सरलीकृत करने के लिए बदलने / साफ करने की आवश्यकता है?
using System;
using System.Linq;
class MainClass {
public static void Main () {
int[] cards = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10};
Console.WriteLine("Welcome to Blackjack. Here are your draws.");
Random drawCard = new Random();
int draw1 = drawCard.Next(cards.Min(), cards.Max());
int draw2 = drawCard.Next(cards.Min(), cards.Max());
Console.WriteLine("You recieved a " + draw1 + " card!");
Console.WriteLine("You recieved a " + draw2 + " card!");
int sum1 = draw1 + draw2;
if (sum1 == 21) //Blackjack Ending
{
Console.WriteLine("Congratulations! You got " + sum1 + "!");
}
else if (sum1 >= 11) //Choice of 3rd draw
{
Console.WriteLine("Is " + sum1 + " enough?");
bool cont1 = false;
drawChoice(cont1); //Call the draw choice function
if (cont1 == true)
{
int draw3 = drawCard.Next(cards.Min(), cards.Max());
Console.WriteLine("You drawed a " + draw3 + " card!");
int sum2 = draw3 + sum1;
Console.WriteLine("You have a total of " + sum2 + ".");
if (sum2 > 21) Console.WriteLine("Game Over!");
}
else //NPC's turn starts
{
}
}
else //Player has less than 11 cards, auto draw
{
Console.WriteLine("You have a total of " + sum1 + ".");
Console.WriteLine("You will be forced to draw another card.");
int draw3 = drawCard.Next(cards.Min(), cards.Max());
Console.WriteLine("You drawed a " + draw3 + " card!");
int sum2 = draw3 + sum1;
Console.WriteLine("You have a total of " + sum2 + ".");
}
}
static void drawChoice(bool contChoice) //Function for player to choose whether to draw
{
Console.WriteLine("Would you like to draw another card? Y/N");
string choice1 = Console.ReadLine();
if (choice1 == "Y" || choice1 == "y")
{
contChoice = true;
Console.WriteLine(contChoice);
}
else if (choice1 == "N" || choice1 == "n")
{
contChoice = false;
Console.WriteLine(contChoice);
}
}
}
जवाब
मैंने वास्तव में एक ऐसी ही परियोजना बनाई है, यह वास्तव में अच्छा है!
1. स्कोर का ट्रैक रखना
पहली बात जो मैंने देखी वह यह है कि आप खिलाड़ी के लिए मूल्यों के योग का हिसाब रखते हैं और संभवतः डीलर के लिए भी, लेकिन हाथ का स्कोर वास्तव में खेलते समय नाटकीय रूप से बदल सकता है।
१.१। लाठी में नरम योग
लाठी की इस अवधारणा को नरम योग कहा जाता है , जिसका अर्थ है कि कुल राशि के आधार पर एक अलग मूल्य हो सकता है यदि कोई इक्का है या नहीं। उदाहरण के लिए, यदि किसी खिलाड़ी के पास एक (1) और 7 है, जो वास्तव में 18 (11 + 7) के रूप में गिना जाता है। लेकिन अगर वही खिलाड़ी एक और 7 मैच ड्रॉ करता है, तो उनका कुल स्कोर 15 (1 + 7 + 7) होगा। जब आप अधिक कार्ड बनाते हैं, तो इक्का का मूल्य बदल जाता है, इसलिए यदि आपके पास किसी तरह कार्ड को एक दूसरे से अलग रखने के लिए स्कोर रखने का आसान समय होगा। यह संग्रह का उपयोग करके किया जा सकता है।
1.2। संग्रह
संग्रह सरणियों (जो आपने पहले ही उपयोग किया है), सूचियों और शब्दकोशों जैसी चीजें हैं। पूर्णांक की एक सूची एक खिलाड़ी के (या डीलर के) कार्ड के वर्तमान संग्रह का प्रतिनिधित्व करने के लिए एक अच्छा उम्मीदवार है, क्योंकि वे शिकायत के बिना आकार बदल सकते हैं। इसके अलावा, सूचियों में अंतर्निहित संख्या उनके अंदर सभी संख्याओं का योग प्राप्त करने के लिए है, सूची के न्यूनतम और अधिकतम मूल्य और बहुत कुछ। आप अपने लाभ के लिए उन अंतर्निहित कार्यों का उपयोग कर सकते हैं, साथ ही इस तथ्य को भी कि आप हमेशा सूची के अंदर की संख्याओं को जानते हैं कि किसी का कुल नरम है या नहीं।
2. खेल लूप
लाठी का खेल वास्तविक जीवन में ताश के पत्तों की सीमित संख्या के साथ खेला जाता है, लेकिन निश्चित रूप से कोड में आपको इस बारे में चिंता करने की आवश्यकता नहीं है। यदि एक (संयुक्त राष्ट्र) भाग्यशाली खिलाड़ी इक्के खींचता रहता है, तो वे अंततः 21 से टकराएंगे और गोल को समाप्त करेंगे। हालाँकि, जब आप अनुमान नहीं लगा सकते कि खिलाड़ी (या डीलर) कब हारने वाला है, तो आप गेम लूप नामक किसी चीज़ का उपयोग कर सकते हैं। लाठी के लिए गेम लूप एक खिलाड़ी या डीलर द्वारा पुष्टि करने के बाद सभी गेम लॉजिक को निष्पादित करना शुरू कर देता है कि वे एक कार्ड खींचना चाहते हैं, और एक बार इसे निष्पादित करने के बाद, यह आवश्यक होने पर दोहराने के लिए कहेंगे।
2.1। दूसरा कार्ड चुनने की शर्तें
आप देखेंगे कि खिलाड़ी के पास लाठी में बहुत अधिक स्वतंत्रता है, वे 21 तक जाने या जब तक उनके लिए गोल समाप्त होता है, तब तक वे ड्राइंग कार्ड रख सकते हैं। हालांकि, डीलर के पास वह स्वतंत्रता नहीं है। आप ऑनलाइन उस पर अधिक जानकारी पा सकते हैं।
किसी भी तरह से, यदि आप इसके बारे में सोचते हैं, तो खिलाड़ी और डीलर दोनों किसी बिंदु पर दूसरे कार्ड को खींचने या न बनाने का निर्णय लेते हैं। आप इनपुट के लिए "Y"
या "N"
जब कोई इनपुट देते हैं, जो समझ में आता है।
२.२। करने के लिए पाठ इनपुट का अनुवाद true
याfalse
आपका DrawChoice
तरीका bool
खिलाड़ी के इनपुट के आधार पर बदल जाता है , लेकिन आप उस तरीके को भी रिफैक्ट कर सकते हैं ताकि वह प्राप्त करे string
और ए वापस आए bool
। इस तरह, आप सीधे उपयोगकर्ता के इनपुट का अनुवाद कर सकते हैं true
(हाँ, मुझे दूसरा कार्ड दें) या false
(नहीं, मुझे दूसरा कार्ड नहीं चाहिए)। यह कुछ इस तरह दिख सकता है:
// One option
public static bool DrawChoice(string input)
{
if (input == "Y" || input == "y") // You could also use input.ToLower() == "y"
{
return true;
}
else // If it's not "Y" or "y", it's gonna be "N" or "n"
{
return false;
}
// else if (input == "N" || input == "n")
// {
// return false;
// }
}
// Alternative one-liner
public static bool DrawChoice2(string input) => input.ToLower() == "y";
गेम लूप के विचार पर वापस जाते हुए, अब आपके पास एक शर्त है जो यह बताती है कि गेम लूप जारी है या नहीं। एक संभावित कार्यान्वयन यह होगा:
string choice = Console.ReadLine();
while (DrawChoice(choice)) // No need to write "== true" or "== false"
{
// Stuff that happens if a player or the dealer draws another card
choice = Console.ReadLine() // Ask again once the game logic has executed
}
// Stuff that happens when the loop ends
2.3। ड्राइंग कार्ड
ब्लेक जेक एक कार्ड गेम है, इसलिए आप कार्ड्स को बहुत ड्रॉ करेंगे, चाहे वह किसी खिलाड़ी के लिए हो या डीलर के लिए। यदि खेल में अक्सर कुछ होता है, तो यह आम तौर पर एक विधि में बनाने के लिए एक अच्छा विचार है, इसलिए आपको विभिन्न स्थानों में एक ही तर्क नहीं लिखना है।
आपका वर्तमान कार्यान्वयन न्यूनतम और आपके कार्ड की अधिकतम सीमा के बीच एक यादृच्छिक मूल्य प्रदान करता है। प्रलेखन से, हम निम्नलिखित सीखते हैं:
Next(Int32 minValue, Int32 maxValue)
एक 32-बिट हस्ताक्षरित पूर्णांक से अधिक या इसके बराबर
minValue
और उससे कमmaxValue
; अर्थात्, रिटर्न मानों की श्रेणी शामिल हैminValue
लेकिन नहींmaxValue
। यदिminValue
बराबर होता हैmaxValue
,minValue
तो लौटा दिया जाता है
इसलिए जब आप लिखते हैं Next(1, 10)
(न्यूनतम और अधिकतम से), तो आपको अधिकतम 9. प्राप्त होगा। एक अन्य मुद्दा यह है कि भले ही आप कार्यान्वयन को ठीक करते हैं Next(1, 11)
, आपके पास 10. के माध्यम से 1 से किसी भी मूल्य को प्राप्त करने के लिए समान संभावनाएं होंगी, लेकिन चूंकि कई कार्ड हैं डेक में जिनका मूल्य 10 है, उन्हें गैर -10 कार्ड की तुलना में अधिक बार दिखाना चाहिए।
सौभाग्य से, आपके सरणी में पहले से ही कार्ड का सही वितरण है, इसलिए इसके बजाय आप अपने सरणी से संबंधित मान प्राप्त करने के लिए एक वैध यादृच्छिक स्थिति उत्पन्न कर सकते हैं ।
दिन के अंत में, आप जो समाप्त करेंगे वह कुछ इस तरह दिखाई देगा:
public static int DrawCard()
{
int[] cards = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };
int card;
// Implement random draw here
return card;
}
और फिर आप भी कार्ड को बार-बार ड्रा करने के लिए कुछ ऐसा कर सकते हैं:
// You could also use a list, which is more flexible
public static int[] DrawCard(int count)
{
int[] drawn = new int[count];
for (int i = 0; i < count; i++)
{
drawn[i] = DrawCard();
}
return drawn;
}
उम्मीद है की यह मदद करेगा! गुड लक और मजा करें!
बस कुछ नोट्स ताकि आप अपना कोड सुधार सकें:
int sum1 = draw1 + draw2; if (sum1 == 21) //Blackjack Ending { Console.WriteLine("Congratulations! You got " + sum1 + "!"); }
यह कभी सच नहीं होगा, क्योंकि
- आपके पास कार्ड्स में इक्का नहीं है जिसका अर्थ ग्यारह का संभावित मूल्य है।
maxValue
में Random.Next(int minValue, int maxValue)विशेष ऊपरी यादृच्छिक संख्या लौटे बाध्य है।
में void drawChoice(bool contChoice)
विधि तर्क contChoice
एक मूल्य के प्रकार है। आप इसे संशोधित नहीं कर सकते जैसे आप सोचते हैं। विधि को छोड़ने के बाद चाहे उपयोगकर्ता टाइप करें y या n का मान cont1
अभी भी है false
। आपको कोई हस्ताक्षर करने के लिए और वापस लौटने के लिए विधि हस्ताक्षर को बदलना चाहिए bool
।
if (cont1 == true)
क्योंकि cont1
पहले ही एक बूल है, इसलिए आपको बूल के साथ तुलना करने की आवश्यकता नहीं होगी । आप इसे बस शर्त के रूप में उपयोग कर सकते हैं if (cont1)
और यदि आपको एक चूल चर की जाँच करने की आवश्यकता होगी तो आप false
इसका उपयोग करेंगे if (!cont1)
।
मुझे यकीन नहीं है कि मैं यहां कितना मददगार हो सकता हूं, लेकिन IMHO आपको कोड के माध्यम से बात करने वाले किसी व्यक्ति के साथ पूर्ण रूप से कोड की समीक्षा करने की आवश्यकता है। यहां एक गुच्छा "गलत" है, लेकिन कहा कि मैं सोच रहा हूं कि आपका उद्देश्य C # के साथ क्या है - क्या आप सिंटैक्स सीखने के लिए कुछ जल्दी से स्क्रिप्टिंग कर रहे हैं, या क्या आप बेहतर तरीके से समझना चाहते हैं कि C # में चीजों को कैसे आर्किटेक्ट किया जाए।
अगर कोई मेरे साथ पेशेवर सेटिंग में पहली बात करने के लिए आया था, तो मैं उन्हें बताऊंगा: "आपको यह परीक्षण करने में सक्षम होना चाहिए"। मैं तब TDD के बारे में बात करूंगा, और वास्तव में यह बताने की कोशिश करूंगा कि इस कोड को किस तरह से संरचित किया जाए। कोई सार नहीं है, और सब कुछ बहुत ही प्रक्रियात्मक है। हर वर्ग को 1 काम करना चाहिए। मुझे यकीन है कि लोग इस बिंदु पर मुझसे बहस करेंगे। किसी भी तरह से, तथ्य यह है कि आप केवल 1 वर्ग है बुरा है।
विगत कि, सिर्फ सामान्य "2 मिनट त्वरित सी # युक्तियों" के लिए। मैं 10, 10, 10 के बजाय कार्ड के लिए गणना का उपयोग करना चाहता हूं, मेरे पास 10, जैक, क्वीन, ऐस होंगे। इसके बजाय var का उपयोग करें। if (cont1 == true)
के रूप में ही है if(cont1)
। बेहतर नामित चर का उपयोग करें: बस cont1 को देखकर मुझे पता नहीं है कि इसका क्या मतलब है।
JansthcirlU ने संग्रह भी लाया। इस कोड को देखते हुए, ऐसा नहीं लगता है कि आप उन्हें समझते हैं इसलिए मैं वास्तव में यहां भी ध्यान केंद्रित करूंगा।
कोडिंग रखें :)