使用Lists作为方法参数

时间:2016-12-13 20:50:52

标签: c# list methods arguments

我正在制作一个基本的城市建设者游戏(在控制台中)。我遇到了一个方法(DrawMap)的问题。我不能让列表作为方法的输入参数。我得到了一大堆错误,所以这里是代码。

编辑:现在有效,谢谢kmatyaszek。

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

namespace City
{
    public class map
    {
        public int m { get; set; } //Map size
        public List<int> info { get; set; }
        public List<int> fire { get; set; }
        public List<int> police { get; set; }
        public List<int> education { get; set; }
        public List<int> health { get; set; }
        public List<int> cursor { get; set; }
    }
    class Program
    {

        static void Main(string[] args)
        {
            map map1 = new map();
            map1.m = 256;

            map1.info = new List<int>();
            for (int i = 0; i < map1.m; i++)
            {
                map1.info.Add(0);
            }

            map1.fire = new List<int>();
            for (int i = 0; i < map1.m; i++)
            {
                map1.fire.Add(0);
            }
            map1.police = new List<int>();
            for (int i = 0; i < map1.m; i++)
            {
                map1.police.Add(0);
            }
            map1.education = new List<int>();
            for (int i = 0; i < map1.m; i++)
            {
                map1.education.Add(0);
            }
            map1.health = new List<int>();
            for (int i = 0; i < map1.m; i++)
            {
                map1.health.Add(0);
            }
            map1.cursor = new List<int>() { 0, 0 };

            DrawMap(map1.info, map1.cursor);
        }

        static void DrawMap(List<int> map1.info, List<int> map1.cursor)
        {
        int j = 0;
        int k = 0;
            for (int k = 0; k < Math.Sqrt(map1.m); k++)
            {
                Console.SetCursorPosition(map1.cursor[j], map1.cursor[k]);       

            for (int j = 0; j < Math.Sqrt(map1.m); j++)
            {
            Console.SetCursorPosition(map1.cursor[j], map1.cursor[k]);  
            Console.Write("A");  
            }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您应该阅读有关C#方法(https://msdn.microsoft.com/en-us/library/ms173114.aspx)。

我认为方法DrawMap应该使用map对象:

...
map1.health = new List<int>();
        for (int i = 0; i < map1.m; i++)
        {
            map1.health.Add(0);
        }
        map1.cursor = new List<int>() { 0, 0 };

        DrawMap(map1);
    }

    static void DrawMap(map map1)
    {
        int j = 0;
        int k = 0;
        for (k = 0; k < Math.Sqrt(map1.m); k++)
        {
            Console.SetCursorPosition(map1.cursor[j], map1.cursor[k]);

            for (j = 0; j < Math.Sqrt(map1.m); j++)
            {
                Console.SetCursorPosition(map1.cursor[j], map1.cursor[k]);
                Console.Write("A");
            }
        }
    }
...

DrawMap中,您在同一范围内声明了两个本地(j和k)。你不能这样做。

在这里,您可以阅读有关局部变量和范围的信息: https://blogs.msdn.microsoft.com/samng/2007/11/09/local-variable-scoping-in-c/

答案 1 :(得分:0)

我不知道从哪里开始。让我们从DrawMap方法的参数开始。 C#不允许变量名中的.。声明方法的签名时,只编写参数的名称。不要尝试引用程序中的现有变量。只需选择一个名字。当您在方法调用中传递它们时,编译器将知道您的快速列表:

DrawMap(map1.info, map.cursor);

在您为方法的参数指定了正确的名称之后:

static void DrawMap(List<int> info,  List<int> cursor)

您可以使用方法范围内的名称。

第二件事是你在方法中声明你的索引变量两次。看看你的for循环声明。那里有int k=0; k<...,这意味着声明了一个具有相同名称的新变量。只需删除循环上方的两个变量即可。