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.
Nic a nic ponad to co trzeba dla węża z jednym graczem.
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.
Wąż dla dwóch graczy... coś jak Tron z zanikającym śladem :)
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
???????????????????????
Obsługuj ruchy każdego z graczy w osobnych wątkach po prostu.
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.
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.
Czym w wężu różnią się gracze, że chcesz powielać klasy?
@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.
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.
Dzięki na pomoc, połowy rzeczy z tego kodu nie rozumiem, dopiero uczę się programowania.
ale jakoś to rozgryzę :)