首页 文章

如何从方法返回bool值

提问于
浏览
0

我有一个循环,循环直到bool done = true;在方法TestMoves()中,根据用户输入,该方法将bool作为true或false返回 . 但是,我不知道如何在Start()方法中将此值“发送”回while循环以停止循环 . 这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {


        public static void Main(string[] args)
        {
            Start("r");
        }

        public static string Start(string move)
        {

            Console.Write("Welcome to the Shotgun App\nEnter s for single player and m for multiplayer: ");
            string gameType = Console.ReadLine();

            if (gameType == "s")
            {

                Console.Write("Single Player Controls:\n r = reload\n s = shield\n f = fire\n ***you start with ammo\n Ready to play?");
                Console.ReadLine();

                int ammo = 1;

                bool done = false;
                while (!done)
                {
                    Console.Write("\nEnter your move: ");
                    move = Console.ReadLine();


                    switch (move)
                    {
                        case "r":
                            Console.Write("\nYou have reloaded, press enter for Genius\n");

                            ammo++;
                            Console.Write("Your ammo is " + ammo);

                            Console.ReadLine();

                            string geniusMove = "";
                            Genius(geniusMove, move, done);
                            Console.ReadLine();




                            break;
                        case "s":
                            Console.Write("\nYou have shielded, press enter for Genius\n");

                            Console.Write("Your ammo is " + ammo);

                            Console.ReadLine();

                            geniusMove = "";
                            Genius(geniusMove, move, done);
                            Console.ReadLine();




                            break;
                        case "f":
                            if (ammo != 0)
                            {
                                Console.Write("\nYou have fired, press enter for Genius\n");

                                ammo--;
                                Console.Write("Your ammo is " + ammo);

                                Console.ReadLine();

                                geniusMove = "";
                                Genius(geniusMove, move, done);
                                Console.ReadLine();
                            }
                            else
                            {
                                Console.Write("You don't have enough ammo, try again");
                                done = false;
                            }
                            break;
                        default:
                            Console.Write("\nInvalid move, try again\n");
                            done = false;
                            break;
                    }


                }
                return move;
            }
            else
            {
                return move;
            }
        }

        static string Genius(string geniusMove, string move, bool done)
        {
            int geniusAmmo = 1;

            geniusMove = "r";
            if (geniusMove == "f")
            {

                geniusAmmo--;
                Console.Write("Genius had decided to fire.\nGenius ammo is " + geniusAmmo + "\n");
            }
            else if (geniusMove == "r")
            {

                geniusAmmo++;
                Console.Write("Genius had decided to reload.\nGenius ammo is " + geniusAmmo + "\n");
            }
            else if (geniusMove == "s")
            {
                Console.Write("Genius had decided to shield.\nGenius ammo is " + geniusAmmo + "\n");
            }
            TestMoves(move, geniusMove, done);
            return geniusMove;
        }


        static bool TestMoves(string move, string geniusMove, bool done)
        {

            if (move == "s" && geniusMove == "f")
            {
                Console.Write("No one has died yet");
                done = false;
                return done;
            }
            else if (move == "f" && geniusMove == "f")
            {
                Console.Write("You both died!  Good game!");
                done = true;
                return done;
            }
            else if (move != "s" && geniusMove == "f")
            {
                Console.Write("You died!  Good game!");
                done = true;
                return done;
            }
            else if (move == "f" && geniusMove == "s")
            {
                Console.Write("No one has died yet");
                done = false;
                return done;
            }
            else if (move == "f" && geniusMove != "s")
            {
                Console.Write("Genius died!  Good game!");
                done = true;
                return done;
            }
            else if (move != "f" && geniusMove != "f")
            {
                Console.Write("No one has died yet");
                done = false;
                return done;
            }
            else
            {
                return done;
            }

        }
    }
}

4 回答

  • 2

    是否有理由需要从 Genius 内部而不是从循环中调用 TestMoves ?在我看来,您的代码可以像这样重写:

    //Every instance of:
    
    string geniusMove = "";
    Genius(geniusMove, move, done);
    Console.ReadLine();
    
    //seems like it could be rewritten as:
    
    string geniusMove = "";
    Genius(geniusMove, move, done);
    done = TestMoves(geniusMove, move, done);
    Console.ReadLine();
    //and then you can remove the call to TestMoves from Genius
    

    所有代码的整体流程对我来说有点混乱 . 每个函数都返回一个值,但似乎没有对返回值执行任何操作 . 我有一种感觉,通过一些重构,你可以使这段代码更短更合理 .

    在看了一下你的代码后,看起来你可以在循环的最后放置对TestMoves的调用:

    default:
                            Console.Write("\nInvalid move, try again\n");
                            done = false;
                            break;
                    }
    
                    //add it here:
                    done = TestMoves(geniusMove, move, done);
    
                }
                return move;
    
  • 0

    您可以通过ref传递值:

    static string Genius(string geniusMove, string move, ref bool done) ...
    

    并从 TestMoves 返回:

    static bool TestMoves(string move, string geniusMove) ...
    

    打电话给它:

    Genius(geniusMove, move, ref done);
    
  • 0

    您可以在 done 参数上使用refout关键字

  • 0

    由于 bool 是值类型,而不是引用类型,因此您无法像这样通过bool . 使用 out 关键字明确指定要将其作为引用传递:

    http://msdn.microsoft.com/en-us/library/ee332485.aspx

相关问题