Autor Wątek: java snake problem z ArrayList  (Przeczytany 2987 razy)

Offline marcinkk

  • Użytkownik

# Maj 05, 2013, 14:36:31
Witam, próbuje napisać grę snake. Mam kilka pytań odnośnie rysowania węża ponieważ ustawiłem że owoc rysuje się co 5 sekund, w wersji działającej chcę aby rysował się co 5 sekund lub po każdym zjedzeniu, ale to już kwestia warunków i z tym sobie poradzę. Moje pytanie brzmi jak zsynchronizować rysowanie się owocu z poruszaniem węża który będzie się np poruszać z prędkością jedną kratkę na sekundę czy te wątki nie będą się gryzły?
Jeżeli chodzi o węża to będzie go tworzył interfejs ArrayList: głowę i ogon osobno a jako argument jest klasa Coordinate z polami: x, y, numberPartBody: głowa to 3 a ogon 4.
Nie mogę wyobrazić sobie rysowania węża. Mam koncepcje że wąż ma być rysowany pętli for i w skrócie pętla przelatując przez całą tablice jeżeli trafi na cyfrę oznaczającą część ciała węża to wtedy będzie rysowała go. Ale jak jeszcze to połączyć z ArrayList?? ArrayList i tablica dwu wymiarowa z planszą maja być podczas iteracji porównywane?? Proszę o pomoc bo nie mogę sobie tego wyobrazić
Wstawiam kod i proszę o uwagi odnośnie kodu. 
Pozdrawiam
Kod: (java) [Zaznacz]
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;
 
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
/**
 *
 * @author marcin
 */
public class JavaSwingSnake extends JFrame {
 
    /**
     * @param args the command line arguments
     */
    private int widthWindow = 640;
    private int heightWindow = 480;
 
    public JavaSwingSnake() {
        setSize(new Dimension(widthWindow, heightWindow));
        setTitle("snake !!!!!!!");
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
 
    public static void main(String[] args) {
        // TODO code application logic here
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JavaSwingSnake javaSwingSnake = new JavaSwingSnake();
                ClassDrawBoard classDrawBoard = new ClassDrawBoard();
                javaSwingSnake.add(classDrawBoard);
            }
        });
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
/**
 *
 * @author marcin
 */
public class ClassDrawBoard extends JPanel {
 
    SnakeListeners snakeListeners = new SnakeListeners();
    JLabel scoreLabel;
    static JButton startGameButton;
    static JButton endGameButton;
    static JButton jButtonExit;
    BorderLayout borderLayout;
    BoxLayout boxLayout;
    BoxLayout boxLayoutButtons;
    JPanel controlPanel;
    JPanel drawPanel;
    private int sizeSquare = 20;//wielkosc kwadratu
    private int startDrawPositionX = 20;//poczatek rysowania
    private int startDrawPositionY = 20;//poczatek rysowania
    int defaultXPositionHeadSnake = 10;
    int defaultYPositionHeadSnake = 10;
    //oznaczenia cyfr w tablicy
    //0 - mur
    //1 - plansza po ktorej porusza sie waz
    //2 - owoc
    //3 - glowa weza
    //4 - ogon weza
    static final int numberOfGridCellsHeight = 21;
    static final int numberOfGridCellsWidth = 25;
    static int[][] board = new int[numberOfGridCellsHeight][numberOfGridCellsWidth];
 
    public ClassDrawBoard() {
        scoreLabel = new JLabel("score: 0");
        startGameButton = new JButton("start");
        endGameButton = new JButton("end");
        jButtonExit = new JButton("exit");
        controlPanel = new JPanel();
        drawPanel = new JPanel();
        borderLayout = new BorderLayout();
        boxLayoutButtons = new BoxLayout(controlPanel, BoxLayout.Y_AXIS);
        setLayout(borderLayout);
        add(drawPanel, BorderLayout.CENTER);
        add(controlPanel, BorderLayout.EAST);
        controlPanel.setPreferredSize(new Dimension(100, 480));
        controlPanel.add(scoreLabel);
        controlPanel.add(startGameButton);
        controlPanel.add(endGameButton);
        controlPanel.add(jButtonExit);
        drawPanel.setBackground(Color.BLACK);
        drawPanel.setPreferredSize(new Dimension(540, 480));
 
        fillBoard();
 
        endGameButton.setEnabled(false);
        startGameButton.addActionListener(snakeListeners.actionListenerButtonStart);
        endGameButton.addActionListener(snakeListeners.actionListenerButtonEnd);
        jButtonExit.addActionListener(snakeListeners.actionListenerButtonExit);
    }
 
