С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
3 / 3 / 0
Регистрация: 14.02.2019
Сообщений: 37

Решение детской задачки

02.04.2019, 05:53. Показов 6978. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано:
Имеется исходный программный код игры Новогодний дождь.
Необходимо изменить логику поведения подарка и добавить пять жизней.
Каждый подарок движется в одном из восьми направлений
(право, лево, верх, низ и четыре направления по диагонали).
Подарки появляются в центре игрового поля и начинают движение в одном
из восьми направлений случайным образом. При столкновении с верхней, правой,
левой, нижней границами игрового поля - подарок должен отражаться в одном
из трех направлений случайным образом (под углом 90 градусов, под углом
45 градусов вправо, влево). Пять жизней отображаются сверху в виде пяти
маленьких шапочек. Если подарок пропущен, то одна жизнь убавляется.
При окончании жизней наступает конец игры.
_____
Что сделано:
Добавлен код для перемещения подарков в восьми направлениях и отталиквания от стенки.
Но почему-то появляющиеся подарки появляются в одном месте и не двигаются.
Не могу понять, где ошибка. Подскажите пжлст.
_____
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
package test;
 
// Подключения необходимых библиотек
import javax.swing.*;
 
// Главный класс игры
public class game {
 
    // Главный метод, который запускает игру
    public static void main(String[] args) {
        
           // Вызов диалогового окна для ввода сложности игры
           String rez = JOptionPane.showInputDialog(null,"Введите сложность игры от 1 до 7:","Сложность игры",1);
           
           // Помещение результата выбора в переменную целого типа
           int slogn = rez.charAt(0)-'0';
           
           // Проверка, что введена цифра от 1 до 7
           if ((slogn>=1)&&(slogn<=7))
           {
              // Создание окна, в котором находится игровое поле
              okno window = new okno(slogn);
           }
    }
 
}
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
package test;
 
// Подключения необходимых библиотек
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
// Класс окна, в котором размещено игровое поле
class okno extends JFrame
{   
    private pole gameP; // Закрытая Переменная класса - игровое поле
    private int slogn; // Закрытая Переменная класса - сложность игры
    
    // Обработчик событий нажатий на клавиши
    private class myKey implements KeyListener  
    {
            // Метод, который срабатывает при нажатии
            public void keyPressed(KeyEvent e)
            {
                // Получение кода нажатой клавиши
                int key_ = e.getKeyCode();
                
                // Выход из программы, если нажат - Esc 
                if (key_==27) System.exit(0);                               
                else if (key_==37) // Если нажата стрелка влево
                {
                    // Контроль перемещения влево за пределы окна
                    if (gameP.x-30>-48) gameP.x-=30;
                    else gameP.x=752;
                }               
                else if (key_==39) // Если нажата стрелка вправо
                {
                    // Контроль перемещения вправо за пределы окна                    
                    if (gameP.x+30<752) gameP.x+=30;
                    else gameP.x=-48;
                }
                
            }
            public void keyReleased(KeyEvent e) {}
            public void keyTyped(KeyEvent e) {}
       }                
    
    // Конструктор класса
    public okno(int slogn)
    {
        // Помещение сложности, выбранной пользователем в переменную класса
        this.slogn = slogn;
        // Подключение обработчика события для клавиатуры к окну     
        addKeyListener(new myKey());
        // Установка активности окна
        setFocusable(true);
        
        // Задание размеров и положения окна
        setBounds(0,0,800,600);
        // Задание заголовка окна
        setTitle("Игра: Новогодний дождь");
        // Запрет изменения размеров окна
        setResizable(false);
        // Операция завершения работы приложения при 
        // закрытии окна
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // Создание объекта - игрового поля
        gameP = new pole(slogn);
        // Прикрепление (вложение) панели - игрового поля в окно
        Container con = getContentPane();
        con.add(gameP);
        
        // Сделать окно видимым 
        setVisible(true);
    }
}
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
package test;
// Подключения необходимых библиотек
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
// Класс для подарка, падающего сверху
class podar {
    
