Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 10
1

Java game ошибка конца игры

24.04.2020, 13:02. Показов 513. Ответов 10

Author24 — интернет-сервис помощи студентам
Здравствуйте, подскажите, пожалуйста, как исправить проблему того, что при запуске игры выскакивает картинка конца игры, хотя она должна выскакивать только в том случае, если Змейка врежется сама в себя. (Строки с переменными конца игры: Класс логики игры: 16,160; Класс картинок и кнопок: 16,189).

Главный класс:
Java
1
2
3
4
5
public class zmeika {
    public static void main(String[] args) {
        myFrame window = new myFrame();
    }
}

Класс логики игры:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
public class game {
 
    public int[][] mas;
 
    // Текущее направление движения
    public int direction;
    // Координаты головы змейки
    private int head_X, head_Y;
    // Количество очков
    public int score;
    // Новое направление движения
    public int newDirection;
    // Длина змейки
    private int lengthOfSnake;
    // Признак окончания игры
    public boolean endGame;
 
    private void povorot() {
        if (Math.abs((newDirection - direction)) != 2) {
            direction = newDirection;
        }
    }
 
    public game() {
        // Создаем новый массив 30x30
        mas = new int[40][40];
    }
 
    // Генерация нового объекта в случайном месте
    private void make_new() {
        // Глухой (бесконечный цикл)
        while (true) {
            // Получаем случайные значения x,y от 0 до 39
            int x = (int) (Math.random() * 40);
            int y = (int) (Math.random() * 40);
 
            // Если в этом месте массива нулевое значение
            // то помещаем туда объект для поедания змейкой
            // и прерываем цикл
            if (mas[y][x] == 0) {
                mas[y][x] = -1;
                // Прерываем цикл
                break;
            }
        }
    }
 
    private void make_new_toxic() {
        // Глухой (бесконечный цикл)
        while (true) {
            // Получаем случайные значения x,y от 0 до 39
            int x = (int) (Math.random() * 40);
            int y = (int) (Math.random() * 40);
 
            // Если в этом месте массива нулевое значение
            // то помещаем туда объект для поедания змейкой
            // и прерываем цикл
            if (mas[y][x] == 0) {
 
                mas[x][y] = -3;
                // Прерываем цикл
                break;
            }
        }
    }
 
    //  Запуск игры (Старт)
    public void start() {
        // Заполняем весь массив нулями
        for (int i = 0; i < 40; i++) {
            for (int j = 0; j < 40; j++) {
                mas[i][j] = 0;
            }
        }
 
        // Начальное направление - up
        direction = 38;
 
        // Количество очков
        score = 0;
 
        // Создаем начальную змейку с длиной 5 cell
        mas[20][20] = 1;
        mas[20][21] = 2;
        mas[20][22] = 3;
        mas[20][23] = 4;
        mas[20][24] = 5;
        lengthOfSnake = 5;
 
        // Записываем в переменные координаты головы змейки
        head_X = head_Y = 20;
 
        // Признак окончания игры
        endGame = false;
 
        // Формируем первый объект для поедания змейкой
        make_new();
        make_new_toxic();
 
    }
 
    // Перемещение головы змейки
    public int peremGolova() {
        // Если текущее направление влево
        if (direction == 37) {
            if ((head_X - 1) >= 0)
                head_X--;
            else
                head_X = 39;
        }
        // Если текущее направление вверх
        else if (direction == 38) {
            if ((head_Y - 1) >= 0)
                head_Y--;
            else
                head_Y = 39;
        }
        // Если текущее направление вправо
        else if (direction == 39) {
            if ((head_X + 1) <= 39)
                head_X++;
            else
                head_X = 0;
        }
        // Если текущее направление вниз
        else if (direction == 40) {
            if ((head_Y + 1) <= 39)
                head_Y++;
            else
                head_Y = 0;
        }
 
        // Результат
        int result = 0;
 
        // Если съеден объект
        if (mas[head_Y][head_X] == -1) result = 1;
            // Если перемещение в пустую ячейку
        else if (mas[head_Y][head_X] == 0) result = 2;
            // Если попадание в туловище змейки
        else if (mas[head_Y][head_X] > 0) result = 3;
        else if (mas[head_Y][head_X] == -3) result = 4;
 
        // В место перемещения головы
        // установим значение - минус два
        mas[head_Y][head_X] = -2;
 
        // Возвращаем результат
        return result;
    }
 
