Untitled

 avatar
unknown
plain_text
2 years ago
7.6 kB
3
Indexable
package ru.tutorial.other;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.util.Random;

/**
 * В играх типа "Шахматы", "Змейка", "Пошаговая РПГ ..." и других часто встречается
 * поле в виде сетки. Сетка имеет свою систему координат,
 * первая: номер столбца по горизонтали
 * втоорая: номер строки по вертикали
 * (0,0)(1,0)(2,0)----(i,0)-----------------> X
 * (0,1)(1,1)....
 * (0,2).....
 * |
 * (0,j)               Cij
 * |
 * \/ Y
 */
public class DrawingGrids extends JFrame implements KeyListener {
    //Приписка static у переменных значит что это глобальная переменная
    //Приписка final у переменных значит что это неизменяемая константа, т.е. такие переменные нельзя именять
    //размер экрана, поменяйте на ваш
    static final int w = 600;
    static final int h = 600;
    //Сетка представляется в программе в виде двумерного массива, ячеек grid (в нашем случае в ячейках будут числа)
    static final int cellsX = (w - 200) / 20;//количество ячеек по оси х и у
    static final int cellsY = (h - 200) / 20;
    static final int[][] grid = new int[cellsX][cellsY];

    static {//заполняем сетку случайными часламми  от 0 до 2
        Random r = new Random();
        for (int i = 0; i < cellsX; i++) {
            for (int j = 0; j < cellsY; j++) {
                if(i == 0||j==0||i==cellsX-1||j==cellsX-1) grid[i][j]=-2;


            }
        }
        generateApple();
    }
    static void generateApple(){
        Random r = new Random();
        int i = r.nextInt(cellsX-1)+1;
        int j = r.nextInt(cellsY-1)+1;
        grid[i][j] = -1;
    }


    //Такое лучше делать через enum, но для простоты я использую числа
    static final int AIR = 0; //was sand
    static final int FOOD = -1; //was water
    static final int WALL = -2; //was asphalt


    static final int gridX = 100;//координаты левого верхнего угла сетки
    static final int gridY = 100;
    static final int gridW = w - 200;//Шририна и высота сетки
    static final int gridH = h - 200;
    static final int cellSizeX = gridW / cellsX;// длинна стороны ячейки
    static final int cellSizeY = gridH / cellsY;


    public static void draw(Graphics2D g) {

        //чтобы нарисовать сетку нужно перебрать все её клетки
        for (int i = 0; i < cellsX; i++) {
            for (int j = 0; j < cellsY; j++) {
                //и для каждой клетки нарисовать прямоугольник нужного цвета, проще всего это сделать через switch
                switch (grid[i][j]) {
                    case AIR:
                        g.setColor(new Color(50, 67, 100));
                        break;
                    case FOOD:
                        g.setColor(Color.RED);
                        break;
                    case WALL:
                        g.setColor(new Color(117, 115, 128));
                        break;
                    default:
                        //неправильное число в сетке
                }
                if (grid[i][j] > 0) g.setColor(Color.MAGENTA);

                g.fillRect(gridX + cellSizeX * i, gridY + cellSizeY * j, cellSizeX, cellSizeY);
            }
        }
/*        //рисуем игрока поверх сетки
        g.setColor(new Color(0, 0, 0, 0.3f));//полупрозрачный круг-тень под игроком
        //g.fillOval(gridX + cellSizeX * playerX, gridY + (cellSizeY) * playerY, cellSizeX, cellSizeY);
        g.setFont(new Font("", Font.BOLD, cellSizeY));
        g.setColor(Color.MAGENTA);
        // + cellSizeY смещение вниз, т.к. тест пишется из нижней левой точки, а клетка рисуется из верхней левой
        //g.drawString("@", gridX + cellSizeX * playerX, gridY + cellSizeY * playerY + cellSizeY * 3 /4);
        g.fillRect(gridX + cellSizeX * playerX, gridY + cellSizeY * playerY + cellSizeY  ,cellSizeX, cellSizeY);
    }
*/
    }
    //давайте добавим игрока
    static int playerX = cellsX / 2;//положение игрока на сетке
    static int playerY = cellsY / 2;
    static int snake_length = 1;
    //функция делает один ход игрока в направлении dx dy
    public void turn(int dx, int dy) {

        if (grid[playerX + dx][playerY + dy] != WALL) {//Запрещаем ходить в стену)))00)00))00
            grid[playerX + dx][playerY + dy] = grid[playerX][playerY]+1;
            playerX += 1;
            playerY += 1;
            for(int i = 0;i<cellsX;i++){
                for(int j = 0;cellsY>j;j++){
                    if(grid[i][j]>0) grid[i][j] -= 1;
                }
            }

        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println(e);
        System.out.println(playerX + " " + playerY);
        switch (e.getKeyCode()) {
            case KeyEvent.VK_W:
                turn(0, -1);
                break;
            case KeyEvent.VK_S:
                turn(0, 1);
                break;
            case KeyEvent.VK_A:
                turn(-1, 0);
                break;
            case KeyEvent.VK_D:
                turn(1, 0);
                break;
        }
    }


    //магический код позволяющий всему работать, лучше не трогать
    public static void main(String[] args) throws InterruptedException {
        DrawingGrids jf = new DrawingGrids();
        jf.setSize(w, h);//размер экрана
        jf.setUndecorated(false);//показать заголовок окна
        jf.setTitle("Grid");
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.createBufferStrategy(2);
        jf.addKeyListener(jf);
        //в бесконечном цикле рисуем новый кадр
        while (true) {
            long frameLength = 1000 / 60; //пытаемся работать из рассчета  60 кадров в секунду
            long start = System.currentTimeMillis();
            BufferStrategy bs = jf.getBufferStrategy();
            Graphics2D g = (Graphics2D) bs.getDrawGraphics();
            g.clearRect(0, 0, jf.getWidth(), jf.getHeight());
            draw(g);

            bs.show();
            g.dispose();

            long end = System.currentTimeMillis();
            long len = end - start;
            if (len < frameLength) {
                Thread.sleep(frameLength - len);
            }
        }

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }


    @Override
    public void keyReleased(KeyEvent e) {

    }
}
Editor is loading...