    public Image img; // Изображение подарка
    public int x,y; // Положение подарка на игровом поле, в пикселях, x - отступ слева, y - отступ сверху
    public Boolean act; // Переменная логического типа, показывающая активность подарка, есть он игровом поле или нет
    Timer timerUpdate; // Таймер, отвечающий за движение подарка вниз
    int napr;
    
    // Конструктор класса
    public podar(Image img)
    {
        // Создание и настройка таймера, отвечающего за движение подарка вниз
        timerUpdate = new Timer(500,new ActionListener() {              
            public void actionPerformed(ActionEvent e) {
                vniz(); // Метод, осуществляющий движение подарка вниз
        }
        });     
        this.img = img; // Передача изображения из круглых скобок Конструктора класса в переменную класса
        act=false; // Изначально делаем подарок неактивным, отсутствующим на игровом поле        
    }
    
    // Метод, выполняющий активизацию подарка на игровом поле, вывод его сверху игрового поля
    public void start()
    {
        timerUpdate.setDelay(300); // Установка временной задержки для таймера
        timerUpdate.start(); // Запуск таймера
        y = 300; // Отступ сверху в пикселях
        x = 400; // Отступ слева в пикселях, получаем случайным образом от 0 до 700
        act = true; //
        napr = (int)(Math.random()*8);
    }
    
    // Метод, осуществляющий движение подарка вниз 
    public void vniz()
    {
       if (act==true) // Если подарок активен на игровом поле
       {
          //y+=6; // Увеличение отступа сверху на 6 пикселей
          
          if (napr==0)
          {
            y--;    
          }
          
          if (x>700) //right
          {
            napr = (int)(Math.random()*3)+5;
            if (napr == 2) napr = 7;
          }  
       }  
       if ((y+img.getHeight(null))>=470) // Если подарок достиг нижней границы
       {
          timerUpdate.stop(); // Остановка таймера
       }
    }
    