    // Перемещение змейки
    public void perem() {
        // Перемещаем голову змейки
        // и получаем результат перемещения
        int flag = peremGolova();
 
        // Если змейка врезалась в себя
        // то признак окончания игры устанавливаем в истину
        if (flag == 3) endGame = true;
 
        // Два вложенных цикла, которые перебирают
        // все элементы двухмерного массива
        for (int i = 0; i < 40; i++) {
            for (int j = 0; j < 40; j++) {
                // Если значение больше нуля, то увеличиваем на 1
                if (mas[i][j] > 0) mas[i][j]++;
                    // Если значение минус два, то меняем его на 1
                else if (mas[i][j] == -2) mas[i][j] = 1;
 
                // Если не было поедания объекта
                // Если это хвост, то записываем в него нулевое значение
                if (flag != 1) {
                    if (mas[i][j] == (lengthOfSnake + 1)) mas[i][j] = 0;
                }
            }
        }
 
        // Если съеден объект
        if (flag == 1) {
            // Увеличиваем длину на единицу
            lengthOfSnake++;
            // Генерируем новый объект для поедания
            make_new();
            // Увеличиваем количество очков на 10
            score += 500;
        }
 
        if (flag == 4) {
            //lengthOfSnake--;
            make_new_toxic();
            score -= 10;
        }
        // Изменяем направление движения
        povorot();
    }
}

Класс картинок и кнопок:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
 
class myPanel extends JPanel {
 
    // Ссылка на панель
    private final myPanel panel;
 
    // Переменная для реализации логики игры
    private final game myGame;
 
    // Изображения, используемые в игре
    private Image background1, bodyOfSnake, headOfSnake, apple, toxicApple, endGame, arrows;
 
    // Надпись для количества очков
    private JLabel labelScore;
 
    // Две кнопки
    private final JButton buttonNewGame;
    private JButton buttonExit, buttonPause;
 
 
    private class myKey implements KeyListener {
        // Метод при нажатии на клавишу
        public void keyPressed(KeyEvent e) {
            // Получение кода нажатой клавиши
            int key = e.getKeyCode();
 
            // Если нажатие одной из четырех стрелочек, то
            // изменение направления змейки
            if (key == KeyEvent.VK_LEFT) myGame.newDirection = 37;
            else if (key == KeyEvent.VK_UP) myGame.newDirection = 38;
            else if (key == KeyEvent.VK_RIGHT) myGame.newDirection = 39;
            else if (key == KeyEvent.VK_DOWN) myGame.newDirection = 40;
        }
 
        public void keyReleased(KeyEvent e) {
        }
 
