Gra dla 2 osób c#

0

Witam
Moje pytanie jest następujące, tworzę sobie grę (coś podobnego do węża ) i nie wiem jak/czego użyć aby było możliwa jednoczesna
granie 2 osób.??
chodzi mi o to aby jednocześnie 2 osoby przyciskając klawisze np. jedna = UpArrow a druga= W wykonywały swoje ruchy.

0

Nic a nic ponad to co trzeba dla węża z jednym graczem.

0

jezeli masz obiekt Player to po prostu u tego playera w petli robisz cos na zasadzie

HandleInput(); 

i w tym handleInput masz strukture/obiekt Controls ktore jest rozne dla obu Player i sprawdzasz czy zostalo tam wcisniete i odpowiednia akcja. W sumie tyle.

0

Wąż dla dwóch graczy... coś jak Tron z zanikającym śladem :)

0

Chodzi mi o to że jak GRACZ 2 wykonuje ruch to ruch GRACZa 1 się zatrzymuje !!
Jak GRACZ 1 wykonuje ruch to ruch GRACZa 2 się zatrzymuje
nie umiem sobie poradzić z tym aby dwóch użytkowników wykonywało ruchy jednocześnie
???????????????????????

0

Obsługuj ruchy każdego z graczy w osobnych wątkach po prostu.

1
grzesiek51114 napisał(a):

Obsługuj ruchy każdego z graczy w osobnych wątkach po prostu.

Jaja sobie robisz?

Wybitny Terrorysta napisał(a):

Chodzi mi o to że jak GRACZ 2 wykonuje ruch to ruch GRACZa 1 się zatrzymuje !!
Jak GRACZ 1 wykonuje ruch to ruch GRACZa 2 się zatrzymuje
nie umiem sobie poradzić z tym aby dwóch użytkowników wykonywało ruchy jednocześnie
???????????????????????

Coś musiałeś skopać programując lub projektując grę.

Wąż musi iść samoczynnie w wyznaczonym kierunku. Nie musisz przytrzymywać klawisza, żeby szedł. Wciśnięcie klawisza zmienia tylko kierunek ruchu, nie porusza wężem.
Każdy gracz musi mieć swój zestaw zmiennych dlatego zapakuj wszystko co dotyczy gracza w jeden obiekt (tylko jednemu przypisz inne klawisze niż drugiemu).

W grze wszędzie gdzie odwołujesz się do graczy użyj pętli odwołującej się do każdego gracza z tablicy graczy.

0

Ale JAK mam zrobić DOKŁADNIE !!!!!!
mam 2 osobne klasy na graczy (Gracz1 i Gracz2) uruchamia się program i kiedy naciskam UpArrow to wykonuje się ruch Gracza1 w górę
Jak nacisnę W to zatrzymuje się petlą gra GRACZ1 i uruchamia się pętla dla GRACZ2
nie mogę i nie wiem jak zrobić aby wykonywały się obie albo żeby wciśniecie klawisza nie przerywało jednej.

2

Czym w wężu różnią się gracze, że chcesz powielać klasy?

0

@Spine A no prawda. Rzeczywiście jeden wątek wystarczy! ;)

A jak to zrobić? Choćby tak:

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

namespace ASCII_Snake {
    class Snake {
        private class Position {
            public int XPos { get; set; }
            public int YPos { get; set; }
        }

        private class PlayersMoves {
            public List<Position> First { get; set; }
            public List<Position> Second { get; set; }

            public PlayersMoves() {
                this.First = new List<Position>();
                this.Second = new List<Position>();
            }
        }

        private class PlayerKeys {
            public List<ConsoleKey> First { get; set; }
            public List<ConsoleKey> Second { get; set; }

            public PlayerKeys() {
                this.First = new List<ConsoleKey>() { ConsoleKey.UpArrow, ConsoleKey.DownArrow, ConsoleKey.LeftArrow, ConsoleKey.RightArrow };
                this.Second = new List<ConsoleKey>() { ConsoleKey.W, ConsoleKey.S, ConsoleKey.A, ConsoleKey.D };
            }
        }

        private enum Player {
            First,
            Second
        }

        private PlayersMoves _moves;
        private PlayerKeys _keys;

        public Snake() {
            this._moves = new PlayersMoves();
            this._moves.First.Add(new Position { XPos = Console.WindowHeight / 2, YPos = Console.WindowHeight / 2 });
            this._moves.Second.Add(new Position { XPos = Console.WindowWidth - (Console.WindowHeight / 2), YPos = Console.WindowHeight / 2 });

            this.SetPoint(this._moves.First[0].XPos, this._moves.First[0].YPos, Player.First);
            this.SetPoint(this._moves.Second[0].XPos, this._moves.Second[0].YPos, Player.Second);

            this._keys = new PlayerKeys();
        }

