Hei,
Jos määrittelen 10x10 boolean taulukon näin:
Javaa:
boolean[][] Tekoaly0= { {false,false,false,false,false,false,false,false,false,false}, {false,false,false,true,true,false,false,false,false,false}, {false,false,false,false,false,false,false,false,false,false}, {false,false,false,false,false,false,false,false,false,false}, {false,false,false,false,false,false,false,false,false,false}, {false,false,true,false,false,true,false,false,false,false}, {false,false,true,false,false,true,false,false,false,false}, {true,false,false,false,false,false,false,false,false,false}, {true,false,true,true,false,false,false,false,false,false}, {false,false,false,false,false,false,false,false,false,false} };
ja haluaisin myöhemmin lisätä taulukkoon sarakkeita tai rivejä jotka sisältävät pelkkiä falseja, kuinka se tehdään?, siis kuinka laajennan taulukkoa myöhemmin?
Käytä listaa
Ja näköjään huonoa otsikkoa ei voi muokata jälkikäteen ilman moderaattorin oikeuksia :( (mod. paransi otsikkoa)
Tietääkseni Javan taulukon koko on kiinteä eikä sen kokoa voi muuttaa myöhemmin. Voit kuitenkin varata uuden suuremman taulukon ja kopioida sinne vanhan tiedot tai käyttää os:n neuvon mukaisesti jotain muuta tietorakennetta.
Tiedätkö etukäteen, kuinka suuri taulukko voi olla korkeintaan? Silloin helppo ratkaisu on varata heti aluksi tarpeeksi suuri taulukko.
Antti Laaksonen kirjoitti:
Tiedätkö etukäteen, kuinka suuri taulukko voi olla korkeintaan? Silloin helppo ratkaisu on varata heti aluksi tarpeeksi suuri taulukko.
Tehtävänä oli tehdä laivanupotuspeli, jonka taulun koko on ainakin 81 ruutua, nyt sain sen kuitenkin valmiiksi ja rupesin väkertää versiota jossa taulukon koon saisi itse määrätä. mutta toki voisin laittaa hyvän maun mukaisen ylärajan taulukolle, jolloin ongelma ratkeaisi. Näin teen.
Listaa voit käyttää esimerkiksi näin:
// import java.util.ArrayList; // --- Jäsenet int rivit = 0; int sarakkeet = 0; // Lista listoja ArrayList< ArrayList<Boolean> > t = new ArrayList< ArrayList< Boolean > >(); // --- Metodit boolean haeAlkio(int rivi, int sarake) { return t.elementAt(rivi).elementAt(sarake); } void asetaAlkio(int rivi, int sarake, boolean arvo) { return t.elementAt(rivi).set(sarake, arvo); } void lisaaRivi(int paikka) { // Lisätään uusi lista ArrayList< Boolean > rivi = new ArrayList<Boolean>(); for (int i=0; i<sarakkeet; i++) rivi.add(false); t.add(paikka, rivi); rivit++; } void lisaaSarake(int paikka) { // Lisätään jokaiseen listaan uusi alkio for (ArrayList<Boolean> rivi : t) rivi.add(paikka,false); sarakkeet++; }
Miksi laivanupotuspelin ruudukon kokoa muuten pitäisi voida muuttaa jälkeenpäin? Mikset vain alusta jokaisen pelin alussa oikeankokoista taulukkoa?
os kirjoitti:
Miksi laivanupotuspelin ruudukon kokoa muuten pitäisi voida muuttaa jälkeenpäin? Mikset vain alusta jokaisen pelin alussa oikeankokoista taulukkoa?
Alunperin taulukot olivat 10x10 kokoisia.
Tein peliin kaksi erinlaista ja eri tasoista teko"älyä", toisen jossa laivat on aina samoin ja toisen jossa arvotaan kymmenen paikka joihin laivat sijoitetaan. Nyt kun halusin tehdä pelikentän koosta muutettavan kokoisen, ajattelin säilyttää tämän 2 vaihtoehtoisen tekoälyn, kuitenkin toinensen esimerkki taulu oli 10x10 ja päätin että jos pelaaja valitsee isomman kenttä koon, voisi ohjelma lisätä tarvittavat rivit ja sarakkeet Tekoaly0 taulukkoon joka myöhemmin (jos tämä taso 0 valitaan) kopioidaan AIlaivat-tauluun.
EDIT: ehkä hölmöä puhua tekoälystä tässä tilanteessa.Tekoäly tason valinta vaikuttaa myös tietokoneen ampumis koordinaattien valintaan.
Joo, on kyllä tosiaan aika "tason nolla" vastustaja, jos laivat on aina samassa paikassa :)
Vastaavan taulukon saa helposti aikaan, kun käyttääkin tavallista yksiulotteista taulukkoa kaksiulotteisena kaavalla indeksi = x + leveys * y
. Tällöin joutuu tietenkin itse tekemään mahdolliset tarkistukset siitä, että luvut ovat kunnossa, ja säilyttämään tuon leveyden jossain. Taulukonhan saa luotua näin:
boolean [] t; t = new boolean[leveys * korkeus];
Edit. Jaa, ja näköjään myös kaksiulotteinen onnistuu Javassa suoraan:
boolean [][] t; t = new boolean[leveys][korkeus];
Kaksiuloitteisen taulukon tekeminen on vielä helpompaa, koska ei tarvitse laskea indeksejä käsipelillä:
boolean[][] t = new boolean[leveys][korkeus];
Aihe on jo aika vanha, joten et voi enää vastata siihen.