    private void fillBoard() {
        for (int i = 0; i < board.length; ++i) {
            for (int j = 0; j < board[0].length; ++j) {
                if (i == 0) {
                    board[i][j] = 0;
                } else if (i == board.length - 1) {
                    board[i][j] = 0;
                } else if (j == 0) {
                    board[i][j] = 0;
                } else if (j == board[0].length - 1) {
                    board[i][j] = 0;
                } else {
                    board[i][j] = 1;
                }
            }
        }
    }
 
    @Override
    public void paint(Graphics graphics) {
        super.paint(graphics);
        drawBoard(graphics);
        drawSchedule(graphics);
    }
 
    private void drawBoard(Graphics graphics) {
        graphics.setColor(Color.red);
        graphics.drawRect(18, 18, 504, 424);
        for (int i = 0; i < board.length; ++i) {
            for (int j = 0; j < board[0].length; ++j) {
                if (board[i][j] == 0) {
                    graphics.setColor(Color.blue);
                    graphics.fillRect((sizeSquare * j) + startDrawPositionX,
                            (sizeSquare * i) + startDrawPositionY, sizeSquare,
                            sizeSquare);
                }
                if (board[i][j] == 2) {
                    graphics.setColor(Color.green);
                    graphics.fillRoundRect((sizeSquare * j) + startDrawPositionX,
                            (sizeSquare * i) + startDrawPositionY, sizeSquare,
                            sizeSquare, 360, 360);
                }
            }
        }
    }
 
    private void drawSchedule(Graphics graphics) {
        for (int i = 2; i < board.length - 1; ++i) {
            for (int j = 1; j < board[0].length - 1; ++j) {
                graphics.setColor(Color.darkGray);
                graphics.drawLine((j * sizeSquare) + sizeSquare, (i * sizeSquare)
                        + sizeSquare, (j * sizeSquare) + sizeSquare
                        + startDrawPositionX, (i * sizeSquare) + startDrawPositionY);
            }
 
        }
        for (int i = 1; i < board.length - 1; ++i) {
            for (int j = 2; j < board[0].length - 1; ++j) {
                graphics.setColor(Color.darkGray);
                graphics.drawLine((j * sizeSquare) + sizeSquare, (i * sizeSquare)
                        + sizeSquare, (j * sizeSquare) + sizeSquare,
                        (i * sizeSquare) + startDrawPositionY + sizeSquare);
            }
        }
        repaint();
    }
 
