NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Petr Kubíček:29.10.2017 1:14

Ahoj, jsem začínající programátor, rozhodl jsem se zkusit si vytvořit vlastní tetris v konzoli.

Vytvořil jsem si třídu hracího pole, v něm pole znaků a metody pro jeho vykreslení, další třídu s kostkou (berte s rezervou) a metodou, která by měla kostku posouvat po ose Y směrem dolů.

Z nějakého důvodu se mi hodnota osy Y sice mění, ale pole nepřekreslí, potřeboval bych poradit, čím to je. Děkuji.

using System;
using System.Collec­tions.Generic;
using System.Linq;
using System.Text;
using System.Threadin­g.Tasks;
using static System.Threadin­g.Thread;

namespace Tetris
{
class Program
{
static Hraci_plocha hraci_plocha = new Hraci_plocha();
static Kostka kostka = new Kostka();

static void Main(string[] args)
{
VytvorHraciPlochu();
VytvorKostku();
}

static public void VytvorHraciPlochu()
{
hraci_plocha.Na­plnHraciPlochu();
hraci_plocha.Vy­kresliHraciPlochu();

}

static public void VytvorKostku()
{
while (true)
{
Console.Clear();
hraci_plocha.Vy­kresliKostku();
kostka.Presun­Kostku();
Console.Write­Line(kostka.Y);
Sleep(1000);
}
}
}

class Hraci_plocha
{
Kostka kostka = new Kostka();
public char[,] plocha;
public Hraci_plocha()
{
plocha = new char[45, 100];
}

public void NaplnHraciPlochu()
{
for (int i = 0; i < plocha.GetLen­gth(0); i++)
{
for (int j = 0; j < plocha.GetLen­gth(1); j++)
{
if (j == 0 || j == 99 || i == 44)
{
Console.Write("*");
}
else
{
Console.Write(" ");
}
}
Console.Write­Line();
}
}

public void VykresliHraci­Plochu()
{
foreach (char ch in plocha)
{
Console.Write(ch);
}
}

public void VykresliKostku()
{
for (int i = 0; i < plocha.GetLen­gth(0); i++)
{
for (int j = 0; j < plocha.GetLen­gth(1); j++)
{
if (j == 0 | j == 99 | i == 44)
{
Console.Write("*");
}
else if (j == kostka.X & i == kostka.Y)
{
Console.Write("x");
}
else
{
Console.Write(" ");
}
}
Console.Write­Line();
}
}
}

class Kostka
{
public int X { get; set; }
public int Y { get; set; }
private Random rnd;

public Kostka()
{
rnd = new Random();
X = rnd.Next(1, 100);
Y = 0;
}

public void PresunKostku()
{
Y++;
}
}
}

 
Odpovědět
29.10.2017 1:14
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Petr Kubíček
Petr Šťastný:29.10.2017 8:38

Pouzivej takovy to tlacitko </> nad textovym polem kdyz tady na itnetworku pises prispevek. Hezky to naformatuje kod.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Threading.Thread;

namespace Tetris
{
class Program
{
static Hraci_plocha hraci_plocha = new Hraci_plocha();
static Kostka kostka = new Kostka();

static void Main(string[] args)
{
VytvorHraciPlochu();
VytvorKostku();
}

static public void VytvorHraciPlochu()
{
hraci_plocha.NaplnHraciPlochu();
hraci_plocha.VykresliHraciPlochu();

}

static public void VytvorKostku()
{
while (true)
{
Console.Clear();
hraci_plocha.VykresliKostku();
kostka.PresunKostku();
Console.WriteLine(kostka.Y);
Sleep(1000);
}
}
}

class Hraci_plocha
{
Kostka kostka = new Kostka();
public char[,] plocha;
public Hraci_plocha()
{
plocha = new char[45, 100];
}

public void NaplnHraciPlochu()
{
for (int i = 0; i < plocha.GetLength(0); i++)
{
for (int j = 0; j < plocha.GetLength(1); j++)
{
if (j == 0 || j == 99 || i == 44)
{
Console.Write("*");
}
else
{
Console.Write(" ");
}
}
Console.WriteLine();
}
}

public void VykresliHraciPlochu()
{
foreach (char ch in plocha)
{
Console.Write(ch);
}
}

public void VykresliKostku()
{
for (int i = 0; i < plocha.GetLength(0); i++)
{
for (int j = 0; j < plocha.GetLength(1); j++)
{
if (j == 0 | j == 99 | i == 44)
{
Console.Write("*");
}
else if (j == kostka.X & i == kostka.Y)
{
Console.Write("x");
}
else
{
Console.Write(" ");
}
}
Console.WriteLine();
}
}
}

class Kostka
{
public int X { get; set; }
public int Y { get; set; }
private Random rnd;

public Kostka()
{
rnd = new Random();
X = rnd.Next(1, 100);
Y = 0;
}

public void PresunKostku()
{
Y++;
}
}
}.
 
Nahoru Odpovědět
29.10.2017 8:38
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Petr Kubíček
Petr Šťastný:29.10.2017 8:46
  • Proc using static System.Threadin­g.Thread; ?
  • Kdyz vykreslujes hraci plochu, udelej to takhle, 2rozmerne pole bych neiteroval pres foreach
