Vajíčková mánie Vajíčková mánie
Probíhá výprodej HTML, JavaScript a Bootstrap. Slevy až 80 %
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde

Diskuze: Vytvoření nepřátel a střel ve hře.

Aktivity (4)
Avatar
Petr Seifert
Člen
Avatar
Petr Seifert:27. března 19:41

Nejde mi vytvořit více nepřátel a střel do hry.
V každém cyklu by se měl vytvořit nový nepřítel a všichni existující nepřátelé by se měli pohnout o jeden bod po se x směrem k vám.
Vždycky když vystřelíte tak by se měla vytvořit nová střela a v každém cyklu by se měli všechny existující střeli pohynout po ose x směrem k nepříteli.

Zde je můj momentální kód s jedním nepřítelem a jednou střelou.

using System;
using System.Text;
using System.Threading;

namespace spaceWar2
{
    class Program
    {
        public Random random = new Random();
        public ConsoleKeyInfo keyPress = new ConsoleKeyInfo();
        public StringBuilder sb = new StringBuilder();

        int score, playerX, playerY, enemyX, enemyY, firePosY, firePosX, speed;

        const int height = 20;
        const int width = 80;

        bool gameOver, reset, shoot;
        string dir;

        /// <summary>
        /// Nastaví okno a zobrazí main obrazovku
        /// </summary>
        void ShowMain()
        {
            Console.SetWindowSize(width, height + 4);
            Console.SetBufferSize(width + 1, height + 4);
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;

            sb.AppendLine("||============================================================================||");
            sb.AppendLine("||----------------------------------------------------------------------------||");
            sb.AppendLine("||--------------------------- Welcome to Spacewar! ---------------------------||");
            sb.AppendLine("||----------------------------------------------------------------------------||");
            sb.AppendLine("||============================================================================||");
            sb.AppendLine();
            sb.AppendLine();
            sb.AppendLine("                             PRESS ANY KEY TO PLAY                              ");
            sb.AppendLine();
            sb.AppendLine();
            sb.AppendLine("          Controller:- Use Arrow buttons UP and DOWN to move the plane          ");
            sb.AppendLine("                            - Press Space to shoot                              ");
            sb.AppendLine("                            - Press S to pause                                  ");
            sb.AppendLine("                            - Press ESC to quit game                            ");
            Console.Write(sb);
            sb.Clear();
            keyPress = Console.ReadKey(true);
            if (keyPress.Key.Equals(ConsoleKey.Escape))
            {
                Environment.Exit(0);
            }
        }

        /// <summary>
        /// Nastaví proměné na základní hodnoty
        /// </summary>
        void Setup()
        {
            dir = "";
            score = 0;

            gameOver = false;
            reset = false;
            shoot = false;

            playerX = 1;
            playerY = 10;

            speed = 0;

            enemyX = width - 1;
            enemyY = random.Next(1, height - 1);
        }

        /// <summary>
        /// Čte vstup uživatele
        /// </summary>
        void CheckInput()
        {
            while (Console.KeyAvailable)
            {
                keyPress = Console.ReadKey();
                if (keyPress.Key.Equals(ConsoleKey.Escape))
                    Environment.Exit(0);

                if (keyPress.Key.Equals(ConsoleKey.S))
                {
                    dir = "STOP";
                }
                else if (keyPress.Key.Equals(ConsoleKey.UpArrow) && playerY > 1)
                {
                    dir = "UP";
                }
                else if (keyPress.Key.Equals(ConsoleKey.DownArrow) && playerY < 18)
                {
                    dir = "DOWN";
                }
                else if (keyPress.Key.Equals(ConsoleKey.Spacebar))
                {
                    shoot = true;
                    firePosX = playerX;
                    firePosY = playerY;
                }
            }
        }

        /// <summary>
        /// Vykonává veškeré akce
        /// </summary>
        void Logic()
        {
            switch (dir)
            {
                case "UP":
                    playerY--;
                    break;
                case "DOWN":
                    playerY++;
                    break;
                case "STOP":
                    while (true)
                    {
                        Console.Clear();
                        Console.CursorLeft = width / 2 - 6;
                        sb.AppendLine("GAME PAUSED");
                        sb.AppendLine();
                        sb.AppendLine();
                        sb.AppendLine("   - Press S to resume game");
                        sb.AppendLine("   - Press R to reset game");
                        sb.Append("   - Press ESC to quit game");
                        Console.Write(sb);
                        sb.Clear();
                        keyPress = Console.ReadKey(true);
                        if (keyPress.Key.Equals(ConsoleKey.Escape))
                            Environment.Exit(0);
                        if (keyPress.Key.Equals(ConsoleKey.R))
                        {
                            reset = true;
                            break;
                        }
                        if (keyPress.Key.Equals(ConsoleKey.S))
                            break;
                    }
                    break;
            }
            if (firePosX.Equals(enemyX) && firePosY.Equals(enemyY) || firePosX.Equals(enemyX + 1) && firePosY.Equals(enemyY))
            {
                score += 10;
                enemyX = width - 1;
                enemyY = random.Next(1, height - 1);
                firePosX = width;

                if (speed < 22)
                {
                    speed++;
                }
            }

            if (enemyX.Equals(0))
            {
                gameOver = true;
            }

            dir = "";
        }

