# Spiel möglichst einfach Darstellen



## Turbo Pascal (22. Okt 2008)

Hallo,
Ich bin gerade dabei mein erstes Spiel zu programmieren. Ich möchte das Spiel "Kalaha" gegen eine KI spielen. Ich habe zwar noch nicht sehr viel Erfahrung aber
man wächst ja schließlich mit dem Projekt :meld: . Doch nun habe ich ein Paar Probleme bei der Grafischen darstellung. So sieht das reale Brettspiel aus:
http://upload.wikimedia.org/wikipedia/commons/5/54/Kalaha.jpg

Es liegen ein paar Murmeln oder sonst was in 12 Mulden die ihren Inhalt während des Spieles laufend ändern. Da ich bisher nur ein wenig swing gemacht habe fällt mir die Darstellung
ein wenig schwer.


Die Murmeln lasse ich mir im Moment von der Klasse "Graphics" auf ein Glass Panel zeichnen. Die Anzahl kann ich in meinem Testprogrämmchen schon bestimmen und das Löschen erledige ich mit einem Quadrat in Farbe das Hintergrundes welches ich über den Kreis lege. Doch leider zeichne ich momentan nur Planlos auf den Frame rum. Die Kreise sollen aber später in die besagten Mulden. Meine Idee ist es den Frame mit dem GridBagLayout in ein Raster, wie im Bild oben zu sehen, zu zerlegen. Dann in jedes Kästchen ein Panel zu legen und auf das Panel dann meine Kreise evtl. mit einem Zufallsgenerator für die X- und Y Positionen. Damit die Anordnung immer verschieden ist. Villeicht aber auch überlappen.

Falls mir einer von euch sagen kann ob das so gehen könnte wäre ich echt dankbar. Oder wenn jemand eine noch bessere Idee hat, bitte melden :toll:


----------



## Fu3L (22. Okt 2008)

Das müsste so gehen, ich wüsste nix was dagegen spricht.

Allerdings weiß ich nich, ob das mit dem GridBagLayout klappt, aber das hat mich sowieso immer zum Verzweifeln gebracht :roll: Zur Not halt eine anderes oder ein null-layout nehmen und beim null-layout dann die Mulden mit Bezug auf die Fenstergröße oder die Größe des Bildschirms positionieren...


----------



## Marco13 (22. Okt 2008)

Hm. Da gibt's 1000 Möglichkeiten, aber das GridBagLayout wäre mir als letztes eingefallen :lol:
Die Positionen der Felder sind ja ziemlich regelmäßig. Das einzige, was stören würde, wären die "Häuser" am Rand, aber die gehen auch noch. 

Das ist keine Empfehlung, das so zu machen, aber wie ich es machen würde (d.h. schon fast mal gemacht habe - das war ein Programmierpraktikum bei uns im 1. Semester  ) :

Ein JPanel, das das Spielfeld zeichnet (und NUR das Spielfeld)
Drin gibt es dann ggf. eine Methode "drawAllTheBackgroundStuff" wo du das eigentliche (leere) Spielbrett malst.
Dazu dann Methoden, die eine bestimmte Steinanzahl in ein bestimmtes Loch zeichnen. Die Position, an der gezeichnet werden soll, kann dabei einfach ausgerechnet werden: Man kann ein "Gitter" über das Spielfeld legen, der Größe 8*3. In welches "Gitterfeld" man dann zeichnen muss, kann man sich aus der Nummer des Spielers und der Nummer des Loches ausrechnen - und daraus dann die x- und y-Koordinaten.

Hier mal der Codeschnipsel aus meinem Programm von damals (suboptimal, aber ... auch schon etliche Jahre alt...):

```
private void paintStones(Graphics g, int player, int pit) {
        int x=getSize().width/8; // grid size
        int y=getSize().height/3;
        if (board!=null) {
            int stones=board.getStones(player, pit);
            int xpos=0;
            int ypos=0;
            if (pit==6) {
                ypos=y;
                xpos=player*x*7;
            } else {
                if (player==1) {
                    ypos=2*y;
                    xpos=x+pit*x;
                } else {
                    ypos=0;
                    xpos=getSize().width-2*x-pit*x;
                }
            }
            if (stones>0) {
                g.drawImage(stoneImage[(stones>14?14:stones)-1],
                            xpos,ypos,this);
            }
            if (showStoneNumbers) {
                g.setFont(new Font("TimesRoman", Font.BOLD, x/4));
                g.setColor(new Color(255,196,32));
                String val=String.valueOf(stones);
                xpos+=((x/2)-(g.getFontMetrics().stringWidth(val)/2));
                g.drawString(val,xpos,ypos+y/4);
            }
        }
    }
```

Ich hatte damals Images für bis zu 14 Kugeln verwendet, aber wenn stattdessen du EIN Bild von einer Kugel n-mal an "zufälligen" Positionen zeichnen willst, könnte man die einfach "in der Umgebung von" xpos/ypos zeichnen lassen....


----------

