Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben?

berndoa

Top Contributor
Hallo,
ich hatte dies in meinem vorherigen Thread schon einmal angesprochen:

Ich hatte anfangs ein Programm gebaut, das aus einer Klasse mit über 700 Zeilen Code bestand.

Weil unübersichtlich wie nochwas, habe ich es anschließend unterteilt in 8 Klassen wie später folgend.
"Realspiel" ist die Hauptklasse, deren main methode auch in der Konsole ausgeführt wird.
Alle anderen Klassen haben, wie ersichtlich, nur static Methoden, die in der Hauptmethode aufgerufen werden
und die aber Attribute des Realspiel objekts ändern sollen.
Da sie dazu auf das objekt zugreifen können müssen, wird derzeit mit vielen "this" das Objekt an die aufgerufene Methode übergeben.

Randbemerkung: Dass die imports derzeit nciht sinnhaft sind, ist mir klar, ich muss die mal noch verteilen und in der klasse die import sachen einfügen die benötigt werden.
Ausser den Klassen gibt es noch eine exceldatei, die eingelesen wird.
Beim Aufrufen der konsole wird übrigens eine ebenso vorhandene .jar datei benutzt (auf faulem wege setze ich einfach den classpath auf die datei, bevor ich die ganzen klassen kompiliere und die realspielklassen main methode ausführe).

Bei dem Ganzen geht es drum dass der Browser mit einer bestimmten Casinoseite geöffnet wird, eingeloggt wird und dann rinse and repeat runde für runde immr weder dieselbe strategie angewandt wird.

An bestimmten punkten in der Endlosschleife (wenn gerade leergedreht wurde, wenn gerade gewonnen wurde) wird ein zeitcheck gemacht und wenn die vergangene zeit größer 51 minuten ist, wird abgebrochen durch schließen von browser und konsole.

Hier nun die Klassen, mein hauptanliegen ist die grundsätzliche OOP Programmierung des Ganzen, an der sich ja scheinbar die Geister scheiden...


Die Hauptklasse Realspiel:
Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException;  
import java.awt.Robot;  
import java.awt.event.KeyEvent;  
import java.io.*;  
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;










public class Realspiel {
    int LeerDrehen=7;
   
    final long ScriptStartTime = System.nanoTime();
    long CurrTimeStamp=ScriptStartTime;
    int winnings=0;
    int betet=0;
    int betft=0;
    String betcolor=null;
   
    String[] Colors=new String[16]; //Array der letzten 16 gezogenen Farben
    public int NewIndex=15;//index of the last drawn color
   
    int[] et,ft; //nächste Einsätze et=Farbe, ft=Null
   
    int[] einsbut={10,50,100,200,500,1000,2500,5000,10000,50000,100000};
    //entspricht {0.1,0.5,1,2,5,10,25,50,100,500,1000}; in Cents
   
    Robot bot = new Robot();
   
    long dummyTime=0;

   
    Map EZP = new HashMap(); //einsätze->index
   
    Map VTK = new HashMap(); //index->einsätze
   
    int currwheelpos=2;//left most position of the visible wheel right now, 5 pos visible at once
   
   
   
   
   
   
    public static void main(String[] args)throws AWTException, InterruptedException, Exception{
       
        //Disbale scaling??
        //System.setProperty( "sun.java2d.uiScale", "1.0" );

       
        //Start Timetracking
        Realspiel a=new Realspiel();
       
       
    }
   
   
    public Realspiel() throws InterruptedException, AWTException, Exception{
                et=new int[17];
                ft=new int[17];
       
                LoginLogout.preparations(this);
                System.out.println("Vorbereitungen komplett!");
                TimeFunctions.TimeInfo(this);
                Thread.sleep(3000);
                run();
    }
   
   
   
    public void run() throws InterruptedException, AWTException, Exception{
        while(true){
            RundenManagement.EineRunde(this);
        }
    }
   
   
   
   
}

Die anderen 7 "Hilfsklassen":

Java:
public class Klickmanagement{
   
    //Alles was Klicken angeht
   
    //Hilfsfunktion
    //fertig
    public static void einsatzclick(Realspiel respi, int pos) throws Exception{
        int diff=pos-respi.currwheelpos;
       
        if((diff<0)&&(respi.currwheelpos==respi.einsbut.length-5)){
                Click("linksdreh");
                //Linksdreh;
                respi.currwheelpos--;
                diff++;
            }
               
        while((respi.currwheelpos<respi.einsbut.length-5)&&(diff!=0)){
            if(diff<0){
                Click("linksdreh");
                //Linksdreh;
                respi.currwheelpos--;
                diff++;
            }
            if(diff>0){
                Click ("rechtsdreh");
                //Rechtsdreh;
                respi.currwheelpos++;
                diff--;
            }                  
        }
        diff=pos-respi.currwheelpos;//now diff tells us which of the buttons 0-4 should be used
       
        Click("eins"+diff);
    }
   
   
   
       
    public static void Click(Realspiel respi, String a) throws Exception{
        int x=0;
        int y=0;
        switch(a){
            case "linksdreh":
                x=570;y=675;
                break;
               
            case "rechtsdreh":
                x=950;y=675;
                break;

            case "eins0":
                x=630;y=675;
                break;
               
            case "eins1":
                x=695;y=675;
                break;

            case "eins2":
                x=760;y=675;
                break;

            case "eins3":
                x=825;y=675;
                break;
               
            case "eins4":
                x=890;y=675;
                break;
               
            case "R"://rot
                x=995;y=460;
                break;          
               
            case "S"://schwarz
                x=1010;y=615;
                break;          
               
            case "Z"://null
                x=350;y=530;
                break;

            case "del"://Einatz löschen
                x=1110;y=675;
                break;          
               
            case "dreh"://drehen button
                x=1207;y=680;
                break;
           
            default:
                System.out.println("Default Case erreicht!");
                throw new Exception("We somehow got into the Click default case! This was the input: "+a+" !");

        }
       
        //add random offset
        x=x+((int) (Math.random() * 7-3));
        y=y+((int) (Math.random() * 7-3));
       
        //hier eigentlichen click ausführen
    respi.bot.mouseMove(x, y);   //ggbfls. mit custom funktion ersetzen
        respi.bot.delay(100);
    respi.bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        respi.bot.delay(100);
    respi.bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
        //System.out.println("string a="+a+"; x="+x+"; y="+y);
        Thread.sleep(100);
    }
   

   
}




Java:
import java.io.File;
import java.io.IOException;

import org.jopendocument.dom.spreadsheet.MutableCell;
import org.jopendocument.dom.spreadsheet.Sheet;
import org.jopendocument.dom.spreadsheet.SpreadSheet;


public class ExcelReader{
   
// Alles zum Einlesen der Exceldatei
   
    //Ab hier ODS Kram (Einsätze aus Openoffice Tabelle ablesen)
    //#GameVorbereitung
    public static void EinsaetzeEinlesen(Realspiel respi){
            File file = new File("C:\\Users\\blablabla\\Exceldateiname.ods");

                       
                        Sheet sheet;
                       
                        try {
             //Getting the 0th sheet for manipulation| pass sheet name as string
             sheet = SpreadSheet.createFromFile(file).getSheet(0);
             
             //Get row count and column count
             int nColCount = sheet.getColumnCount();
             int nRowCount = sheet.getRowCount();

             System.out.println("Rows :"+nRowCount);
             System.out.println("Cols :"+nColCount);
             //Iterating through each row of the selected sheet
             MutableCell cell = null;
                         //bei 7 mal leerdrehen
                         for (int i=0;i<respi.Leerdrehen;i++){
                             respi.et[i]=0;
                             respi.ft[i]=0;                            
                         }
                       
                         for(int i=respi.Leerdrehen;i<17;i++){
               cell = sheet.getCellAt(3, i-respi.Leerdrehen+3);
                             respi.et[i]=(int)(100*Double.parseDouble((cell.getValue()+"")));
               cell = sheet.getCellAt(4, i-respi.Leerdrehen+3);
                             respi.ft[i]=(int)(100*Double.parseDouble((cell.getValue()+"")));
                         }                    
                           

            } catch (IOException e) {
              e.printStackTrace();
            }
                       
                        return;
                       
    }
   
   
   
}


Java:
public class TimeFunctions{
   
   
// Alles rund um Zeitchecks und Sleeping
   
    public static void TimeInfo(Realspiel respi){
        long diff=System.nanoTime()-respi.CurrTimeStamp;
        int milliseconds    = (int) (diff / 1000000.0);
       
        System.out.println("About "+milliseconds+" milliseconds have passed since the last time we checked!");
       
        return;
    }
   
   
   
   
    public static void sleeptilltarget(long ScriptStartTime, long targetmilliTime){
        long tosleep=1000000*targetmilliTime-(System.nanoTime()-ScriptStartTime);
        if(tosleep>10000000){//10 milliseconds
            try{
                long millis= (long) (tosleep / 1000000.0);
                Thread.sleep(millis);
            }
            catch(Exception e){}
        }
        return;
    }
   
   
   
   
   
}




Java:
public class RundenManagement{
   
//Managed Alles was in einer Runde passiert

    public static void EineRunde(Realspiel respi) throws Exception{
       
            RundebisDreh(respi);
            try{
                Thread.sleep(2200);
            }
            catch (Exception e){}
            respi.CurrTimeStamp=System.nanoTime();
       
            //WarteBisDrehEnde();
            DoUpdatesAfterRoll(respi);
            System.out.println("Die Gewinne betragen nach dieser Runde insgesamt "+respi.winnings+" Cent!");
            TimeFunctions.TimeInfo(respi);
    }
   
   
   
    public static void RundebisDreh(Realspiel respi) throws InterruptedException, AWTException, Exception{
        respi.CurrTimeStamp=System.nanoTime();
        //einsätze für aktuelle runde auffarbfelder und null platzieren
        //einsätze leeren sicherheitshalber
        int l=ColorManagement.GetStreakLength(respi);
       
        String color="R";
        if(ColorManagement.getCurrColor(respi).equals("R")){color="S";}//only change color if it is red
       
        respi.betcolor=color;
        int etemp= respi.et[l];
        int ftemp= respi.ft[l];
        respi.betet=etemp;
        respi.betft=ftemp;
   
        //nur für Testzwecke eingefügt, wieder löschen!!!!
        //etemp=290;
        //ftemp=120;
       
       
        System.out.println("Einsätze für diese Runde sind: Farbe="+etemp+", Null="+ftemp);
        //bet on zero with ftemp
        // bet with etemp on the opposite of what col is
        //dont bet at all if etemp and ftemp are equal to zero, aka their product is zero
       
       
        //einsätze leeren
        Klickmanagement.Click(this,"del");
       
        //falls es eine nullrunde ist
        if(etemp*ftemp==0){
            //rollbutton klicken
            Klickmanagement.Click(this,"dreh");
            LoginLogout.TimeEndGameCheck(respi);
            return;
        }
        //place the bets and press the roll button
        int temp=0;
        System.out.println("etemp="+etemp+", ftemp="+ftemp+", temp="+temp);
        TimeFunctions.TimeInfo(respi);
        for(int i=respi.einsbut.length-1;i>=0;i--){
            temp=Integer.parseInt (respi.VTK.get(i)+"");
            //System.out.println("Vor einsatzclick!");
            //click einsatzclick(i)
            if((etemp>=temp)||(ftemp>=temp)){
                Klickmanagement.einsatzclick(this,i);
            }
            else{
                continue;
            }
            //System.out.println("Nach einsatzclick!");
            while(etemp>=temp){
                //farbe klicken
                //System.out.println("etemp Schleife!");
                Klickmanagement.Click(this,color);
                etemp=etemp-temp;
                //System.out.println("Placed "+temp+" on "+color+"!");
                //System.out.println("etemp now only "+etemp);
            }
            while(ftemp>=temp){
                //null klicken
                Klickmanagement.Click(this,"Z");
                ftemp=ftemp-temp;
                //System.out.println("Placed "+temp+" on Z!");
                //System.out.println("ftemp now only "+ftemp);
            }          
        }
       
       
        if(etemp*ftemp!=0){
            System.out.println("Something went horribly wrong while placing the bets!");
        }
        TimeFunctions.TimeInfo(respi);
        Klickmanagement.Click(respi,"dreh");
        TimeFunctions.sleeptilltarget(respi.CurrTimeStamp,3000);
        Thread.sleep(300);
    }
   
   
   

   
   

   

    public static void DoUpdatesAfterRoll(Realspiel respi) throws InterruptedException{
        ColorManagement.addColor(respi,ColorManagement.GetResult(respi));
       
        //do the winning math
        String a=ColorManagement.getCurrColor(respi);
        respi.winnings=respi.winnings-respi.betet-respi.betft;
        if(a.equals("Z")){
            respi.winnings=respi.winnings+36*respi.betft;
            System.out.println("Gewonnen mit Z und "+(35*respi.betft)+" Gewinn!");
            TimeFunctions.TimeInfo(respi);
            LoginLogout.TimeEndGameCheck(respi);
        }
        else if((a.equals(respi.betcolor))){
            respi.winnings=respi.winnings+2*respi.betet;
            System.out.println("Gewonnen mit "+respi.betcolor+" und "+respi.betet+" Gewinn!");
            TimeFunctions.TimeInfo(respi);
            LoginLogout.TimeEndGameCheck(respi);
        }
       
        TimeFunctions.sleeptilltarget(respi.CurrTimeStamp,2500);
       
    }  
       
       
       
   
   
}



Java:
public class Hilfskram{
   
    public static void PrintEinsaetze(Realspiel respi){
        for(int i=0;i<respi.et.length;i++){
            System.out.println();
            System.out.println();
            System.out.println("et["+i+"]="+respi.et[i]+", ft["+i+"]="+respi.ft[i]);
            System.out.println();
            System.out.println();        }
    }
   
   
    private static String toString(long nanoSecs) {
        int minutes    = (int) (nanoSecs / 60000000000.0);
        int seconds    = (int) (nanoSecs / 1000000000.0)  - (minutes * 60);
        int millisecs  = (int) ( ((nanoSecs / 1000000000.0) - (seconds + minutes * 60)) * 1000);


        if (minutes == 0 && seconds == 0)
             return millisecs + "ms";
        else if (minutes == 0 && millisecs == 0)
             return seconds + "s";
        else if (seconds == 0 && millisecs == 0)
             return minutes + "min";
        else if (minutes == 0)
             return seconds + "s " + millisecs + "ms";
        else if (seconds == 0)
             return minutes + "min " + millisecs + "ms";
        else if (millisecs == 0)
             return minutes + "min " + seconds + "s";

        return minutes + "min " + seconds + "s " + millisecs + "ms";
  }
   
}



Java:
public class ColorManagement{
   
    public static void initColors(Realspiel respi){
        for(int i=0;i<respi.Colors.length;i++){
            respi.Colors[i]="U";
        }
    }
   
   
   
    //fertig
    public static void addColor(Realspiel respi,String color){
        respi.NewIndex=  (respi.NewIndex>=1) ? (respi.NewIndex-1) : (respi.NewIndex+respi.Colors.length-1);
        respi.Colors[respi.NewIndex]=color;
    }
   
   
    //fertig
    public static String getCurrColor(Realspiel respi){
        return respi.Colors[respi.NewIndex];
    }
   
   
   