    // Метод, выполянющий отрисовку подарка на игровом поле, если он активен
    public void draw(Graphics gr)
    {
        if (act==true)
        {
           gr.drawImage(img,x,y,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
package test;
 
// Подключения необходимых библиотек
import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
 
class param
{
    public static int score = 0;
}
 
// Класс панели, которая является игровым полем
class pole extends JPanel
{
      private Image shapka; // Закрытая Переменная класса, в которую загружается шапка
      private Image fon; // Закрытая Переменная класса, в которую загружается фон
      public int x = 400; // Открытая Переменная класса, в которую загружается шапка
      private int slogn; // Переменная сложности игры
      private podar[] gamePodar; // Массив подарков
      private Image end_game; // Изображение Окончания игры
      public Timer timerUpdate,timerDraw; // Два таймера: первый для 
      int life = 5;
      
      
       // Конструктор класса 
       public pole(int slogn)
       {
           param.score = 100;
           
           this.slogn = slogn;            
           // Загрузка изображения шапки из файла
           try
           {
             shapka = ImageIO.read(new File("./shapka.png"));
           }
           catch(IOException ex) {}
           
           // Загрузка изображения фона из файла
           try
           {
             fon = ImageIO.read(new File("./fon.png"));
           }
           catch(IOException ex) {}
           
           // Загрузка изображения Окончания игры
           try
           {
             end_game = ImageIO.read(new File("./end_game.png"));
           }
           catch(IOException ex) {}        
        
            //  Загрузка семи изображений подарков
           gamePodar = new podar[7];
           for (int i=0;i<7;i++)
           {
               try
               {
                   gamePodar[i] = new podar(ImageIO.read(new File("./p"+i+".png")));
               }
               catch (IOException ex) {}
           }
 
           // Создание таймера, который будет раз в три секунды проверять и добавлять подарки на игровое поле          
           timerUpdate = new Timer(3000,new ActionListener() {              
                public void actionPerformed(ActionEvent e) {
                   updateStart(); // Метод для проверки и добавление подарков на игровое поле
                }
            });         
           timerUpdate.start(); // Запуск таймера timerUpdate                 
           
           // Создание таймера, который будет перерисовывать игровое поле 20 раз в секунду      
           timerDraw = new Timer(50,new ActionListener() {              
                public void actionPerformed(ActionEvent e) {
                   repaint(); // Запуск метода перерисовки поля (public void paintComponent(Graphics gr))
                }
            });         
           timerDraw.start(); // Запуск таймера для перерисовки
                                                                            
       }
           
       // Метод, который отрисовывает графические объекты на панели
       public void paintComponent(Graphics gr)
       {
           // Выполнить отрисовку сначала самого окна
           super.paintComponent(gr);
           gr.drawImage(fon, 0, 0, null); // Рисование фона 
           gr.drawImage(shapka, x, 465, null); // Рисование шапки
           
           gr.drawImage(shapka, 50, 50, 50, 50, null);
           
           
           // Цикл, который отображает подарки на игровом поле и проверяет пропущенные подарки
           for (int i=0;i<7;i++)
           {
                   gamePodar[i].draw(gr); // Отображение подарка
                   if (gamePodar[i].act==true) // Если подарок из массива подарков активен
                   {
                   if ((gamePodar[i].y+gamePodar[i].img.getHeight(null))>=470) // Если подарок достиг нижней границы
                   {
                        if (Math.abs(gamePodar[i].x - x) > 75) // Если подарок пропущен
                        {
                            if (life == 0)
                            {
                            gr.drawImage(end_game, 300, 300, null); // Вывод картинки Окончания игры
                            timerDraw.stop(); // Оставнока таймера timerDraw 
                            timerUpdate.stop(); // Оставнока таймера timerUpdate
                            break; // Прерывание цикла
                            }
                            life--;
                        }
                        else gamePodar[i].act=false; // Снятие подарка с игрового поля, если он пойман шапкой
                   }
                   }
           }
       }
        // Метод для проверки и добавление подарков на игровое поле
       private void updateStart()
       {
           int kol=0; // Переменная для подсчета подарков на игровом поле
           for (int i=0;i<7;i++) // Цикл перебора всех подарков массива
           {
              if (gamePodar[i].act==false) // Если подарок не на игровом поле
              {
                 if (kol<slogn) // Если текущее количество менее номера сложности (от 1 до 7)
                 {
                   gamePodar[i].start(); // Активизация подарка на игровом поле, вывод его сверху игрового поля
                   break; // Прерывание цикла
                 }
              }
              else kol++; // Если подарок на игровом поле
           }
       }       
}
_____
Заранее благодарю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.04.2019, 05:53
Ответы с готовыми решениями:

Решение задачки
На сайте есть задачка для начинающих по программированию http://********/index.asp?main=task&amp;id_task=43, там можно вставлять пайтон-код...

Решение задачки
Встретил на просторах интернета такую задачку: Ради интереса захотел её решить на 1ске. Предлагаю такое решение: Процедура...

Решение задачки
Добрый день! Подскажите, в чем проблема. Угол фи делает, а гамму нет. Альфа - это гамма Бетта - фи &lt;h1&gt;Задача 1....

2
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
02.04.2019, 08:29
ivangrant, тебе все же, сюда https://www.cyberforum.ru/java-gui/
0
3 / 3 / 0
Регистрация: 14.02.2019
Сообщений: 37
02.04.2019, 09:36  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
ivangrant, тебе все же, сюда https://www.cyberforum.ru/java-gui/
Да, скорей всего. Но не могу найти кнопку переноса темы в другой раздел
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2019, 09:36
Помогаю со студенческими работами здесь

задачки на решение
1)a(a+1)(a+2)...(a+n),a-действительное число 2)дана последовательность n-вещественных чисел.найти их ср. арифметическое 3)дана...

Решение задачки
Есть два класса. package task9; //переменные можно взять любые public class givie_sushestva { String name; //название...

решение задачки
дано: R=20м аy=5м/с2 U-?

Решение задачки
Привет всем. Помогите или намекните, как решить данную задачку. В предыдущем задании записал файл из 40 значений, вот вторая часть: ...

решение задачки
Размер стипендии составляет 1560 руб. Если все экзамены сданы на &quot;5&quot;, то надбавка составляет 50%. Если есть хотя бы одна &quot;4&quot;...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru