IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 5. diel - Viacrozmerné polia v Jave

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Peter Gasparik:28.2.2017 20:40

Hneď prvá veta. Píšeš: " V minulém tutoriálu o základech Javy jsme si uvedli metody Split() a Join() ..."

Kde si uvádzal metódy join() ?

Odpovedať
28.2.2017 20:40
while (noSuccess) { tryAgain(); if (Dead) break;
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Peter Gasparik
David Hartinger:1.3.2017 11:18

Díky za upozornění, Java join() nemá, opravil jsem to.

Odpovedať
1.3.2017 11:18
New kid back on the block with a R.I.P
Avatar
Lesní Muž
Člen
Avatar
Lesní Muž:22.4.2017 13:35

To tu dříve nebylo, že? Davide, plánuješ občas pilovat tyhle tutoriály v průběhu času způsobem dodáváním dílů, i když jsi ty předchozí psal např. před dvěma lety? Jestli tohle není vyjímka, pokuď ne, tak to budu muset každých pár měsíců zkontrolovat všechny tutoriály, ze kterých jsem čerpal, jestli tam nepřibyla nějaká moudrost navíc :D.

 
Odpovedať
22.4.2017 13:35
Avatar
gcx11
Tvůrce
Avatar
Odpovedá na David Hartinger
gcx11:22.4.2017 15:55

Statická metoda join na třídě String přibyla nově v Javě 8 (rok 2014).
https://docs.oracle.com/…/String.html#…...-

 
Odpovedať
22.4.2017 15:55
Avatar
Tano7
Člen
Avatar
Tano7:6.10.2019 20:44

Skvělá lekce. Díky!

Odpovedať
6.10.2019 20:44
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
Avatar
Gemy
Člen
Avatar
Gemy:19.2.2020 20:32

Když jsem uviděl vícerozměrná pole, hned mi hlavou probleskl nápad na textovou hru!
Dámy a pánové, ze jsem pro vás vytvořil hru zvanou TEMNÉ BLUDIŠTĚ.
Stačí jen celý kód nakopírovat a spustit, díky ITnetwork za tuto stránku.

package temne_bludiste_v_1_3;
import java.util.Scanner;
public class TEMNE_BLUDISTE_v_1_3 {

    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in,"Windows-1250");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
    System.out.println("██  Hra Michala Tomana ██");
    System.out.println("███▓▓▒ v1.3 ▒▓▓████");
    System.out.println("███  TEMNÉ BLUDIŠTĚ ! ██");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
    System.out.println("███▓▓ OVLÁDÁNÍ ▓▓████");
    System.out.println("Ve hře máš těchto 6 povelů");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
    System.out.println("ROVNE = pro 1 krok chodbou vpřed");
    System.out.println("PRAVA = pro 1 krok do chodby v pravo");
    System.out.println("LEVA = pro 1 krok do chodby v levo");
    System.out.println("ZPET = pro 1 krok zpět bez otočení");
    System.out.println("OTOC = pro otočení se na místě o 180°");
    System.out.println("KONEC = pro ukončení hry");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
//======================== MAPA ================================================
       int[][] mapa = {
           {1,1,1,1,1,1,1,1,1,1},
           {1,0,0,0,6,1,0,0,0,1},
           {1,7,1,1,0,1,1,0,1,1},
           {1,0,0,0,0,0,0,0,0,1},
           {1,1,0,1,1,1,0,1,0,1},
           {9,0,0,1,0,0,0,1,8,1},
           {1,1,0,1,1,0,1,1,0,1},
           {1,0,0,0,1,0,0,0,0,1},
           {1,-6,1,0,0,0,1,0,1,1},
           {1,1,1,1,1,1,1,1,1,1}
       };
//======================== PŘEDSTARTOVNÍ NASTAVENÍ =============================
    int x = 5;      // startovní pozice X
    int y = 4;      // startovní pozice Y
    int index = 2;  // směr natočení hráče
        // index 0 = SEVER
        // index 1 = VÝCHOD
        // index -1 = ZÁPAD
        // index 2 = JIH
//------------------------ jiná přednastavení ----------------------------------
    int pohyb;                      // v1.0
    int pocitadloKroku = 0;         // v1.0
    String dalsiKrok = "ano";       // v1.0
    String kompasSmer = "";         // v1.1
    String kompas = "ne";           // v1.1
    String kompasNalezen = "ne";    // v1.1
    int pocetKoster = 0;            // v1.2
    String kostlivec = "ne";        // v1.2
//========================= HLAVNÍ PROGRAM =====================================
while (dalsiKrok.equals("ano"))
{
    pocitadloKroku++;   // počet kroků pro vítěze
//============================ KOMPAS v1.1 =====================================
    while (kompas.equals("ano")){
        System.out.println("██▓ ▲ " + kompasSmer + " ▲ ▓██");
        kompas = "ne";
        kompasNalezen = "ano";
    }
//============================== POVELY ========================================
    System.out.print("██ " + pocitadloKroku + ": POVEL : ");
    String povel = sc.nextLine().trim().toLowerCase();
//-------------- určení povelu v závislosti na směru natočení ------------------
    switch (povel)
    {
        case "rovne":
                pohyb = index;
        break;
        case "zpet":
            if ((index == 0) || (index == -1)){
                pohyb = index + 2;
            }
            else pohyb = index - 2;
        break;
        case "prava":
            if ((index > -2) && (index < 2)){
                pohyb = index + 1;
            }
            else pohyb = -1;
        break;
        case "leva":
            if ((index > -1) && (index < 3)){
                pohyb = index - 1;
            }
            else pohyb = 2;
        break;
        case "otoc":
            pohyb = 5;
        break;
        case "konec":
            pohyb = 3;
            dalsiKrok = "x"; // konec programu při chybném zadání
        break;
        default:
            pohyb = 3;
            System.out.println("Chybný povel!");
    }
//------------------- vložení nuly do předchozího místa ------------------------
    mapa[x][y] = 0;
        int predchoziX = x; // poslední pozice X při nárazu do zdi
        int predchoziY = y; // poslední pozice Y při nárazu do zdi
//============================ KOSTLIVEC v1.2 ==================================
    while (kostlivec.equals("ano")){
        mapa[2][1] = 7;     // návrat kostlivce na pozici
        /* Předchozí funkce vložení nuly by pri nalezení kostlivce
        na jeho pozici vložila nulu, tento while cyklus ho navrátí zpět.*/
        kostlivec = "ne";
    }
//=========================== POHYB DLE POVELU =================================
    switch (pohyb)
    {
        case 0: // ROVNE
            y--;
        break;
        case 2: // ZPET
            y++;
        break;
        case 1: // PRAVA
            x++;
        break;
        case -1: // LEVA
            x--;
        break;
        case 5: // OTOC
            index += 2;
        break;
    } // --- konec pohybu ------------------------------------------------------
    int predchoziIndex = index;     // pokud hráč narazí do zdi
//================== ROTACE INDEXŮ DLE SMĚRU POHYBU ============================
    if (povel.equals("prava")){     // otočení ve směru hodin
        index++;
    }
    if (povel.equals("leva")){      // otočení proti směru hodin
        index--;
    }
    //---------------------- trasformace indexů při rotaci ---------------------
        if (index == 3){    // z 3 na -1 při otočení ze 2 na 3
            index = -1;
        }
        if (index == -2){   // z -2 na 2 při otočení ze -1 na -2
            index = 2;
        }
        if (index == 4){    // z 4 na 0 = otočení o 180°
            index = 0;
        }
    //------------------------ jen "grafika" -----------------------------------
            System.out.println("███▓▓▒▒░░▒▒▓▓████");
            System.out.println("███▓▓▒▒░░▒▒▓▓████");
//=================== REAKCE BLUDIŠTĚ NA ZÁKLADĚ POHYBU ========================
//---------------------------- krok je možný -----------------------------------
    if (mapa[x][y] == 0){
        mapa[x][y] = 2;     // současná pozice hráče
        if (povel.equals("rovne")){
            System.out.println("██ " + pocitadloKroku + ". Jdeš rovně chodbou");
        }
        if (povel.equals("prava")){
            System.out.println("██ " + pocitadloKroku + ". Jdeš do chodby v pravo");
        }
        if (povel.equals("leva")){
            System.out.println("██ " + pocitadloKroku + ". Jdeš do chodby v levo");
        }
        if (povel.equals("zpet")){
            System.out.println("██ " + pocitadloKroku + ". Udělal jsi krok zpět");
        }
        if (povel.equals("otoc")){
            System.out.println("██ " + pocitadloKroku + ". Otočil ses na místě");
        }
    }
//---------------------------- náraz do zdi ------------------------------------
    if (mapa[x][y] == 1){ // při nárazu do zdise hrác vrátí zpět na stejnou pozici a stejný index
        System.out.println("██ " + pocitadloKroku + ". Narazil jsi do zdi!");
        mapa[predchoziX][predchoziY] = 2;
        x = predchoziX;
        y = predchoziY;
        index = predchoziIndex;
    }
//----------------------- nalezení východu z bludiště --------------------------
    if (mapa[x][y] == 9){
        System.out.println("██  !!! JSI VENKU !!!  ██");
        System.out.println("Našel jsi cestu ven, gratuluji!");
        System.out.printf("Celkem jsi udělal %d kroků,\n", pocitadloKroku);
        System.out.println("nejmenší možný počet kroků je 12.");
            dalsiKrok = "x";    // ukončení opakování programu
    }
//--------------------------- kompas v1.1 --------------------------------------
    if (mapa[x][y] == 8){
        System.out.println("███ NAŠEL JSI KOMPAS ███");
        System.out.println("Jeho luminiscenční text");
        System.out.println("ti pomůže s orientací.");
        kompas = "ano";
    }

    while (kompasNalezen.equals("ano")){ // povolení opakovaného použití kompasu
        kompas = "ano";
        kompasNalezen = "ne";
    }

        switch (index){     // určení směru kompasu kde směru (indexu) hráče
            case 0:
                kompasSmer = "SEVER";
                break;
            case 1:
                kompasSmer = "VÝCHOD";
                break;
            case -1:
                kompasSmer = "ZÁPAD";
                break;
            case 2:
                kompasSmer = "JIH";
                break;
        }
//---------------------------- kostlivec v1.2 ----------------------------------
    if (mapa[x][y] == 7){
        pocetKoster++;
        if (pocetKoster == 1){  // první nalezení kostlivce
            System.out.println("████▓ KOSTLIVEC ▓████");
            System.out.println("Našel jsi kostlivce, ");
            System.out.println("asi nějaký hráč před tebou. ");
            kostlivec = "ano";
        }
        else {                  // opakované nalezení kostlivce
            System.out.println("████▓ KOSTLIVEC ▓████");
            System.out.println("Zase ten kostlivce, ");
            System.out.println("asi chodíš v kruhu. ");
            kostlivec = "ano";
        }
    }
//----------------------------- pasti v1.3 -------------------------------------
    if (mapa[x][y] == 6){
        System.out.println("███▓▓▒ CVAK! ▒▓▓████");
        System.out.println("Dlaždice pod tebou cvakla,");
        System.out.println("z bludiště se ozval rachot,");
        System.out.println("jako by se stěny začaly hýbat!");
        if (mapa[6][2] == 0){
            mapa[4][2] = 1;
        }
        if (mapa[6][2] == 1){
            mapa[4][2] = 1;
            mapa[6][2] = 0;
        }
    }
    if (mapa[x][y] == -6){
        System.out.println("███▓▓▒ CVAK! ▒▓▓████");
        System.out.println("Dlaždice pod tebou cvakla,");
        System.out.println("z bludiště se ozval rachot,");
        System.out.println("jako by se stěny začaly hýbat!");
        if (mapa[4][2] == 0){
            mapa[6][2] = 1;
        }
        if (mapa[4][2] == 1){
            mapa[6][2] = 1;
            mapa[4][2] = 0;
        }
    }
//------------------------ konec reakce bludiště -------------------------------
} //--------------------------- konec while ------------------------------------
    System.out.println("███▓▓▒ KONEC ▒▓▓███");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
    }
}
Odpovedať
19.2.2020 20:32
Člověk stvořil logiku, a proto jedná v afektu.
Avatar
Rozbita Zaluzie:25.4.2020 19:56