    //fertig?
    public static int GetStreakLength(Realspiel respi){
        int length=0;
        String a=getCurrColor(respi);
        int index=respi.NewIndex;
        if(a.equals("U")){
            return 0;
        }
       
        while(length<respi.Colors.length){
            //indexnext=(index+1) mod 16;
            if(respi.Colors[index].equals(a)){
                length++;
            }
            else{
                break;
            }
            index=(index<=respi.Colors.length-2) ? (index+1) : (index-respi.Colors.length+1);
           
        }
        return length;
    }
   
   
   
   
   
   
    //fertig?
    //Farbe von Bildschirm ablesen
  public static String GetResult(Realspiel respi) throws InterruptedException {
            respi.CurrTimeStamp=System.nanoTime();
          String res="U";
           
           
          for(int i=0;i<300;i++){
                res=ResultHelp(respi);
                if(!(res.equals("U"))){
                    System.out.println("Farbe "+res+" erkannt!");
                    TimeFunctions.TimeInfo(this);
                    return res;
                }
                Thread.sleep(10);
            }
           
           
               
            System.out.println("Error in getResult!Nach 300 Versuchen nichts gefunden!");
            return "";
               
  }
   
   
   
   

    public static String ResultHelp(Realspiel respi) throws InterruptedException{
                //BufferedImage img = bot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
               
                //final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
                //final int width = img.getWidth();
                //final int height = img.getHeight();
                //final boolean hasAlphaChannel = image.getAlphaRaster() != null;
                int R=0;
                int G=0;
                int B=0;
                Color color=null;
               
                //final int pixelLength = hasAlphaChannel?4:3;
                //final int fac=pixelLength-3;
                //int x=1370;
                //int y=105;
           
           
                //1200,210 bis 1236,210
                for(int x=1200, y=210; x<=1236;x++){
          color = respi.bot.getPixelColor(x,y);
                       
                    //    System.out.println("x="+x+"; y="+y+"; green="+color.getGreen()+"; blue="+color.getBlue()+"; red="+color.getRed());
                    //color = img.getRGB(x, y);
                    B=color.getBlue();
                    G=color.getGreen();
                    R=color.getRed();

                    // Components will be in the range of 0..255:
                    //B = color & 0xff;
                    //G = (color & 0xff00) >> 8;
                    //R = (color & 0xff0000) >> 16;
                                   
                    /*
                    int pixel=y*(width*pixelLength)+x*pixelLength;
                   
                   
                    B= ((int) pixels[pixel + fac] & 0xff); // blue
                    G= (((int) pixels[pixel + fac+1] & 0xff) << 8); // green
                    R= (((int) pixels[pixel + fac+2] & 0xff) << 16); // red
                    */
                   
                    if(B>=80){
                        //TimeFunctions.TimeInfo(this);
                        return "S";
                    }
                    else if(R>=80){
                        //TimeFunctions.TimeInfo(this);
                        return "R";
                    }
                    else if(G<80){
                        //Fall ohne Treffer
                        continue;
                    }
                    else{
                        //TimeFunctions.TimeInfo(this);
                        return "Z";
                    }
                       
                       
                   
                   
                    //1370,105 bis 1418,105
                   
                    //RGB alle unter 30->nichts
                    //R>80, bg<80->rot
                    //rgb alle >80->schwarz aka B>80
                    //g>80, br<80->Null
                   
                }
                return "U";
    }
   
   
   
   
       
    public static void PrintColors(Realspiel respi){
        int length=0;
        int index=respi.NewIndex;
        String colors="";
       
        while(length<respi.Colors.length){
            colors=colors+respi.Colors[index]+" ";
           
            index=(index+1<=respi.Colors.length-1) ? (index+1) : (index-respi.Colors.length+1);
            length++;
           
        }
        System.out.println("aktuelle Farben: "+colors);
    }
   
   
   
   
   
   
   
}



Java:
//for opening Browser
import java.lang.Runtime;




public class LoginLogout{
   
//    Alles was vor dem eigentlichen Spiel oder danach passiert
   

/********************************
Ab hier Vorbereitungen***********
*********************************/
   
   

   
    public static void preparations(Realspiel respi)throws InterruptedException, AWTException, Exception{
        respi.CurrTimeStamp=System.nanoTime();
       
        ColorManagement.initColors(this);
        ExcelReader.EinsaetzeEinlesen(this);
        einsaetzeposprep(this);
       
        openbrowser(this);
       
        //Do Login
        LoginCheck(this);
       
        TimeFunctions.sleeptilltarget(CurrTimeStamp,40000);
       
    }  
   
   
   
   
   
   
   
    //#GameVorbereitung
  public static void einsaetzeposprep(Realspiel respi){//bei Spielstart alle möglichen Einsätze hinterlegen

        for(int i=0;i<respi.einsbut.length;i++){
            respi.EZP.put(respi.einsbut[i],i);
            respi.VTK.put(i,respi.einsbut[i]);
        }
   
   
        /*
       
        EZP.put(0.1,0);
        EZP.put(0.5,1);
        EZP.put(1,2);
        EZP.put(2,3);
        EZP.put(5,4);
        EZP.put(10,5);
        EZP.put(25,6);
        EZP.put(50,7);
        EZP.put(100,8);
        EZP.put(500,9);
        EZP.put(1000,10);
      */
    }


/********************************
Ab hier Loginkram****************
*********************************/



  //Browser öffnen  
    //GameVorbereitung
    public static void openbrowser(Realspiel respi){//Browser öffnen duh
        respi.CurrTimeStamp=System.nanoTime();
        try{
          String[] a=new String[]{"cmd", "/c","start chrome https://geilecasinoschlampen.com"};
           
            //String[] a=new String[]{"cmd", "/c","start chrome"};
          Runtime.getRuntime().exec(a);  
            TimeFunctions.sleeptilltarget(respi.CurrTimeStamp,6000);
      }
      catch(Exception e){
        }
    }
   
       
   
   
    public static void Login(Realspiel respi){
        try{
           
            //Passwort eingeben
            int x=760+((int) (Math.random() * 7-3));
            int y=476+((int) (Math.random() * 7-3));
           
            //klick in passwortfeld
            respi.bot.mouseMove(x, y);  
            respi.bot.delay(100);
            respi.bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            respi.bot.delay(100);
            respi.bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
           
            //alte Eingabe löschen
           
            //select all
            respi.bot.keyPress(KeyEvent.VK_CONTROL);
            respi.bot.delay(100);
            respi.bot.keyPress(KeyEvent.VK_A);
            respi.bot.keyRelease(KeyEvent.VK_A);
            respi.bot.delay(100);
            respi.bot.keyRelease(KeyEvent.VK_CONTROL);
            respi.bot.delay(100);
           
            //delete content
            respi.bot.keyPress(KeyEvent.VK_DELETE);
            respi.bot.keyRelease(KeyEvent.VK_DELETE);
            respi.bot.delay(100);
           
            //enter new passwort
            //hier wird Passwort eingegeben, aus offensichtlichen gründen gelöscht
           
            //passwort=ShrekIsLoveShrekIsLife
           
           
            //login Button anklicken
            x=770+((int) (Math.random() * 7-3));
            y=580+((int) (Math.random() * 7-3));
            respi.bot.mouseMove(x, y);  
            respi.bot.delay(100);
            respi.bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            respi.bot.delay(100);
            respi.bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
       
        }
        catch(Exception e){
           
        }
        TimeFunctions.sleeptilltarget(respi.CurrTimeStamp,5000);
       
       
    }
   
   
    public static void LoginCheck(Realspiel respi){
        respi.CurrTimeStamp=System.nanoTime();
        try{
            Thread.sleep(2000);
        }
        catch(Exception e){}
       
        //check if login needed

        Color color=respi.bot.getPixelColor(120,115);  
        int B=color.getBlue();
        int G=color.getGreen();
        int R=color.getRed();
       
        if(B<100&&G<100&&R<100){
            Login(respi);
        }
               
        return;
    }
   
   
   
   
   

/********************************
Ab hier EndGame Kram*************
*********************************/


    public static void TimeEndGameCheck(Realspiel respi) {
        long diff=System.nanoTime()-respi.ScriptStartTime;
        int minutes    = (int) (diff / 60000000000.0);

        if(minutes>=51){
            System.out.println("minutes="+minutes);
            //End It All!
            DoEndGameStuff(respi);
        }
        return;
  }
   
   
    public static void DoEndGameStuff(Realspiel respi){
       
        //switch to other window
        /*
        try
        {
            bot.keyPress(KeyEvent.VK_ALT);
            bot.delay(300);
            bot.keyPress(KeyEvent.VK_TAB);
            bot.delay(300);
            bot.keyRelease(KeyEvent.VK_TAB);
            bot.delay(300);
            bot.keyRelease(KeyEvent.VK_ALT);
            bot.delay(300);
        }
        catch(Exception exception){}
        */  
           
        //close chrome window
    //automatically switches focus to console afterwards      
        try
        {
            respi.bot.keyPress(KeyEvent.VK_ALT);
            respi.bot.delay(300);
            respi.bot.keyPress(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_ALT);
            respi.bot.delay(300);
        }
        catch(Exception exception){}
       
        //close script via closing cmd
        try
        {
            respi.bot.keyPress(KeyEvent.VK_ALT);
            respi.bot.delay(300);
            respi.bot.keyPress(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_ALT);
            respi.bot.delay(300);
        }
        catch(Exception exception){}
           
        //now both chrome and this script are gone and done  
       

    }
       
   
   
   
   
   
   
}



Nun darf gerne das Maul zerrissen werden wie mies der Code ist :-D
 

Neumi5694

Top Contributor
Grundsätzlich seh ich da jetzt nicht viel verkehrtes, bis auf die Formatierung.
Ich würde als erstes mal anfangen, bei switch mit Klammern zu arbeiten und nie 2 Befehle in einer Zeile schreiben, ebenso bei den if-Bedingungen. Eine IDE wird das für dich automatisch erledigen.
Und ich würde mich noch an den LowerCamelCase Standard beim Benennen von Methoden halten.
Dein Thread könnte anstatt while (true) eine Variable abfragen, über die er von außen gestoppt werden kann.

Auf jeden Fall auf den ersten Blick keine all zu großen Schnitzer.

Persönlich hab ich mittlerweile ganz gerne Stringformatter anstatt Konkatenationen, da sieht man schneller, wie das Endergebnis ausschauen wird, inklusive Leerzeichen, die man vielleicht vergessen hat.
Code:
System.out.printSystem.out.println("etemp="+etemp+", ftemp="+ftemp+", temp="+temp);

//wie gesagt, reine Geschmackssache. Das '%n' am Ende macht noch den Zeilenumbruch.

System.out.printf("etemp=%d, ftemp=%d, temp=%d%n", etemp,ftemp,temp);
 

KonradN

Super-Moderator
Mitarbeiter
Das erste, was Du da machen könntest, wäre einmal vernünftige Bezeichner zu nehmen. Das ist so ein Beispiel, das direkt so abschreckt, dass man da nicht einmal mit der Kneifzange diesen Code anpacken möchte.

Du hast da einen Reader, der irgendwas aus einer Excel Tabelle liest. Das ist doch irgend etwas, das vermutlich eine Einheit bildet. Das was da also gelesen wird kann man in eine Klasse packen. Dann hat man da schon direkt eine objektorientierte Aufteilung und das Realspiel hat dann eine Instanz davon. In diese neue Klasse fliessen dann auch alle Methoden, die ein Verhalten darauf abbilden. Der Reader wird dann eine Klasse mit einer Methode, die dann eine neue solche Instanz erstellt und zurück gibt. Die Datei wird im Konstruktor übergeben und die Methode, die das neue Element erstellt und füllt, heisst dann ggf. read.

Du hast ein Rundenmanagement als Klassenname gewählt. Also hast Du evtl. Runden? Da kann man ggf. eine sinnvolle Klasse bauen, dass dann im Realspill enthalten ist. ColorManagement klingt schion extrem danach. Da hat dann das Realspiel einfach eine Color und alle möglichen Dinge wandern dann da rein.

Halt Objektorientierter Aufbau ...
 

Neumi5694

Top Contributor
Dieser Aufbau mit static Methoden ist ok in Deinen Augen? Danke für diese Aussage und sorry, dass ich Dich mit Clean Code belästigt habe ... Wird nicht mehr vorkommen (Danke @Robert Zenz!).
"Erster Blick" ... Bin zugegebenermaßen eher bei den Code-Teilen als bei den Headern hängengeblieben. Die statics sind mir tatsächlich entgangen.
Und nein, du bist doch nie lästig :) Denke aber nicht, dass du mich deswegen nie wieder ansprechen wirst. Das hast du schon in der Vergangenheit versprochen.
 

KonradN

Super-Moderator
Mitarbeiter
Meine Meinung werde ich garantiert schreiben aber Diskussionen werde ich versuchen massiv einzuschränken.
 

mihe7

Top Contributor
@berndoa, man kann nicht einfach Code nehmen und den objekt-orientiert umschreiben (ja, in gewissen Grenzen geht das natürlich), dazu muss man sich schon mit dem zu lösenden Problem beschäftigen. Das hast Du sicher getan - die User im Forum aber (noch) nicht.

Deswegen habe ich den Code kurz überflogen, um zu verstehen, worum es überhaupt geht. Irgendein "Realspiel" und aus Deiner Beschreibung weiß ich, dass es was mit einem Online-Casino zu tun hat. Wenn ich tiefer in den Code schaue, wird wohl ein Rad gedreht. Farben spielen auch eine Rolle, z. B. "rot". Könnte Roulette sein. Rätselraten.

Dann sehe ich Variablen-Bezeichner, die mir so absolut nichts sagen: et, ft -> wofür steht das? Als Kommentar: nächster Einsatz. Gut, ich bin kein Zocker, vielleicht erklärt sich für die et und ft von selbst.

Ich will hier nicht alles aufführen, was mir am Code nicht gefällt. Aber einen Punkt möchte ich dann als Verbesserungsvorschlag doch noch einbringen, weil ich meine Lieblingskommentare sehe, die beschreiben, was der Code macht. Mal ein zufällig gewähltes Beispiel:
Java:
        //check if login needed

        Color color=respi.bot.getPixelColor(120,115); 
        int B=color.getBlue();
        int G=color.getGreen();
        int R=color.getRed();
      
        if(B<100&&G<100&&R<100){
            Login(respi);
        }

Kleines Refactoring:
Java:
if (isLoginNeeded(respi)) {
    Login(repsi);
}

Java:
private static boolean isLoginNeeded(Realspiel respi) {
        Color color=respi.bot.getPixelColor(120,115); 
        int B=color.getBlue();
        int G=color.getGreen();
        int R=color.getRed();
        return B<100 && G<100 && R<100;
}
Der überflüssige Kommentar wurde durch einen ebenso aussagekräftigen Code ersetzt und an der Stelle sieht man nun auf einen Blick, worum es geht und muss sich nicht erst durch weitere fünf Zeilen wühlen.
 

Neumi5694

Top Contributor
Grundsätzlich hab ich nichts gegen statische Methoden in a) Utility Klassen und b) den Programmeigenschaften. Das Ganze ist aber schon recht seltsam.
Ehrlich gesagt hätte ich das Ganze nicht auf eigene Klassen zerlegt, vor allem nicht auf diese Art.
Das Ergebnis eines Spiels oder das Ende eines Spiels gehören zum Spiel, sollten also auch in dieser Klasse bleiben.
Du übergibst ständig die Instanz von Realspiel an irgendwelche Methoden, die dann etwas damit machen (und auf public Variablen daraus zugreifen ... pfui!). All diese Methoden sollten meiner Meinung nach Teil des Spiels bleiben. Aber wenn du es schon so machen willst, dann solltest du an diese Methoden nicht das Spiel übergeben, sondern die benötigten Variablen.
Beim Aufteilen ist dir glaub ich auch noch der eine oder andere Fehler unterlaufen. Wie kann "this" von einer statischen Methode aus funktionieren?

