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.
David Hartinger:1.3.2017 11:18
Díky za upozornění, Java join() nemá, opravil jsem to.
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 .
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#…...-
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("███▓▓▒▒░░▒▒▓▓████");
}
}
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();
}
}
}
}
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);
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??
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");
}
}
});
Zatiaľ nikto nevložil komentár - buď prvý!