// Kod je zjednodusenej, jsem na mobilu, ty for cykly udelej jako u naplnovani plochy
for(i){
for(j){
Console.Write(plocha[i, j]);
}
Console.WriteLine();
}
  • Metoda NaplnHraciPlochu nic nenaplnuje, ale jenom vykresluje
Editováno 29.10.2017 8:47
 
Nahoru Odpovědět
29.10.2017 8:46
Avatar
Odpovídá na Petr Šťastný
Petr Kubíček:29.10.2017 11:10

Using STATIC mi jen zkracuje zápis funkce volané z System.Threadin­g.Thread. A ten používám, protože chci pole překreslovat například po vteřině.

Trochu jsem poupravil kód, dle instrukcí, ale stále bez výsledku.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Threading.Thread;

namespace Tetris
{

    class Hraci_plocha
    {
        Kostka kostka = new Kostka();
        public char[,] plocha;
        public Hraci_plocha()
        {
            plocha = new char[45, 100];
        }

        public void NaplnHraciPlochu()
        {
            for (int i = 0; i < plocha.GetLength(0); i++)
            {
                for (int j = 0; j < plocha.GetLength(1); j++)
                {
                    if (j == 0 || j == 99 || i == 44)
                    {
                        plocha[i, j] = '*';
                    }
                    else
                    {
                        plocha[i, j] = ' ';
                    }
                }
                Console.WriteLine();
            }
        }

        public void VykresliHraciPlochu()
        {
            for (int i = 0; i < plocha.GetLength(0); i++)
            {
                for (int j = 0; j < plocha.GetLength(1); j++)
                {
                    Console.Write(plocha[i, j]);
                }
                Console.WriteLine();
            }
        }

        public void VytvorKostku()
        {
            for (int i = 0; i < plocha.GetLength(0); i++)
            {
                for (int j = 0; j < plocha.GetLength(1); j++)
                {
                    if (j == kostka.X & i == kostka.Y) { plocha[i, j] = 'x'; }
                }
                Console.WriteLine();
            }
        }
    }

    class Kostka
    {
        public int X { get; set; }
        public int Y { get; set; }
        private Random rnd;

        public Kostka()
        {
            rnd = new Random();
            X = rnd.Next(1, 100);
            Y = 0;
        }

        public void PresunKostku()
        {
            Y++;
        }
    }

    class Program
    {
        static Hraci_plocha hraci_plocha = new Hraci_plocha();
        static Kostka kostka = new Kostka();

        static void Main(string[] args)
        {
            VytvorHraciPlochu();
            VytvorKostku();
        }

        static public void VytvorHraciPlochu()
        {
            hraci_plocha.NaplnHraciPlochu();
            Console.Clear();
            hraci_plocha.VykresliHraciPlochu();

        }

        static public void VytvorKostku()
        {
            hraci_plocha.VytvorKostku();
            while (true)
            {
                Console.Clear();
                kostka.PresunKostku();
                hraci_plocha.VykresliHraciPlochu();
                Console.WriteLine(kostka.Y);
                Sleep(1000);
            }
        }
    }
}
 
Nahoru Odpovědět
29.10.2017 11:10
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Petr Kubíček
Petr Šťastný:29.10.2017 11:33

Metoda VytvorKostku se nikdy neukonci, zasekne se to v nekonecnym cyklu, ktery nikde neukoncujes. Mozna to bude tim. Za par hodin budu doma, tam se na to podivam poradne. Zatim si zkus kod vykrokovat, abys nasel chybu.

Dobry s tim using static, ani jsem nevedel, ze neco takovyho jde :)

 
Nahoru Odpovědět
29.10.2017 11:33
Avatar
Odpovídá na Petr Kubíček
Michael Škrášek:29.10.2017 11:45

Podle mě to máš celé špatně rozvržené, ale to nechme stranou. Chyba je v tom, že sice změníš pozici kostky, ale v poli zustane x uložené na stejném místě ...
Tak jak to máš stačí poupravit takto:

static public void VytvorKostku()
{
    hraci_plocha.VytvorKostku();
    while (true)
    {
        Console.Clear();
        hraci_plocha.plocha[kostka.Y, kostka.X] = ' ';
        kostka.PresunKostku();
        hraci_plocha.plocha[kostka.Y, kostka.X] = 'x';
        hraci_plocha.VykresliHraciPlochu();
        Console.WriteLine(kostka.Y);
        Sleep(1000);
    }
}

Pozice se posune i v poli ... smaže stará a uloží nová.

Editováno 29.10.2017 11:46
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
29.10.2017 11:45
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovídá na Michael Škrášek
Petr Kubíček:29.10.2017 14:23

Funguje, díky za pomoc.:)

 
Nahoru Odpovědět
29.10.2017 14:23
Avatar
Odpovídá na Petr Šťastný
Petr Kubíček:29.10.2017 14:24

Už dívat nemusíš, ale díky za ochotu.:)

 
Nahoru Odpovědět
29.10.2017 14:24
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 8 zpráv z 8.