Du hast dir wegen der 700 Zeilen zu viel Gedanken gemacht. Sooo viel ist das nicht, vor allem nicht für ein Spiel mit einer gewissen Ablauflogik. Wenn du erst mal die ganzen Leerzeilen und den alten auskommentierten Code rausnimmst, dann wird's auch gleich viel kompakter.
Ich hab z.B. gerade eine Datenklasse mit 400 Zeilen offen, die nur 15 Eigenschaften hat und keine Ablauflogik (bis auf Clone, Equals usw).

Den Großteil davon machen Dokumentation und Fehlerbehandlung bei den Settern aus. Methoden kann man übrigens toll dokumentieren, wenn man sich an den Standard hält.
/**
* Das ist Methode xyz
* <br> die macht das hier:
* @param parameterName Damit wird folgendes gemacht
* @Return Es gibt folgende Fälle ...
*/

Diese Doumentation wird dann auch in der IDE angezeigt, wenn du die Methode aufrufst.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Ich habe jetzt einmal den gegebenen Code genommen. Mal von diversen Clean Code Aspekten abgesehen: Er ist so ja nicht einmal übersetzbar. Das muss man dann doch eigentlich keine weiteren Worte verlieren, oder?

Aber ok, das bekommt man alles etwas hin ... Aber es führt zu der Frage: Nutzt Du eine IDE? Welche? Die üblichen IDEs sollten dir doch eigentlich massiv helfen damit viele der Dinge nicht auftreten oder sofort sichtbar sind.

Aber wie dem auch alles sei - paar Dinge:
- Dieses et / ft - kannst Du das etwas erläutern? Ebenso, was da aus der Excel Tabelle geladen wird und wie diese aussieht?
- Deine HashMaps für Einsätze nutzen keine Generics. Du solltest den Typ genau festlegen!

Bei den Einsätzen sieht es aber schon so aus, dass man da ein Refactoring zeigen kann. Du brauchst eine Map, die in beide Richtungen aufgerufen werden kann. Daher hast Du zwei HashMap - das kann man aber sehr schön in eine Klasse Kapseln. Wenn man das nicht generisch lösen will, dann hat man da halt sowas wie:
Java:
import java.util.HashMap;
import java.util.Map;

public class Einsaetze {
    private Map<Integer, Integer> EZP = new HashMap<>(); //einsätze->index
    private Map<Integer, Integer> VTK = new HashMap<>(); //index->einsätze

    public void put(int index, int einsatz) {
        EZP.put(einsatz, index);
        VTK.put(index, einsatz);
    }

    public int getEinsatz(int index) {
        return VTK.get(index);
    }

    public int getIndex(int einsatz) {
        return EZP.get(einsatz);
    }
}

Das sieht erst einmal nicht besonders aus, aber nun wird es an diversen Stellen einfacher. Dass z.B. beide Maps angepasst werden, ist nun hier zentral sicher gestellt und man kann hier zentral mögliche Checks einbauen. (Die jetzt hier noch fehlen!)

Dann kann man in Realspiel Einfach eine Instanz von Einsaetze haben und dann nutzen. Durch die Typisierung wird es dann auch noch einfacher:
temp = Integer.parseInt(respi.VTK.get(i) + "");
wird direkt zu
temp = Integer.parseInt(respi.einsaetze.getEinsatz(i);
also kein Object to String um den dann zu parsen ...

Das einfach einmal als kleines Beispiel. Generell ist auf die Namensgebung zu achten! Ich habe die Variablen selbst jetzt nicht umbenannt. Aber die sollten natürlich klein anfangen in Camelcase und sinnvolle Namen haben. Also von mir aus sowas wie einsatzZuIndexMap und indexZuEinsatzMap. Dann sind auch sofort die Kommentare obsolet.

Und ganz wichtig: Das hat jetzt keine längeren Methoden. Das ist aber durchaus bei den anderen Dingen, die ich noch so sehe, wo mir aber der Überblick über den Code fehlt und daher ein Refactoring deutlich erschwert wird. Ich bin mir sicher, dass es bei dem et/ft deutlich besser sichtbar werden würde, wie so neue Klassen wirklich funktionieren können und wie man damit Software sauber aufteilen kann.
 

berndoa

Top Contributor
IDEs?
Notepad++ und die Konsole sind mir IDE genug :)

(Ich mag einfach Eclipse und Co. nicht)

Ja, das Alles zu kompilieren habe ich mich bisher noch nicht getraut ....


Ja, was wofür ist müsste ich ausgiebig an einem Beispiel erklären, hierzu hier ein Casinounabhängiger Roulettesimulator:
Code:
https://oddsmatrix-static.casinomodule.com/games/europeanroulette3_mobile_html/game/europeanroulette3_mobile_html.xhtml?gameId=europeanroulette3_not_mobile_sw&lobbyURL=https%3A%2F%2Fcasino3.gammatrix.com%2FLoader%2FLobbyResolver%2F6%2F100%3Fcasinolobbyurlencoded%3DiuANNG_Ju4fDkBQM1mfuOdMBHlBFLOndK4uO31a2z1w~%26lobbyurlcase%3D0&server=https%3A%2F%2Foddsmatrix-game.casinomodule.com%2F&lang=en&sessId=DEMO637626804932298166-EUR&operatorId=default&statisticEndpointURL=https://gcl.netentcdn.com/gcs/reportData&logsId=5e87c3b4-925b-41a3-bacc-239340df6c1a&loadStarted=1627083700655&giOperatorConfig=%7B%22gameId%22%3A%22europeanroulette3_not_mobile_sw%22%2C%22staticServer%22%3A%22https%3A%2F%2Foddsmatrix-static.casinomodule.com%2F%22%2C%22width%22%3A%22100%25%22%2C%22height%22%3A%22100%25%22%2C%22enforceRatio%22%3Afalse%2C%22lobbyURL%22%3A%22https%3A%2F%2Fcasino3.gammatrix.com%2FLoader%2FLobbyResolver%2F6%2F100%3Fcasinolobbyurlencoded%3DiuANNG_Ju4fDkBQM1mfuOdMBHlBFLOndK4uO31a2z1w~%26lobbyurlcase%3D0%22%2C%22server%22%3A%22https%3A%2F%2Foddsmatrix-game.casinomodule.com%2F%22%2C%22lang%22%3A%22en%22%2C%22sessId%22%3A%22DEMO637626804932298166XXXX%22%2C%22operatorId%22%3A%22default%22%7D&casinourl=https://casino3.gammatrix.com&loadSeqNo=0

Das Casino wo ich spielen will, benutzt den haargenau selben Roulettetishc, kann man an dem also gut ausprobrieren bevor es am realen Casino probiert wird.
Hier auch ein Screenshot zum Erklären (vermutlich irgendwo im Anhang sichtbar)
Zur Vorgehensweise und zur "Strategie":
Man dreht einige Male leer (heißt ohne Einsatz, einfach nur das Rad drehen; wie oft steht in LeerDrehen Variable) und dann wird einige Runden mit Einsatz gespielt.
Sinn ist dass man anfangs so lange leerdreht bis bspw. 7 mal eine rote Zahl gekommen ist.
Danach wird mit Einsatz auf die entgegengesetzte Zahl gesetzt solange bis man eben gewonnen hat.
Beim Martingale würde bei jeder nichterfolgreichen Runde in der Folgerunde das Doppelte gesetzt, bei mir sind es spezielle Beträge in jeder Runde.
Ausserdem wird neben dem Setzen in einer bestimmten Runde auch noch ab einem Zeitpunkt die "null mit abgesichert".
Lange Rede, kurze Sinn:
es wird mit bestimmten Einsätzen in bestimmten Runden auf eine Farbe sowie die gesetzt.
et sind die Einsätze auf die Farbe, ft die auf die Null (et und ft sind frei erfundene begriffe, haben keinen tiefen Sinn. Sollte ich vll. "EinsätzeFarbe"
und "EinsätzeNull" nennen).
Was ab der 7. leerdrehrunde nun wann auf farbe und auf null gesetzt wird, steht in der exceldatei und wird eingangs eingelesen und halt Alles passend in et und ft geschrieben.

betcolor sollte eigentlich die Zahl sein auf die zuletzt gesetzt wurde.


winnings ist ein primitiver Zähler, der mitzählt wie viel Geld seit Spielbeginn gewonnen wurde.
Mehr dazu da, um das korrekte Funktinierend es Programms zu checken.

Colors ist genau das, was da steht: Es hat als Array gespeichert, welche 16 "Farben" zuletzt gezogen wurden
(rot=R,schwarz=S, Null=Z (wie englisch zero)).
Natürlich wird zu Spielbeginn dieses Array erst mal mit Dummywerten "U" belegt, die später überschrieben werden wenn neue richtige Werte dazukommen.

Und da ich bei hinzukommen einer neuen Farbe nicht immer das ganze Array um 1 nach rechts verschieben will, habe ich einen Indexvariable (glaube, das war das newIndex) dabei, die mir angibt welche "Farbe" im Array das zuletzt gezogene ist.
geht man immer weiter nach rechts (von hinten nahc vorne loopend, daher auch der mod 16 kram) kommt man zu den immer älteren Werten.

zu "einsbut" (meine Namen sind einfach klasse! :)):
Hier geht es, wenn man auf den Screenshot guckt, um die Einsatzmünzen unten.
wenn man sich mal von links nach rechts all anguckt, gehen die von 0.1 euro bis 1000 Euro.
bzw. von 10 bis 100000 (weil ich aus anti-kommazahlen-gründen mit cents arbeite).
diese sind in dem array einsbut gespeichert.

davon sind aber nur genau 5 davon zu einer zeit sichtbar.
um mir zu "merken", welche 5 gerade sichtbar sind, merke ich mir den index des am linkesten sichtbaren zeichens.
dieser index heißt currwheelpos.

natürlich, wenn auf den rechts oder linksdrehknopf gedrückt wird, wird dieserr index verändert.


Ansosnten sind CurrTimeStamp und dummytime beides schlichte Zeitstempel (über System.nanotime()).
currtimestamp ist final weil ich da die zeit drin speichere in der das objekt erzeugt wird und damit den beginn der skriptausführung markiert.
dummytime ist, wie der name sagt, eine dummyvariable um mir gerade einen zeitpunkt zu merken wo es mir passt.
wo ich mir durch anpassen von dummytime bspw. am start einer methode die zeit merke und am methodenende wird mit sleeptilltarget eben eine gewisse mindestzeit abgewartet, entweder war die ausführung der methode schnell und wir warten noch etwas bis ca. 6 sekunden rum sind. oder die methode brauchte so schon mehr als 6 sekunden, dann passiert gar nix.

Map EZB und MAP VTK sind, wie shcon vermutet wurde, nur da um eine gewisse bijektive(?) Funktion darzustellen.
Es geht, mal wieder, um die Einsatzbuttons unten.
Anstatt wie oben mit den werten 10 cent bis 100000 cent zu arbeiten, macht es halt einfahc mehr sinn mit den indexstellen 0-10(?) zu arbeiten.
daher brauche ich was, was mir die buttonzahl in die zugehörige indexposition umrechnet. und umgekehrt.
leider nicht wirklich bijektiv da 10 auf beiden seiten vorkommt.
daher habe ich halt für jede richtung des funktion eine map gebaut und benutze die jeweilige dort, wo benötigt.

Waren das Alle Variabeln?
Ich hoffe es doch.

Achja, die Farberkennung:
Um rauszufinden welche zahl nach einem dreh "gezogen" wurde, gucken ich oben rechts in den ebreich wo die gezogenen Zahlen sind.
die ganz frishc gezogene Zahl steht blinkend ganz oben, der Rest darunter.
ca. in der Mitte durch die oberste Zahl ziehe ich im prinzip ein 1 pixel hohes und ??? pixel breits Rechteck in dem ich immer wieder pixelcolorsearch mache.
nach einem dreh muss ja nach einer weile da dann blinkend die neue zahl erscheinen.
und ich pixelsearche die pixelzeile so lange bis eben eine grüne, rote oder schwarze zahl gefunden wurde.
So wird die aktuelle zahl gefunden, gespeichert, darauf basierend das ergebnis ermittelt und einsätze und co. angepasst.
 

Anhänge

  • inputpic3-min.png
    inputpic3-min.png
    664 KB · Aufrufe: 3

KonradN

Super-Moderator
Mitarbeiter
Notepad++ und die Konsole sind mir IDE genug :)

(Ich mag einfach Eclipse und Co. nicht)
Damit nimmst Du Dir extrem viel Unterstützung. Diese Position solltest Du schlicht überdenken, wenn Du weiter kommen willst. In der Software Entwicklung sind so Dinge wie Refactorings an der Tagesordnung. Und die Unterstützung ist einfach enorm - bei dir ist alleine schon die Neuformatierung vom Code extrem hilfreich :)

Eclipse nicht zu mögen ist einfach. Aber andere IDEs sind deutlich benutzerfreundlicher (IntelliJ, Netbeans).

Das einfach nur als eine einfache Anregung zum Nachdenken.

Und ich vermute, dass Du dann auch nicht wirklich ein Buildtool nutzt, oder?
 

berndoa

Top Contributor
Damit nimmst Du Dir extrem viel Unterstützung. Diese Position solltest Du schlicht überdenken, wenn Du weiter kommen willst. In der Software Entwicklung sind so Dinge wie Refactorings an der Tagesordnung. Und die Unterstützung ist einfach enorm - bei dir ist alleine schon die Neuformatierung vom Code extrem hilfreich :)

Eclipse nicht zu mögen ist einfach. Aber andere IDEs sind deutlich benutzerfreundlicher (IntelliJ, Netbeans).

Das einfach nur als eine einfache Anregung zum Nachdenken.

Und ich vermute, dass Du dann auch nicht wirklich ein Buildtool nutzt, oder?
Ein Buildtool?
Ich weiß gerade nicht mal, was das ist. :)
Ja, die Unis schrieben halt aber Eclipse vor.
Auch im Programmierpraktikum ist Eclipse zu benutzen.

Das Intellj werde ich vll. mal testen, wird ja augenscheinlich auch im Forumskurs benutzt :)
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Buildtools sind Tools, die den Build eines Projekts steuern. Also so Tools wie make, cmake, ant, maven, gradle, msbuild, ...
Wobei in Java vor allem Maven und Gradle dominieren.

Ja, die Unis schrieben halt aber Eclipse vor.
Auch im Programmierpraktikum ist Eclipse zu benutzen.
Dann wäre es um so wichtiger, dass Du Dich damit auseinander setzt. Wenn man die Bedienung einmal halbwegs verstanden hat, ist Eclipse ein extrem gutes Tool. Es wird halt deutlich weniger auf Anfängerfreundlichkeit geachtet aber das ändert nichts daran, dass es die Eierlegendewollmilchsau ist. Das ist es halt, das es einem Anfänger schwer macht, da diese von der Funktionalität einfach erschlagen werden.

Aber gerade, wenn man mit einem Tool arbeiten muss, sollte man es beherrschen.
 

berndoa

Top Contributor
Ich werde mal das Intellj testen, dann sehen wir mal weiter.
Mich störts halt alleine schon dass man bei Eclipse irgendwie nicht so easy .jar Dateien benutzen kann, wie man das ggbfls in der Konsole kann.

Ich werde mal das Intellj testen, mal sehen wie das so ist :)

Oh God, maven, ich erinnere mich da was.
Irgendwie in Bezug auf Texterkennung waren 90% der google ergebnisse dahingehend dass man eclipse, maven und wat weiß ich braucht, um irgendwelchen repority mist einzustellen und viel mehr nur um simple Texterkennung zu benutzen. Hat mich damals schon angepisst als jeder Beitrag zu blöd war, einen simplen java-only weg zu beschreiben.
umständlicher kram.

