Ahoj všem,
mám tu menší problém. Udělal jsem v C# hru, něco na způsob hada a všechny prvky jsou náhodně generovány, ale problém je v tom, že když hru spustím, tak se had nejdřív na obrazovce neobjeví vůbec a když dám šipku doprava, tak se objeví u posledního generovaného prvku (v tomto případě východ). [Nevšímejte si věcí, jakože překážkama se dá projít, to jsem ještě neřešil]. Zde je kód
using System;
namespace Upg.Snake
{
enum StavHry
{
Probiha,Vyhra,Prohra,Ukonceni
}
class HerniSvet
{
private int[,] Mapa;
private int x = 1, y = 1;
int predchoziX = 1, predchoziY = 1;
int zbyvajiciPredmety;
int pocetPredmetu = 4;
int pocetPrekazek = 4;
int pocetVychodu = 1;
const int MapaSirka = 24;
const int MapaVyska = 24;
const int Prekazka = 3;
const int Predmet = 2;
const int Vychod = 1;
Random nahoda = new Random();
public StavHry stavHry = StavHry.Probiha;
public int X
{
get
{
return x;
}
set
{
if (value >= 1 && value < MapaSirka - 1)
{
if (Mapa[value, y] == Prekazka)
{
return;
}
Mapa[x, y] = Prekazka;
x = value;
}
}
}
public int Y
{
get
{
return y;
}
set
{
if(value >=1 && value < MapaVyska -1)
{
if (Mapa[x,value] == Prekazka)
{
return;
}
Mapa[x, y] = Prekazka;
y = value;
}
}
}
public void ZkontrolujPolicko()
{
if (Mapa[x,y] == Predmet)
{
Mapa[x, y] = 0;
zbyvajiciPredmety--;
}
else if (Mapa[x,y] == Vychod && zbyvajiciPredmety == 0)
{
stavHry = StavHry.Vyhra;
}
else if (Mapa[x,y] == Vychod && zbyvajiciPredmety > 0)
{
stavHry = StavHry.Prohra;
}
if(Mapa[x-1,y] == Prekazka && Mapa[x,y-1] == Prekazka && Mapa[x+1,y] == Prekazka && Mapa[x,y+1] == Prekazka)
{
stavHry = StavHry.Prohra;
}
}
public void AktualizujZobrazeni()
{
Console.SetCursorPosition(predchoziX, predchoziY);
Console.BackgroundColor = ConsoleColor.White;
Console.Write(" ");
Console.SetCursorPosition(x, y);
Console.BackgroundColor = ConsoleColor.Red;
Console.Write("X");
Console.ResetColor();
predchoziX = x;
predchoziY = y;
Console.SetCursorPosition(MapaSirka + 2, 0);
Console.WriteLine("Předmětů zbývá sebrat: " + zbyvajiciPredmety);
}
public void ZpracovaniPohybu()
{
ConsoleKeyInfo stisknutaKlavesa = Console.ReadKey(true);
switch(stisknutaKlavesa.Key)
{
case ConsoleKey.DownArrow:
y++;
break;
case ConsoleKey.UpArrow:
y--;
break;
case ConsoleKey.LeftArrow:
x--;
break;
case ConsoleKey.RightArrow:
x++;
break;
case ConsoleKey.Escape:
stavHry = StavHry.Ukonceni;
break;
}
}
public HerniSvet()
{
Mapa = new int[MapaSirka, MapaVyska];
for (int y = 0; y < MapaVyska; y++)
{
Mapa[0, y] = Prekazka;
Mapa[MapaSirka - 1, y] = Prekazka;
}
for (int x = 0;x < MapaSirka;x++)
{
Mapa[x, 0] = Prekazka;
Mapa[x, MapaVyska - 1] = Prekazka;
}
for (int i = 0; i < pocetPrekazek; i++)
{
x = nahoda.Next(1, 23);
y = nahoda.Next(1, 23);
Mapa[x,y] = Prekazka;
}
for (int i = 0; i < pocetPredmetu; i++)
{
x = nahoda.Next(1, 23);
y = nahoda.Next(1, 23);
while (Mapa[x,y] == Prekazka)
{
x = nahoda.Next(1, 23);
y = nahoda.Next(1, 23);
}
Mapa[x, y] = Predmet;
}
for (int i = 0; i < pocetVychodu;i++)
{
x = nahoda.Next(1, 23);
y = nahoda.Next(1, 23);
while(Mapa[x,y] == Prekazka || Mapa[x,y] == Predmet)
{
x = nahoda.Next(1, 23);
y = nahoda.Next(1, 23);
}
Mapa[x, y] = Vychod;
}
for (int Y = 0; Y < MapaVyska; Y++)
{
for (int X = 0; X < MapaSirka; X++)
{
if (Mapa[X, Y] == Predmet)
{
zbyvajiciPredmety++;
}
}
}
ZobrazHerniSvet();
}
private void ZobrazHerniSvet()
{
for(int y = 0;y < MapaVyska; y++)
{
for(int x = 0; x < MapaSirka; x++)
{
if (Mapa[x,y] == Prekazka)
{
Console.SetCursorPosition(x, y);
Console.Write("#");
}
else if (Mapa[x, y] == Predmet)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.SetCursorPosition(x, y);
Console.Write("*");
Console.ResetColor();
}
else if (Mapa[x,y] == Vychod)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.SetCursorPosition(x, y);
Console.Write("@");
Console.ResetColor();
}
}
}
}
}
class Program
{
const int NovaHra = 0;
const int Instrukce = 1;
const int Konec = 2;
static void Main(string[] args)
{
HlavniNabidka.ZobrazHlavniNabidku();
bool hraPokracuje = true;
while (hraPokracuje)
{
int vysledekVolby = HlavniNabidka.ZobrazHlavniNabidku();
switch (vysledekVolby)
{
case NovaHra:
Console.Clear();
HerniSvet herniSvet = new HerniSvet();
while (herniSvet.stavHry == StavHry.Probiha)
{
herniSvet.ZpracovaniPohybu();
herniSvet.ZkontrolujPolicko();
herniSvet.AktualizujZobrazeni();
}
switch (herniSvet.stavHry)
{
case StavHry.Ukonceni:
Console.Clear();
Console.WriteLine("Hra ukončena uživatelem.");
break;
case StavHry.Vyhra:
Console.Clear();
Console.WriteLine("VYhrál jsi!");
break;
case StavHry.Probiha:
Console.Clear();
Console.WriteLine("Prohrál jsi!");
break;
}
Console.ReadKey();
break;
case Instrukce:
Console.Clear();
Console.Write("Instrukce\nOvládání:");
Console.Write("šipky");
Console.Write("\nCíl hry:Sesbírej všechny předměty (*) a dojdi k východu (@). Cestou se vyhni překážkám (#)");
Console.ReadKey();
break;
case Konec:
hraPokracuje = false;
break;
}
}
}
}
class HlavniNabidka
{
public static int ZobrazHlavniNabidku()
{
string[] polozkyNabidky = new string[3];
polozkyNabidky[0] = "Nová hra";
polozkyNabidky[1] = "Instrukce";
polozkyNabidky[2] = "Konec";
int zvolenaPolozka = 0;
bool vyberDokoncen = false;
Console.Clear();
while (!vyberDokoncen)
{
Console.SetCursorPosition(0, 3);
for (int i = 0; i < polozkyNabidky.Length; i++)
{
if (zvolenaPolozka == i)
{
Console.BackgroundColor = ConsoleColor.Blue;
}
Console.WriteLine(polozkyNabidky[i]);
Console.ResetColor();
}
ConsoleKeyInfo StisknutaKlavesa = Console.ReadKey(true);
if (StisknutaKlavesa.Key == ConsoleKey.DownArrow)
{
zvolenaPolozka++;
if (zvolenaPolozka == polozkyNabidky.Length)
{
zvolenaPolozka = 0;
}
}
else if (StisknutaKlavesa.Key == ConsoleKey.UpArrow)
{
zvolenaPolozka--;
if (zvolenaPolozka < 0)
{
zvolenaPolozka = polozkyNabidky.Length - 1;
}
}
else if (StisknutaKlavesa.Key == ConsoleKey.Enter)
{
vyberDokoncen = true;
}
}
return zvolenaPolozka;
}
}
}