More homeworks... (but one cool universal reusable linkedlist in pure C)
[mirrors/Programs.git] / java / lode.java
diff --git a/java/lode.java b/java/lode.java
new file mode 100644 (file)
index 0000000..9ef6a77
--- /dev/null
@@ -0,0 +1,146 @@
+import java.util.Scanner;
+import java.text.NumberFormat;
+//import java.lang.Math;
+import java.io.*;
+
+/** Trida BitevniPole je implementaci hry lode pro jednoho hrace
+ * @author      hejnama2
+ * @version     1.0
+ */
+
+class BitevniPole implements Serializable {
+       /** pole znaku, ve kterem je ulozen stav bitevniho pole */
+       public char[][] pole;
+       public final int size; //velikost pole (x je stejne jako y)
+       //private Random rnd = new Random();
+       private Scanner sc = new Scanner(System.in);
+       private long draws = 0, impacts = 0, total_impacts = 0; //pocet tahu, pocet zasahu, celkovy pocet okupovanych policek
+       private int x,y; //pomocne promenne
+       public boolean debug = false; //urcuje, jestli se budou lode zobrazovat (takovy cheat pro odladeni programu)
+
+       public char //tady jsou ruzne znaky reprezentujici ruzne stavy jednotlivych bunek pole:
+               neznamo = '_',
+               lod = '#',
+               voda = '~',
+               zasah = 'X';
+
+       /** vypise napovedu ke hre */
+       public void printHelp() {
+               System.out.print(
+                       "Pri zadavani souradnic dodrzujte mala a velka pismenka.\n"+
+                       neznamo + " - zatim neproskoumane policko\n"+
+                       zasah + " - policko se zasazenou lodi\n"+
+                       voda + " - policko se splouchnutim vody\n"+
+                       lod + " - lod (zobrazuje se jen pri debug = true)\n"
+               );
+       }
+
+       /** konstruktor - vytvori prazdne bitevni pole o velikosti s */
+       BitevniPole(int s) {
+               int max_size = 59;
+               if(s < 1 || s > max_size) {
+                       System.err.println("Can't make battlefield smaller than 1x1 or bigger than "+max_size+"x"+max_size+"!");
+                       System.exit(max_size);
+               }
+               size = s;
+               pole = new char[size][size];
+               for(x = 0;x < size;x++) for(y = 0;y < size;y++) pole[x][y] = neznamo;
+       }
+
+       /** druhy konstruktor - vytvori pole o vychozi s pouzitim prvniho konstruktoru velikosti (bude zavolan, pokud neni zadna velikost zadana) */
+       BitevniPole() {
+               this(10);
+       }
+
+       /** metoda zajistujici rozmisteni lodi - ve skutecnosti zatim rozmistuje jen nahodne ctverecky, ne cele lode*/
+       public void rozmistiLode(int i) {
+               for(;i>0;i--) {
+                       x = (int)(Math.random()*(size-1));
+                       y = (int)(Math.random()*(size-1));
+                       pole[x][y] = lod;
+                       total_impacts++;
+               }
+       }
+
+       /** metoda, ktera vytvori string znazornujici toto bitevni pole */
+       public String toString() {
+               String out = new String("\n");
+               out += " \tPocet tahu: "+draws+"\n";
+               out += " \tPocet zasahu: "+impacts+" z "+total_impacts+"\n";
+               out += " \t";
+               for(y = 0;y < size;y++) out += "|"+(char)((int)'A'+y);
+               out += "|\n\n";
+               for(x = 0;x < size;x++) {
+                       out += x+"\t";
+                       for(y = 0;y < size;y++) {
+                               if(!debug && pole[x][y] == lod) {
+                                       out += "|"+neznamo;
+                                       continue;
+                               }
+                               out += "|"+pole[x][y];
+                       }
+                       out += "|\n";
+               }
+               return out;
+       }
+
+       /** zjisti, jestli uz byly zniceny vsechny lode a vrati jako boolean */
+       public boolean jeKonec() {
+               for(x = 0;x < size;x++) for(y = 0;y < size;y++) if(pole[x][y] == lod) return false;
+               return true;
+       }
+
+       /** strili na souradnice x,y */
+       public boolean strilej(int a, int b) {
+               if(a >= size || b >= size || a < 0 || b < 0) {
+                       System.out.println("No such cell!");
+                       return false;
+               }
+               if(pole[a][b] == voda || pole[a][b] == zasah) {
+                       System.out.println("This cell was already impacted!");
+                       return false;
+               }
+               if(pole[a][b] == lod) {
+                       pole[a][b] = zasah;
+                       impacts++;
+               }
+               if(pole[a][b] == neznamo) pole[a][b] = voda;
+               draws++;
+               return true;
+       }
+
+       /** provede hrace dalsim tahem */
+       public void dalsiTah() {
+               System.out.println(this);
+               System.out.print("pismenko: ");
+               y = (int)(sc.next().charAt(0)-'A');
+               System.out.print("cislicko: ");
+               x = sc.nextInt();
+               strilej(x, y);
+       }
+
+       /** provadi tahy, dokud neni pravda, ze jeKonec(), pak vypise gratulace a zkonci */
+       public void hrat() {
+               while(!jeKonec()) dalsiTah();
+               System.out.println("\n!!! CONGRATULATIONS !!!");
+               System.out.println("You have defeated "+impacts+" ships within "+draws+" draws!");
+               System.out.println("!!! CONGRATULATIONS !!!\n");
+       }
+
+}
+
+/** trida lode vytvori BytevniPole a provede vse potrebne ke spusteni hry */
+public class lode {
+       public static void main(String[] argv) {
+               System.out.println("Lode (verze pro jednoho hrace)");
+
+               BitevniPole bp = new BitevniPole(); //nove bitevni pole (pokud neni zadana velikost, bude pouzita vychozi velikost)
+               bp.printHelp(); //vypis napovedu
+               bp.debug = true; //zapne zobrazeni lodi (to je pri hre nezadouci podvod)
+               bp.rozmistiLode(5); //kolik lodi chceme?
+
+               bp.hrat(); //hrajeme
+
+       }
+}
+
This page took 0.136128 seconds and 4 git commands to generate.