Ist SVN (Subversion versionsverwaltung) auch so ein buildtool?
oder wieder was Anderes?
Weil sowas soll auch in dem Programmierpraktikum benutzt werden :-/
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
SVN ist natürlich SVN und nicht Git. Das sind einfach zwei unterschiedliche Produkte mit unterschiedlichen Features / Arbeitsweisen.
 
Y

yfons123

Gast
Ich werde mal das Intellj testen, dann sehen wir mal weiter.
Mich störts halt alleine schon dass man bei Eclipse irgendwie nicht so easy .jar Dateien benutzen kann, wie man das ggbfls in der Konsole kann.

Ich werde mal das Intellj testen, mal sehen wie das so ist :)

Oh God, maven, ich erinnere mich da was.
Irgendwie in Bezug auf Texterkennung waren 90% der google ergebnisse dahingehend dass man eclipse, maven und wat weiß ich braucht, um irgendwelchen repority mist einzustellen und viel mehr nur um simple Texterkennung zu benutzen. Hat mich damals schon angepisst als jeder Beitrag zu blöd war, einen simplen java-only weg zu beschreiben.
umständlicher kram.

Ist SVN (Subversion versionsverwaltung) auch so ein buildtool?
oder wieder was Anderes?
Weil sowas soll auch in dem Programmierpraktikum benutzt werden :-/
sobald du ein mvn project hast linked es dir eclipse nach /.m2 sobald du es woanders importierst

dein traum von "nur java keine gradle oder maven oä" ist vorbei der zug ist abgefahren
 

berndoa

Top Contributor
sobald du ein mvn project hast linked es dir eclipse nach /.m2 sobald du es woanders importierst

dein traum von "nur java keine gradle oder maven oä" ist vorbei der zug ist abgefahren
hm, vielleicht sollte ich dann das IDE Kram doch lassen? :-(
Ich will einfach nur meine stinknormalen .java und .class Dateien haben und sonst nichts :-/
 

Robert Zenz

Top Contributor
Mich störts halt alleine schon dass man bei Eclipse irgendwie nicht so easy .jar Dateien benutzen kann, wie man das ggbfls in der Konsole kann.
Du kannst jars einfach in das Projekt kopieren und in den Klassenpfad einbinden, das geht sehr einfach.

Oh God, maven, ich erinnere mich da was.
Irgendwie in Bezug auf Texterkennung waren 90% der google ergebnisse dahingehend dass man eclipse, maven und wat weiß ich braucht, um irgendwelchen repority mist einzustellen und viel mehr nur um simple Texterkennung zu benutzen. Hat mich damals schon angepisst als jeder Beitrag zu blöd war, einen simplen java-only weg zu beschreiben.
umständlicher kram.
Maven kann ich auch nicht leiden, wenn dich das beruhigt. Komplett ueberbewertet meiner Meinung nach, aber auf der anderen Seite bin ich auch der Meinung dass die Abhaengigkeiten mit ins Repository gehoeren damit man die nicht erst suchen muss (und sich darauf verlassen muss dass die nicht vom Server verschwunden sind, oder noch besser, leise geaendert wurden). Wenn man ein Projekt herunterlaedt sollte alles zum bauen drinnen sein, auszer dem Build-Tool und der Laufzeitumgebung.

dein traum von "nur java keine gradle oder maven oä" ist vorbei der zug ist abgefahren
Meh, diese "Jeder verwendet das, das muss man verwenden, wer was anderes verwendet ist doof" Mentalitaet sollte man abschaffen. Wenn jemand nicht Maven will, dann soll man die doch bitte etwas anderes verwenden lassen. Ich habe auch lieber drei Tage investiert und mir eine Ant+Ivy Loesung gebaut mit der ich zufrieden war, und siehe da, ein Build von einem kleinen Projekt ist ja doch in wenigen Sekunden durchgelaufen anstatt erstmal auf Maven warten zu muessen bis sich das entschlieszt Plugins zu suchen.

Ist SVN (Subversion versionsverwaltung) auch so ein buildtool?
oder wieder was Anderes?
Weil sowas soll auch in dem Programmierpraktikum benutzt werden :-/
Build-Tools gibt es viele, Ant ist der Klassiker, Gradle und Maven die anderen groszen Platzhirsche. Du kannst natuerlich auch make nehmen, oder irgendetwas anderes was dir beliebt.

Was weniger freiverhandelbar ist, ist Versions Kontrolle. Subversion/SVN und Git sind die gaengigsten. Jedes Projekt sollte unter Versions Kontrolle stehen, es erleichtert dir die Arbeit wenn du zum Beispiel etwas umstellen willst, und kannst einfach wieder auf den vorherigen Stand zurueck wechseln kannst. Oder unterschiedliche Dinge gleichzeitig ausprobieren auf unterschiedlichen Zweigen ohne das man sich selbst dabei in die Quere kommt. Oder dass man nachvollziehen kann wann man was gemacht hat.

Du musst dir Git und SVN vorstellen wie Arbeitsaufzeichnungen, jeder deiner Arbeitsschritte wird festgehalten, zum Beispiel "Habe Feature X eingebaut.", "Bug Y korrigiert.", "Abhaengigkeit auf Stand gebracht." und zu allen diesen Schritten ist immer der komplette Stand des Projekts zu diesem Zieptunkt verfuegbar. Du kannst immer wieder dorthin zurueck wechseln, oder dir die Geschicht von einzelnen Dateien, sogar Zeilen, ansehen um nachvollziehen zu koennen was dort gemacht wurde. Wenn du da einmal einen Arbeitsablauf gefunden hast der fuer dich funktioniert, wirst du aber auch nicht mehr ohne koennen.

IDEs?
Notepad++ und die Konsole sind mir IDE genug :)

(Ich mag einfach Eclipse und Co. nicht)
Kann ich verstehen, dass du es haendisch kannst ist meiner Meinung nach auf jeden Fall sehr gut, sollte jeder mal gemacht haben. Aber IDEs bieten schon eine Menge Komfort den man nach einer bestimmten Zeit nicht mehr vermissen will. Automatisches Formatieren (braucht jedes Projekt), Javadoc anzeigen, Autovervollstaendigung, automatisches verwalten der Imports und dann noch so viele tolle Sachen wie springen zur Deklaration einer Methode. Das sind alles Dinge die man nach kurzer Zeit einfach vermissen beginnt.

Welche IDE zu verwendest ist natuerlich dir ueberlassen (auszer halt fuer die Uni-Projekte). Die groszen drei fuer Java sind Eclipse, NetBeans und IntelliJ IDEA. Ich habe schon mit allen dreien gearbeitet und finde da gibt es nicht viel daran auszusetzen, ich selbst liebe Eclipse, aber das liegt vermutlich daran dass ich auch schon Plugins dafuer geschrieben und mich daher damit beschaeftigt habe. IntelliJ wird immer als der Messiahs angepriesen, hat mich selbst jetzt aber nicht so sehr beeindruckt. NetBeans ist sehr solide, ich bedaure immer ein biszchen dass ich damit nicht mehr gearbeitet habe.
 

berndoa

Top Contributor
Habs gerade mal versucht zu kompilieren.....
Oh weh...

Von ein paar offensichtlichen Sachen abgesehen will mir gerade nicht einleuchten, warumd er Fehler " non-static variable this cannot be referenced from a static context" auftritt.
ich meine, in einem anderen Thread hatte ich doch das selbe prinzip mit A und B Klassen gemacht und da konnt eich es kompilieren und die Attribute des Objekts wurden erfolgreiche durch die statische Mathode der anderen klasse geändert!

Warum geht das hier nicht? :O
 

berndoa

Top Contributor
Aus dem gleichen Grund wie im angesprochenen Thread. Du versuchst aus einer statischen Methode heraus auf eine Instanzvariable der selben Klasse zuzugreifen. Hierzu würde eine Instanz benötigt, die aber im Kontext der statischen Methode nicht existiert.
Habs gerade gesehen, war natürlich Schwachsinn die Codezeilen da.
Anstatt der Methode this zu übergeben, müsste natürlich die Referenz auf das Realspiel Objekt übergeben werden.

Typische Fehler die beim stumpfen Copy und Pasten auftreten....
 

KonradN

Super-Moderator
Mitarbeiter
Und du hast da ja die Methode aus der anderen Klasse kopiert und dafür den Parameter hinzugefügt. this ist also nur durch den parameter zu ersetzen.

Und wenn du auf eine Instanzvariable zugreifst, dann muss die sichtbar sein damit du per parameter.variable darauf zugreifen kannst.

Und eine Variable war falsch geschrieben LeerIrgendwas ist dann bei Nutzung Leerirgendwas (also nicht camelaCase).

das war, was mir so aufgefallen war.
 

berndoa

Top Contributor
Habe mal die Fehler ausgebügelt, jetzt lässt sich sogar wieder Alles kompilieren und ausführen! :O

Zwar zu hässlich um es wem zu zeigen (clean code, kapselung, OOp, etc.) aber es läuft zumindest :)
 

berndoa

Top Contributor
Und du hast da ja die Methode aus der anderen Klasse kopiert und dafür den Parameter hinzugefügt. this ist also nur durch den parameter zu ersetzen.

Und wenn du auf eine Instanzvariable zugreifst, dann muss die sichtbar sein damit du per parameter.variable darauf zugreifen kannst.

Und eine Variable war falsch geschrieben LeerIrgendwas ist dann bei Nutzung Leerirgendwas (also nicht camelaCase).

das war, was mir so aufgefallen war.
Vielleicht sollte ich mir deinen Kamelkäse (sorry musste sein) mal angewöhnen.
Wobei ich da eher PascalCase bzw UpperCamelCase bevorzugen würde, weil es einfach mehr Sinn macht, jedes Wort im Variabelnnamen konsequent groß zu schreiben.
Und nicht, im Gegensatz zu jeder Ähnlichkeit zur deutschen Rechtschreibung, das erste Wort klein und den Rest Groß schreiben.

Erinnert mich zu sehr an aSsIsChReIbStIl :)
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe Probleme, Dich zu verstehen. Wieso tust Du Dir das alles an? Man ‚zwingt‘ Dich, Tools zu nutzen, die üblichen Standards sagen Dir nicht zu … alles doof!

Schon mal überlegt, das einfach sein zu lassen? Als Landschaftsgärtner musst du bestimmt kein Eclipse nutzen und Du musst Dich nicht mit so blöden Styleguides herum plagen.
Oder Dachdecker? Maurer? Gibt so viele tollen Berufe. Irgend etwas wird Dir bestimmt mehr Spaß machen und hat weniger (in Deinen Augen) sinnloses Zeug.

Nur mal so als Denkanregung.
 

berndoa

Top Contributor
Also ich habe im Prinzip keinen Plan, wie man laut euch euren Clean Code und eure OOP machen soll.
Es ist ja schon in 8 Klassen verteilt, teilweise auch in mehr wenn mans drauf anlegt.
Und ohne die this Verweise sehe ich nicht, wie das funktionieren soll.

yep, von IDE, maven und Co. halte ich nicht viel, notepad++ und konsole tut eigentlich was es soll.
Wozu einem die Uni nötigt, so einen Quark zu benutzen wo man erst mal 20 einstellungen machen muss bevor man eine klasse bauen kann...
keine Ahnung.

Warum ich es mir antue?
Weil ich offensichtlich programmieren will (teilweise wohl auch muss) und mir nicht noch mehr Probleme antun will als die die mir der Kompiler schon zum Lösen entgegen wirft.
Da will ich mich doch nicht in eine IDe und Kram noch einarbeiten müssen den ich eh nur benutzen werde weil die dolle Uni es so will.

Braucht man doch keine IDE dazu, jeder Depp, weiß wie man das Grundgerüst einer Klasse schreibt mit Attributen, (optionaler) Main Methode und (optionalen) Konstruktoren sowie Methoden.

Brauche ich keine IDE, der ich 20 Sachen einstellen muss für jede Kleinigkeit.


geht einem dann halt masslos auf den Sack wenn man nach einer simplen Lösung für bspw. das Schwarzweiss Einlesen eines simplen Zeichens sucht und die google Vorschläge dann anfangen von wegen, man solle eclipse, maven und rotz installieren und die ersten 20 Schritte sich nur drum drehen, irgendeinen Msit in den unnötigen Programmen einzustellen, irgendwelche dependencies und respirotires einzurichten, etc.

Würde meinen geilen Arsch verwetten, dass das auch in stinknormalem Java geht, also wozu sich mit unnötigem Extrraprogrammen rumärgern?

Ausser Leuten heir im Forum sit mir im Übrigen noch keiner begegnet, der auch nur einen Fick auf den "Styleguide" gegeben hat.
Da juckte es bisher keinen ob der Hund nun groß oder klein oder sonstwie geschrieben wurde.

steht es so da, ist es ein Attribut.
Ist ne Klammer dahinter (), ist es ne Methode.
Simple Merkregel.

Genauso nervig wie die Masterhacker Nerds, die meinen man müsste ihr meises Linux, Unix und Whatnix benutzen wo man für jeden Dreck einen Konsolenbefehl braucht.
 
Y

yfons123

Gast
Brauche ich keine IDE, der ich 20 Sachen einstellen muss für jede Kleinigkeit.
du kannst sicher rechtsklick => java project => und eine klasse erstellen

das sollte noch im rahmen des möglichen sein

Genauso nervig wie die Masterhacker Nerds, die meinen man müsste ihr meises Linux, Unix und Whatnix benutzen wo man für jeden Dreck einen Konsolenbefehl braucht.
nein man braucht nicht für jeden quatsch einen konsolen befehl, es ist schlichtweg schneller ( deswegen haben die masterhacker nerds jetzt auch powershell UND integriertes linux terminal auf windows und integrierten subkernel oder wie das ding heißt )

zusätzlich mal so nebnbei erwähnt ist es eifnacher eine konsolen anwendung zu bauen und dann darauf eine GUI zu zimmern
dann hat man sogar beides was läuft ( so programmier ich meine spiele ) hab mir extra eine ingame konsole dafür gebaut

Ist ne Klammer dahinter (), ist es ne Methode.
einspruch euer ehren, willkommen bei methoden referenzen

Da juckte es bisher keinen ob der Hund nun groß oder klein oder sonstwie geschrieben wurde.
ist es nicht genau das was dich so gestört hat bei den ganzen github projekten die so furchtbar waren? vllt liegt es ja daran
 
Zuletzt bearbeitet von einem Moderator:

mihe7

Top Contributor
Also ich habe im Prinzip keinen Plan, wie man laut euch euren Clean Code und eure OOP machen soll.
Es ist ja schon in 8 Klassen verteilt, teilweise auch in mehr wenn mans drauf anlegt.
Nur weil Code in Klassen aufgeteilt wurde, heißt das nicht, dass objekt-orientiert programmiert wurde. Bei Deinem Code kommt erschwerend hinzu, dass Du durch die static-Methoden kaum Objekte hast.

yep, von IDE, maven und Co. halte ich nicht viel, notepad++ und konsole tut eigentlich was es soll.
Das muss jeder selbst wissen, womit er am besten zurechtkommt. Wenn ich fürs Forum schreibe, verwende ich üblicherweise vim, Browser für JavaDocs, jshell und ggf. noch Maven.

Brauche ich keine IDE, der ich 20 Sachen einstellen muss für jede Kleinigkeit.
Wovon sprichst Du? IDE runterladen, installieren bzw. entpacken, ausführen. Dort neues Java-Projekt (musst ja kein Maven verwenden, wenn Du nicht willst) anlegen, ansonsten Klassen schreiben, Run. Ich wüsste nicht, was man da großartig einstellen müsste.