        public void keyTyped(KeyEvent e) {
        }
    }
 
 
    // Конструктор класса
    public myPanel() {
 
        // Помещаем ссылку на саму панель в переменную
        panel = this;
 
        // Подключение обработчика события для клавиатуры к панели
        this.addKeyListener(new myKey());
        // Делаем панель в фокусе - для приема событий от клавиатуры
        this.setFocusable(true);
 
        // Попытка загрузки всех изображений для игры
        try {
          /*  background = ImageIO.read(new File("./background.png"));
            bodyOfSnake = ImageIO.read(new File("./bodyOfSnake.png"));
            headOfSnake = ImageIO.read(new File("./headOfSnake.png"));
            apple = ImageIO.read(new File("./apple.png"));
            toxicApple = ImageIO.read(new File("./toxicApple.png"));
            endGame = ImageIO.read(new File("./endGame.png"));
            arrows = ImageIO.read(new File("./arrows.png"));
         */
            background1 = ImageIO.read(new File("c:\\Pictures for game Snake\\background1.png"));
            bodyOfSnake = ImageIO.read(new File("c:\\Pictures for game Snake\\bodyOfSnake.png"));
            headOfSnake = ImageIO.read(new File("c:\\Pictures for game Snake\\headOfSnake.png"));
            apple = ImageIO.read(new File("c:\\Pictures for game Snake\\apple.png"));
            toxicApple = ImageIO.read(new File("c:\\Pictures for game Snake\\toxicApple.png"));
            endGame = ImageIO.read(new File("c:\\Pictures for game Snake\\endGame.png"));
            arrows = ImageIO.read(new File("c:\\Pictures for game Snake\\arrows.png"));
 
        } catch (Exception ignored) {
        }
 
        // Создаем объект новой игры
        myGame = new game();
        // Запускаем игру
        myGame.start();
 
        // Создаем, настраиваем и запускаем таймер
        // для отрисовки игрового поля
        // Вызываем перерисовку - paintComponent()
        // Таймер отрисовки
        Timer tmDraw = new Timer(50, arg0 -> {
            // Вызываем перерисовку - paintComponent()
            repaint();
        });
        tmDraw.start();
 
 
        // Создаем, настраиваем и запускаем таймер для изменения
        // логики игры
        // Если не конец игры, то перемещаем змейку
        // Выводим информацию о количестве очков
        Timer tmUpdate = new Timer(100, arg0 -> {
            // Если не конец игры, то перемещаем змейку
            if (!myGame.endGame) myGame.perem();
            // Выводим информацию о количестве очков
            labelScore.setText("Score: " + myGame.score);
        });
        tmUpdate.start();
 
        setLayout(null);
 
        labelScore = new JLabel("Score: 0");
        labelScore.setForeground(Color.WHITE);
        labelScore.setFont(new Font("serif", Font.PLAIN, 30));
        labelScore.setBounds(850, 200, 150, 50);
        add(labelScore);
 
        buttonNewGame = new JButton();
        buttonNewGame.setText("New game");
        buttonNewGame.setForeground(Color.BLUE);
        buttonNewGame.setFont(new Font("serif", Font.PLAIN, 20));
        buttonNewGame.setBounds(850, 30, 150, 50);
        buttonNewGame.addActionListener(arg0 -> {
            myGame.start();
            // Забираем фокус у кнопки Новая игра
            buttonNewGame.setFocusable(false);
            // Забираем фокус у кнопки Выход
            buttonExit.setFocusable(false);
            // Отдаем фокус панели
            panel.setFocusable(true);
 
        });
        add(buttonNewGame);
 
        buttonExit = new JButton();
        buttonExit.setText("Exit");
        buttonExit.setForeground(Color.RED);
        buttonExit.setFont(new Font("serif", Font.PLAIN, 20));
        buttonExit.setBounds(850, 100, 150, 50);
        buttonExit.addActionListener(arg0 -> System.exit(0));
        add(buttonExit);
 
 
      /*  buttonPause = new JButton();
        buttonPause.setText("Pause");
        buttonPause.setForeground(Color.white);
        buttonPause.setFont(new Font("serif", Font.PLAIN, 20));
        buttonPause.setBounds(1050, 300, 150, 50);
 
        buttonPause.addActionListener(arg0 ->System.);
 
        add(buttonPause);*/
    }
 
    // Метод отрисовки
    public void paintComponent(Graphics gr) {
        super.paintComponent(gr);
 
        // Отрисовка фона
        gr.drawImage(background1, 0, 0, 1050, 850, null);
        gr.drawImage(arrows, 850, 550, 100, 85, null);
 
 
        // Отрисовка игрового поля на основании массива
        for (int i = 0; i < 40; i++) {
            for (int j = 0; j < 40; j++) {
                if (myGame.mas[i][j] != 0) {
                    if (myGame.mas[i][j] == 1) {
                        gr.drawImage(headOfSnake, 10 + j * 20, 10 + i * 20, 20, 20, null);
                    } else if (myGame.mas[i][j] == -1) {
                        gr.drawImage(apple, 10 + j * 20, 10 + i * 20, 20, 20, null);
                    } else if (myGame.mas[i][j] == -3) {
                        gr.drawImage(toxicApple, 10 + j * 20, 10 + i * 20, 20, 20, null);
                    } else if (myGame.mas[i][j] >= 2) {
                        // Выводим тело змейки
                        gr.drawImage(bodyOfSnake, 10 + j * 20, 10 + i * 20, 20, 20, null);
                    }
                }
            }
        }
 
        // Отрисовка сетки игрового поля из синих линий
        gr.setColor(Color.BLUE);
        for (int i = 0; i <= 40; i++) {
            gr.drawLine(10 + i * 20, 10, 10 + i * 20, 810);
            gr.drawLine(10, 10 + i * 20, 810, 10 + i * 20);
        }
 
        //Вывод изображения конца игры - при окончании игры
        if (myGame.endGame) {
            gr.drawImage(endGame, 315, 315, 200, 100, null);
        }
    }
}