        public void Play() {
            int firstXdir = 0, firstYdir = -1;
            int secondXdir = 0, secondYdir = -1;
            bool state = true;

            ThreadPool.QueueUserWorkItem(delegate {
                do {
                    var key = Console.ReadKey().Key;
                    if (this._keys.First.Contains(key)) this.ChangePlayerDirection(ref firstXdir, ref firstYdir, this._keys.First, key);
                    else if (this._keys.Second.Contains(key)) this.ChangePlayerDirection(ref secondXdir, ref secondYdir, this._keys.Second, key);
                    else state = false;                    
                } while (state);
            });

            do {                
                Thread.Sleep(500);
                this.Move(firstXdir, firstYdir, Player.First);
                this.Move(secondXdir, secondYdir, Player.Second);
            } while (state);
        }

        private void ChangePlayerDirection(ref int xdir, ref int ydir, List<ConsoleKey> keyList, ConsoleKey key) {
            if (key == keyList[0]) {
                xdir = 0;
                ydir = -1;
            }
            else if (key == keyList[1]) {
                xdir = 0;
                ydir = 1;
            }
            else if (key == keyList[2]) {
                xdir = -1;
                ydir = 0;
            }
            else if (key == keyList[3]) {
                xdir = 1;
                ydir = 0;
            }
        }

        private void Move(int xdir, int ydir, Player player) {
            int x = 0, y = 0;
            switch (player) {
                case Player.First:
                    {
                        x = this._moves.First[this._moves.First.Count - 1].XPos + xdir;
                        y = this._moves.First[this._moves.First.Count - 1].YPos + ydir;
                        this._moves.First.Add(new Position { XPos = x, YPos = y });
                        break;
                    }
                case Player.Second:
                    {
                        x = this._moves.Second[this._moves.Second.Count - 1].XPos + xdir;
                        y = this._moves.Second[this._moves.Second.Count - 1].YPos + ydir;
                        this._moves.Second.Add(new Position { XPos = x, YPos = y });
                        break;
                    }
            }
            this.SetPoint(x, y, player);
        }

        private void SetPoint(int xpos, int ypos, Player player) {
            if (player == Player.First) Console.ForegroundColor = ConsoleColor.Yellow;
            else Console.ForegroundColor = ConsoleColor.Green;

            Console.SetCursorPosition(xpos, ypos);
            Console.Write('O');
        }
    }

    class Program {
        static void Main(string[] args) {
            var snake = new Snake();
            snake.Play();
        }
    }
}

Masz tutaj węża z historią ruchów na podstawie której możesz zostawiać na planszy tyle kropek ile wąż zjadł ciastek. Zaprogramowałem klawisze strzałek i WSAD dla drugiego gracza (które działają z echem niestety więc musisz pokusić się o ich odpowiednie usuwanie z okna konsoli). Możesz ewentualnie zrobić numpadowe strzałki ale pisałem to na lapku i niewygodnie było mi sprawdzać. One pewnie echa nie zostawią więc wiesz... Pozmieniasz sobie najwyżej.

Tak jak @Spine napisał: jeden wątek w zupełności wystarczy co widać w metodzie Play().

Reszta w Twoich rękach.

PS: Pewnie, kod jest niedoskonały ale chodziło o ideę pokazania mechaniki ruchów dla dwóch graczy.

0

Nikt nie pisał, że wąż ma być konsolowy ;)

Wybitny Terrorysta napisał(a):

Ale JAK mam zrobić DOKŁADNIE !!!!!!
mam 2 osobne klasy na graczy (Gracz1 i Gracz2) uruchamia się program i kiedy naciskam UpArrow to wykonuje się ruch Gracza1 w górę
Jak nacisnę W to zatrzymuje się petlą gra GRACZ1 i uruchamia się pętla dla GRACZ2
nie mogę i nie wiem jak zrobić aby wykonywały się obie albo żeby wciśniecie klawisza nie przerywało jednej.

Kto Ci broni obsługiwać obu graczy w jednej pętli?

To co masz w klasie gracza wewnątrz pętli wpakuj do osobnej metody, którą z kolei będziesz wywoływał na zewnątrz w pętli.

0

Dzięki na pomoc, połowy rzeczy z tego kodu nie rozumiem, dopiero uczę się programowania.
ale jakoś to rozgryzę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1