irgendwelche dependencies und respirotires einzurichten, etc.
Naja, statt in einer pom.xml einfach eine Abhängigkeit zu deklarieren, musst Du halt hergehen und Dir die Jar(s) besorgen und auf der Befehlszeile in den Classpath einbinden. Da gehts je nach Lib dann los, dass die von zig anderen abhängig ist.

Kleines Beispiel: PDFBox. Je nachdem, was Du haben willst, brauchst Du Apache Commons Logging (obligatorisch), dann natürlich noch log4j, für die Verschlüsselung Bouncy Castle, für die Schriften fontbox, für XMP xmpbox und für bestimmte Bildformate nochmal extra Bibliotheken. Ich hab jetzt nicht nachgeschaut, ob die Libs wiederum Abhängigkeiten haben aber es ist völlig klar, dass das Zusammensuchen (natürlich in der richtigen Version) der Jars kein Zuckerschlecken ist.

Da ist mir Maven lieber, zumal man in der Regel über die IDE die Lib gleich suchen kann. Ein Repository musst Du nur einrichten, wenn Du irgendeine Lib hast, wo die Maintainer meinen, den Spaß nicht im central maven repo zu veröffentlichen oder wenn Du selbst eines "hosten" willst (z. B. im Firmennetz).

Würde meinen geilen Arsch verwetten, dass das auch in stinknormalem Java geht,
Natürlich geht das, das Zeug nimmt Dir einfach Arbeit ab, aber wenn Du drauf stehst, kannst Du alles mit low-level-Befehlen erledigen.

Ausser Leuten heir im Forum sit mir im Übrigen noch keiner begegnet, der auch nur einen Fick auf den "Styleguide" gegeben hat.
Da juckte es bisher keinen ob der Hund nun groß oder klein oder sonstwie geschrieben wurde.
Dann läufst Du aber blind durch die Gegend und kennst seltsame Leute. Google mal nach irgendeinem Java-Beispiel, dann wirst Du zu 99 % auf eines treffen, das sich zumindest überwiegend an den Styleguide hält.

Neben der Tatsache, dass Styleguides die Zusammenarbeit erleichtern hat die übliche Schreibweise von Bezeichnern auch einen praktischen Sinn: man erkennt sofort, ob man es mit einer Variablen, einer Konstanten oder einem Referenztyp zu tun hat. Was die Methodennamen betrifft: Methoden "tun" etwas, so dass der Name üblicherweise aus einem Verb besteht oder mit diesem beginnt. Insofern entspricht dies sogar unserer Rechtschreibung: das Verb heißt setzen und nicht Setzen.

steht es so da, ist es ein Attribut.
Ist ne Klammer dahinter (), ist es ne Methode.
Könnte auch eine lokale Variable oder Konstante sein.

Nehmen wir mal xyz.b() - ist das xyz nun eine Variable, eine Konstante oder eine Klasse bzw. Typ?
 

KonradN

Super-Moderator
Mitarbeiter
Es wurde schon recht viel geschrieben. Vielleicht nur noch ein Punkt, den ich in den Antworten noch nicht gesehen habe:

Nur weil irgendwelche Tutorials oder Beschreibungen ganz am Anfang mit der Installation einer IDE und ggf. einzelnen Einstellungen anfangen, bedeutet dies eben nicht, dass dies immer notwendig ist. Das ist ja eine einmalige Sache. Wenn Du einmal eine Entwicklungsumgebung installiert hast, dann musst Du die ja kein 2te, 3tes oder ntes mal installieren.

Und die ganze Sicht ist dann für uns recht deutlich:

Und gerade, wenn Deine Projekte ganz ohne jegliches Drumherum funktionieren sollen, müssten Maven und Gradle Dir sehr sympathisch sein. Du brauchst nur das Projekt und kannst dann schon loslegen. (Abhängigkeit zu Java bleibt natürlich noch). Selbst auf der Kommandozeile. Und das ohne beschreiben zu müssen, wie etwas aufzurufen ist (Wie machst Du das? Du hast dann irgend welche Scripte selbst geschrieben? Oder tippst Du jedes Mal von Hand alles ein?)

Besonders interessant finde ich, dass man Ratschläge als Quatsch abgetan werden. Die Ratschläge kommen aber ja nicht, weil die Welt schön und toll ist und wir nur einfach Bock darauf haben, jemanden zu ärgern. Auslöser ist und bleibt ja, dass es etwas gibt, das so sehr störte, so dass im Forum um Hilfe gefragt wurde.

Dieser "Quatsch" hindert uns daran, Deinen Code zu verstehen. Dadurch bekommst Du keine Beispiel, wie man Deinen Code sinnvoll umstellen kann.

Und eine kurze Einrichtung der Entwicklungsumgebung hätte nicht viel Zeit gekostet. Es kostet natürlich Zeit, sich damit vertraut zu machen, aber das sind ja alles "Fixkosten". Nach X Stunden ist es vorbei. Aber die Unterstützung nimmt einem ständig Arbeit ab. Also selbst wenn es nur wenige Minuten sind - so man viel Zeit mit Software Entwicklung verbringt, wird sich das automatisch rechnen. Die Probleme bei der Umstellung jetzt müssten das doch etwas deutlich gemacht haben: Wie oft hast Du den Compiler angeworfen und hast Fehler bekommen ehe Du dann soweit warst, dass es wieder übersetzte? Jeder dieser Aufrufe wäre unnötig gewesen - eine Entwicklungsumgebung zeigt sowas direkt an, also kein Wechsel zwischen Anwendungen, Aufruf des Compilers, Warten auf Ergebnisse um diese dann auszuwerten. Refactorings hätten auch massiv bei der Umstellung geholfen. Da macht die IDE einiges für einen. Ist aber etwas, an das man sich heran tasten muss. Irgend etwas in eine neue Klasse verschieben ist dann kein Thema und geht deutlich vereinfacht. Die Hinweise kommen halt, weil wir diese Erfahrungen schon gesammelt haben.

Und dann ist wirklich die Frage: Wenn du wirklich glaubst, dass das, was wir hier doch eigentlich alle sagen, Quatsch ist (Wozu es doch eigentlich nur zwei Möglichkeiten gibt: Wir sind böse und lügen Dich an oder wir haben absolut keine Ahnung!): warum hältst Du daran fest, hier nach Hilfe zu suchen. Da wir immer wieder zu den gleichen Punkten kommen, wird das doch so nie etwas.

Und mein Post in #29 war nicht böse gemeint. Diese Frage ist wirklich wichtig. Willst Du wirklich Deine Zeit mit Dingen verbringen, die Dich nicht interessieren? Vorlesungen, dessen Inhalt so sehr Quatsch ist, dass man nicht einmal den Namen behält. Inhalte sind auch schnell wieder vergessen. Das ist dann doch eine massive Zeitverschwendung. Und ich kann mir da auch gerade nicht vorstellen, dass Dir dies Spass macht. Und vor allem würde ich behaupten, dass Du mit der Einstellung auch nicht wirklich gut im Beruf wärst, wenn es um Softwareentwicklung geht. Einem Feld, in dem immer mehr eigenständiges Arbeiten mit einem "open Mindset" gefragt ist. Wo vorausgesetzt wird, dass jeder Einzelne auch dazu lernen will. Interesse an neuen Technologien hat. Stichwort "agiles Arbeiten". Immer mehr Firmen steigen auf SAFe um (und ich habe das Glück, in einem Projekt zu sein, bei dem die Firma danach arbeitet). Das sind Fragen, die da wirklich aufkommen bei mir und nichts, was ich Dir vor den Latz knallen will um Dich runter zu ziehen. Ich habe halt auch vor Augen, dass Du da ja etwas lernst, was hinterher Dein Beruf wird. und 30 - 40 Jahre so einen "Quark" zu nutzen wird Dich nicht glücklich machen fürchte ich. Aber das geht mich nichts an - ich sollte aufhören mir über sowas den Kopf zu zerbrechen!
 

berndoa

Top Contributor
Es wurde schon recht viel geschrieben. Vielleicht nur noch ein Punkt, den ich in den Antworten noch nicht gesehen habe:

Nur weil irgendwelche Tutorials oder Beschreibungen ganz am Anfang mit der Installation einer IDE und ggf. einzelnen Einstellungen anfangen, bedeutet dies eben nicht, dass dies immer notwendig ist. Das ist ja eine einmalige Sache. Wenn Du einmal eine Entwicklungsumgebung installiert hast, dann musst Du die ja kein 2te, 3tes oder ntes mal installieren.

Und die ganze Sicht ist dann für uns recht deutlich:

Und gerade, wenn Deine Projekte ganz ohne jegliches Drumherum funktionieren sollen, müssten Maven und Gradle Dir sehr sympathisch sein. Du brauchst nur das Projekt und kannst dann schon loslegen. (Abhängigkeit zu Java bleibt natürlich noch). Selbst auf der Kommandozeile. Und das ohne beschreiben zu müssen, wie etwas aufzurufen ist (Wie machst Du das? Du hast dann irgend welche Scripte selbst geschrieben? Oder tippst Du jedes Mal von Hand alles ein?)

Besonders interessant finde ich, dass man Ratschläge als Quatsch abgetan werden. Die Ratschläge kommen aber ja nicht, weil die Welt schön und toll ist und wir nur einfach Bock darauf haben, jemanden zu ärgern. Auslöser ist und bleibt ja, dass es etwas gibt, das so sehr störte, so dass im Forum um Hilfe gefragt wurde.

Dieser "Quatsch" hindert uns daran, Deinen Code zu verstehen. Dadurch bekommst Du keine Beispiel, wie man Deinen Code sinnvoll umstellen kann.

Und eine kurze Einrichtung der Entwicklungsumgebung hätte nicht viel Zeit gekostet. Es kostet natürlich Zeit, sich damit vertraut zu machen, aber das sind ja alles "Fixkosten". Nach X Stunden ist es vorbei. Aber die Unterstützung nimmt einem ständig Arbeit ab. Also selbst wenn es nur wenige Minuten sind - so man viel Zeit mit Software Entwicklung verbringt, wird sich das automatisch rechnen. Die Probleme bei der Umstellung jetzt müssten das doch etwas deutlich gemacht haben: Wie oft hast Du den Compiler angeworfen und hast Fehler bekommen ehe Du dann soweit warst, dass es wieder übersetzte? Jeder dieser Aufrufe wäre unnötig gewesen - eine Entwicklungsumgebung zeigt sowas direkt an, also kein Wechsel zwischen Anwendungen, Aufruf des Compilers, Warten auf Ergebnisse um diese dann auszuwerten. Refactorings hätten auch massiv bei der Umstellung geholfen. Da macht die IDE einiges für einen. Ist aber etwas, an das man sich heran tasten muss. Irgend etwas in eine neue Klasse verschieben ist dann kein Thema und geht deutlich vereinfacht. Die Hinweise kommen halt, weil wir diese Erfahrungen schon gesammelt haben.

Und dann ist wirklich die Frage: Wenn du wirklich glaubst, dass das, was wir hier doch eigentlich alle sagen, Quatsch ist (Wozu es doch eigentlich nur zwei Möglichkeiten gibt: Wir sind böse und lügen Dich an oder wir haben absolut keine Ahnung!): warum hältst Du daran fest, hier nach Hilfe zu suchen. Da wir immer wieder zu den gleichen Punkten kommen, wird das doch so nie etwas.

Und mein Post in #29 war nicht böse gemeint. Diese Frage ist wirklich wichtig. Willst Du wirklich Deine Zeit mit Dingen verbringen, die Dich nicht interessieren? Vorlesungen, dessen Inhalt so sehr Quatsch ist, dass man nicht einmal den Namen behält. Inhalte sind auch schnell wieder vergessen. Das ist dann doch eine massive Zeitverschwendung. Und ich kann mir da auch gerade nicht vorstellen, dass Dir dies Spass macht. Und vor allem würde ich behaupten, dass Du mit der Einstellung auch nicht wirklich gut im Beruf wärst, wenn es um Softwareentwicklung geht. Einem Feld, in dem immer mehr eigenständiges Arbeiten mit einem "open Mindset" gefragt ist. Wo vorausgesetzt wird, dass jeder Einzelne auch dazu lernen will. Interesse an neuen Technologien hat. Stichwort "agiles Arbeiten". Immer mehr Firmen steigen auf SAFe um (und ich habe das Glück, in einem Projekt zu sein, bei dem die Firma danach arbeitet). Das sind Fragen, die da wirklich aufkommen bei mir und nichts, was ich Dir vor den Latz knallen will um Dich runter zu ziehen. Ich habe halt auch vor Augen, dass Du da ja etwas lernst, was hinterher Dein Beruf wird. und 30 - 40 Jahre so einen "Quark" zu nutzen wird Dich nicht glücklich machen fürchte ich. Aber das geht mich nichts an - ich sollte aufhören mir über sowas den Kopf zu zerbrechen!
Hoffentlich kommst du mir nicht gleich wie so eine gewisse professorin an der Uni und willst wir weismachen dass "Netzwerken" das wichtigste Skill überhaupt als Programmierer ist.
Nicht Können, nicht Wissen, nicht Programmiererfahrung.
Nö, Smalltalken und Quatschen und Tratschen können ist angeblich wichtiger als Alles Andere :-D

Aber gut, war auch Sozioinformatik.
Das "Soziale" steht da schon in Namen, kein Wunder dass da die professorin auch insgeheim eine Art Sozialtherapeut ist :)

Egal, genug gelästert und unbeliebt gemacht.
Werde mir das Intellj mal angucken.
Vielleicht taugts ja was :)
 

KonradN

Super-Moderator
Mitarbeiter
Ich will Dir gar nichts weismachen. Aber einfach einmal eine einfache Frage: Wie meinst Du, dass Du zu Wissen kommst? Um dann dieses Wissen umzusetzen um Erfahrung zu bekommen. Und damit Dein Können zu erweitern?

Im Augenblick scheint mir, dass Dir da auch nichts anderes einfällt als "Netzwerken", "Quatschen", "Tratschen", ...

Nutz, was Du für richtig hältst um dieses Wissen zu bekommen. Niemand will dir Weismachen, dass dieses Forum dazu geeignet ist. Eher im Gegenteil! Ich denke, wir haben Dir schon viele Quellen genannt. Hast Du denn irgendwelche Bücher gelesen? Lehrvideos geschaut (Kurse, YouTube, ...) ...

Ja, auch Vorlesungen sind geeignet, sich Wissen anzueignen und die Übungen dienen dann dazu, dass man Erfahrung und Können durch praktizieren bekommt.

Irgend welche Alternativen wirst Du hoffentlich haben. Dann nutz diese doch einfach!
 

berndoa

Top Contributor
Ich will Dir gar nichts weismachen. Aber einfach einmal eine einfache Frage: Wie meinst Du, dass Du zu Wissen kommst? Um dann dieses Wissen umzusetzen um Erfahrung zu bekommen. Und damit Dein Können zu erweitern?
Google.Oder hier fragen um dann zu hören dann man MAven, IDEs und Co. nutzen soll.
Oder irgendweöchen Cleancode Kram, wo man offenbar nichts lesen kann wenn es nicht in perfekter 8unlogischer) Großund Kleinschreibung gemäß Java Conventions ist.

Werd mir mal den Java Kurs von udemy angucken, ist vermutlich das einzig sinnvolle derzeit.
und versuchen zu verstehen wie die Lambda Ausdrücke funktionieren :)
 

mihe7

Top Contributor
Offensichtlich eine Klasse oder ein objekt einer klass
Also handelt es sich bei xyz entweder um eine Klasse, eine Variable oder eine Konstante :)

Der gemeine Java-Entwickler ist an den Styleguide gewöhnt und liest hier sofort eine Variable. Würde da Xyz stehen, liest er einen Typ (z. B. Klasse) heraus und weiß damit auch, dass b() eine statische Methode sein muss. Bei XYZ ist es nicht ganz eindeutig (im Kontext des Codes wird es das aber zumeist), in der Regel kennzeichnet das aber eine Konstante.

Nebenbei: ohne IDE müsstest Du jetzt das Suchen anfangen, weil Du nicht weißt, ob Du in den Variablen/Konstanten der Klasse oder bei anderen Klassen nachschauen musst.

Apropos IDE: eine weitere Konvention ist, nur eine top-level Klasse pro .java-Datei zu haben. Ansonsten findest Du ohne IDE praktisch gar nix mehr (grep lässt grüßen).

Wenn ich nachher mal Zeit habe, komme ich auch wieder auf das ursprüngliche Thema zurück, schließlich hattest Du oben schon einiges beschrieben. Damit sollte man ja nun was anfangen können.
 

KonradN

Super-Moderator
Mitarbeiter
Wenn dieses objektorientierte Entwickeln abgelehnt wird, dann ist es natürlich auch möglich, darauf zu verzichten. Das ist ja ein Paradigma, das man nicht berücksichtigen muss.

Da auch bisher von denKlassen entweder nur eine oder gar keine Instanz erzeugt wurde, wird das sehr einfach:
- Alle Instanzvariablen public static machen. Damit ist von überall her der Zugriff möglich.
- Da der Klassenname noch relativ lang ist: Hier evtl. einfach alle Variablen in eine Klasse Var oder VAR schieben.
- Zugriff erfolgt dann immer mit VAR.NameDerVariablen

Dann kannst Du Deine Methoden auch gut in mehrere Klassen Unterteilen. Alle Methoden sind dann natürlich auch am besten public static.

So kannst Du dann relativ frei alles so machen, wie Du es willst. Durch die Unterteilung kannst Du dann die Methoden beliebig verschieben, ohne dass da viel Aufwand entsteht. Wenn du Dir angewöhnst, Methoden immer mit Klassenname zu schrieben, dann wäre es ein einfaches suchen und ersetzen über allen Dateien.

Du kannst dann auch sehr schön Dinge kapseln wenn Du das irgendwo doch möchtest. Du kannst ja irgendwelche Variablen in einer Klasse unterbringen mit Modifier "private". Dann kann auf diese Daten nur von den Methoden dieser Klasse zugegriffen werden.

Vielleicht ist das einfach die Programmierung, die dir so vorschwebt. Das wäre halt kein Prozedural entwickelt. Und da gibt es dann auch ein Tutorial auf Youtube zu. Pongo oder so. @mihe7 wird das bestimmt auch kennen und kennt ggf. auch den Link dazu.
 

KonradN

Super-Moderator
Mitarbeiter
Ja, würde ich niemandem empfehlen, der an Java interessiert ist (und da dann das objektorientierte lernen möchte).

Aber wenn diese ganzen Dinge abgelehnt werden, dann sehe ich da prinzipiell kein Problem. Damit wird Java zu einer prozeduralen Sprache. Die Klassen werden zu dem, was man sonst Module nannte. So wäre da gerade mein Ansatz. Die Ansätze, die wir bisher vorgeschlagen wurden, wurden ja in keiner Weise angenommen, so dass weitere Versuche in der Richtung eher nicht zielführend sein dürften.
 
Y

yfons123

Gast
alles "Fixkosten". Nach X Stunden
also für den "standard kram" braucht eclipse folgenden aufwand
=> installieren
=> schriftart einstellen

der rest ist ja schon drin und da zumindest das was man als hobby braucht ( wer fxclipse installiert hat mein mitleid :D )

n kann wenn es nicht in perfekter 8unlogischer) Großund Kleinschreibung gemäß Java Conventions ist.
die groß und klein schreibung wurde von den entwicklern festgelegt zb c# hat die klammern in der nächsten zeile was auch sinn macht weil du sonst gar nix mehr lesen kannst weil der aufbau der syntax der sprache in verbindung mit den konventionen sind

zb hat c# auch methoden groß geschrieben, hat java nicht obwohl beide das gleiche da machen

das problem ist wenn jemand der 4 jahre oder mehr mit java hantiert deinen code liest und groß geschriebene methoden sieht steht der erstmal auf dem schlauch

und der sinn von clean code ist es code maximal lesbar zu machen ( und noch mehr ) und da gehören konventionen dazu
 

berndoa

Top Contributor
Ja, würde ich niemandem empfehlen, der an Java interessiert ist (und da dann das objektorientierte lernen möchte).

Aber wenn diese ganzen Dinge abgelehnt werden, dann sehe ich da prinzipiell kein Problem. Damit wird Java zu einer prozeduralen Sprache. Die Klassen werden zu dem, was man sonst Module nannte. So wäre da gerade mein Ansatz. Die Ansätze, die wir bisher vorgeschlagen wurden, wurden ja in keiner Weise angenommen, so dass weitere Versuche in der Richtung eher nicht zielführend sein dürften.
Ich mag wohl blind sein aber abgesehen von "Beachte Camelcase" habe ich da irgendwie noch nicht viel konkretes rausgelesen, gerade auch wie ich es objektorientiert schreiben könnte (was ja Thema eigentlich ist).

Kann von mir aus hübsch und brav überall vielsagende Namen für Variabeln und Methoden benutzen und die komsichen Camelcase Regeln umsetzen, an meinem eigentlichen this Problem ändert das leider nichts.
Wobei es per se nicht mal ein Problem ist (Programm läuft ja), aber halt wohl nicht objektorientiert ist.
Wobei ich mittlerweile nicht mehr im geringsten durchblicke was genau denn diese Objektorientierung sein soll, von der immer geredet wird.
Mir ist mal noch kein beispiel begegnet wie man es groß besser machen könnte.

Klar, static kann raus und ich habe halt in der Hauptklasse referenzen auf objekte der ganzen anderen Klassen.

Mein Grund problem, wenn ich bspw. der Methode einer 2. Klasse ein int attribut übergebe, das ich das da drin nicht ändenr kann, besteht halt weiterhin.

Ich blicks mittlerweile nicht mehr, ich höre zwar über "Objektorientiert programmieren!" aber was das nun kopnkret heißen soll, weiß ich nicht.
ich habe im prinzip einen durchgehenden programmablauf, der sich auch suepr in nem Fliessdiagramm schreiben lassen würde.
nur sinds dann halt 700+ Zeilen Code mit zig Methoden.
Darum habe ich es halt ausgelagert, klar, im Sinne von Modul oder so.
Alles was nicht zwingend in der Hauptklasse gemacht werden muss, wurde ausgelagert.
 

KonradN

Super-Moderator
Mitarbeiter
In #3 habe ich klare Vorschläge gegeben, was man denn zu eigenständigen Objekten zusammen fassen könnte ...

in #10 habe ich dann noch einmal etwas aufgezeigt, wie sowas aussehen könnte.

Deine Erläuterungen in #11 waren teilweise leicht verwirrend. Du hast zwar versucht, die einzelnen Variablen etwas zu erläutern, aber aus der kurzen Erläuterung konnte ich jetzt nicht wirklich ableiten, was da genau gespeichert wird und welcher Art da die Zugriffe sind.

Daher blieb es vor allem bei den allgemeinen Aussagen, wobei #10 ja schon etwas aufzeigt, wie sowas aussehen würde.

Dann wurde leider abgewichen, aber das durchaus zu Recht, denn auch wenn Du es bisher nicht wahr haben willst: Viele der angesprochenen Punkte würden sehr helfen, dass wir Dir besser helfen können. Derzeit ist es recht hart zu verstehen, was die Abläufe sind. Man muss in mehreren Dateien schauen, wo eine Variable verwendet wird um dann aus den zugewiesenen Werten schlau zu werden.

Aber vielleicht können wir einfach das Vorgehen etwas an einem konkreten Beispiel vorstellen. Du hast ja etwas, das den Einsatz steuert.
Dazu hast Du ja ein Array mit Werten erstellt:
int[] einsbut={10,50,100,200,500,1000,2500,5000,10000,50000,100000};

Vorgehen ist, dass Du Einsätze festlegst. Dabei gehst Du auf Farbe.

Wenn eine Farbe 7 Mal nicht gekommen ist, dann setzt Du 10 auf diese Farbe.
Wenn die Farbe 8 Mal nicht gekommen ist, dann setzt Du 50 auf diese Farbe.
...
Bis Du 100.000 setzt.

Das habe ich verstanden. Es gibt die Farben ROT und SCHWARZ. Gibt es noch andere Möglichkeiten? (Ich kenne mich da absolut nicht aus. War da nicht etwas mit einer Neutralen Zahl? Zero?)

Und was passiert dann erst einmal? Du hast eine Sammlung von Ziehungen. Da interessiert nur die Farbe oder willst Du da alles erfassen? Was gibt es denn da genau?

Und dann geht man hin und schaut sich sozusagen an, womit man da hantiert:
- Man hat Farben. Also sowas wie enum Color { RED, BLACK, ZERO }.
- Du hast dann Ergebnisse, Würfe, wie auch immer da das eigentliche Wort ist. Das hat eine Farbe und eine Zahl. Also baut man sowas:
public class RouletteResult { private int number; private Color color; ..... }
- Dann brauchst Du eine ErgebnisListe. Da hast Du dann sowas wie eine Queue von Ergebnissen. Da dies vergangene Dinge sind, nennen wir es einfach mal History. Es gibt eine maximale Anzahl von Ergebnissen, die Du speichern willst. Und dann kannst Du da Ergebnisse Hinzufügen: add(RouletteResult). Aber Du kannst auch abfragen, wie viele Würfe ein Ergebnis her ist. int lastResult(Color). - Da gehst Du halt durch die Queue bis Du die angegebene Farbe hast.

Und dann kannst Du die Taktik als Klasse bauen. Und da kannst Du dann einfach ein Array mit Deinen Einsätzen geben. Der Index ist die Anzahl der Würfe bis zu der Farbe:
0 -> Kein Einsatz (0)
1 -> Kein Einsatz (0)
2 -> Kein Einsatz (0)
...
6 -> Kein Einsatz (0)
7 -> 10
8 -> 50
...

Für die Taktik brauchen wir jetzt Wetteinsätze. Dazu müssen wir die erst einmal beschreiben. Wir gehen nur auf Farbe, daher haben wir hier eine Klasse, die nur eine Farbe und einen Einsatz hat.
Damit kann die Taktik nun einfach vorgehen:
Für jede Farbe holt sie sich aus der History die Anzahl der Würfe, die diese Farbe nicht geworfen wurde.
Diese Zahl wird als Index verwendet. Wenn die Zahl größer ist als der Index, dann ist der Einsatz xyz (musst Du festlegen!)
Wenn der ermittelte Einsatz > 0 ist, wird in eine Liste mit Wetteinsätzen ein neuer Wetteinsatz gepackt aus Farbe, Einsatz.

Damit haben wir hier eine einfache Klasse Tactic. Damit diese aber funktionieren kann, braucht diese die History. Also verlangen wir, dass beim Konstruktor diese mit angegeben wird.

Somit haben wir diese Logik schnell und einfach beschrieben.Die lässt sich so schon schnell aufbauen. Und wir haben eine Aufteilung:
- Enum Color
- RouletteResult
- History
- Tactic

Jede Klasse ist für sich nicht wirklich komplex. Jede Klasse ist doch eigentlich so überschaubar, oder?
 

mihe7

Top Contributor
Wobei ich mittlerweile nicht mehr im geringsten durchblicke was genau denn diese Objektorientierung sein soll, von der immer geredet wird.
Nachdem ich im Forum des öfteren über das Pong-Tutorial gelästert habe und sich irgendwann einmal die Gelegenheit durch eine Forenfrage bot, sah ich mich seinerzeit dazu genötigt, mal mögliche Gedankengänge einer OO-Sicht niederzuschreiben: https://www.java-forum.org/thema/wie-man-einfache-spiele-programmieren-kann.189417/

Nachtrag: jetzt kam @KonradN schon mit einer OO-Beschreibung für Dein Roulette dazwischen. Das Beispiel aus dem Link brauchst Du also nicht mehr :)

Ich habe im prinzip einen durchgehenden programmablauf, der sich auch suepr in nem Fliessdiagramm schreiben lassen würde.
nur sinds dann halt 700+ Zeilen Code mit zig Methoden.
Ja und im Sinne der OO würdest Du z. B. den Kern der Anwendung, also den Spieler mit seiner Strategie, vom Rest trennen. Das Roulette selbst ist dann ein Implementierungsdetail.
 

AndiE

Top Contributor
Wie der Name sagt, geht es um Objekte- genauer um Datenobjekte. Die Anweisungen, die wir als "class" erstellen, sind aber im Grunde genommen nur Vorlagen, aus denen mit "new" Objekte erstellt werden. Dabei lasse ich jetzt bewusst "static" raus.

Wenn ich aufrufe

