Beiträge von Misteradi1 im Thema „Ideen für Informatik-Präsentation“

    //update: neue version


    features:

    • einzelne schiffe per rechtsklick auf den ursprung eines schiffes löschen
    • die gewonnen/verloren benachrichtigung am ende zeigt das ergebnis an
    • keyboard shortcuts beim schiffe setzen (1-5 für schiffsgröße, "r" für reset, shift+click für ausrichtung nach unten)
    • eigene IP adresse im hauptmenü anzeigen lassen
    • möglichkeit, einen anderen look&feel für das spielfeld auszuwählen (mit windows look and feel sieht das arg blöd aus, weil dann nicht der ganze button, sondern nur die umrandung gefärbt wird)
    • look&feel menü ändert auch nachträglich das design von bereits geöffneten fenstern
    • einstellungen importieren/exportieren
    • anleitung (ist bei der version jetzt nicht dabei, weil die anleitung aus einer textdatei ausgelesen wird, die ich jetzt nicht mit hochgeladen hab - dazu hätte ich das ganze als zip hochladen müssen, das hab ich aber vergessen)

    in arbeit:

    • KI (künstliche Intelligenz bzw. computergegner)
    • schiffe per rechtsklick auf irgendeinen teil des schiffes entfernen
    • serverkonsole
    • zweites fenster, in dem angezeigt wird, welche felder der gegner bereits angegriffen hat
    • einstellungen automatisch importieren


    zur android version:
    soweit alles fertig (wenn auch sehr viel weniger reduzierter als die PC-version, man kann z.B. nicht auswählen wie viele schiffe man will, und den ganzen "customization"-luxus hab ich auch erstmal weggelassen), nur ein größeres problem hab ich noch:
    in der PC-version zeigt ein kleines panel in der ecke an, welcher spieler gerade an der reihe ist, in android wollte ich das über eine checkbox machen. problem dabei ist, dass diese checkbox laufend aktualisiert werden müsste, was auf dem UI-thread aber nicht geht, da sonst der input blockiert wird. Leider kann man die checkbox aber nicht von außerhalb des UI-threads verändern ...
    irgendwelche ideen, wie man das umgehen könnte?

    ich hab mir jetzt mal ein paar tutorials zu android studio angeschaut, ob ich dann wirklich das spiel auf android programmier überleg ich mir noch. die hauptprogrammierarbeit ist ja aber ohnehin nicht die GUI, sondern der rest :grinning_face_with_smiling_eyes:
    (was genau ist alles beim javax und sun package dabei? wenn da java NIO dazugehört, hab ich erstmal ein problem xD [bin grad am handy & kann nicht nachschauen])

    @Cheefkoch leider, so fürchte ich, werde ich nicht drum herum kommen, in naher zukunft wieder damit zu arbeiten - spätestens dann, wenn ich die größe des spielfelds variable machen will. DAS wiederum ist ohnehin eine Menge Arbeit, weil ich dann soviele ".setBounds(x,y,b,h)" im code anpassen muss, dass es mir jetzt schon graust. und dann darf ich das ganze auch noch über den server an spieler 2 weiterleiten, damit der auch die richtige spielfeldgröße hat ... wird bestimmt sehr lustig.
    naja, ich hab mir eh mal ne liste gemacht was ich noch alles ergänzen will :grinning_face_with_smiling_eyes:

    • chat
    • evtl. andere grafiken/texturen
    • KI-Spiel
    • Server umprogrammieren mit Selektoren, sodass nicht mehr 2 Threads pro Spieler laufen (bzw. wären es 3, wenn ich noch nen Chat hinzufüg)
    • veränderbare spielfeldgröße, wie gesagt
    • "hotseat"-modus: alle spieler spielen am selben PC & wechseln sich ab
    • zweites Fenster, in dem angezeigt wird, welche Felder der Gegner bisher angegriffen hat

    schon erledigt ist folgendes (im vergleich zur version, die irgendwo oben zum download steht):

    • Anzeige "Bereit" (damit man weiß, wann man an der Reihe ist)
    • Feldfarbe anpassen, also welche Farbe haben unberührte / leere / getroffene Felder
    • veränderbare Anfangsschiffzahl
    • Bei der Meldung gewonnen/verloren wird das Ergebnis angezeigt
    • anpassbarer "look and feel" (wobei das spielfeld im windows LAF total bekloppt aussieht - ein anwählen der felder ändert nicht die farbe des felds, sondern nur irgendwie die umrandung; vielleicht stell ich das spielfeld daher noch von Buttons auf ne eigene Klasse um, die eine Subklasse von JPanel ist & schon das ganze MouseEvent zeug mit drin hat. hat aber eher niedrige priorität, da lohnt sich der aufwand nicht, man kann ja einfach mit dem standard java LAF spielen ^^)

    in arbeit:

    • anleitungen an diversen stellen (wird wohl immer in arbeit sein, weil sich immer mal was ändert ^^)
    • mehr Schiffsgrößen (1x3, 1x4, 1x5)




    //edit: ich hab das spiel jetzt nochmal als aktuelle version hochgeladen; Downloadlink
    ansonsten hab ich mir überlegt, das ganze auf android noch zu machen & mal mit android studio rumprobiert. es scheint aber, dass das nicht so einfach ist, wie ich mir erhofft hatte, oder täusch ich mich da (hab nicht viel rumprobiert)? kennt sich da jemand mit aus?

    @Ginkor danke, aber lieber nicht xD
    damit hab ich schon beim spielfeldlayout rumprobiert (und letztlich dann ein GridLayout verwendet), und das hat mir gereicht xD
    ich mach das lieber von hand :grinning_face_with_smiling_eyes: (zumindest jetzt noch, vielleicht ändert sich das auch irgendwann)
    in dem fall würde es vermutlich sogar sinn machen / wäre einfacher, aber jetzt hab ich das ganze schon soweit fertig :smiling_face:
    ich häng nur grad am look & feel fest ... nichts tut, was es tun soll -.-

    Hab keine Ahnung von swing und so, aaaaber... Statt dem "Class type = ..." Gedöhns dürfte auch instanceof funktionieren, oder hab ich gerade nen Denkfehler? Also als if-Abfrage "if(panel.getComponent(i) instanceof JSlider) { ... }", vorausgesetzt du hast JSlider importiert, was ich aber definitiv machen würde.


    //e: Kommentare im Code wären super, damit man auch weiß, was du da anstellen willst. Ist immer recht schwierig sich in fremdem Code zurechtzufinden. Auch mit Beschreibung deiner Variablen und so

    ja, es geht auch mit "instanceof"; da ich das bisher noch nicht benutzt hatte (bin ja noch ziemlicher java anfänger), nur mal irgendwo gesehen, bin ich da garnicht drauf gekommen. das ist aber nicht das eigentliche problem, an dem, was in der konsole angezeigt wurde, konnte ich ja erkennen, dass jede der 4 Komponenten an die Reihe kam - nur irgendwie sche***t java auf meine gesetzen Bounds ...



    //edit: erstmal sorry, sollte sich jetzt jemand unnötig gedanken gemacht haben, aber ich habe inzwischen selbst eine Lösung gefunden: Ich hab einfach die einzelnen Komponenten zu einem "JComponent[]" Array hinzugefügt und dann den durchiteriert. Dadurch konnte ich das Panel weglassen (fällt mir grad auf - das hätte ich sowieso gekonnt ... ka warum ich das eingebaut hab), außerdem ändert jetzt z.B. setBounds nichts mehr an der Komponentenreihenfolge (bzw. theoretisch schon, aber das kann mir egal sein). Wenn ich das richtig verstanden hab, könnte ich das zwar über validate lösen, aber so geht es a) auch und b) einfacher.

    ich hab zwar die präsentation jetzt rum, aber zum spaß noch weiter damit rumprogrammiert. jetzt hab ich ein problem: im hauptmenü kann man ein frame öffnen, in dem man die anzahl der startschiffe einstellen kann (per JSlider). Das hat soweit auch funktioniert, aber mMn zuviel Platz verbraucht, deswegen wollte ich jetzt - als ich auch 3er, 4er und 5er Schiffe einbauen wollte - das ganze durch ne for-Schleife laufen lassen und dabei überprüfen, ob die Komponente die entsprechende Klasse besitzt (JTextArea oder JSlider). Leider funktioniert das ganze nicht so, wie es sollte; hier mal der Code:


    in der konsole wird ausgegeben:
    0_class javax.swing.JSlider
    1_class javax.swing.JSlider
    2_class javax.swing.JTextArea
    3_class javax.swing.JTextArea
    wenn ich das ganze jetzt starte, habe ich aber das falsche layout:

    eigentlich sollte oben die beiden JSlider sein, und mittig darunter jeweils das zugehörige JTextField.
    Hat irgendjemand eine Idee, warum das nicht so funktioniert, wie es sollte?
    Danke im Voraus :thumbs_up:


    //edit: shipChooser ist ein einfaches JFrame, mit dem außer der Deklaration bislang nichts getan wurde

    ja, die spielfeld.class mach ich noch raus, die hab ich ja letztendlich garnicht benutzt.
    suboptimal in welchem sinn? bzw. was würdest du verbessern? (klar, an einigen stellen hab ich ziemlich uneleganten code verwendet - behalt dabei aber im hinterkopf dass ich, als ich angefangen hab mit dem programm, nicht viel mehr wusste als schleifen, arrays und so grundlegenden kram.)




    PS: in der version die ich derzeit oben verlink hab kann man 5x dasselbe feld angreifen, um zu gewinnen. das hab ich in einer neuen version behoben, in der ich nur noch ein paar zusätzliche fehlermeldungen zur besseren differenzierung einbaue bevor ich sie hochlade.
    PPS: wie aufwändig wäre es, wenn ich die "System.out.println" befehle, die ich an einigen stellen verwende, in einem konsolenfenster ausgeben wollte? also ein fenster so ähnlich wie die kommandozeile?



    //edit: bezüglich dem teilweise ziemlich ungünstigen code: ich bin erstmal froh, dass ich damit fertig bin - am montag muss ich das programm fertig haben :grinning_squinting_face:

    @Cheefkoch könnt ich schon. inzwischen hab ich aber ehrlich gesagt keine lust mehr das alles zu ändern :grinning_face_with_smiling_eyes:
    funktioniert ja auch so :smiling_face:
    trotzdem danke für die tipps :thumbs_up:



    PS: gameBackground.getComponent(i) liefert die komponente mit der betreffenden nummer zurück, angefangen bei nummer 0. getComponents() liefert einen array der komponenten zurück; könnt ich hier natürlich auch verwenden und dann einen neuen array erstellen, der nur die buttons enthält, aber dazu müsste ich ebenfalls einiges umprogrammieren, was ich wie gesagt vermeiden will.
    mein hauptproblem ist derzeit eigentlich der server, damit man über LAN spielen kann (Problem im sinne von "fehlt noch" - sollte eig. nicht mehr allzu schwer sein, ich muss nur noch rausfinden wie ich zwei clients gleichzeitig anspreche (per thread, aber da ich die koordinaten als .txt speichern will, muss ich da noch was umändern damit ich zwei verschiedene dateien mit koords hab.))
    PPS: mit C.getClass() lässt sich sicher arbeiten, das werde ich dann verwenden wenn ich nochmal sowas brauch :smiling_face:



    //edit: hat jemand zufällig eine idee, wie der server den spielern mitteilen könnte, dass sie am zug sind? vielleicht per abfrage einer variablen (z.B. boolean player1 = true/false) beim server?

    sicher, ich bin auch nicht 100% mit der funktion der schleife zufrieden. wenn du mir eine andere möglichkeit nennen kannst, durch die buttons zu iterieren, nehme ich sie gerne an :grinning_face_with_smiling_eyes:
    problem ist halt, dass ich nicht für jeden button den code schreiben will, es sind immerhin 64 stück. außerdem - der code, um schiffe zu setzen hat allein schon fast 40 zeilen. wär schon arg blöd, wenn ich 40*64= 2560 zeilen code schreiben müsste :grinning_squinting_face:
    nebenbei bemerkt: "gameBackground" ist ein JPanel, auf dem nur die buttons und die JLabels angeordnet sind. alle anderen buttons, also "reset", "fertig" usw. sind daneben, direkt 'auf' dem JFrame.
    im anhang noch ein bild des betreffenden JFrames. "gameBackground" ist der grau hinterlegte Bereich.

    @Cheefkoch ich wollte nur wissen, ob es möglich ist, irgendwie den namen einer variable (bzw. eines buttons) als string zu verarbeiten. alles andere habe ich über z.B. über getComponent gelöst.

    Java
    //hier wären dann noch die betreffenden zeilen mit z.B. a1.setName("a1") bis h8.setName("h8")
    for (int i = 0; i < gameBackground.getComponentCount(); i++) {
    	if (i > 9 && i % 9 != 0) {
    		((AbstractButton) gameBackground.getComponent(i)).addActionListener(this);
    		((AbstractButton) gameBackground.getComponent(i)).setToolTipText( gameBackground.getComponent(i).getName());
    	}
    }

    die if-schleife dient dazu, die labels (die auch auf dem JPanel gameBackground befindlich sind) "auszusortieren".
    davon abgesehen - was meinst du mit


    Wenn man die Java-Docs vom JButton anschaut sieht man sofort, dass kein Konstruktor mit Tooltip existiert -> nicht möglich. Man könnte ne Wrapper Klasse für den Button schreiben, welche eine solche instanzierung beinhaltet.

    mir ist nicht ganz klar was du damit sagen willst, "JButton.setToolTipText("text")" geht nämlich. die betreffende methode ist laut javadoc von JComponent geerbt.




    //edit: nebenbei bemerkt: JButton.getName() liefert NICHT den namen, der bei der deklaration verwendet wurde, man muss zuerst über .setName("name") einen namen zuweisen. tut man das nicht, liefert .getName() "null" zurück.

    derzeit hab ich grad das problem, dass ich für eine höhere benutzerfreundlichkeit tooltips zu den einzelnen buttons hinzufügen will. Diese sollen dann den namen des entsprechenden JButtons anzeigen, z.B. der Tooltip des JButtons a1 soll "a1" anzeigen. der tooltip soll also den variablennamen anzeigen, der bei der deklaration verwendet wurde (z.B. JButton a1 = new JButton()). diversen google-ergebnissen zufolge geht das nicht - könnt ihr das bestätigen? (bzw. widerlegen)

    wohl eher nicht :grinning_face_with_smiling_eyes:
    ich studier nächstes jahr angewandte informatik, da kommt's auch dran :grinning_face_with_smiling_eyes:


    bezüglich meines "schiffe versenken" spiels: die benutzeroberfläche ist soweit fertig, derzeit bin ich grade an einem server mit mehreren threads, damit 2 clients eine verbindung herstellen können. geht wahrscheinlich auch ohne multithreading, aber ich würd gern soviel wie möglich ausprobieren :grinning_face_with_smiling_eyes:

    inzwischen bin ich ein gutes stück weiter, das programm ist jetzt soweit, dass man es starten kann, mehrere buttons zur auswahl hat, was man tun möchte (LAN-spiel, KI-spiel, Info (so ne art credits), exit).
    desweiteren habe ich eine klasse "game.java" fertig, mit der man über ein JFrame auswählen kann, wo man seine schiffe setzen möchte. nach abschluss dieses prozesses wird das ergebnis im programmordner als "ships_pos_host.txt" gespeichert (format: 1. zeile x-koordinaten, 2. zeile y-koordinaten)


    jetzt hatte ich hier mal eine kleine konzeptidee aufgestellt, wie ich das eigentliche spiel über einen server steuern würde (also ein LAN-spiel, ein KI-spiel hab ich zwar auch noch nicht, wäre aber wesentlich einfacher als die LAN-variante da alles auf einem rechner ist --> kein java.net-schei**)
    kann gut sein, dass da noch ein paar sachen fehlen, ich hab das um 22 uhr angefangen zu skizzieren, da bin ich nich mehr 100% leistungsfähig. auch nicht mehr 80% :grinning_squinting_face:
    http://www.directupload.net/file/d/4165/vutrb63l_png.htm


    jetzt meine frage: kennt sich einer von euch mit java-netzwerkprogrammierung aus & kann mir sagen, ob das so funktioniert? ich weiß nur, dass da mit sockets und pipapo irgendwie gearbeitet wird, hab mich aber noch nicht besonders ausführlich damit auseinandergesetzt. was die einspeisung der ".txt" mit den Schiffskoordinaten in das programm des anderen spielers angeht, würde ich über IO-operations einfach den text als string auslesen und dann weiterverarbeiten.


    danke im voraus


    Misteradi1




    PS: @Cheefkoch: die buttons bzw. auch die reihen/spalten beschriftungen hab ich jetzt doch per layoutmanager gemacht.
    PPS: wenn ihr zufällig wisst, wie man 64 buttons erstellt, die die bezeichnungen "a1" bis "h8" haben, ohne 64 Mal den Button zu deklarieren, 64x einen ActionListener hinzuzufügen, 64x den Button zu einem Panel hinzuzufügen und dann bei einem reset-knopf noch 64x die Buttonfarbe zurückzusetzen, die beim schiffe platzieren geändert wurde, wär das echt cool :grinning_squinting_face:
    (kurz gesagt: kann man mit einer schleife die namen der buttons hochzählen? beim schiffe platzieren hab ich die buttons über getcomponent hochgezählt, was gefühlsmäßig (ohne jetzt groß darüber nachzudenken) auch beim actionlistener, button auf panel und beim resetknopf funktioneren müsste. wenns da noch ne andere möglichkeit gäb, wär das aber echt cool, dann kann ich auch die buttons kompakter deklarieren.

    danke erstmal :smiling_face:
    dann stellt sich mir nur leider die frage, wie man eine riesige fläche mit nem gitter erstellt :grinning_face_with_smiling_eyes:
    bzw. wie nennt sich das zugehörige gui-element? ich kenn mich da leider nicht besonders gut aus - bin ja auch noch anfänger :smiling_face:
    oder meinst du einfach eine tabelle? oder das "gridLayout"? letzteres wäre ja wieder genauso unübersichtlich wie mit buttons, bzw. genau das gleiche, nur dass ich nicht extra die größe jedes buttons einzeln angeben muss.

    ich hab mich jetzt entschlossen, "schiffe versenken" zu programmieren. ich denk das krieg ich auch hin, nur eine frage - fällt euch eine elegantere lösung für die spielfeldverwaltung ein, als 64 panels, buttons oder was-weiß-ich zu erstellen?
    es geht nur um die GUI, also wie der user auswählt, welches feld er beschießen will.
    abspeichern werd ich die daten entweder in nem zweidimensionalen array oder als variablen. jedes feld auf dem spielfeld kriegt dann z.B. ne nummer in richtung "a1", "c5", "h8", etc. (feldgröße 8x8). dazu braucht es noch booleans, die z.B. abspeichern, ob ein feld schon beschossen wurde oder ob sich dort ein schiff befindet.
    schnelle antwort wär super :thumbs_up:

    theoretisch kann ich auch grundlagen von HTML/CSS, Javascript, JQuery und PHP (praktikum bei internetfirma mit homepagewartung und so zeug). muss aber ich java sein weil meine klassenkameraden in HTML grad mal listen erstellen können -.- (und die anderen genannten sprachen garnicht)
    hast du dein ticktacktoe gegen PC gegner gemacht? oder gegen andere menschen über LAN? und falls PC, mit zufälliger auswahl oder KI? ich hätt jetzt spontan nämlich keine ahnung wie ich dem PC ne akzeptable KI für TickTackToe programmieren könnte :grinning_face_with_smiling_eyes:


    @shokyo: das "lesetagebuch war eigentlich ein unterpunkt zur verwaltungssoftware & nur als notiz für mich gedacht. der unterpunkt ist beim kopieren von word in den browser aber verloren gegangen. ich hatte mir das halt so in richtung oberfläche für tabellenverwaltung gedacht, das werd ich aber wahrscheinlich eher privat mal machen, nicht jetzt als GFS. auch bedingt dadurch, dass ich ungern mit datenbanken programmier (abgesehen von so SELECT x FROM y WHERE a=b und so abfragezeugs halt)

    Hey Ho,


    da ich für Informatik für nach den Ferien noch meine GFS (ne präsentation die wie ne klausur zählt) vorbereiten muss, wollte ich mich mal an euch wenden. Problem ist, ich muss ein Programm in Java schreiben, kann aber schlecht den schwierigkeitsgrad einschätzen.
    hier mal eine liste von ideen, die ich bisher hatte:

    • TicTacToe
    • Schiffe versenken
    • Ping-Pong (Winkel in Java?)
    • Snake
    • Hangman
    • Erweiterter Taschenrechner (Wurzel, Potenz, Fakultät, Klammern, Permutation, Variantion, Logorithmus, Brüche, Winkelfunktionen, Speichern von Ergebnissen, imaginäre Zahlenbereiche, Umrechnung von Einheiten, Umrechnung von Zahlensystemen, Eingabe von physikalischen und mathematischen Konstanten ...)
    • Mensch ärgere dich nicht
    • 4 gewinnt
    • Game of Life
    • Tetris
    • Verwaltungssoftware für Bücher, Spiele, … (Datenbankeinbindung)
    • Vokabeltrainer
    • Schere-Stein-Papier
    • Stadt-Land-Fluss


    weitere ideen sind natürlich willkommen :)Was meine Programmierkenntnisse angeht: GUI-Programmierung mit Buttons/Timern/nicht-klickbaren Objekten, ansonsten so grundlegendes zeugs wie schleifen, arrays, ...
    zum schwierigkeitsgrad: vor ein paar jahren hat mal die volle punktzahl für ein chatprogramm bekommen, bei dem man auf einem PC einen server starten kann, und jeder, der im selben lan-netzwerk den client startet, kann dann in einem einzigen chatroom mit anderen reden. der PC-user mit dem server muss zum "mitreden" auch den client starten.
    wenn ich mir noch ein paar zusätzliche kenntnisse aneignen muss, sollte das kein allzu großes problem sein, ich würde aber ungern zuviel neues auf einmal lernen, da ich die nächsten 2 wochen auch noch einen ferienjob habe & daher nicht sooo viel zeit.


    danke im voraus


    misteradi1




    PS: ich würde ungern unmengen von aufwendigen texturen erstellen, wenn sich das vermeiden lässt :winking_face: