Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 21.12.2021
Сообщений: 12

Программно промоделировать стрельбу по мишени группой человек

25.05.2022, 21:06. Показов 1740. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте! Нужна помощь. Не могу понять, как мне сделать так, чтобы шанс попадания нормально расчитывался. Текст задачи и моё недорешение прилагается.

Программно промоделировать стрельбу по мишени группой человек.
Каждый человек имеет свое имя, возраст (в годах) и стаж обучения ‘стрельбе (в годах).
Люди делятся на новичков, опытных и ветеранов (потомки класса
человек). Для каждого человека определите полиморфный метод. «Стрелять» без параметров, возвращающих логическое значение (попал — ‘true,не попал — false). Попадание определяется случайным образом, причем
для новичка вероятность попасть равна 0,01 *стаж обучения; для опытного = 0,05*стаж обучения стрельбе; для ветерана = 0,9 — 0,01*возраст. Люди стреляют по очереди, начиная с первого, пока кто-то не попадет в мишень. Стрельба прекращается после того, как кто-то попал или все выстрелили по одному разу. После каждого выстрела нужно выводить на экран всю информацию о стреляющем и результат стрельбы. В главной программе создайте массив из 7 людей в таком порядке: новичок, опытный, ветеран, опытный, новичок и произведите стрельбу с выводом ее результатов.




Python
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
import random
 
names = ['Анастасия', 'Ирина', 'Наталья', 'Павел', 'Роман', 'Андрей', 'Михаил']
type_s = ['новичок', 'опытный', 'ветеран']
class People:
   def __init__(self, info_people):
       self.name = info_people[0]
       self.age = info_people[1]
       self.type_of_person = info_people[2]
       self.stage = info_people[3]
 
   def tell(self):
       print('Меня зовут {0}, мой возраст {1}, я {2}. Мой стаж стрельбы {3} лет.'.format(self.name, self.age, self.type_of_person, self.stage))
 
   def shoot(self, people):
       return self.name + ' стреляет:' 
 
class new(People):
   def shoot(self, people):
       chance = 0.01 * self.stage
       if chance < 1:
         print('Не попал')
       else:
         print('Попал')
 
class stage(People):
   def shoot(self, people):
       chance = 0.05 * self.stage
       if chance < 1:
         print('Не попал')
       else:
         print('Попал')
 
class pro(People):
   def shoot(self, people):
       chance = 0.9 - 0.1 * self.age
       if chance < 1:
         print('Не попал')
       else:
         print('Попал')
 
info = []
for name in range(5):
   info.append([names[0], random.randint(20, 40), type_s[random.randint(0, 2)], random.randint(1, 10)])
   info.append([names[1], random.randint(20, 40), type_s[random.randint(0, 2)], random.randint(1, 10)])
   info.append([names[2], random.randint(20, 40), type_s[random.randint(0, 2)], random.randint(1, 10)])
   info.append([names[3], random.randint(20, 40), type_s[random.randint(0, 2)], random.randint(1, 10)])
   info.append([names[4], random.randint(20, 40), type_s[random.randint(0, 2)], random.randint(1, 10)])
   info.append([names[5], random.randint(20, 40), type_s[random.randint(0, 2)], random.randint(1, 10)])
   info.append([names[6], random.randint(20, 40), type_s[random.randint(0, 2)], random.randint(1, 10)])
 
people_0 = People(info[0])
people_1 = People(info[1])
people_2 = People(info[2])
people_3 = People(info[3])
people_4 = People(info[4])
people_5 = People(info[5])
people_6 = People(info[6])
 
people_0.tell()
people_1.tell()
people_2.tell()
people_3.tell()
people_4.tell()
people_5.tell()
people_6.tell()
 
while i == False:
  print(people_0.shoot([people_0.name]))
  if (random.random() * people_0.stage < 1.0):
    print('Не попал')
  else:
    print('Попал')
    break
  print(people_1.shoot([people_1.name]))
  if (random.random() * people_1.stage < 1.0):
    print('Не попал')
  else:
    print('Попал')
    break
  print(people_2.shoot([people_2.name]))
  if (random.random() * people_2.stage < 1.0):
    print('Не попал')
  else:
    print('Попал')
    break
  print(people_3.shoot([people_3.name]))
  if (random.random() * people_3.stage < 1.0):
    print('Не попал')
  else:
    print('Попал')
    break
  print(people_4.shoot([people_4.name]))
  if (random.random() * people_4.stage < 1.0):
    print('Не попал')
  else:
    print('Попал')
    break
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.05.2022, 21:06
Ответы с готовыми решениями:

Программно промоделировать стрельбу по мишени группой человек
Программно промоделировать стрельбу по мишени группой человек. Каждый человек имеет свое имя, возраст (в годах) и стаж обучения стрельбе (в...

Объектно ориентированная модель стрельбы по мишени группой человек
Объясните, пожалуйста, как оно работает //Программно промоделировать стрельбу по мишени группой человек. //Каждый человек...

Программно промоделировать разговор людей
Программно промоделировать разговор людей. Всего есть 5 людей. Каждое человек имеет имя (строку) и возраст (число). Установите возраст...

7
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
26.05.2022, 00:09
Лучший ответ Сообщение было отмечено Chochorik как решение

Решение

Chochorik, примерно так

Python
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
import random
 
names = ['Анастасия', 'Ирина', 'Наталья', 'Павел', 'Роман', 'Андрей', 'Михаил']
type_s = ['новичок', 'опытный', 'ветеран']
shoot_order = [0,1,2,1,0,1,2]
shoot_legend = ['не попал', 'попал']
 
class People:
    def __init__(self, info_people):
        
        self.name = info_people[0]
        self.age = info_people[1]
        self.type_of_person = info_people[2]
        self.stage = info_people[3]
 
    def tell(self):
        print('Меня зовут {0}, мой возраст {1}, я {2}. Мой стаж стрельбы {3} лет.'.format(self.name, self.age, self.type_of_person, self.stage))
 
    def shoot(self):
        return self.get_chance() > random.random()
 
class new(People):
    def get_chance(self):
        return 0.01 * self.stage
 
class stage(People):
    def get_chance(self):
        return 0.05 * self.stage
 
class pro(People):
    def get_chance(self):
        return 0.9 - 0.01 * self.age
 
for i in range(7):
    people_info = [names[i], random.randint(20, 40), type_s[shoot_order[i]], random.randint(1, 10)]
    match shoot_order[i]:
        case 0:
            person = new(people_info)
        case 1:
            person = stage(people_info)
        case 2:
            person = pro(people_info)
            
    result = person.shoot()
    
    person.tell()
    print("Результат стрельбы - %s, шанс попадания - %.2f \n"% (shoot_legend[result], person.get_chance()) )
 
    if result:
        break
Python
1
2
3
4
5
6
7
8
Меня зовут Анастасия, мой возраст 38, я новичок. Мой стаж стрельбы 4 лет.
Результат стрельбы - не попал, шанс попадания - 0.04 
 
Меня зовут Ирина, мой возраст 22, я опытный. Мой стаж стрельбы 7 лет.
Результат стрельбы - не попал, шанс попадания - 0.35 
 
Меня зовут Наталья, мой возраст 40, я ветеран. Мой стаж стрельбы 1 лет.
Результат стрельбы - попал, шанс попадания - 0.50
Добавлено через 9 минут
Пара примечаний:
1. Я взял ваши имена классов, но new не очень подходящее имя. Лучше обозвать novice
2. Используется конструкция match - case, появилась с python 3.10. В более ранних можете этот блок ifами разрулить
1
0 / 0 / 0
Регистрация: 21.12.2021
Сообщений: 12
26.05.2022, 00:23  [ТС]
Благодарю! Спасибо за замечания, учту в будущем

Добавлено через 5 минут
А можете, пожалуйста, подсказать, как заменить match на if? Я просто впервые сталкиваюсь с этим
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
26.05.2022, 00:27
Цитата Сообщение от Chochorik Посмотреть сообщение
как заменить match на if?
Конструкция if-elif-else
Python
1
2
3
4
5
6
7
a = int(input())
if a < -5:
    print('Low')
elif -5 <= a <= 5:
    print('Mid')
else:
    print('High')
0
0 / 0 / 0
Регистрация: 21.12.2021
Сообщений: 12
26.05.2022, 00:32  [ТС]
Что-то вроде этого?
Python
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
import random
 
names = ['Анастасия', 'Ирина', 'Наталья', 'Павел', 'Роман', 'Андрей', 'Михаил']
type_s = ['новичок', 'опытный', 'ветеран']
shoot_order = [0,1,2,1,0,1,2]
shoot_legend = ['не попал', 'попал']
 
class People:
    def __init__(self, info_people):
        
        self.name = info_people[0]
        self.age = info_people[1]
        self.type_of_person = info_people[2]
        self.stage = info_people[3]
 
    def tell(self):
        print('Меня зовут {0}, мой возраст {1}, я {2}. Мой стаж стрельбы {3} лет.'.format(self.name, self.age, self.type_of_person, self.stage))
 
    def shoot(self):
        return self.get_chance() > random.random()
 
class new(People):
    def get_chance(self):
        return 0.01 * self.stage
 
class stage(People):
    def get_chance(self):
        return 0.05 * self.stage
 
class pro(People):
    def get_chance(self):
        return 0.9 - 0.01 * self.age
 
for i in range(7):
  people_info = [names[i], random.randint(20, 40), type_s[shoot_order[i]], random.randint(1, 10)]
  if person == new(people_info):
    result = person.shoot()
  elif person == stage(people_info):
    result = person.shoot()
  elif person == pro(people_info):
    result = person.shoot()
      
  result = person.shoot()
  
  person.tell()
  print("Результат стрельбы - %s, шанс попадания - %.2f \n"% (shoot_legend[result], person.get_chance()) )
  
  if result:
    break
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
26.05.2022, 00:42
Chochorik, вы понимаете как это происходит?
Мы на вход получаем информацию о типе: 0, 1 или 2.
В зависимости от этого значения мы должны вызвать соответствующий конструктор.

Добавлено через 2 минуты
Я рекомендую сейчас вам ничего не делать, а завтра, на свежую голову прочитать про классы и их наследование. Разобрав при этом несколько примеров. Возможно тогда вам станет понятнее.
1
0 / 0 / 0
Регистрация: 21.12.2021
Сообщений: 12
26.05.2022, 00:43  [ТС]
Я уже разобрался. Спасибо вам большое!
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
26.05.2022, 10:02
Ну или так:

Python
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
import random
#==============================================================================
class Person:
    # =========================================================================
    def __init__( self, name, age, stage ):
        self.name  = name
        self.age   = age
        self.stage = stage
    # =========================================================================
    def get_chance(self):
        pass
    # =========================================================================
    def shoot(self):
        return random.random() < self.get_chance()
    # =========================================================================
    def __str__(self):
        return f'Меня зовут { self.name }, мне { self.age } лет, мой стаж стрельбы { self.stage } лет. ' \
               f'Шанс попадания { self.get_chance().__round__(2) }. '
#==============================================================================
class Beginner(Person):
    # =========================================================================
    def __init__( self, name, age, stage ):
        super().__init__(name, age, stage)
    # =========================================================================
    def get_chance(self):
        return 0.01 * self.stage
    # =========================================================================
    def __str__(self):
        return f'Я новичок. ' + super().__str__()
#==============================================================================
class Expert(Person):
    # =========================================================================
    def __init__( self, name, age, stage ):
        super().__init__(name, age, stage)
    # =========================================================================
    def get_chance(self):
        return 0.05 * self.stage
    # =========================================================================
    def __str__(self):
        return f'Я опытный. ' + super().__str__()
#==============================================================================
class Veteran(Person):
    def __init__( self, name, age, stage ):
        super().__init__(name, age, stage)
    # =========================================================================
    def get_chance(self):
        return 0.9 - 0.01 * self.age
    # =========================================================================
    def __str__(self):
        return f'Я ветеран. ' + super().__str__()
#==============================================================================
shooters = [
    Beginner('Вася', 20, 1),
    Expert('Петя', 40, 5),
    Veteran('Коля', 60, 40),
 
    Expert('Маня', 50, 7),
    Beginner('Боря', 25, 3),
 
    Expert('Николетта', 45, 8),
    Veteran('Жоржетта', 65, 45)
]
for e in shooters:
    shot_res = e.shoot()
    print( str(e) + f'Результат стрельбы: { ["не попал", "попал"][shot_res] }.' )
    if shot_res:
        break
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.05.2022, 10:02
Помогаю со студенческими работами здесь

В деканат поступили данные о результатах сдачи сессии группой студентов из N человек. Сессия состояла из трех экзаменов
В деканат поступили данные о результатах сдачи сессии группой студентов из N человек. Сессия состояла из трех экзаменов (математика,...

В деканат поступили данные о результатах сдачи сессии группой студентов из N человек. Сессия состояла из трех экзаменов
!!! ПОЖАЛУЙСТА НЕ НАДО ОТПРАВЛЯТЬ &quot;ответы с готовыми решениями&quot;, ТАМ СОВЕРШЕННО НЕ ПО ТЕМЕ И ИСПОЛЬЗУЮТСЯ ДРУГИЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ !!!...

Доказать, является ли структура группой, абелевой группой?
Докажите, является ли структура &lt;P1,+&gt;,где P1: R→R - многочлены одной переменной с целыми коэффициентами степени не выше n=1: -группой? ...

Определить время, проведенное в гостинице всей группой и время, проведенное подгруппами из 3 человек
Задание: Первый посетитель из группы, состоящей из P человек, провел в гостинице C часов, а каждый последующий на 10 мин. дольше....

Определить время, проведенное в гостинице всей группой и время, проведенное подгруппами из 3 человек
Первый посетитель из группы, состоящей из P человек, провел в гостинице C часов, а каждый последующий на 10 мин. дольше. Определить...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru