使用程序方法?

using methods for program?

所以我做了这个刽子手游戏,它运行得很好,唯一的问题是我想用方法来组织一切。

是的,这是一个学校项目。我尽了最大努力,但每当我尝试将程序的一部分放入方法中时,就好像我删除了一个变量,并且它用红色下划线标记了它。

我暂时删除了它们,这样更清楚了。另外,我使用的文件最多包含 19 个 8 个字母的单词,每行一个。

有人能告诉我如何在不破坏整个事情的情况下合并方法吗?英语也不是我的第一语言,请原谅任何错误,代码是法语的,我为这个问题翻译了它。非常感谢你。我感谢你的时间和努力:)

using System;
using System.IO;

namespace TP3
{
    class Program
    {
        public const String Dico = "dico.txt";

        public static void Welcome()
        {
            //Mot de bienvenue
            Console.WriteLine("Welcome to hangman !");
        }

        public static void Goodbye()
        {
            Console.WriteLine("thx for playing, goodbye!");
        }

        public static void Program()
        {
            int SolvedWords= 0;
            string WordToGuess= "";
            int NumberOfLetters ;
            int x = 0;
            int WordTried = 0;

            Console.WriteLine("");
            Console.WriteLine("Do you wanna guess a word ? oui or non.");
            Console.WriteLine("you have 8  chances per word.");
            string Answer= Console.ReadLine();
            Answer= Answer.ToLower();

            while (Answer== "oui" && WordTried <19) 
            {
                const int Lives= 8;
                int LostLives= 0;
                int LivesLeft= 8;
                int LettersGuesed= 0;
                x += 1;
                WordTried += 1;

                if (WordTried <= 20 && WordTried >1) 
                {
                    Console.WriteLine("Do you wanna guess a word ? oui or non.");
                    Answer= Console.ReadLine();
                    Answer= Answer.ToLower();
                }

                //Read a word in the file
                int compteur = 0;
                string ligne;
                // Read file and show on the line
                System.IO.StreamReader file = new System.IO.StreamReader(@"dico.txt");
                while ((line = file.ReadLine()) != null)
                {
                    compteur++;
                    if (compteur == x)
                    {
                        WordToGuess= line;
                    }
                }
                file.Close();

                char[] table;
                table = new char[WordToGuess.Length];
                for (int i = 0; i < table.Length; i++)
                {
                    table[i] = WordToGuess [i];
                }

                //change each letter into a *
                Console.WriteLine("here’s the word to guess : ");
                string HiddenWord = "********";
                char[] table2;
                table2 = new char[WordToGuess.Length];
                for (int i = 0; i < table2.Length; i++)
                {
                    table2[i] = HiddenWord[i];
                }
                for (int i = 0; i < table2.Length; i++)
                {
                    Console.Write(table2[i]);
                }
                Console.WriteLine("");

                //guess the word
                while (LettersGuesed< WordToGuess.Length && LivesLeft> 0)
                {
                    Console.WriteLine("");
                   /* Console.WriteLine("Devinez une seule Letterdu mot. Ne pas écrire une Letter plus d'une fois de suite. Si c'est le cas, recommencez le jeu.");*/
                    string Letter= Console.ReadLine();
                    Letter= Letter.ToLower();
                    NumberOfLetters  = Letter.Length;
                    char[] table3;
                    table3= new char[NumberOfLetters ];

                    for (int i = 0; i < table2.Length; i++)
                    {
                        if (table[i].Equals(Letter[0]))
                        {
                            Table2[i] = Letter[0];
                            LettersGuesed+= 1;
                        }
                    }

                    for (int i = 0; i < table2.Length; i++)
                    {
                        Console.Write(table2[i]);
                    }

                    if (WordToGuess.IndexOf(Lettre) < 0)
                    {
                        Console.WriteLine("");
                        Console.WriteLine("wrong letter.");
                        LostLives+= 1;
                        LivesLeft= Lives- LostLives;
                        Console.WriteLine("you have " + LivesLeft+ " lives left.");
                    }

                    if (WordToGuess.IndexOf(Lettre) >= 0)
                    {
                        Console.WriteLine(" ");
                        Console.WriteLine("right !");
                        Console.WriteLine("you have " + LivesLeft+ " lives left.");
                    }

                    if (LettersGuesed== WordToGuess.Length && LivesLeft> 0)
                    {
                        SolvedWords+= 1;
                        Console.WriteLine(" ");
                        Console.WriteLine("you found the word !");
                        Console.WriteLine("you found " + SolvedWords+ " on" + WordTried + " words so far.");
                    }

                    if (LivesLeft== 0)
                    {
                        Console.WriteLine("you couldnt guess the word.");
                        Console.WriteLine("the word was :");
                        for (int i = 0; i < table.Length; i++)
                        {
                            Console.Write(table[i]);
                        }
                        Console.WriteLine(" ");
                        Console.WriteLine("you found " + SolvedWords+ " on" + WordTried + " words so far.");
                    }

                    if (WordTried == 19)
                    {
                        Console.WriteLine("no more words to guess.");
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            Welcome();

            Programme();

            Goodbye();
        }
    }
}

我不会为你的项目制定每一种方法,我会帮助启动如何思考它。查看您当前用于读取单词文件的代码。您可以将其移动到方法中 -

public string[] ReadWordsFromFile()
{
    string file = "path to your file here";
    return File.ReadAllLines(file);
}

或将文件路径作为参数传递 -

public string[] ReadWordsFromFile(string filePath)
{
    return File.ReadAllLines(filePath);
}

接下来就可以有一个获取随机词的方法了-

public string GetRandomWord(string[] wordsArray)
{
    Random random = new Random();
    int randomIndex = random.Next(0, wordsArray.Length);
    return wordsArray[randomIndex];
}

注意 - 如果你这样做,单词可以重复,如果你不想那样做 - 然后添加逻辑以在该项目被使用后从列表中删除该项目游戏。如果您在此方法中将其删除,它实际上不会将其从游戏中删除,因为您在获取新单词时仍会传递整个数组。如果您愿意,我会把该逻辑的实现留给您。

在"game controller"代码中—— 你可以像这样使用上面的方法 -

string file = "your path to txt file";
string[] allWords = ReadWordsFromFile(file);
string WordToGuess = GetRandomWord(allWords);

可能你的下一个目标应该是这样的 -

public void GameControler()
{
    // get all words here and other logic before game starts
    while (Attempts > 0)
    {
        string WordToGuess = GetRandomWord(wordsArray);
        // get letterGuessed from user
        bool letterExists = CheckIfLetterExists(WordToGuess, letterGuessed);
        if (!letterExists)
            {
                Attempts--;
                ExecuteWrongGuessMethod(x, y);
            }
        else
            {
                ExecuteRightGuessMethod(w);
            }
    }
}

public bool CheckIfLetterExists(string word, string letter)
{
    if (word.Contains(letter)) return true;
    else return false;
}

public void ExecuteWrongGuessMethod(string passWhatYouNeedTo, int somethingElse)
{
     // what to do when the guess is wrong e.g. Console.Writeline("wrong guess");
}

public void ExecuteRightGuessMethod(string word)
{
     // logic when guess is right. e.g. Show the letter guessed within the word on the console etc.
}

所有这些都不是最好的方法。但是我个人认为这是初学者采取的合乎逻辑的下一步在你实施之后。如果不了解至少一些 OOP 的基本概念,看到一个完全开发良好的程序可能会太多。

在学习了如何创建方法并使用它们之后,接下来是 类 和对象。哪些应该在这个游戏中实现,但这只是目前的全部。我建议你在 coursera 等甚至 youtube 上做一个简短的 C# 课程。并慢慢走向更好地理解 SOLID 原则。我所说的 SOLID 是指 5 条原则的首字母缩写词,而不是实际的词。祝一切顺利。