问题 编辑清单项目

开发者917

新成员
已加入
2020年12月3日
留言内容
1
编程经验
1-3
因此,我目前正在为学校开发游戏,我将为您保存详细信息,但基本上是基于图块的游戏。
由于只允许我在VS中进行此操作,因此我不知道如何制作合适的工作系统以加载到不同级别的10x10地图中。
我正在尝试使用列表,因为数组对我也不起作用,我有一个列表<Tiles>这是我编程的课程。
我的问题是我如何编辑列表中的项目,因为如果执行_level1.Add(objTile),我将以空白图块结尾。
有没有一种方法可以分别为每个图块更改图块的Color属性?

感谢您抽出宝贵时间回答我的问题,您真棒!
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
欢迎来到论坛。

显示您的代码,并解释引起问题的有问题的部分。
 

约阿基姆

成员
已加入
2018年10月4日
留言内容
11
地点
瑞典斯德哥尔摩
编程经验
10+
C#控制台磁贴游戏:
using System;

namespace TilesGameCSharp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Game game = new Game();
            game.ShowIntro();
            game.Play();
        }
    }

    public class Game
    {
        private readonly Level[] Levels = new Level[10];
        private const int USER_GAVE_UP = -1;
        private const int USER_WANTS_HELP = -2;

        public Game()
        {
            for (int i = 0; i < 10; i++)
            {
                Levels[i] = new Level() { Number = i + 1 };
                Levels[i].SetRandomColors(i + 1);
            }
        }

        public void ShowIntro()
        {
            Console.Clear();
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("===[Tiles game]===\n");
            Console.WriteLine("Remember the numbers for each color!\n");
            for (int c = 1; c < 15; c++)
            {
                Console.BackgroundColor = (ConsoleColor)c;
                Console.ForegroundColor = ConsoleColor.Black;
                Console.Write(Enum.GetName(typeof(ConsoleColor), c).PadRight(20));
                Console.ForegroundColor = ConsoleColor.White;
                Console.BackgroundColor = ConsoleColor.Black;
                Console.Write("= {0}\n", c);
            }
            Console.WriteLine("\nWhen ready press any key when ready to play!");
            Console.ReadKey();
            Console.Clear();
        }

        public void Play()
        {
            int input;
            int numberOfMoves = 0;
            int totalNumberOfMoves = 0;
            int level = 0;
            do
            {
                DrawLevel(level);
                Console.Write("\nPlease enter color number (1-14) that exist in map above then press [ENTER]\n" +
                              "Press H and [ENTER] for help with color numbers.\n" +
                              "Press any other key and [ENTER] to quit.\n> ");
                input = GetUserInput(Console.ReadLine(), 14);
                if (input == USER_GAVE_UP)
                {
                    Console.WriteLine("\nYou gave up after {0} moves - game ended!", totalNumberOfMoves + numberOfMoves);
                    return;
                }
                if (input == USER_WANTS_HELP)
                {
                    ShowIntro();
                    continue;
                }
                numberOfMoves += 1;
                SelectColors(input, level);
                if (GameFinished())
                {
                    totalNumberOfMoves += numberOfMoves;
                    Console.WriteLine("\nYou finished the game in " +
                                      totalNumberOfMoves + " moves!");
                    return;
                }
                if (LevelFinished(level))
                {
                    DrawLevel(level);
                    Console.WriteLine("\nYou finished level " + level + 1 +
                                      " in " + numberOfMoves + " moves!");
                    level += 1;
                    totalNumberOfMoves += numberOfMoves;
                    numberOfMoves = 0;
                    if (level > Levels.Length - 1)
                    {
                        Console.WriteLine("\nGame Over - No more levels!");
                        return;
                    }
                    Console.WriteLine("\nPress any key to advance to the next level!");
                    Console.ReadKey();
                }
            }
            while (input < 15);
        }

        private void SelectColors(int selectColor, int activeLevel)
        {
            Level level = Levels[activeLevel];
            for (int y = level.Map.GetLowerBound(0); y < level.Map.GetUpperBound(0); y++)
            {
                for (int x = level.Map.GetLowerBound(1); x < level.Map.GetUpperBound(1); x++)
                {
                    if ((level.Map[y, x].Color == (ConsoleColor)selectColor))
                    {
                        level.Map[y, x].Selected = true;
                    }
                }
            }
        }

        private void DrawLevel(int activeLevel)
        {
            Console.Clear();
            Level level = Levels[activeLevel];
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("===[Level #{0}]===\n", level.Number + 1);
            for (int y = level.Map.GetLowerBound(0); y < level.Map.GetUpperBound(0); y++)
            {
                for (int x = level.Map.GetLowerBound(1); x < level.Map.GetUpperBound(1); x++)
                {
                    Console.BackgroundColor = (level.Map[y, x].Selected) ? ConsoleColor.Green : ConsoleColor.Black;
                    Console.ForegroundColor = level.Map[y, x].Color;
                    Console.Write("* ");
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.ForegroundColor = ConsoleColor.White;
                }
                Console.WriteLine();
            }
        }

        private bool LevelFinished(int activeLevel)
        {
            Level level = Levels[activeLevel];
            for (int y = level.Map.GetLowerBound(0); y < level.Map.GetUpperBound(0); y++)
            {
                for (int x = level.Map.GetLowerBound(1); x < level.Map.GetUpperBound(1); x++)
                {
                    if (!level.Map[y, x].Selected)
                    {
                        return false;
                    }
                }
            }

            return true;
        }

        private bool GameFinished()
        {
            for (int level = 0; level < Levels.Length - 1; level++)
            {
                if (!LevelFinished(level))
                {
                    return false;
                }
            }

            return true;
        }

        private int GetUserInput(string input, int maxNum)
        {
            if (input.ToUpper() == "H")
            {
                return USER_WANTS_HELP;
            }

            if (int.TryParse(input, out int num))
            {
                if (num > 0 && num < (maxNum + 1))
                {
                    return num;
                }
                else
                {
                    return USER_GAVE_UP;
                }
            }
            else
            {
                return USER_GAVE_UP;
            }
        }

        private class Level
        {
            public int Number { get; set; }
            public Tile[,] Map = new Tile[9, 9];

            public void SetRandomColors(int maxNumberOfColors)
            {
                Random rnd = new Random();
                int[] levelColors = new int[maxNumberOfColors + 1];
                for (int c = 0; c <= maxNumberOfColors; c++)
                {
                    levelColors[c] = rnd.Next(1, 15);
                }

                for (int y = 0; y < Map.GetUpperBound(0); y++)
                {
                    for (int x = 0; x < Map.GetUpperBound(1); x++)
                    {
                        Map[y, x] = new Tile() { Color = (ConsoleColor)levelColors[rnd.Next(0, maxNumberOfColors)] };
                    }
                }
            }
        }

        private class Tile
        {
            public ConsoleColor Color { get; set; }
            public bool Selected { get; set; }
        }
    }
}
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,529
地点
弗吉尼亚州切萨皮克
编程经验
10+
考虑到这是一个C#论坛,因此第3条中的VB.NET代码即使在VS2019中也看起来不会在C#程序中编译。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
我建议在姐妹论坛上发帖 VB.NET开发人员社区
由于C#论坛仅适用于C#问题,因此请关闭此线程。
我已经重新打开线程。我认为您可能错误地认为第3个帖子来自OP,但并非如此。 OP可能正在寻求C#而不是VB的帮助。如果他们准备花时间阅读它,他们可能仍会从VB代码中获得一些想法。
 
Last edited:

约阿基姆

成员
已加入
2018年10月4日
留言内容
11
地点
瑞典斯德哥尔摩
编程经验
10+
我错过了这个问题,我现在制作了C#版本并编辑了帖子。
我已经重新打开线程。我认为您可能错误地认为第3个帖子来自OP,但并非如此。 OP可能正在寻求C#而不是VB的帮助。如果他们准备花时间阅读它,他们可能仍会从VB代码中获得一些帮助。
误解了问题,现在已更改为C#...
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,529
地点
弗吉尼亚州切萨皮克
编程经验
10+
请不要再编辑您的帖子,尤其是在有人对此发表评论之后。现在似乎在第4个帖子中我疯了,因为我说第3个帖子中的代码是VB.NET,而现在其中包含C#代码。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
请不要再编辑您的帖子,尤其是在有人对此发表评论之后。现在似乎在第4个帖子中我疯了,因为我说第3个帖子中的代码是VB.NET,而现在其中包含C#代码。
如果可以快速完成操作,那么编辑帖子中的错误是个好主意。如果您的帖子包含不正确的信息,那么编辑可能是一个好主意。在其他情况下,在单词后面添加新帖子或添加到现有帖子"EDIT"可能是一个更好的主意。编辑现有帖子的一个问题是,尽管该主题已订阅,但仍未收到通知 @Joakim 在这种情况下确实添加了新帖子,因此该问题已得到解决。

顺便提一句 @跳伞,您由于许多原因而发疯,以至于没有任何其他效果。 ;) 这些天至少每个帖子都具有“历史记录”功能,所以在这种情况下有证据表明您的理智。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,529
地点
弗吉尼亚州切萨皮克
编程经验
10+
哈哈!我的许多高空跳闸对缺氧产生的长期影响,跳伞结束后喝太多酒,射击过多导致铅污染,发现并存放更多饮酒后被清理并收起,并且四处奔跑! ;-)
 
Last edited:

约阿基姆

成员
已加入
2018年10月4日
留言内容
11
地点
瑞典斯德哥尔摩
编程经验
10+
如果可以快速完成操作,那么编辑帖子中的错误是个好主意。如果您的帖子包含不正确的信息,那么编辑可能是一个好主意。在其他情况下,在单词后面添加新帖子或添加到现有帖子"EDIT"可能是一个更好的主意。编辑现有帖子的一个问题是,尽管该主题已订阅,但仍未收到通知 @Joakim 在这种情况下确实添加了新帖子,因此该问题已得到解决。

顺便提一句 @跳伞,您由于许多原因而发疯,以至于没有任何其他效果。 ;) 这些天至少每个帖子都具有“历史记录”功能,所以在这种情况下有证据表明您的理智。
为了进行辩护,当我进行编辑时,有人锁定了线程并且我无法添加新帖子,但是无论如何,也许更少的手指指责和更多地尝试帮助人们解决问题是我的思考过程 :) 当然还有跳伞运动员,我不想让你看起来不好,伤害你的自我是我最后要做的事情,因此,这里有一个我最初为让您省心而做的VB.net版本的链接(具有讽刺意味的表现出来?) 来源Github
 
最佳 底部