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

Java MenuBar с настройками игры "Змейка"

28.04.2020, 17:05. Показов 585. Ответов 0

Студворк — интернет-сервис помощи студентам
Привет, не могу понять как обратиться к параметрам другого класса для их изменения при нажатия на MenuItems.

Вот класс с MenuBar в котором я хочу при нажатии на MenuItem менять параметры Змейки(скорость, фон игры и цвет линий)
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
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
 
class myFrame extends JFrame implements ActionListener {
 
    private JMenuItem speed1Item;
    private JMenuItem speed2Item;
    private JMenuItem speed3Item;
 
    private JMenuItem background1Item;
    private JMenuItem background2Item;
    private JMenuItem background3Item;
 
    private JMenuItem colorOfLines1Item;
    private JMenuItem colorOfLines2Item;
    private JMenuItem colorOfLines3Item;
 
 
    myFrame() {
        myPanel pan = new myPanel();
 
        Container cont = getContentPane();
        cont.add(pan);
 
        setTitle("Game \"Snake\"");
 
        setJMenuBarAndMenuBarItems();
 
        setBounds(0, 0, 1050, 900);
 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        setResizable(false);
 
        setVisible(true);
    }
 
    void setJMenuBarAndMenuBarItems() {
 
        JMenuBar menuBar = new JMenuBar();
 
        JMenu settingsMenu = new JMenu("Settings");
        settingsMenu.add(new JSeparator());
 
        JMenu speedItem = new JMenu("Speed of Snake");
        speed1Item = new JMenuItem("2 level");
        speed2Item = new JMenuItem("3 level");
        speed3Item = new JMenuItem("4 level");
 
 
        JMenu backgroundItem = new JMenu("Background");
        background1Item = new JMenuItem("Image 1");
        background2Item = new JMenuItem("Image 2");
        background3Item = new JMenuItem("Image 3");
 
 
        JMenu colorOfLinesItem = new JMenu("Color of lines");
        colorOfLines1Item = new JMenuItem("Black");
        colorOfLines2Item = new JMenuItem("Red");
        colorOfLines3Item = new JMenuItem("Pink");
 
 
        settingsMenu.add(speedItem);
        speedItem.add(speed1Item);
        speedItem.add(speed2Item);
        speedItem.add(speed3Item);
 
        settingsMenu.add(backgroundItem);
        backgroundItem.add(background1Item);
        backgroundItem.add(background2Item);
        backgroundItem.add(background3Item);
 
        settingsMenu.add(colorOfLinesItem);
        colorOfLinesItem.add(colorOfLines1Item);
        colorOfLinesItem.add(colorOfLines2Item);
        colorOfLinesItem.add(colorOfLines3Item);
 
        menuBar.add(settingsMenu);
        setJMenuBar(menuBar);
    }
 
    void setAction() {
        speed1Item.addActionListener(this);
        speed2Item.addActionListener(this);
        speed3Item.addActionListener(this);
 
        background1Item.addActionListener(this);
        background2Item.addActionListener(this);
        background3Item.addActionListener(this);
 
        colorOfLines1Item.addActionListener(this);
        colorOfLines2Item.addActionListener(this);
        colorOfLines3Item.addActionListener(this);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        myPanel panel = new myPanel();
 
        if (e.getSource() == "speed1Item")
            panel.tmUpdate.setDelay(50);
        else if (e.getSource() == "background1Item") ;
 
 
    }
}


Вот класс где задаются начальные параметры игры Змейка (84 строчка - скорость Змейки, и в методе paintComponent на 132 строчке задаётся фон приложения и цвет линий)
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
198
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
 
class myPanel extends JPanel {
 
    private Graphics gr;
 
    private final myPanel panel;
 
    private final game myGame;
 
    private Image background, background1, background2, background3, background4, background5, bodyOfSnake, headOfSnake, apple, toxicApple, endGame, arrows;
 
    private JLabel labelScore;
 
    private final JButton buttonNewGame;
    private JButton buttonExit, buttonPause;
 