    static void resetGame() {
        for (int i = 1; i < board.length - 1; ++i) {
            for (int j = 1; j < board[0].length - 1; ++j) {
                board[i][j] = 1;
            }
        }
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;
 
import java.util.Random;
 
/**
 *
 * @author marcin w klasie jest losowana pozycja na ktorej ma byc wstawiony
 * owoc, owoc jest oznaczony cyfra 2 i taka cyfra jest wstawiana w odpowiednie
 * miejsce tabeli
 */
public class ClassFruit {
 
    Random random;
    int xPositionFruit;
    int yPositionFruit;
 
    public ClassFruit() {
        random = new Random();
    }
 
    void randomPositionFruit() {
        xPositionFruit = random.nextInt((ClassDrawBoard.board.length - 2)) + 1;
        yPositionFruit = random.nextInt((ClassDrawBoard.board[0].length - 2)) + 1;
        System.out.println("xPositionFruit = " + xPositionFruit);
        System.out.println("yPositionFruit = " + yPositionFruit);
    }
 
    void drawFruit() {
        ClassDrawBoard.board[xPositionFruit][yPositionFruit] = 2;
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;
 
import java.util.ArrayList;
 
/**
 *
 * @author marcin
 */
public class Snake {
 
    ArrayList<Coordinate> arrayListHead;
    ArrayList<Coordinate> arrayListTail;
 
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
 
/**
 *
 * @author marcin
 */
public class SnakeListeners  {
 
    ClassFruit classFruit = new ClassFruit();
    Timer timer;
 
    ActionListener actionListenerDrawFruit = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            ClassDrawBoard.resetGame();
            classFruit.randomPositionFruit();
            classFruit.drawFruit();
        }
    };
 
    ActionListener actionListenerButtonStart = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Object object = e.getSource();
 
            if (object == ClassDrawBoard.startGameButton) {
                ClassDrawBoard.startGameButton.setEnabled(false);
                ClassDrawBoard.endGameButton.setEnabled(true);
                classFruit.randomPositionFruit();
                classFruit.drawFruit();
                timer = new Timer(5000, actionListenerDrawFruit);
                timer.start();
            }
        }
    };
 
    ActionListener actionListenerButtonEnd = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Object object = e.getSource();
 
            if (object == ClassDrawBoard.endGameButton) {
                ClassDrawBoard.startGameButton.setEnabled(true);
                ClassDrawBoard.endGameButton.setEnabled(false);
                ClassDrawBoard.resetGame();
                timer.stop();
            }
        }
    };
    ActionListener actionListenerButtonExit = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Object object = e.getSource();
 
            if (object == ClassDrawBoard.jButtonExit) {
                System.exit(0);
            }
        }
    };
}

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Moderator
    • xion.log

# Maj 05, 2013, 14:41:53
Cytuj
Ale jak jeszcze to połączyć z ArrayList??
Nie łącz, przechowuj węża jako ArrayList par X,Y. Podczas umiejscawiania owocu będziesz musiał wtedy sprawdzać czy wylosowane pole należy do węża, co niby jest trochę wolniejsze (O(długość węża)) ale prostsze niż trzymanie jego stanu w dwóch miejscach.

Uwagi co do kodu:
//oznaczenia cyfr w tablicyUżyj enuma.
random = new Random();Wystarczy ci jeden Random na całą grę.

ArrayList<Coordinate> arrayListHead;
    ArrayList<Coordinate> arrayListTail;
Czemu aż dwie ArrayListy?
« Ostatnia zmiana: Maj 05, 2013, 14:44:21 wysłana przez Xion »

Offline marcinkk

  • Użytkownik

# Maj 05, 2013, 15:03:08
Masz rację z tym random-em, przeniosłem go z konstruktora do metody. Chciałem zrobić dwie ArrayListy ponieważ jedna miała przechowywać głowę a druga ogon węża. Nie mam koncepcji na rysowanie węża, wiem że powinienem w ArrayLiście przechowywać współrzędne X i Y węża, myślałem też o dodatkowej zmiennej aby odróżnić głowę od ogona. Mam tylko pomysł żeby stworzyć głowę o współrzędnych X i Y i w to miejsce w tablicy wstawić zmienną reprezentującą głowę, później przesuwać w ArrayLiście tą głowę i porównywać czy w tablicy na tym miejscu nie ma owocu lub nie jest mur i oczywiście każde przesunięcię w ArrayLiście przerysowywać przez przyrównanie, problem w tym że nie mam pomysłu jak to zrobić. tablica[xpos][ypos]= arrayList(xpos, ypos) a jak wstawić zmienną reprezentującą węża lub kolejne części węża.
pozdrawiam
« Ostatnia zmiana: Maj 05, 2013, 15:08:47 wysłana przez marcinkk »

Offline MatlertheGreat

  • Użytkownik

# Maj 05, 2013, 17:49:06
Co do sposobu poruszania węża ja zastosowałbym inną strategię:
Mapa jest to 2-wymiarowa tablica. Każda komórka to np. jeden piksel na ekranie. Tworzę sobie enum'a do rozróżniania typu komórki( wąż, ściana, jedzenie ). Jeżeli wąż porusza się o jedną kratkę na sekundę to co sekundę update'uję całą mapę. Jeżeli komórka jest wężem to w metodzie Update ustawiam pole lifeTime na jeden więcej( głowa ma to ustawione na 0, a więc kolejne "segmenty" węża będą miały 1, 2, 3 itp. ). Przechowuję też długość węża. Jeżeli segment ma lifeTime > snakeLength, to ustawiam typ segmentu na 0( powietrze ). W taki sposób wąż będzie miał ciągle tą samą długość i łatwo będzie zaimplementować kolizję. Znika też potrzeba tworzenia osobnych list na węża, jego głowę, jedzenie i ułatwi to renderowanie, bo po prostu "przelatujesz" po kolejnych segmentach, sprawdzasz ich typ i renderujesz to co potrzebujesz.