Hund h= new Hund("Hasso,14);

Dann bedeutet das, das ich ein Objekt h der Klasse Hund anlege, in dem h.name="Hasso ist und h.weight=14. Die Klassendefinition ist natürlich denkbar einfach und ich brauche sie hier nicht hinzuschreiben.

Wenn ich jetzt wissen als Pfleger in der Klasse Keeper will, wieviel Futter Hasso braucht, und sage, dass er 20 % seines Körpergewichtes braucht, würde ich etwa aufrufen.

Java:
Keeper k= new Keeper;
k.meat(h);

und in 

class Keeper{

public float meat{Hund h){
return  (float)h.weight*0.2;
}

Die Frage ist doch, wieso sollte die Methode meat das Gewicht des Hundes weight ändern? Das ist doch, was du willst, oder?
 
Y

yfons123

Gast
@berndoa versteht halt noch nicht dass man nur ein problem sieht und für die lösung nur 1 mal X braucht

bei solchen skripten die von a > b > c durchlaufen sieht man es halt nicht immer
wenn du mal javafx oder mit unity was gemacht hast dann funktioniert die philosophie von a > b > c einfach nimmer

du hast halt dann ein a > b > b > b> b> c problem
natürlich kann man zb
Java:
     for(int i=0;i<respi.et.length;i++){
            System.out.println();
            System.out.println();
            System.out.println("et["+i+"]="+respi.et[i]+", ft["+i+"]="+respi.ft[i]);
            System.out.println();
            System.out.println();
und dann denkst dir kacke "will jetzt eine textarea" dan nmusst du den code 6 mal ändern
und auch die ganzen anderen out.printlns die du rein gebacken hast , geht dir das nicht auf die nerven wenn du es dann 10 mal ändern musst?

und zusätzlich durch den ganzen code schaufeln musst ob du nichts vergessen hast und durch alle dateien einzeln


ich kann dir sogar ein real life beispiel nennen wo mir das passiert wäre
public void ResetInput()
{
InputFieldManager.SetFocus();
InputFieldManager.ResetText();
}
hier hab ich mein input feld von einer GUI die swing ähnllich ist umgeändert auf die neue und da ist das alte set focus nicht mehr gegangen und das alte resettext auch nimmer

jetzt musste ich es NUR in der Klassee vom inputmanager ändern und schon hat es wieder überall funtkioniert
mein inputmanager hat nur 30 zeilen code also gleich gefunden und gleich gelöst
[field: SerializeField] private InputFieldManager InputFieldManager { get; set; }
das ist eine property und keine statische methode... also psssscht!!!
 

berndoa

Top Contributor
Ich habe mal, hoffentlich aussagekräftiger als vorher, meinen Variabeln neue Namen gegeben und hoffentlich überall die CamelCase Sachen richtig angewendet (Also Variabeln und Methoden so: meinHausIstGruen, Klassenname: MeinHausIstGruen)
Ich weiß, vermutlich viel zu viele Import Anweisungen. Habe aber keinen Plan mehr was ursprünglich wofür nötig war (Codeteile zum Großteil Copy+Paste aus Internetprogrammen).
Daher sicherheitshalber mal überall alle imports reinkopiert.

Hier die Klassen:
Realspiel
Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;










public class Realspiel {
    int leerDrehen=7;
  
    final long scriptStartTime = System.nanoTime(); 
    long timeStampForClickToClickDuration=0;
    long currTimeStamp=scriptStartTime;

    int winningsSoFar=0;
    int lastBetAmountOnColor=0;
    int lastBetAmountOnZero=0;
    String lastBetOnColor=null;
  
    String[] listOfTheLastDrawnColors=new String[16]; //Array der letzten 16 gezogenen Farben, looping
    public int indexOfLastDrawnColorInList=15;//index of the last drawn color
  
    int[] listOfAllBetStacksForColor,listOfAllBetStacksForZero; //nächste Einsätze et=Farbe, ft=Null
  
    int[] listeAuswaehlbareEinsaetze={10,50,100,200,500,1000,2500,5000,10000,50000,100000};
    //entspricht {0.1,0.5,1,2,5,10,25,50,100,500,1000}; in Cents
    Robot bot = new Robot();
  

  
    Map EZP = new HashMap(); //einsätze->index
  
    Map VTK = new HashMap(); //index->einsätze
  
    int indexDesErstenSichtbarenEinsatzbuttons=2;//left most position of the visible wheel right now, 5 pos visible at once
  
  
  
  
  
  
    public static void main(String[] args)throws AWTException, InterruptedException, Exception{
      
        //Disable scaling??
        //System.setProperty( "sun.java2d.uiScale", "1.0" );

      
        //Start Timetracking
        Realspiel a=new Realspiel();
      
      
    }
  
  
    public Realspiel() throws InterruptedException, AWTException, Exception{
                listOfAllBetStacksForColor=new int[17];
                listOfAllBetStacksForZero=new int[17];
      
                LoginLogout.preparations(this);
                System.out.println("Vorbereitungen komplett!");
                TimeFunctions.timeInfo(this);
                Thread.sleep(3000);
                run();
    }
  
  
  
    public void run() throws InterruptedException, AWTException, Exception{
        while(true){
            RundenManagement.eineRunde(this);
        }
    }
  
  
  
  
}


Rundenmanagement:

Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;






public class RundenManagement{
  
//Managed Alles was in einer Runde passiert

    public static void eineRunde(Realspiel respi) throws Exception{
      
            rundeBisDreh(respi);
            try{
                Thread.sleep(2200);
            }
            catch (Exception e){}
            respi.currTimeStamp=System.nanoTime();
      
            //WarteBisDrehEnde();
            doUpdatesAfterRoll(respi);
            TimeFunctions.sleepTillTarget(respi.timeStampForClickToClickDuration,6800);
            System.out.println("Die Gewinne betragen nach dieser Runde insgesamt "+respi.winningsSoFar+" Cent!");
    }
  
  
  
    public static void rundeBisDreh(Realspiel respi) throws InterruptedException, AWTException, Exception{
        //einsätze für aktuelle runde auffarbfelder und null platzieren
        //einsätze leeren sicherheitshalber
        int lastStreakLength=ColorManagement.getStreakLength(respi);
      
        String color="R";
        if(ColorManagement.getCurrColor(respi).equals("R")){
            color="S";
        }//only change color if it is red
      
        respi.lastBetOnColor=color;
        int restAmountToBetOnColor= respi.listOfAllBetStacksForColor[lastStreakLength];
        int restAmountToBetOnZero= respi.listOfAllBetStacksForZero[lastStreakLength];
        respi.lastBetAmountOnColor=restAmountToBetOnColor;
        respi.lastBetAmountOnZero=restAmountToBetOnZero;
  
        //nur für Testzwecke eingefügt, wieder löschen!!!!
        //restAmountToBetOnColor=290;
        //restAmountToBetOnZero=120;
      
      
        System.out.println("Einsätze für diese Runde sind: Farbe="+restAmountToBetOnColor+", Null="+restAmountToBetOnZero);
        //bet on zero with restAmountToBetOnZero
        // bet with restAmountToBetOnColor on the opposite of what col is
        //dont bet at all if restAmountToBetOnColor and restAmountToBetOnZero are equal to zero, aka their product is zero
      
      
        //einsätze leeren
        Klickmanagement.click(respi,"del");
      
        respi.timeStampForClickToClickDuration=System.nanoTime();
      
        //falls es eine nullrunde ist
        if(restAmountToBetOnColor+restAmountToBetOnZero==0){
            //rollbutton klicken
            Klickmanagement.click(respi,"dreh");
            LoginLogout.timeEndGameCheck(respi);
            return;
        }
        //place the bets and press the roll button
        int aktuellAusgewaehlterEinsatz=0;
        System.out.println("restAmountToBetOnColor="+restAmountToBetOnColor+", restAmountToBetOnZero="+restAmountToBetOnZero+", aktuellAusgewaehlterEinsatz="+aktuellAusgewaehlterEinsatz);
        TimeFunctions.timeInfo(respi);
        for(int i=respi.listeAuswaehlbareEinsaetze.length-1;i>=0;i--){
            aktuellAusgewaehlterEinsatz=Integer.parseInt (respi.VTK.get(i)+"");
            //System.out.println("Vor einsatzclick!");
            //click einsatzclick(i)
            if((restAmountToBetOnColor>=aktuellAusgewaehlterEinsatz)||(restAmountToBetOnZero>=aktuellAusgewaehlterEinsatz)){
                Klickmanagement.einsatzClick(respi,i);
            }
            else{
                continue;
            }
            //System.out.println("Nach einsatzclick!");
            while(restAmountToBetOnColor>=aktuellAusgewaehlterEinsatz){
                //farbe klicken
                //System.out.println("restAmountToBetOnColor Schleife!");
                Klickmanagement.click(respi,color);
                restAmountToBetOnColor=restAmountToBetOnColor-aktuellAusgewaehlterEinsatz;
                //System.out.println("Placed "+temp+" on "+color+"!");
                //System.out.println("restAmountToBetOnColor now only "+restAmountToBetOnColor);
            }
            while(restAmountToBetOnZero>=aktuellAusgewaehlterEinsatz){
                //null klicken
                Klickmanagement.click(respi,"Z");
                restAmountToBetOnZero=restAmountToBetOnZero-aktuellAusgewaehlterEinsatz;
                //System.out.println("Placed "+temp+" on Z!");
                //System.out.println("restAmountToBetOnZero now only "+restAmountToBetOnZero);
            }         
        }
      
      
        if(restAmountToBetOnColor+restAmountToBetOnZero!=0){
            System.out.println("Something went horribly wrong while placing the bets!");
        }
        Klickmanagement.click(respi,"dreh");
    }
  
  
  

  
  

  

    public static void doUpdatesAfterRoll(Realspiel respi) throws InterruptedException{
        ColorManagement.addColor(respi,ColorManagement.getResult(respi));
      
        //do the winning math
        String a=ColorManagement.getCurrColor(respi);
        respi.winningsSoFar=respi.winningsSoFar-respi.lastBetAmountOnColor-respi.lastBetAmountOnZero;
        if(a.equals("Z")){
            respi.winningsSoFar=respi.winningsSoFar+36*respi.lastBetAmountOnZero;
            System.out.println("Gewonnen mit Z und "+(35*respi.lastBetAmountOnZero)+" Gewinn!");
            LoginLogout.timeEndGameCheck(respi);
        }
        else if((a.equals(respi.lastBetOnColor))){
            respi.winningsSoFar=respi.winningsSoFar+2*respi.lastBetAmountOnColor;
            System.out.println("Gewonnen mit "+respi.lastBetOnColor+" und "+respi.lastBetAmountOnColor+" Gewinn!");
            LoginLogout.timeEndGameCheck(respi);
        }
      
      
    } 
      
      
      
  
  
}


Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;




public class ColorManagement{
  
    public static void initColors(Realspiel respi){
        for(int i=0;i<respi.listOfTheLastDrawnColors.length;i++){
            respi.listOfTheLastDrawnColors[i]="U";
        }
    }
  
  
  
    //fertig
    public static void addColor(Realspiel respi,String color){
        respi.indexOfLastDrawnColorInList=  (respi.indexOfLastDrawnColorInList>=1) ? (respi.indexOfLastDrawnColorInList-1) : (respi.indexOfLastDrawnColorInList+respi.listOfTheLastDrawnColors.length-1);
        respi.listOfTheLastDrawnColors[respi.indexOfLastDrawnColorInList]=color;
    }
  
  
    //fertig
    public static String getCurrColor(Realspiel respi){
        return respi.listOfTheLastDrawnColors[respi.indexOfLastDrawnColorInList];
    }
  
  
  
    //fertig?
    public static int getStreakLength(Realspiel respi){
        int length=0;
        String lastDrawnColor=getCurrColor(respi);
        int index=respi.indexOfLastDrawnColorInList;
        if(lastDrawnColor.equals("U")){
            return 0;
        }
      
        while(length<respi.listOfTheLastDrawnColors.length){
            //indexnext=(index+1) mod 16;
            if(respi.listOfTheLastDrawnColors[index].equals(lastDrawnColor)){
                length++;
            }
            else{
                break;
            }
            index=(index<=respi.listOfTheLastDrawnColors.length-2) ? (index+1) : (index-respi.listOfTheLastDrawnColors.length+1);
          
        }
        return length;
    }
  
  
  
  
  
  
    //fertig?
    //Farbe von Bildschirm ablesen
  public static String getResult(Realspiel respi) throws InterruptedException {
            respi.currTimeStamp=System.nanoTime();
          String res="U";
          
          
          for(int i=0;i<500;i++){
                res=resultHelp(respi);
                if(!(res.equals("U"))){
                    System.out.println("***********************************Farbe "+res+" erkannt!******************************************");
                    return res;
                }
                try{
                    Thread.sleep(10);
                }
                catch(Exception e){}
            }
          
          
              
            System.out.println("Error in getResult!Nach 500 Versuchen nichts gefunden!");
            return "";
              
  }
  
  
  
  

    public static String resultHelp(Realspiel respi) throws InterruptedException{
                int r=0;
                int g=0;
                int b=0;
                Color color=null;
                String string=new String();
          
                //1200,210 bis 1236,210
                for(int x=1200, y=210; x<=1236;x++){
                    string="";
          color = respi.bot.getPixelColor(x,y);
                      
                    b=color.getBlue();
                    g=color.getGreen();
                    r=color.getRed();
                  
                    string=string+"B"+b+"G"+g+"R"+r;
                    if(b>=80){
                        System.out.println(string+"daher S!");
                        return "S";
                    }
                    else if(r>=80){;
                        System.out.println(string+"daher R!");
                        return "R";
                    }
                    else if(g<80){
                        continue;
                    }
                    else{
                        System.out.println(string+"daher Z!");
                        return "Z";
                    }
                      
                      
                  
                  
                    //1370,105 bis 1418,105
                  
                    //RGB alle unter 30->nichts
                    //R>80, bg<80->rot
                    //rgb alle >80->schwarz aka B>80
                    //g>80, br<80->Null
                  
                }
                return "U";
    }
  
  
  
  
      
    public static void printColors(Realspiel respi){
        int length=0;
        int index=respi.indexOfLastDrawnColorInList;
        String colors="";
      
        while(length<respi.listOfTheLastDrawnColors.length){
            colors=colors+respi.listOfTheLastDrawnColors[index]+" ";
          
            index=(index+1<=respi.listOfTheLastDrawnColors.length-1) ? (index+1) : (index-respi.listOfTheLastDrawnColors.length+1);
            length++;
          
        }
        System.out.println("aktuelle Farben: "+colors);
    }
  
  
  
  
  
  
  
}

Klickmanagement:

Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;




public class Klickmanagement{
  
    //Alles was Klicken angeht
  
    //Hilfsfunktion
    //fertig
    public static void einsatzClick(Realspiel respi, int indexDesZuKlickendenEinsatzes) throws Exception{
        int diff=indexDesZuKlickendenEinsatzes-respi.indexDesErstenSichtbarenEinsatzbuttons;
      
        if((diff<0)&&(respi.indexDesErstenSichtbarenEinsatzbuttons==respi.listeAuswaehlbareEinsaetze.length-5)){
                click(respi,"linksdreh");
                //Linksdreh;
                respi.indexDesErstenSichtbarenEinsatzbuttons--;
                diff++;
            }
              
        while((respi.indexDesErstenSichtbarenEinsatzbuttons<respi.listeAuswaehlbareEinsaetze.length-5)&&(diff!=0)){
            if(diff<0){
                click(respi,"linksdreh");
                //Linksdreh;
                respi.indexDesErstenSichtbarenEinsatzbuttons--;
                diff++;
            }
            if(diff>0){
                click (respi,"rechtsdreh");
                //Rechtsdreh;
                respi.indexDesErstenSichtbarenEinsatzbuttons++;
                diff--;
            }                 
        }
        diff=indexDesZuKlickendenEinsatzes-respi.indexDesErstenSichtbarenEinsatzbuttons;//now diff tells us which of the buttons 0-4 should be used
      
        click(respi,"eins"+diff);
    }
  
  
  
      
    public static void click(Realspiel respi, String nameOfButtonToBeClicked) throws Exception{
        int x=0;
        int y=0;
        switch(nameOfButtonToBeClicked){
            case "linksdreh":
                x=570;y=675;
                break;
              
            case "rechtsdreh":
                x=950;y=675;
                break;

            case "eins0":
                x=630;y=675;
                break;
              
            case "eins1":
                x=695;y=675;
                break;

            case "eins2":
                x=760;y=675;
                break;

            case "eins3":
                x=825;y=675;
                break;
              
            case "eins4":
                x=890;y=675;
                break;
              
            case "R"://rot
                x=995;y=460;
                break;         
              
            case "S"://schwarz
                x=1010;y=615;
                break;         
              
            case "Z"://null
                x=350;y=530;
                break;

            case "del"://Einatz löschen
                x=1110;y=675;
                break;         
              
            case "dreh"://drehen button
                x=1207;y=680;
                break;
          
            default:
                System.out.println("Default Case erreicht!");
                throw new Exception("We somehow got into the click default case! This was the input: "+nameOfButtonToBeClicked+" !");

        }
      
        //add random offset
        x=x+((int) (Math.random() * 7-3));
        y=y+((int) (Math.random() * 7-3));
      
        //hier eigentlichen click ausführen
    respi.bot.mouseMove(x, y);   //ggbfls. mit custom funktion ersetzen
        respi.bot.delay(100);
    respi.bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        respi.bot.delay(100);
    respi.bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
        //System.out.println("string a="+a+"; x="+x+"; y="+y);
        Thread.sleep(100);
    }
  

  
}

ExcelReader:


Java:
import java.io.File;
import java.io.IOException;

import org.jopendocument.dom.spreadsheet.MutableCell;
import org.jopendocument.dom.spreadsheet.Sheet;
import org.jopendocument.dom.spreadsheet.SpreadSheet;



import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;






public class ExcelReader{
  
// Alles zum Einlesen der Exceldatei
  
    //Ab hier ODS Kram (Einsätze aus Openoffice Tabelle ablesen)
    //#GameVorbereitung
    public static void einsaetzeEinlesen(Realspiel respi){
            File file = new File("C:\\Users\\...\\Exceldateiname.ods");

                      
             Sheet sheet;
                      
              try {
             //Getting the 0th sheet for manipulation| pass sheet name as string
             sheet = SpreadSheet.createFromFile(file).getSheet(0);
            
             //Get row count and column count
             int nColCount = sheet.getColumnCount();
             int nRowCount = sheet.getRowCount();

             System.out.println("Rows :"+nRowCount);
             System.out.println("Cols :"+nColCount);
             //Iterating through each row of the selected sheet
             MutableCell cell = null;
                         //bei 7 mal LeerDrehen
                         for (int i=0;i<respi.leerDrehen;i++){
                             respi.listOfAllBetStacksForColor[i]=0;
                             respi.listOfAllBetStacksForZero[i]=0;                           
                         }
                      
                         for(int i=respi.leerDrehen;i<17;i++){
               cell = sheet.getCellAt(3, i-respi.leerDrehen+3);
                             respi.listOfAllBetStacksForColor[i]=(int)(100*Double.parseDouble((cell.getValue()+"")));
               cell = sheet.getCellAt(4, i-respi.leerDrehen+3);
                             respi.listOfAllBetStacksForZero[i]=(int)(100*Double.parseDouble((cell.getValue()+"")));
                         }                   
                          

            } catch (IOException e) {
              e.printStackTrace();
            }
                      
                        return;
                      
    }
  
  
  
}

LoginLogout:

Java:
//for opening Browser
import java.lang.Runtime;



import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;





public class LoginLogout{
  
//    Alles was vor dem eigentlichen Spiel oder danach passiert
  

/********************************
Ab hier Vorbereitungen***********
*********************************/
  
  

  
    public static void preparations(Realspiel respi)throws InterruptedException, AWTException, Exception{
        respi.currTimeStamp=System.nanoTime();
      
        ColorManagement.initColors(respi);
        ExcelReader.einsaetzeEinlesen(respi);
        einsaetzeposprep(respi);
      
        openBrowser(respi);
      
        //Do Login
        loginCheck(respi);
      
        TimeFunctions.sleepTillTarget(respi.currTimeStamp,40000);
      
    } 
  
  
  
  
  
  
  
    //#GameVorbereitung
  public static void einsaetzeposprep(Realspiel respi){//bei Spielstart alle möglichen Einsätze hinterlegen

        for(int i=0;i<respi.listeAuswaehlbareEinsaetze.length;i++){
            respi.EZP.put(respi.listeAuswaehlbareEinsaetze[i],i);
            respi.VTK.put(i,respi.listeAuswaehlbareEinsaetze[i]);
        }
  
  
        /*
      
        EZP.put(0.1,0);
        EZP.put(0.5,1);
        EZP.put(1,2);
        EZP.put(2,3);
        EZP.put(5,4);
        EZP.put(10,5);
        EZP.put(25,6);
        EZP.put(50,7);
        EZP.put(100,8);
        EZP.put(500,9);
        EZP.put(1000,10);
      */
    }


/********************************
Ab hier Loginkram****************
*********************************/



  //Browser öffnen 
    //GameVorbereitung
    public static void openBrowser(Realspiel respi){//Browser öffnen duh
        respi.currTimeStamp=System.nanoTime();
        try{
          String[] cmdBefehl=new String[]{"cmd", "/c","start chrome https://google.de//porn"};
          
            //String[] a=new String[]{"cmd", "/c","start chrome"};
          Runtime.getRuntime().exec(cmdBefehl); 
            TimeFunctions.sleepTillTarget(respi.currTimeStamp,6000);
      }
      catch(Exception e){
        }
    }
  
      
  
  
    public static void login(Realspiel respi){
        try{
          
            //Passwort eingeben
            int x=760+((int) (Math.random() * 7-3));
            int y=476+((int) (Math.random() * 7-3));
          
            //klick in passwortfeld
            respi.bot.mouseMove(x, y); 
            respi.bot.delay(100);
            respi.bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            respi.bot.delay(100);
            respi.bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
          
            //alte Eingabe löschen
          
            //select all
            respi.bot.keyPress(KeyEvent.VK_CONTROL);
            respi.bot.delay(100);
            respi.bot.keyPress(KeyEvent.VK_A);
            respi.bot.keyRelease(KeyEvent.VK_A);
            respi.bot.delay(100);
            respi.bot.keyRelease(KeyEvent.VK_CONTROL);
            respi.bot.delay(100);
          
            //delete content
            respi.bot.keyPress(KeyEvent.VK_DELETE);
            respi.bot.keyRelease(KeyEvent.VK_DELETE);
            respi.bot.delay(100);
          
            //hier Passworteingabe
                      
            //login Button anklicken
            x=770+((int) (Math.random() * 7-3));
            y=580+((int) (Math.random() * 7-3));
            respi.bot.mouseMove(x, y); 
            respi.bot.delay(100);
            respi.bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            respi.bot.delay(100);
            respi.bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
      
        }
        catch(Exception e){
          
        }
        TimeFunctions.sleepTillTarget(respi.currTimeStamp,5000);
      
      
    }
  
  
    public static void loginCheck(Realspiel respi){
        respi.currTimeStamp=System.nanoTime();
        try{
            Thread.sleep(2000);
        }
        catch(Exception e){}
      
        //check if login needed

        Color color=respi.bot.getPixelColor(120,115); 
        int B=color.getBlue();
        int G=color.getGreen();
        int R=color.getRed();
      
        if(B<100&&G<100&&R<100){
            login(respi);
        }
              
        return;
    }
  
  
  
  
  

/********************************
Ab hier EndGame Kram*************
*********************************/


    public static void timeEndGameCheck(Realspiel respi) {
        long diff=System.nanoTime()-respi.scriptStartTime;
        int minutes    = (int) (diff / 60000000000.0);

        if(minutes>=51){
            System.out.println("minutes="+minutes);
            //End It All!
            doEndGameStuff(respi);
        }
        return;
  }
  
  
    public static void doEndGameStuff(Realspiel respi){
      
        //switch to other window
        /*
        try
        {
            bot.keyPress(KeyEvent.VK_ALT);
            bot.delay(300);
            bot.keyPress(KeyEvent.VK_TAB);
            bot.delay(300);
            bot.keyRelease(KeyEvent.VK_TAB);
            bot.delay(300);
            bot.keyRelease(KeyEvent.VK_ALT);
            bot.delay(300);
        }
        catch(Exception exception){}
        */ 
          
        //close chrome window
    //automatically switches focus to console afterwards     
        try
        {
            respi.bot.keyPress(KeyEvent.VK_ALT);
            respi.bot.delay(300);
            respi.bot.keyPress(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_ALT);
            respi.bot.delay(300);
        }
        catch(Exception exception){}
      
        //close script via closing cmd
        try
        {
            respi.bot.keyPress(KeyEvent.VK_ALT);
            respi.bot.delay(300);
            respi.bot.keyPress(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_F4);
            respi.bot.delay(300);
            respi.bot.keyRelease(KeyEvent.VK_ALT);
            respi.bot.delay(300);
        }
        catch(Exception exception){}
          
        //now both chrome and this script are gone and done 
      

    }
      
  
  
  
  
  
  
}


TimeFunctions:


Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;






public class TimeFunctions{
  
  
// Alles rund um Zeitchecks und Sleeping
  
    public static void timeInfo(Realspiel respi){
        long diff = System.nanoTime()-respi.currTimeStamp;
        int milliseconds = (int) (diff / 1000000.0);
      
        System.out.println("About "+milliseconds+" milliseconds have passed since the last time we checked!");
      
        return;
    }
  
  
  
  
    public static void sleepTillTarget(long scriptStartTime, long targetmilliTime){
        long tosleep = 1000000*targetmilliTime-(System.nanoTime()-scriptStartTime);
        if(tosleep>10000000){//10 milliseconds
            try{
                long millis = (long) (tosleep / 1000000.0);
                Thread.sleep(millis);
            }
            catch(Exception e){}
        }
        return;
    }
  
  
  
  
  
}


Hilfskram:


Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;

import java.awt.event.InputEvent;

import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;


import java.lang.*;

//Kram für robot und Farbablesen
import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.*; 
 

import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import javax.imageio.ImageIO;




public class Hilfskram{
  
    public static void printEinsaetze(Realspiel respi){
        for(int i=0;i<respi.listOfAllBetStacksForColor.length;i++){
            System.out.println();
            System.out.println();
            System.out.println("et["+i+"]="+respi.listOfAllBetStacksForColor[i]+", ft["+i+"]="+respi.listOfAllBetStacksForZero[i]);
            System.out.println();
            System.out.println();        }
    }
  
  
    private static String toString(long nanoSecs) {
        int minutes    = (int) (nanoSecs / 60000000000.0);
        int seconds    = (int) (nanoSecs / 1000000000.0)  - (minutes * 60);
        int millisecs  = (int) ( ((nanoSecs / 1000000000.0) - (seconds + minutes * 60)) * 1000);


        if (minutes == 0 && seconds == 0)
             return millisecs + "ms";
        else if (minutes == 0 && millisecs == 0)
             return seconds + "s";
        else if (seconds == 0 && millisecs == 0)
             return minutes + "min";
        else if (minutes == 0)
             return seconds + "s " + millisecs + "ms";
        else if (seconds == 0)
             return minutes + "min " + millisecs + "ms";
        else if (millisecs == 0)
             return minutes + "min " + seconds + "s";

        return minutes + "min " + seconds + "s " + millisecs + "ms";
  }
  
}
 

mihe7

Top Contributor
@yfons123 niemand hasst static. Es passt nur nicht wirklich zum objektorientierten Paradigma, das man ja nicht verfolgen muss.

Das Problem von static Variablen: sie sind globaler, veränderlicher Zustand. Das scheint erstmal eine feine Sache zu sein, weil es ja so vieles einfacher macht. Zunächst. Bis eine gewisse Komplexität im Code erreicht wird, spätestens dann wird static zur Hölle. Du änderst was in einem Programmteil und plötzlich funktioniert ein anderer nicht mehr, der augenscheinlich überhaupt nichts damit zu tun hat aber irgendwo in den Tiefen des Codes über statische Methoden, die ihrerseits die statische Variable verwenden, dann doch verbunden ist.

Als Folge davon sind static Methoden, die mit static Variablen arbeiten, natürlich keinen Deut besser. Statische Methoden, die ohne statische Variablen auskommen, sind dagegen kein Problem. Von vielleicht ein paar OO-Junkies mal abgesehen würde niemand behaupten, dass Math.sin() etwas ganz schlechtes ist.

Und natürlich gibt es nicht nur schwarz und weiß. Java selbst hat statische Variablen, z. B. System.out. Hier hat man sich für einen Mittelweg entschieden und das funktioniert ganz gut, weil man System.out in der Regel nicht ändert. Man kann es aber ändern, um die Standardausgabe umzuleiten. Würde man aber überall im Programm System.out als Variable für irgendeine Ausgabe verwendet, dann kann man es bald einstampfen.

Solche Kompromisse findet man in Java häufiger: OO-Puristen haben seit Anfang an die primitive Datentypen in Java bemängelt, weil es ja keine Objekte sind. So what?

Man muss die Dinge eben pragmatisch angehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
Drachenbauer Wie sorge ich dafür, dass mein Spiel die ini-Datei in der Resourcen-ordner des Projektes schreibt? Allgemeine Java-Themen 5
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
M Brainstorming für mein Projekt Allgemeine Java-Themen 30
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
T log4j2 Wo liegt mein Logfile? Allgemeine Java-Themen 3
Thallius Warum läst mein replace die Klammern drin? Allgemeine Java-Themen 10
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
G Mein PDF Projekt mit iText Allgemeine Java-Themen 2
K Was ist mein Fehler? Allgemeine Java-Themen 2
itwestnet Mein Java-Programm läuft nicht in China Allgemeine Java-Themen 4
Thallius App-Sprache in der App ändern. Wo ist mein Denkfehler? Allgemeine Java-Themen 6
M Mein erstes TicTacToe :-) Allgemeine Java-Themen 3
A Applet Mein Applet verursacht Browserabsturz Allgemeine Java-Themen 8
Ollek MVC - Anwendung auf mein Projekt Allgemeine Java-Themen 18
K Wo ist mein Fehler? Allgemeine Java-Themen 21
J Mein eigener Messenger und dessen Probleme Allgemeine Java-Themen 48
C Hilfe! Mein Java mag nich mehr ganz... Allgemeine Java-Themen 11
F VideoIntro für mein Programm Allgemeine Java-Themen 2
A Wie lasse ich mein Programm als Daemon laufen? Allgemeine Java-Themen 4
A Wie liefere ich mein Java-Programm richtig aus? Allgemeine Java-Themen 10
G Entscheidungsproblem für mein Vorhaben, zwischen Java und C# Allgemeine Java-Themen 35
G Wie kann ich in mein Programm eine Updatefunktion einbauen Allgemeine Java-Themen 3
E Wie bekomme ich mein Image in das Fenster Allgemeine Java-Themen 2
V Beratung zum Bestimmen der "Mittel"(Java,Sql) mein Allgemeine Java-Themen 3
S mit welchem befehl kann ich mein programm autom. schließen Allgemeine Java-Themen 3
R Mein Applet läuft in der IDE aber nicht. Allgemeine Java-Themen 2
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
B Fehler:Mein Applet kann nicht auf zwei txt-Dateien zugreifen Allgemeine Java-Themen 2
C Warum wartet mein thread nicht? Allgemeine Java-Themen 2
F Datei auslesen - wo ist mein Fehler? Allgemeine Java-Themen 9
T läuft mein Programm schon? - wie feststellen Allgemeine Java-Themen 6
T Warum mein such-tool schneller als Windows such-tool? Allgemeine Java-Themen 5
A Wie mach ich, das mein Button schneller reagiert. Allgemeine Java-Themen 13
A mein Frame wird nicht schnell genung aktualisiert Allgemeine Java-Themen 7
G JFrame nimmt mein Image nicht Allgemeine Java-Themen 2
D Mein Bäumchen Allgemeine Java-Themen 6
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
8u3631984 Jacoco Testcoverage bei Abstracten Klassen in verschachtelten Modulen Allgemeine Java-Themen 6
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
N abstracte klassen methoden Allgemeine Java-Themen 32
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
B Problem mit meinen Klassen Allgemeine Java-Themen 6
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
F Code in Klassen bringen Allgemeine Java-Themen 4
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
F Klassen Verwendung abstrakter Klassen Allgemeine Java-Themen 9
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
D Klassen JLabels in anderen Klassen verwenden. Allgemeine Java-Themen 7
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
cool_brivk24 Klassen Klassen Aufruf Fehlgeschlagen Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Klassen Abstrakte Klassen Allgemeine Java-Themen 5
T Log4J - Deaktivierung für einzelne Klassen Allgemeine Java-Themen 7
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
Sin137 Struktur der Klassen & Package Allgemeine Java-Themen 2
G Klassen und interne Klassen Allgemeine Java-Themen 1
S Klassen übergeben Allgemeine Java-Themen 13
C Klassen und Konstruktor Allgemeine Java-Themen 2
S Classpath Wie kann ich Java-Library Klassen "verstecken"..? Allgemeine Java-Themen 4
A Java speech - 2 Klassen Allgemeine Java-Themen 1
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
V Klassenname von allen Klassen mit einer bestimmten Eigenschaft bekommen Allgemeine Java-Themen 2
B Classpath Eclipse findet importierte Klassen nicht Allgemeine Java-Themen 1
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
C Arten von Klassen Allgemeine Java-Themen 3
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben