太空侵略者控制台游戏克隆

时间:2018-08-31 23:32:30

标签: c# console-application

出于学习目的,我想在c#空间入侵者上创建一个控制台克隆。我一直陷在侵略者行进的问题上。我已经制作了它们并进行打印,但是当我尝试将它们向某个方向移动时,它们会随着时间的流逝而逐渐消失,我不明白为什么。有人有主意吗?到目前为止,这是我的代码:

using System;
using System.Collections.Generic;
using System.Threading;


namespace SpaceInvader
{
    public struct Position
    {
        public int Row { get; set; }
        public int Col { get; set; }
        public char Symbol { get; set; }

        public Position(int row, int col, char symbol)
        {
            this.Row = row;
            this.Col = col;
            this.Symbol = symbol;
        }
    }
    class Program
    {
        static public int maxRows = 50;
        static public int maxCols = 180;

        public static List<Position> invader = new List<Position>();
        public static List<List<Position>> invaders = new List<List<Position>>();
        public static int moveX = 0;
        public static int moveY = 0;


        static void Main()
        {
            ScreenSettings();


            while (true)
            {
                invader.Clear();

                InitializeInvaders(moveY, moveX);
                DrawInvaders();
                Console.Clear();
                Thread.Sleep(10);
                moveX++;

            }

        }


        private static void ScreenSettings()
        {
            Console.CursorVisible = false;
            Console.BufferHeight = Console.WindowHeight = maxRows;
            Console.BufferWidth = Console.WindowWidth = maxCols;
        }

        private static void DrawInvaders()
        {
            foreach (List<Position> invader in invaders)
            {
                DrawInvader(invader);
            }
        }
        private static void EraseInvaders()
        {
            foreach (List<Position> invader in invaders)
            {
                foreach (Position part in invader)
                {
                    Console.SetCursorPosition(part.Col, part.Row);
                    Console.Write(' ');
                }
            }
        }

        private static void InitializeInvaders(int moveY = 0, int moveX = 0)
        {
            for (int row = 0; row < 16; row += 4)
            {
                for (int col = 0; col < 99; col += 9)
                {
                    InitializeInvader(row + moveY, col + moveX);
                }
            }

            invaders.Add(invader);

        }


        private static void DrawInvader(List<Position> invader)
        {
            ;
            foreach (Position part in invader)
            {
                Console.SetCursorPosition(part.Col, part.Row);
                Console.Write((char)part.Symbol);
            }

        }

        public static List<Position> InitializeInvader(int row, int col)
        {


            int startrow = 5;//start position row
            int startcol = 40;// start position col

            invader.Add(new Position(startrow + row, startcol + col, '/'));
            invader.Add(new Position(startrow + row, startcol + 1 + col, '{'));
            invader.Add(new Position(startrow + row, startcol + 2 + col, 'O'));
            invader.Add(new Position(startrow + row, startcol + 3 + col, '}'));
            invader.Add(new Position(startrow + row, startcol + 4 + col, '\\'));
            invader.Add(new Position(startrow + 1 + row, startcol + col, '\\'));
            invader.Add(new Position(startrow + 1 + row, startcol + 1 + col, '~'));
            invader.Add(new Position(startrow + 1 + row, startcol + 2 + col, '$'));
            invader.Add(new Position(startrow + 1 + row, startcol + 3 + col, '~'));
            invader.Add(new Position(startrow + 1 + row, startcol + 4 + col, '/'));
            return invader;

        }
    }
}

1 个答案:

答案 0 :(得分:2)

您似乎总是在主循环中始终调用InitializeInvaders。此功能将入侵者添加到入侵者列表中(不带s!),但不会删除旧的入侵者。由于入侵者可能与旧入侵者处于同一位置,因此您可能不会在屏幕上看到它们。

[编辑:我知道了,它在主循环中被删除了,但是:]

此外,您然后将整个列表(入侵者)添加到invaderS列表中,而无需事先清除入侵者。这个清单会越来越大...

tl; dr:您忘了清除入侵者列表了。

但是我认为您还有其他想法。不应仅在改变位置时每次都重新创建入侵者。您应该只调用一次InitializeInvaders,然后直接在索引上操作列表中的项目。 (invader [i] .posX = x ...),其中“ i”(默认情况下)为((y * x)+ x)(即:y乘以一行加上最后一行的x位置。) / p>

为清楚起见:您可以像这样添加它们(伪代码):     for(y = 0 to maxy) { for(x = 0 to maxx) { invaders.add(new invader(x, y)); } }

然后,您拥有每个'i'=准确的(开始)y * x + x位置。 ;)

然后您有一个全局x,y被添加到该位置,作业完成。 您只需在循环中更改此全局x,y,所有入侵者就会移动...

我希望这会有所帮助。

这是我对stackoverflow的第一个答案,所以请不要讨厌我。