Mam nadzieję, że pomogłem :).
« Ostatnia zmiana: Maj 05, 2013, 17:51:33 wysłana przez MatlertheGreat »

Offline Xirdus

  • Redaktor

# Maj 05, 2013, 18:55:56
@up
Nie sądziłem, że możliwe jest tak przekombinować ;) IMO metoda z osobną listą jest bardziej intuicyjna, i nie trzeba co klatkę wywoływać metody update() dla każdego jednego pola dwuwymiarowej tablicy, z których i tak ponad 90% się nie zmienia.

wiem że powinienem w ArrayLiście przechowywać współrzędne X i Y węża, myślałem też o dodatkowej zmiennej aby odróżnić głowę od ogona.
A nie prościej mieć na głowę osobną zmienną, a w ArrayLiście przechowywać same nie-głowy?


Pseudokod jak można to wszystko prosto zrobić:
class coord
{
    int x, y;
}

coord owoc;
coord glowa;
list<coord> cialo;

/* petla glowna */
while (true)
{
    cialo.dodajNaPoczatek (glowa);
    if (cialo.size >= dlugoscWeza)
    {
        cialo.usunZKonca();
    }
    ruszGlowaISprawdzKolizje(); // m.in. z owocem i wtedy losuj mu nowa pozycje

    rysujTlo();
    rysujObrazek (obrazekOwoca, owoc.x * szerokoscKratki, owoc.y * wysokoscKratki);
    rysujObrazek (obrazekGlowy, glowa.x * szerokoscKratki, glowa.y * wysokoscKratki);
    for each (i in cialo)
    {
        rysujObrazek (obrazekWeza, i.x * szerokoscKratki, i.y * wysokoscKratki);
    }
}

Offline Xion

  • Moderator
    • xion.log

# Maj 05, 2013, 22:44:02
Cytuj
IMO metoda z osobną listą jest bardziej intuicyjna (...)
Kwestia gustu. Dla mnie metoda Matlera od razu wydała się naturalna, mimo że wcześniej o niej w ogóle nie pomyślałem.

Cytuj
A nie prościej mieć na głowę osobną zmienną, a w ArrayLiście przechowywać same nie-głowy?
A nie prościej przechowywać głowę w elemencie 0 i obsługiwać ją specjalnie tylko na poziomie
public Coord getHead() {
    return mSegments.get(0);
}
i rysowania?

Offline Veldrin

  • Użytkownik

# Maj 05, 2013, 23:14:15
Jeżeli Snake to ja polecam zastanowić się nad lepszym modelem reprezentacji świata.

hint: torus.

Offline ShadowDancer

  • Redaktor

# Maj 05, 2013, 23:15:50
IMO naturalna (dla węża) jest lista kursorowa w tablicy - nie trzeba udpatować całej tablicy.

Offline Xirdus

  • Redaktor

# Maj 05, 2013, 23:42:53
A nie prościej przechowywać głowę w elemencie 0 i obsługiwać ją specjalnie tylko na poziomie (...) i rysowania?
Głowa ma inny sprite, inny sposób poruszania się, i inną rolę w grze niż ciało węża. Wystarczająco różnic, żeby je rozdzielić. No i jak wsadzić głowę do tablicy razem z ciałem, to przy rysowaniu robi się foreach na przedziale <1,end), a nie na całej tablicy - w praktyce nie ma znaczenia, ale wiesz, elegancja ;)


Edit: o Boże przecie to tylko snake x)

Offline Xion

  • Moderator
    • xion.log

# Maj 05, 2013, 23:51:08
Cytuj
Edit: o Boże przecie to tylko snake x)
Od tego jest Warsztat, żeby dzielić włos na czworo :) Na swoje usprawiedliwienie powiem tylko, że to nie ja zacząłem ;)

