Diskuze: Pohyb po matici s nahodne generovanou promennou
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Jestli jsem dobre pochopil, o co ti jde, tak bych si nechal nekde stranou ulozenou tu souradnici a v cyklu, kde se matice vykresluje, bych jen porovnaval, jestli nevykresluju pozici, ktera se shoduje s tou ulozenou souradnici - pak bych misto obsahu matice vykreslil X.
Pokud by ta matice mělo uchovávat pouze dva možné stavy - tedy křížek tam je nebo není, tak by nemuselo být špatné to řešit polem typu bool.
private bool[,] matice = new bool[20, 30];
přičemž "hvězdička" bude false a křížek bude true. Pak by sis mohl udělat nějakou metodu, která bude přepínat hodnotu, třeba něco takovéhoto:
public void ZmenHodnotu(int x, int y)
{
matice[x, y] = !matice[x, y];
}
A ted už by jen stačilo si volat ZmenHodnotu na souřadnici, kde se
křížek nachází a kam se posouvá. Ale způsobů jak to řešit je mraky.
Dekuju za odpovedi. Bool bohuzel pouzit nemuzu, protoze se tam casem objevi jeste dalsi prvky. Abych to teda popsal poradne - jedna se o jednoduchy projekt/hru, kterou jsem nasel v nejake ucebnici. Je dano dvojrozmerne pole, ktere je vypsano hvezdickama(hraci plocha), X (hrac), Z(zombici) a B (bomba). X je nahodne generovane a hrac jim pohybuje pomoci wasd (X je na poli vzdy prave jedno, po zmacknuti klavesy se cela matice znovu vykresli, pricemz X je posunute o souradnice podle zmacknute klavesy a na puvodnim miste je zase hvezdicka). Zombici se pri kazdem novem vykresleni pohnou o jedno policko smerem k hraci. Pokud se potkaji na stejnem policku, hra konci. Pokud hrac stoupne na policko B, bomba vybouchne a hrac ziskava body za zabite zombiky.
Momentalne jsem zasekly na tom, ze se mi nedari nadefinovat nahodnou promennou, ktera by definovala hracovu prvotni pozici (urcite vyzkousim) a hlavne na tom rozpohybovani po matici.
rwn: pokud pouziju tu metodu ZmenHodnotu, nebude se mi X pridavat jako za sebe jako ve hre Had?
Co takto?
Random rnd = new Random();
int x = rnd.Net(tvojePole.GetLength(0));
int y = rnd.Next(tvojePole.GetLength(1));
nebo v objektu
Random rnd = new Random();
Point p = new Point(rnd.Net(tvojePole.GetLength(0)), rnd.Net(tvojePole.GetLength(1)))
Btw, jestli to děláš v konzoli, tak si buď musíš přidat System.Drawing a nebo si nato vytvoř svoji třídu na ty pozice.
Něco pro inspiraci jsem tu vykoumal. Nejlepší by asi bylo, že by jsi měl zvlášt kolekci na všechny objekty (resp. jen na zombíky, protože ty budou mít nějakou AI) a s těmi budeš postupně pohybovat k tomu hráči. Protože hledání je v té matici, pak hledání kde vůbec mají jít a zbytečné přepisování celého objektu by bylo složitější, než si hrát s pozicemi.
class Game
{
private Random random = new Random();
private FieldType[,] gameBoard;
private Point player;
//private List<Point> zombies;
public bool IsPlaying { get; private set; }
public Game(int cols, int rows)
{
gameBoard = new FieldType[cols, rows];
player.X = random.Next(gameBoard.GetLength(0));
player.Y = random.Next(gameBoard.GetLength(1));
IsPlaying = true;
}
public void Turn(ConsoleKey k)
{
switch (k)
{
case ConsoleKey.W:
if (IsValid(player.X, player.Y - 1))
player.Y--;
break;
case ConsoleKey.S:
if (IsValid(player.X, player.Y + 1))
player.Y++;
break;
case ConsoleKey.A:
if (IsValid(player.X - 1, player.Y))
player.X--;
break;
case ConsoleKey.D:
if (IsValid(player.X + 1, player.Y))
player.X++;
break;
}
// zombie's turn etc...
}
private bool IsValid(Point p)
{
return IsValid(p.X, p.Y);
}
private bool IsValid(int x, int y)
{
return x >= 0 &&
y >= 0 &&
x < gameBoard.GetLength(0) &&
y < gameBoard.GetLength(1);
}
public void Draw()
{
Console.Clear();
for (int y = 0; y < gameBoard.GetLength(1); y++)
{
for (int x = 0; x < gameBoard.GetLength(0); x++)
{
Console.Write(FieldTypeToChar(gameBoard[x, y]));
}
Console.WriteLine();
}
Console.CursorLeft = player.X;
Console.CursorTop = player.Y;
Console.Write(FieldTypeToChar(FieldType.Player));
}
private char FieldTypeToChar(FieldType f)
{
switch (f)
{
case FieldType.Empty:
return '*';
case FieldType.Zombie:
return 'Z';
case FieldType.Bomb:
return 'B';
case FieldType.Player:
return 'X';
default:
throw new ApplicationException("nondefined FieldType");
}
}
}
.
enum FieldType
{
Empty, // *
Zombie, // Z
Bomb, // B
Player // X
}
.
struct Point
{
public int X, Y;
}
.
internal static class Program
{
[STAThread]
private static void Main(string[] args)
{
Game g = new Game(10, 10);
g.Draw();
while (g.IsPlaying)
{
g.Turn(Console.ReadKey(true).Key);
g.Draw();
}
Console.ReadLine();
}
}
Bezne se to resi tak, ze vykreslis celou mapu a pak pres to vykreslis objekty - panacka a bombu.
Nebyl by to Had, protože bys negoval novou pozici a starou v jednom
kroku(metoda by se v jednom kroku volala dvakrat). Ale pokud je tam tedy více
stavů na jednotlivém políčku, tak se to nedá s tím bool moc použít.
Zobrazeno 8 zpráv z 8.