Zdravím potřeboval bych pomoc pokusil jsem se udělat něco jako pohybový system který by měnil znak podle toho kde je aktuální pozice "hráče" a udělal jsem tento kó problém je v tom že pří pohybu doleva a nahoru (což jsou pohyby které zmenšují aktuální pozici viz. POHYBOVÝ SYSTÉM)se předešlé políčko nezmění zase na původní znak už jsem zkoušel nějaké řešení ale doteď nevím co s tím PS. ano vím je to dost podobné graficky k Gemymu ale to byl taky účel :)

package testypole;

import java.util.Scanner;

public class TestyPole {
    public static void main(String[] args) {

    Scanner sc = new Scanner(System.in, "Windows-1250");

    // ========================ÚVOD DO HRY======================
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
    System.out.println("██ Hra Rozbité žaluzie ██");
    System.out.println("███▓▓▒ v0.1 ▒▓▓████");
    System.out.println("████ Mini Bludiště ████");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
    System.out.println("███▓▓ OVLÁDÁNÍ ▓▓████");
    System.out.println("█Ve hře máš tyto 4 povely█");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");
    System.out.println("█NAHORU = pro 1 krok nahoru");
    System.out.println("█LEVA = pro 1 krok doleva");
    System.out.println("█PRAVA = pro 1 krok doprava");
    System.out.println("█DOLU = pro 1 krok dolů");
    System.out.println("█KONEC = pro ukončení hry");
    System.out.println("███▓▓▒▒░░▒▒▓▓████");

    //=====================PŘEDNASTAVENÍ=======================
    int pohyb = 0;
    int poziceY = 2;
    int poziceX = 2;
    String povel = "konec";
    String konec = "play";

    //========================MAPA================================
    String[][] mapa = {
        {"█","█","█","█","█"},
        {"█","█","█","█","█"},
        {"█","█","█","█","█"},
        {"█","█","█","█","█"},
        {"█","█","█","█","█"}
    };

    //======================HLAVNÍ CYKLUS===========================
    while ("play".equals(konec)){

        //================ÚVOD NA DALŠÍ TAH==================
        System.out.println();
        System.out.println("███▓▓▒▒░░▒▒▓▓████");
        System.out.println("█ tvůj následující pohyb █");
        System.out.print("███▓▓▒▒");
        povel = sc.next();
        System.out.println("███▓▓▒▒░░▒▒▓▓████");
        System.out.println();

        //==================POHYBOVÝ (pozicový) SYSTÉM=================
        switch (povel.toLowerCase()){
            case "nahoru":
                poziceY--;
                break;
            case "dolu":
                poziceY++;
                break;
            case "leva":
                poziceX--;
                break;
            case "prava":
                poziceX++;
                break;
            case "konec":
                konec = "end";
                break;
        }

        //=========== KONTROLA POLÍČEK A OBNOVENÍ  NA PŮVODNÍ ==========
        mapa[poziceY][poziceX] = "░";

        for (int y = 0;y < mapa[0].length; y++){
            for (int x = 0; x < mapa.length; x++){
                if (mapa[y][x] ==  mapa[poziceY][poziceX]){
                    mapa[y][x] = "░";
                }
                else if (mapa[y][x] != mapa[poziceY][poziceX]){
                    mapa[y][x] = "█";
                }
            }
        }

        //=================VYTISKNUTÍ AKTUÁLNÍ MAPY===================
        for (int y = 0;y < mapa[0].length; y++){
            for (int x = 0; x < mapa.length; x++){
                System.out.print(mapa[y][x] + " ");
            }
            System.out.println();
            }
        }
    }
}
 