Offline Veldrin

  • Użytkownik

# Maj 06, 2013, 00:32:48
@Xirdus: Snake to akurat bardzo dobry case study pisania gierek :). Niby prosta mechanika, każdy widział, grał, ale implementować wiele rzeczy można na skrajnie różne sposoby;). Do tego "elegancja" to też rzecz względna. Dziś trampki do marynarki uznawane są za eleganckie...

Offline marcinkk

  • Użytkownik

# Maj 07, 2013, 13:47:02
witam, napisałem Klasę Snake aby zobaczyć jak będzie wyglądało poruszanie węża z równoczesnym rysowaniem się owocu. Wąż porusza się co sekundę o jedno miejsce w tablicy a owoc rysuje się co 2 sekundy. namiastka głowy węza w tej chwili porusza się tylko w jednym kierunku, ale działa dobrze.
Kod: (java) [Zaznacz]
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

/**
 *
 * @author marcin
 */
public class Snake {

    int defaultXPositionHeadSnake = 10;
    int defaultYPositionHeadSnake = 10;
    Timer timer;

    public Snake() {
        ClassDrawBoard.board[defaultXPositionHeadSnake][defaultYPositionHeadSnake] = 3;
        timer = new Timer(1000, actionListener);
        timer.start();
    }

        ActionListener actionListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(ClassDrawBoard.board[defaultXPositionHeadSnake - 1][defaultYPositionHeadSnake] == 1){
                    ClassDrawBoard.board[defaultXPositionHeadSnake - 1][defaultYPositionHeadSnake] = 3;
                    ClassDrawBoard.board[defaultXPositionHeadSnake][defaultYPositionHeadSnake] = 1;
                    defaultXPositionHeadSnake--;
                }
            }
        };
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

/**
 *
 * @author marcin
 */
public class SnakeListeners {

    ClassFruit classFruit = new ClassFruit();
    Timer timer;
   
    ActionListener actionListenerDrawFruit = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            ClassDrawBoard.resetGame();
            classFruit.randomPositionFruit();
            classFruit.drawFruit();
           
        }
    };
   
    ActionListener actionListenerButtonStart = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Object object = e.getSource();
           
            if (object == ClassDrawBoard.startGameButton) {
                ClassDrawBoard.startGameButton.setEnabled(false);
                ClassDrawBoard.endGameButton.setEnabled(true);
                classFruit.randomPositionFruit();
                classFruit.drawFruit();
                new Snake();
                timer = new Timer(2000, actionListenerDrawFruit);
                timer.start();
            }
        }
    };
   
    ActionListener actionListenerButtonEnd = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Object object = e.getSource();

            if (object == ClassDrawBoard.endGameButton) {
                ClassDrawBoard.startGameButton.setEnabled(true);
                ClassDrawBoard.endGameButton.setEnabled(false);
                ClassDrawBoard.resetGame();
                timer.stop();
            }
        }
    };
    ActionListener actionListenerButtonExit = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Object object = e.getSource();

            if (object == ClassDrawBoard.jButtonExit) {
                System.exit(0);
            }
        }
    };
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsnake;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author marcin
 */
public class ClassDrawBoard extends JPanel {

    SnakeListeners snakeListeners = new SnakeListeners();
    JLabel scoreLabel;
    static JButton startGameButton;
    static JButton endGameButton;
    static JButton jButtonExit;
    BorderLayout borderLayout;
    BoxLayout boxLayout;
    BoxLayout boxLayoutButtons;
    JPanel controlPanel;
    JPanel drawPanel;
    private int sizeSquare = 20;//size square
    private int startDrawPositionX = 20;//begin position drawing
    private int startDrawPositionY = 20;//begin position drawing
    //legends:
    //0 - wall
    //1 - board on witch the snake moves
    //2 - fruit
    //3 - head snake
    //4 - tail snake
    static final int numberOfGridCellsHeight = 21;
    static final int numberOfGridCellsWidth = 25;
    static int[][] board = new int[numberOfGridCellsHeight][numberOfGridCellsWidth];