        /// <summary>
        /// Vykresluje
        /// </summary>
        void Render()
        {
            Console.SetCursorPosition(0, 0);

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    if (i.Equals(0) || i.Equals(height - 1))
                    {
                        sb.Append("#");
                    }
                    else if (j.Equals(0) || j.Equals(width - 1))
                    {
                        sb.Append("#");
                    }
                    else if (j.Equals(playerX) && i.Equals(playerY))
                    {
                        sb.Append(">");
                    }
                    else if (j.Equals(enemyX) && i.Equals(enemyY))
                    {
                        sb.Append("<");
                    }
                    else if (shoot && i.Equals(firePosY) && j.Equals(firePosX + 1))
                    {
                        sb.Append("-");
                    }
                    else
                    {
                        sb.Append(" ");
                    }

                }
                sb.AppendLine();
            }
            sb.Append("Your score: ");
            sb.Append(score);
            Console.Write(sb);
            sb.Clear();
            firePosX++;
            enemyX--;
        }

        /// <summary>
        /// Zobrazí oznámení o prohře
        /// </summary>
        void Lose()
        {
            Console.SetCursorPosition(width / 2 - 4, height + 1);
            sb.AppendLine("YOU LOSED");
            sb.AppendLine("Press R to reset game");
            sb.Append("Press ESC to quit game");
            Console.Write(sb);
            sb.Clear();
            while (true)
            {
                keyPress = Console.ReadKey(true);
                if (keyPress.Key.Equals(ConsoleKey.Escape))
                {
                    Environment.Exit(0);
                }
                if (keyPress.Key.Equals(ConsoleKey.R))
                {
                    reset = true;
                    break;
                }
            }
        }

        /// <summary>
        /// Vykonává metody v cyklu tak aby vše šlapalo
        /// </summary>
        void Update()
        {
            while (!gameOver)
            {
                CheckInput();
                Logic();
                Render();
                if (reset)
                    break;
                Thread.Sleep(40 - speed);
            }
            if (gameOver)
                Lose();
        }

        static void Main(string[] args)
        {
            Program spacewar = new Program();
            spacewar.ShowMain();
            while (true)
            {
                spacewar.Setup();
                spacewar.Update();
                Console.Clear();
            }
        }
    }
}

Zkusil jsem: Zkoušel jsem vytvořit dva Listy. V 1. listu by se měli objekty ukládat. A 2. list by měl sloužit k pohnutí s objektama a aktualizaci 1. listu.

Zde je kód

using System;
using System.Collections.Generic;

namespace TestList
{
    struct Object
    {
        public int x;
        public int y;
        public string c;
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Object> objects = new List<Object>();
            List<Object> newList = new List<Object>();
            Random random = new Random();

            const int width = 80;
            const int height = 20;

            Console.SetWindowSize(width + 1, height + 1);

            while (true)
            {
                Object newObject = new Object();
                newObject.x = width - 1;
                newObject.y = random.Next(1, height - 1);
                newObject.c = "<";
                objects.Add(newObject);

                for (int i = 0; i < objects.Count; i++)
                {
                    Object oldObject = new Object();
                    oldObject.y = objects[i].y;
                    oldObject.c = objects[i].c;

                    if (oldObject.c.Equals("<"))
                        oldObject.x = objects[i].x - 1;
                    else
                        oldObject.x = objects[i].x + 1;

                    if (oldObject.x < width - 1 && oldObject.x > 0)
                    {
                        newList.Add(oldObject);
                    }
                }
                objects = newList;

                Console.WriteLine(objects.Count);
                Console.WriteLine();
            }
        }
    }
}

Tento kód by měl vytvářet nepřátele a pohybovat s nima. Ale z vypisování počtu objektů na konci cyklu vidím, že to nefunguje.
Děkuji za jakoukoliv radu.

Chci docílit: Snažím se vytvořit jednoduchou hru v konzoli. Hra vám vykreslí herní pole ve kterém se vše odehrává, vy ovládáte šipku, kterou hýbete nahoru, dolu a můžete s ní vystřelit. Proti vám jede nepřítelská šipka, kterou musíte sestřeli dřív než narazí do zdi za vámá. Chtěl bych do hry přidat více nepřátel a zajistit abych mohl vystřelit více střel.

 
Odpovědět 27. března 19:41
Avatar
Petr Seifert
Člen
Avatar
Petr Seifert:27. března 21:08

Tak zatím vyřešeno. Musel jsem List newList dát do while cyklu aby se vždycky vytvořil znova.
Pokud budu mít další problém okolo této věci tak sem napíšu.

 
Nahoru Odpovědět 27. března 21:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.