Untitled
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...