Класс окна:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import javax.swing.*;
import java.awt.*;
 
class myFrame extends JFrame {
    // Конструктор класса
    public myFrame() {
        // Создание объекта панели и подключения ее к окну
        myPanel pan = new myPanel();
        Container cont = getContentPane();
        cont.add(pan);
 
        // Заголовок окна
        setTitle("Game \"Snake\"");
 
        // Границы окна: расположение и размеры
        setBounds(0, 0, 1050, 850);
 
        // Операция при закрытии окна - завершение приложения
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        // Запрет изменения размеров окна
        setResizable(false);
 
        // Отображение (показ) окна
        setVisible(true);
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2020, 13:02
Ответы с готовыми решениями:

Java-Game
Всем доброго времени суток!Хотел у вас спросить: я разрабатываю игру и мне интересно,как переменную...

C++ vs. Java = Строим сервер MMO Game
Здравствуйте! Давно вот брожу изучаю проекты эмуляторов под популярные MMORPG (WoW, LA2, Aion)....

Game server side: Java vs JavaScript
Всем привет. Некоторое время назад начал изучать Java, написал для себя десяток приложений,...

Прекращается работа программы Game Application во время игры в Аллоды онлайн
Здравствуйте, Уважаемые. Во время игры Аллоды онлайн появляется сообщение &quot;Прекращена работа...

10
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
24.04.2020, 15:27 2
micro2001, приветик, братец! ответь, пожалуйста, какой людям форума интерес, копаться в коде, который ты сам не понимаешь?
заранее, спасибо!
0
0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 10
24.04.2020, 15:33  [ТС] 3
Понимаю код, и по моему мнению я всё сделал правильно, но результат показывает обратное. Может кто-то заметит ошибку.
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
24.04.2020, 16:13 4
Цитата Сообщение от micro2001 Посмотреть сообщение
кто-то заметит ошибку
так, ты и сам можешь https://www.cyberforum.ru/java/thread2250765.html
0
1021 / 561 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
24.04.2020, 20:54 5
Aviz__, продебажить компоненты свинга не получится таким способом
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
24.04.2020, 21:13 6
Goongala, хорошо, не таким)) по крайней мере, это должно навести на мысль набрать в поисковике следующее:
"how to debug a swing application"
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.04.2020, 21:19 7
Goongala, почему это?
0
1021 / 561 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
24.04.2020, 21:22 8
xoraxax, ладно, можт это и можно сделать, но лучше этого не делать, пушто это очень трудозатратно. Куда разумнее внимательнее изучить код
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.04.2020, 23:23 9
Всегда вроде как обычно все дебажилось. Такая же Ява же.
0
1021 / 561 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
25.04.2020, 01:19 10
Ну, события происходят в разных потоках, к тому же иногда требуется взаимодействие с программой, что весьма неудобно
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
25.04.2020, 08:52 11
Цитата Сообщение от Goongala Посмотреть сообщение
что весьма неудобно
может ТС и такого способа не знает, в принципе. а если ему сильно НАДО, то "китайский язык" выучит за ночь, как все нормальные студенты
0
25.04.2020, 08:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2020, 08:52
Помогаю со студенческими работами здесь

В попытках написать змейку на Java (Snake (video game)
Тестовый вариант, в теории змейка из двух клеток должна &quot;пробегать&quot; вправо. Но на деле же такого не...

Сервер / Game Center для онлайн игры "Шашки"
Здравствуйте уважаемые пользователи форума. Реализовал ли кто-то из вас онлайн игры под ios?...

Сервер для игры java+php или java
Всем привет. Возник вопрос следующего характера. Знаю php и java, однако по вопросу создания...

Подробный алгоритм создания 2D игры от начала до конца
Всем привет! Есть какие нибудь обучающие видео или уроки, где показан подробный алгоритм создания...

Samsung Galaxy Nexus не может скачать игры до конца.
Здравствуйте!Такая проблема Имееться Nexus ,начинаю качать с интернета игры загрузка доходит до 99%...

Как организовать выбор фона, препятствий, начала и конца игры?
я должен написать программу которая должна &quot;возвращать&quot; .exe файл.Как в инди гейм мейкерах как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru