Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Laki harjoitustyö 2 2012
- *
- *Kalle Mattila kalle.mattila@uta.fi
- *
- *Asteroids 2 peli
- */
- public class Asteroids2 {
- //Vakioidaan kentänmerkit, kentänkoko, ohjausmerkit
- private static final char LOPETA = 'q';
- private static final char AMMU = 's';
- private static final char OIKEA = '>';
- private static final char VASEN = '<';
- private static final char ALUS = 'A';
- private static final char ASTEROIDI1 = 'v';
- private static final char ASTEROIDI2 = 'n';
- private static final char ASTEROIDI3 = 'O';
- private static final char ASTEROIDI4 = 'x';
- private static final char AVARUUS = ' ';
- private static final char REUNUS = '.';
- private static final char PILVI = '*';
- private static final int RIVIENLKM = 15;
- private static final int SARAKKEIDENLKM = 11;
- private static final int ALUS_RIVI = 12;
- private static final int ALUS_ALKU_SARAKE = 5;
- /*Attribuuttu aluksen sijainnille kentässä.
- * Perusteluna ettei tarvitse välittää joka metodiin
- * aluksen sijaintia kentässä, ja siten siihen pääsee helposti
- * käsiksi.
- */
- private static int alusX; // sarakkeen indeksi jossa alus on
- /* Toisena Attribuuttina käytetään kilpien lukumäärää
- * perusteluna ettei tarvitse välitää joka metodiin kilpien
- * lukumäärää ja näin ollen kilpien lukumäärä on helpompi
- * pitää ajantasalla
- */
- private static int kilvet;
- /* Metodi tulostaa sille parametrina tuodun
- * kaksiulotteisen char-taulukon
- */
- public static void tulosta(char[][] matriisi) {
- // Tulostetaan, jos on varattu muistia.
- if (matriisi != null) {
- // Käydään kussakin taulukon alkiossa silmukan ja sen laskurin avulla.
- for (int i = 0; i < matriisi.length; i++) {
- for(int j = 0; j < matriisi[0].length; j++) {
- System.out.print(matriisi[i][j]);
- }
- // Vaihdetaan riviä.
- System.out.println();
- }
- }
- }
- /* Tulostetaan otsikko eli teksti annetulla merkillä kehystettynä.
- */
- public static void tulostaOtsikko(String teksti, char merkki) {
- // Reunan ja ajatelman väli vakiona.
- final String VALI = " ";
- // Selvitetään merkkijonon pituus.
- int pituus = teksti.length();
- // Jos pituus oli OK, niin tulostetaan.
- if (pituus > 0) {
- // Ylärivi.
- for (int i = 0; i < pituus + 2 * (VALI.length() + 1); i++)
- System.out.print(merkki);
- // Keskimmäinen rivi.
- System.out.println();
- System.out.println(merkki + VALI + teksti + VALI + merkki);
- // Alarivi.
- for (int j = 0; j < pituus + 2 * (VALI.length() + 1); j++)
- System.out.print(merkki);
- // Vaihdetaan riviä.
- System.out.println();
- }
- }
- /* Tulostaa pelikentän piste-, kilpi- ja kuormitustiedoista koostuvalla otsikolla.
- * Tulostaa myös kentän jälkeisen ohjerivin.
- */
- public static void tilarivi(int pisteet, boolean laser) {
- // Tulostetaan otsikko, kenttä ja ohjerivi.
- System.out.println("Points: " + pisteet + " | Shields: " + kilvet + " | Laser: " + laser);
- }
- //Metodi tulostaa ohjerivin
- public static void ohjerivi() {
- System.out.println("(s)hoot, left (<), right (>) or (q)uit?");
- }
- // Metodi tulostaa lopetusrivin
- public static void lopetusrivi() {
- System.out.println("Bye, see you soon.");
- }
- //Pelin aloitusta varten alustetaan kenttä
- public static void alustaKentta (char[][] kentta, char[] rivi) {
- if(kentta != null && rivi !=null) {
- for (int i = 0; i < RIVIENLKM; i++) {
- for (int j = 0; j < SARAKKEIDENLKM; j++) {
- if (i == 0 || i == RIVIENLKM - 1 || j == 0
- || j == SARAKKEIDENLKM - 1) {
- kentta[i][j] = REUNUS;
- }
- else kentta [i][j] = AVARUUS;
- }
- }
- //Lisätään asteroidi rivi ylimmälle riville.
- for(int i =1; i < SARAKKEIDENLKM - 1; i++) {
- kentta[1][i] = rivi[i-1];
- }
- //sijoitetaan alus kenttään
- kentta[ALUS_RIVI][ALUS_ALKU_SARAKE] = ALUS;
- alusX = ALUS_ALKU_SARAKE; // atribuutin alustus
- }
- }
- public static boolean tormaako (char[][] kentta, char syote) {
- if(syote == VASEN && alusX > 1) {
- return onkoAsteroidi(kentta[ALUS_RIVI][alusX-1]); //onko asteroidi vasemmalla
- }
- else if(syote == OIKEA && alusX < 9){
- return onkoAsteroidi(kentta[ALUS_RIVI][alusX+1]); // onko asteroidi oikealla
- }
- else if(syote != OIKEA && syote != VASEN) {
- return onkoAsteroidi(kentta[ALUS_RIVI-1][alusX]); //onko asteroidi edessä
- }
- else
- return false;
- }
- public static boolean onkoAsteroidi (char c) {
- if(c == ASTEROIDI1 || c == ASTEROIDI2 ||
- c == ASTEROIDI3 || c == ASTEROIDI4) {
- return true;
- }
- else
- return false;
- }
- public static void siirraAlusta(char[][] kentta, char syote) {
- if(syote == VASEN && alusX > 1) {
- kentta[ALUS_RIVI][alusX] = AVARUUS;
- alusX--; //Siirretään aluksen paikkaa vasemmalle
- kentta [ALUS_RIVI][alusX] = ALUS;
- }
- else if (syote == OIKEA && alusX < 9) {
- kentta[ALUS_RIVI][alusX] = AVARUUS;
- alusX++; //Siirretään aluksen paikkaa oikealle
- kentta[ALUS_RIVI][alusX] = ALUS;
- }
- }
- public static int ammu(char[][] kentta, int pisteet) {
- int i = ALUS_RIVI-1;
- boolean osui = false;
- char merkki;
- int rivi;
- /* Tutkitaan silmukalla, onko aluksen
- * ampumaradalla asteroideja, ja jos on
- * annetaan pisteet, ja lisätään räjähdyspilvi
- */
- while(!osui) {
- rivi = i;
- merkki = kentta[i][alusX];
- if(onkoAsteroidi(merkki)) {
- osui = true;
- pisteet += annaPisteet(merkki);
- if(pisteet == 0) {
- pisteet += annaPisteetX(merkki,kentta,rivi);
- }
- kentta[i][alusX] = PILVI;
- if(pisteet == 0) {
- char[] asteroideja = asteroidikeha.luoUusiRivi();
- alustaKentta(kentta,asteroideja);
- kilvet--;
- if(kilvet <= 0)
- jatketaanPelia = false; // peli loppuu
- }
- }
- else if(i <= 1)
- osui = true; //yläreuna, poistutaan silmukasta
- i--;
- }
- return pisteet;
- }
- //Tutkitaan onko x asteroidin ympärillä muita asteroideja ja
- //onko asteroidi aluksen edessä jolloin ei tule pisteitä
- public static int annaPisteetX(char asteroidi,char[][] kentta) {
- int n = 40;
- int j;
- //jos x asteroidi on aluksen edessä
- if(asteroidi == kentta[12][alusX]) {
- return 0;
- }
- kentta[rivi][alusX] = PILVI;
- for(n = rivi - 1;n <= rivi + 1; k++) {
- for(j = alusX - 1; j <= alusX + 1;j++)
- if(onkoAsteroidi(kentta[n][alusX]));
- if(asteroidi == ASTEROIDI1) {
- n = n + 50;
- }
- else if(asteroidi== ASTEROIDI2) {
- n = n + 60;
- }
- else if(asteroidi == ASTEROIDI3) {
- n = n + 70;
- }
- else {
- n = n + 80;
- }
- //Annetaan pisteet ja jos on x asteroidi tutkitaan se eri metodissa
- public static int annaPisteet(char asteroidi); {
- int x;
- if(asteroidi == ASTEROIDI1) {
- return 10;
- }
- else if(asteroidi == ASTEROIDI2) {
- return 20;
- }
- else if(asteroidi == ASTEROIDI3) {
- return 30;
- }
- else if(asteroidi == ASTEROIDI4) {
- return 0;
- }
- }
- public static boolean annaUusiKilpi (int vanhat, int uudet) {
- final int RAJA_ARVO = 1000;
- //Tarkistetaan parametrit
- if (vanhat >=0 && uudet >= 0 && uudet >= vanhat) {
- int vanhatTuhannet = vanhat / RAJA_ARVO;
- int uudetTuhannet = uudet / RAJA_ARVO;
- return uudetTuhannet > vanhatTuhannet; // jos erisuuruiset, true
- }
- else
- return false; //jos parametrit ei ok
- }
- public static void lisaaUusiRivi (char[][] kentta, char[] rivi) {
- if(kentta != null && rivi != null) {
- //siirretään vanhoja rivejä alaspäin
- for(int i = RIVIENLKM - 2; i > 1; i--) {
- for(int j = 1; j < SARAKKEIDENLKM - 1; j++) {
- if(kentta[i-1][j] == ALUS) {
- kentta [i][j] = AVARUUS;
- }
- else if(!(i == ALUS_RIVI && j == alusX &&
- (kentta[i-1][j] == AVARUUS || kentta[i-1][j] == PILVI))) {
- kentta[i][j] = kentta[i-1][j];
- /* jos aluksen yläpuolella on asteroidi, se laitetaan
- * aluksen päälle, mutta jos aluksen yläpuolella on
- * avaruutta tai pilvi, sitä ei laiteta aluksen päälle.
- */
- }
- }
- }
- // Lisätään uusi rivi-indeksiin 1
- for(int i = 1; i < SARAKKEIDENLKM - 1; i++)
- kentta[1][i] = rivi[i-1];
- }
- }
- public static void poistaPilvi(char[][] kentta) {
- int i = ALUS_RIVI;
- boolean pilvi = false; // löytyykö pilveä
- while(!pilvi) {
- if(kentta[i][alusX] == PILVI) {
- kentta[i][alusX] = AVARUUS;
- pilvi = true;
- }
- else if (i<= 1)
- pilvi = true; //kentän yläreuna joten poistutaan silmukasta
- i--;
- }
- }
- /* Pääsilmukka pelin pelaamiseen. Asteroidikehä tuottaa uusia asteroideja.
- */
- public static void pelaaPelia(ABelt asteroidikeha) {
- //Alustetaan pelikenttä, eli avaruus
- char[][] kentta = new char[RIVIENLKM][SARAKKEIDENLKM];
- //Viite luoUusiRivi-metodin palauttamaan taulukkoon liitettäväksi
- char[] asteroideja = asteroidikeha.luoUusiRivi();
- int pisteet = 0;
- kilvet = 3;
- boolean laser = true; // Onko tykki käytössä
- int laukaukset = 0; // Kuinka monta kertaa ammuttu peräkkäin
- boolean tormays = false; // Onko alus törmäämässä asteroidiin
- boolean ammuttu = false; // Onko käyttäjä ampunut tykillä
- boolean jatketaanPelia = true; // Jatketaanko pelisilmukassa
- //Alustetaan peli.
- alustaKentta(kentta, asteroideja);
- tilarivi(pisteet,laser);
- tulosta(kentta);
- ohjerivi();
- //PELISILMUKKA
- while(jatketaanPelia) {
- // Luetaan käyttäjän toive.
- System.out.println("(s)hoot, left (<), right (>) or (q)uit?");
- char syote = In.readChar();
- if(syote != LOPETA) {
- if(syote == VASEN || syote == OIKEA) {
- tormays = tormaako(kentta,syote);
- if(tormays) {
- kilvet--;
- }
- /* Vaikka törmätään, alus siirretään
- * asteroidin päälle, josta se siirretään
- * myöhemmin aloituspisteeseen, jolloin ko.
- * kohtaan tulee avaruutta ja kenttä tyhjennetään
- */
- siirraAlusta(kentta,syote);
- }
- if(syote == AMMU) {
- ammuttu = true;
- if(laser) { //Jos tykki toiminnassa
- laukaukset++;
- if(laukaukset >= 3)
- laser = false;
- int vanhat = pisteet;
- pisteet = ammu(kentta,pisteet);
- int uudet = pisteet;
- if(annaUusiKilpi (vanhat, uudet))
- kilvet++;
- }
- }
- // Jos ei ammuttu , Nollataan tykin laukaukset
- // ja palautetaan tykki tomintakuntoon
- if(!ammuttu) {
- laukaukset = 0;
- laser = true;
- }
- // Törmääkö vastaan tulevaan asteroidiin
- if(!tormays && ! ammuttu) {
- tormays = tormaako(kentta, 'a');
- if(tormays) {
- alustaKentta(kentta,asteroideja);
- kilvet--;
- }
- }
- if(kilvet <= 0)
- jatketaanPelia = false; // peli päättyy
- if (jatketaanPelia) {
- asteroideja = asteroidikeha.luoUusiRivi();
- lisaaUusiRivi(kentta,asteroideja); //lisätään uusi rivi
- if(tormays) {
- alustaKentta(kentta,asteroideja);
- tormays = false;
- }
- tilarivi(pisteet,laser);
- tulosta(kentta);
- ohjerivi();
- if(ammuttu) {
- poistaPilvi(kentta);
- }
- ammuttu = false;
- }
- }
- else {
- jatketaanPelia = false; // Jos syöte on q eli lopetus
- }
- } //Pelisilmukka loppuu
- //Tulostetaan loppu teksti
- lopetusrivi();
- }
- /* Päämetodi, jossa tarkistetaan komentoriviparametri, vaikka oletetaankin aina
- * saatavan simenluku (yksi kappale kokonaislukuja). Käyttäjälle tulostetaan ohje,
- * jos komentoriviparametri on väärän tyyppinen tai parametreja on väärä määrä.
- * Metodi luo ABelt-luokan olion ja välittää sen parametrina pääsilmukkaa
- * suorittavalle metodille, jos simeneluku on kelvollinen.
- */
- public static void main(String[] args) {
- // Tosi, jos komentoriviparametri oli kunnossa.
- boolean argsOK = true;
- // Siemenkuku.
- int siemen = 0;
- // Saatiin tasan yksi komentoriviparametri.
- if (args.length == 1) {
- // Yritetään muuntaa komentoriviparametri int-tyyppiseksi siemenluvuksi.
- try {
- siemen = Integer.parseInt(args[0]);
- }
- catch (NumberFormatException e) {
- // Komentoriviparametria ei voitu muuntaa int-tyyppiseksi luvuksi.
- argsOK = false;
- }
- }
- // Nolla tai kaksi tai useampia komentoriviparametreja.
- else
- argsOK = false;
- // Komentoriviparametri kunnossa.
- if (argsOK) {
- // Infoa käyttälle.
- tulostaOtsikko("A S T E R O I D S", '*');
- // Luodaan asteroidirivejä tuottava olio ja asetetaan siihen viite.
- // Olion rakentimelle annetaan komentoriviparametrina saatu luku.
- // (Ohjelmassa tulee käyttää vain yhtä ABelt-olita, jotta asteroidien
- // järjestys olisi oikea.)
- ABelt asteroidikeha = new ABelt(siemen);
- // Pelataan peliä.
- pelaaPelia(asteroidikeha);
- }
- // Ohjeistetaan virheen tapahtuessa.
- else
- System.out.println("Usage: java Asteroids2 seed");
- }
- }
Add Comment
Please, Sign In to add comment