Odpovedať
25.4.2020 19:56
Avatar
Gemy
Člen
Avatar
Odpovedá na Rozbita Zaluzie
Gemy:26.4.2020 19:46

Já bych udělal mapu z čísel na místo █, například 0 a pak ten pohyb dělal tak že půjdu x nebo y ++ nebo -- a tak do místa kde chci jít vložil místo 0 číslo 1, a zároveň předchozí pozici zase vynuloval.

Pak už jen pro výpis pole stačí dát podmínku že pokud má pole hodnotu 0 tak se vypíše █ a else dal vypsat ░ třeba takto:

Nezapomeň si naimportovat Scenner

int[][] mapa = new int[5][5];

int poziceX = 2;
int poziceY = 2;
boolean opak = true;

mapa[poziceX][poziceY] = 1;

do{
//-------------- výpis mapy -----------------------------------------------
for (int j = 0; j < mapa[0].length; j++)
{
    for (int[] mapa1 : mapa) {
        if (mapa1[j]== 0){
            System.out.print("█");
        }
        else System.out.print("░");
    }
System.out.println();
}
//--------------------------------------------------------------------------
System.out.print("Pohyb: ");
String pohyb = sc.nextLine().trim().toLowerCase();

int predchoziX = poziceX;
int predchoziY = poziceY;

switch (pohyb){
    case "nahoru":
        poziceY--;
        break;
    case "dolu":
        poziceY++;
        break;
    case "leva":
        poziceX--;
        break;
    case "prava":
        poziceX++;
        break;
    case "konec":
        opak = false;
        break;
    default:
        System.out.println("Chybné zadání");
}

mapa[predchoziX][predchoziY] = 0; // zápis do předchozí pozice
mapa[poziceX][poziceY] = 1; // zápis do nové pozice

}while (opak == true);
Odpovedať
26.4.2020 19:46
Člověk stvořil logiku, a proto jedná v afektu.
Avatar
Odpovedá na Gemy
Rozbita Zaluzie:26.4.2020 22:50

Dobře taky jsem nad něčím podobným přemýšlel ale nedomyslel jsem to takto takže díky jo a ještě jenom... Není v Javě něco jako metoda odpočtu například na několik sekund... Že během intervalu bude něco True nebo nějaká přesná hodnota a pak se to změní zpět??

 
Odpovedať
26.4.2020 22:50
Avatar
jan šín
Člen
Avatar
Odpovedá na Rozbita Zaluzie
jan šín:17.5.2020 13:48

stačí vložit do metody main

int i=0;
new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                        i=1
                                        //t= počet zdržení v milisekundách
                                             Thread.sleep(t);
                                                i=0;
                                        }
                                        catch (InterruptedException r){
                                            System.out.println("err");
                                        }
                                         }
                                });
 
Odpovedať
17.5.2020 13:48
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!