    public ClassDrawBoard() {
        scoreLabel = new JLabel("score: 0");
        startGameButton = new JButton("start");
        endGameButton = new JButton("end");
        jButtonExit = new JButton("exit");
        controlPanel = new JPanel();
        drawPanel = new JPanel();
        borderLayout = new BorderLayout();
        boxLayoutButtons = new BoxLayout(controlPanel, BoxLayout.Y_AXIS);
        setLayout(borderLayout);
        add(drawPanel, BorderLayout.CENTER);
        add(controlPanel, BorderLayout.EAST);
        controlPanel.setPreferredSize(new Dimension(100, 480));
        controlPanel.add(scoreLabel);
        controlPanel.add(startGameButton);
        controlPanel.add(endGameButton);
        controlPanel.add(jButtonExit);
        drawPanel.setBackground(Color.BLACK);
        drawPanel.setPreferredSize(new Dimension(540, 480));

        fillBoard();

        endGameButton.setEnabled(false);
        startGameButton.addActionListener(snakeListeners.actionListenerButtonStart);
        endGameButton.addActionListener(snakeListeners.actionListenerButtonEnd);
        jButtonExit.addActionListener(snakeListeners.actionListenerButtonExit);
    }

    private void fillBoard() {
        for (int i = 0; i < board.length; ++i) {
            for (int j = 0; j < board[0].length; ++j) {
                if (i == 0) {
                    board[i][j] = 0;
                } else if (i == board.length - 1) {
                    board[i][j] = 0;
                } else if (j == 0) {
                    board[i][j] = 0;
                } else if (j == board[0].length - 1) {
                    board[i][j] = 0;
                } else {
                    board[i][j] = 1;
                }
            }
        }
    }

    @Override
    public void paint(Graphics graphics) {
        super.paint(graphics);
        drawBoard(graphics);
        drawSchedule(graphics);
    }

    private void drawBoard(Graphics graphics) {
        graphics.setColor(Color.red);
        graphics.drawRect(18, 18, 504, 424);
        for (int i = 0; i < board.length; ++i) {
            for (int j = 0; j < board[0].length; ++j) {
                if (board[i][j] == 0) {
                    graphics.setColor(Color.blue);
                    graphics.fillRect((sizeSquare * j) + startDrawPositionX,
                            (sizeSquare * i) + startDrawPositionY, sizeSquare,
                            sizeSquare);
                }
                if (board[i][j] == 2) {
                    graphics.setColor(Color.green);
                    graphics.fillRoundRect((sizeSquare * j) + startDrawPositionX,
                            (sizeSquare * i) + startDrawPositionY, sizeSquare,
                            sizeSquare, 360, 360);
                }
                if (board[i][j] == 3) {
                    graphics.setColor(Color.red);
                    graphics.fillRoundRect((sizeSquare * j) + startDrawPositionX,
                            (sizeSquare * i) + startDrawPositionY, sizeSquare,
                            sizeSquare, 360, 360);
                }
            }
        }
        repaint();
    }

    private void drawSchedule(Graphics graphics) {
        for (int i = 2; i < board.length - 1; ++i) {
            for (int j = 1; j < board[0].length - 1; ++j) {
                graphics.setColor(Color.darkGray);
                graphics.drawLine((j * sizeSquare) + sizeSquare, (i * sizeSquare)
                        + sizeSquare, (j * sizeSquare) + sizeSquare
                        + startDrawPositionX, (i * sizeSquare) + startDrawPositionY);
            }

        }
        for (int i = 1; i < board.length - 1; ++i) {
            for (int j = 2; j < board[0].length - 1; ++j) {
                graphics.setColor(Color.darkGray);
                graphics.drawLine((j * sizeSquare) + sizeSquare, (i * sizeSquare)
                        + sizeSquare, (j * sizeSquare) + sizeSquare,
                        (i * sizeSquare) + startDrawPositionY + sizeSquare);
            }
        }
        repaint();
    }

    static void resetGame() {
        for (int i = 1; i < board.length - 1; ++i) {
            for (int j = 1; j < board[0].length - 1; ++j) {
                board[i][j] = 1;
            }
        }
    }
}
« Ostatnia zmiana: Maj 07, 2013, 13:49:43 wysłana przez marcinkk »