Untitled
unknown
plain_text
3 years ago
8.4 kB
9
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 {//заполняем цифрами.
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;
grid[5][3] = 3;
grid[4][3] = 2;
grid[3][3] = 1;
}
}
generateApple();
}
static void generateApple(){
Random r = new Random();
int i = r.nextInt(cellsX-2)+1;
int j = r.nextInt(cellsY-2)+1;
while(true){
i = r.nextInt(cellsX - 2) + 1;
j = r.nextInt(cellsY - 2) + 1;
if (grid[i][j] < 1) {
grid[i][j] = -1;
break;
}
}
}
//Такое лучше делать через 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 = 5;//положение игрока на сетке
static int playerY = 3;
static int snake_length = 1;
//функция делает один ход игрока в направлении dx dy
public void turn(int dx, int dy) {
if (grid[playerX + dx][playerY + dy] != WALL&&grid[playerX + dx][playerY + dy]!=FOOD&&grid[playerX + dx][playerY + dy]<1) {//Запрещаем ходить в стену)))00)00))00
grid[playerX + dx][playerY + dy] = grid[playerX][playerY]+1;
playerX=playerX+dx;
playerY = playerY + dy;
for(int i = 0;i<cellsX;i++) {
for (int j = 0; cellsY > j; j++) {
if (grid[i][j] > 0) grid[i][j] -= 1;
}
}
}
else if(grid[playerX + dx][playerY + dy] == FOOD){
grid[playerX + dx][playerY + dy] = grid[playerX][playerY]+1;
playerX=playerX+dx;
playerY = playerY + dy;
generateApple();
}
}
@Override
public void keyPressed(KeyEvent e) {
int ax = 0;
int ay = 0;
System.out.println(e);
System.out.println(playerX + " " + playerY);
switch (e.getKeyCode()) {
case KeyEvent.VK_W:
ax = 0; ay = -1;
break;
case KeyEvent.VK_S:
ax = 0; ay = 1;
break;
case KeyEvent.VK_A:
ax = -1; ay = 0;
break;
case KeyEvent.VK_D:
ax = 1; ay = 0;
break;
}
while(true){
turn(ax, ay);
Thread.sleep(1000/60 - len);
}
}
//магический код позволяющий всему работать, лучше не трогать
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...