    public Timer tmUpdate;
 
    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"));
          background1 = ImageIO.read(new File("./background1.png"));
            background2 = ImageIO.read(new File("./background2.png"));
            background3 = ImageIO.read(new File("./background3.png"));
            background4 = ImageIO.read(new File("./background4.png"));
            background5 = ImageIO.read(new File("./background5.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"));
         */
            background = ImageIO.read(new File("c:\\Pictures for game Snake\\background.png"));
            background1 = ImageIO.read(new File("c:\\Pictures for game Snake\\background1.png"));
            background2 = ImageIO.read(new File("c:\\Pictures for game Snake\\background2.png"));
            background3 = ImageIO.read(new File("c:\\Pictures for game Snake\\background3.png"));
            background4 = ImageIO.read(new File("c:\\Pictures for game Snake\\background4.png"));
            background5 = ImageIO.read(new File("c:\\Pictures for game Snake\\background5.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();
 
        Timer tmDraw = new Timer(50, arg0 -> repaint());
        tmDraw.start();
 
        tmUpdate = new Timer(150, 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(850, 300, 150, 50);
        buttonPause.addActionListener(arg0 -> {
 
        });
        add(buttonPause);*/
    }
 
    public void paintComponent(Graphics gr) {
 
        super.paintComponent(gr);
 
        gr.drawImage(background, 0, 0, 1050, 850, null);
        switch (myGame.score) {
            case 10:
                gr.drawImage(background1, 0, 0, 1050, 850, null);
                break;
            case 20:
                gr.drawImage(background2, 0, 0, 1050, 850, null);
                break;
            case 30:
                gr.drawImage(background3, 0, 0, 1050, 850, null);
                break;
            case 40:
                gr.drawImage(background4, 0, 0, 1050, 850, null);
                break;
            case 50:
                gr.drawImage(background5, 0, 0, 1050, 850, null);
                break;
            case 60:
                gr.drawImage(background1, 0, 0, 1050, 850, null);
                break;
            case 70:
                gr.drawImage(background2, 0, 0, 1050, 850, null);
                break;
            case 80:
                gr.drawImage(background3, 0, 0, 1050, 850, null);
                break;
            case 90:
                gr.drawImage(background4, 0, 0, 1050, 850, null);
                break;
            case 100:
                gr.drawImage(background5, 0, 0, 1050, 850, null);
                break;
        }
 
        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.PINK);
        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
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
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 turn() {
        if (Math.abs((newDirection - direction)) != 2) {
            direction = newDirection;
        }
    }
 
    public game() { mas = new int[40][40]; }
 
    private void make_new() {
        while (true) {
            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) {
            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;
            }
        }
 
        direction = 40;
 
        score = 0;
 
        mas[20][20] = 1;
        mas[20][21] = 2;
        mas[20][22] = 3;
        mas[20][23] = 4;
        mas[20][24] = 5;
        mas[20][25] = 6;
        mas[20][26] = 7;
 
        lengthOfSnake = 7;
 
        head_X = head_Y = 20;
 
        endGame = false;
 
        make_new();
        make_new_toxic();
 
    }
 
    public int peremGolova() {
        switch (direction) {
            case 37:
                if ((head_X - 1) >= 0)
                    head_X--;
                else
                    head_X = 39;
                break;
            case 38:
                if ((head_Y - 1) >= 0)
                    head_Y--;
                else
                    head_Y = 39;
                break;
            case 39:
                if ((head_X + 1) <= 39)
                    head_X++;
                else
                    head_X = 0;
                break;
            case 40:
                if ((head_Y + 1) <= 39)
                    head_Y++;
                else
                    head_Y = 0;
                break;
        }
 
        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] > 1) 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++) {
                if (mas[i][j] > 0) mas[i][j]++;
                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();
            score += 10;
        }
 
        if (flag == 4) {
            //lengthOfSnake--;
            make_new_toxic();
            score -= 10;
        }
        turn();
    }
}
Main:
Java
1
2
3
4
5
6
public class zmeika {
    public static void main(String[] args) {
        myFrame window = new myFrame();
 
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2020, 17:05
Ответы с готовыми решениями:

Алгоритм игры змейка
Мне надо написать игрушку - Змейка ... неподскажете алгоритм... мыльте teem@netmail.kg

Реализация игры ,,Змейка,,
Всем привет :) У меня возникло несколько вопросов о реализации такой консольной игры. Можно ли сделать короткую паузу, потому что сама...

Создание игры - Змейка.
Здравствуйте. Подскажите с помощью чего можно создать такую игру как Змейка. Не в консольном варианте, а с 2D графикой. Изучил...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2020, 17:05
Помогаю со студенческими работами здесь

Конец игры Змейка
Здравствуйте форумчане! Хочу обратится с одной проблемкой, ниже выложил архив с игрой Змейка. Всё работает за исключением того, что я не...

Змейка, завершение игры
Нужно сделать чтобы змейка ела 5 яблок и игра заканчивалась, но не могу понять как это сделать( Вот сам код #include...

Изучаю С# на примере игры Змейка
понимаю что когда змея ползет влево она не должна резко повернуть вправо (и наоборот) и когда змея ползет вверх она не должна резко...

Змейка, не идет счет игры
Добрый день! Подскажите, где ошибка. Программа работает хорошо но счет игры не идет from tkinter import Tk, Canvas import random ...

Построение границ для игры Змейка
Ребят всем привет! ПРОШУ ПОМОГИТЕ, пытаюсь сделать стенки для игры змейка не понимаю почему выдает ошибку (Exception in thread...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru