Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 15

Не могу понять смысл задания на C#/Unity

08.01.2019, 16:22. Показов 1013. Ответов 9

Студворк — интернет-сервис помощи студентам
На олимпиаде по VR задали задание на языке C# (который я не знаю). Вот ссылка на само задание.
Нужно написать класс, который будет каким-то образом получать информацию о расстоянии до цели, задавать угол наклона пушки, стрелять и получать информацию о попадании/непопадании. Это делается через како-то интерфейс.
Код файла с интерфейсом:
C#
1
2
3
4
5
6
public interface ICannonAI
{
    void SetTarget(double distance);
    double GetShootAngle();
    void FeedbackHitDistance(double distance);
}
Код файла с классом пушки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class CannonAI : ICannonAI {
    public void SetTarget(double distance)
    {
        throw new System.NotImplementedException();
    }
 
    public double GetShootAngle()
    {
        throw new System.NotImplementedException();
    }
 
    public void FeedbackHitDistance(double distance)
    {
        throw new System.NotImplementedException();
    }
}
Я не понимаю, как это хотя бы примерно должно выглядеть, почему файлы проекта не подключены друг к другу через using (я могу сравнивать только с C++), что такое интерфейс и почему его использует только один класс.

Кто нибудь может примерно показать, как этот класс должен выглядеть (как получить расстояние, куда его можно запомнить, куда запомнить фидбэк).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2019, 16:22
Ответы с готовыми решениями:

Не могу понять смысл задания.
День (утро, вечер, ночь - нужное подчеркнуть)) добрый! Взялся помочь человеку с контрольной по C и столкнулся с проблемой - не могу понять...

Не могу понять смысл задания
Определить тип заданных выражений и найти их значения. Составить систему тестов и вычислить полученное выражение для нескольких значений n...

Не могу понять смысл задания, что должно быть реализовано
Всем привет, задали вот такую задачу: Разработать архитектуру классов иерархии товаров при разработке системы управления потоками...

9
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
08.01.2019, 16:35
Интерфейс тут явно не уместен, условия размыты, не понятно где находится пушка, может она на возвышенности, или наоборот. Знать дистанцию мало для выстрела, причем в условии пушка не вращается по своей оси, а значит не может стрелять по противникам, которые находятся сбоку.
Короче стремное тз))
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
08.01.2019, 16:41
Цитата Сообщение от 1max1 Посмотреть сообщение
Знать дистанцию мало для выстрела
это если для 100 % попадания, у него же 20 снарядов, ИИ должна сама находить угол и еще что-то для того что бы попасть.

Цитата Сообщение от cjv Посмотреть сообщение
каким-то образом получать информацию о расстоянии до цели
тебе без разницы каким, у тебя она в параметрах передаеться.

Цитата Сообщение от cjv Посмотреть сообщение
что такое интерфейс
Интерфейс представляет ссылочный тип, который определяет набор методов и свойств, но не реализует их. Затем этот функционал реализуют классы и структуры, которые применяют данные интерфейсы.

Не по теме:

Даже близко не понимаю как это решаеться, если сможешь решить напишеш что сделал, самому интересно.

0
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 15
08.01.2019, 17:14  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
не понятно где находится пушка
Если скачать проект (ссылка на гитхаб на странице) и запустить его в Unity, там будет видно, что есть пушка, которая стоит на ровной поверхности. Только я не понял, как, чем и в кого она должна стрелять.

Я что-то покопался и нашёл ещё пару файлов, в которых что-то говорится про интерфейс.
Кликните здесь для просмотра всего текста
C#
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
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Cannon : MonoBehaviour
{
    public GameObject CannonObject;
    public GameObject CannonBallPrefab;
 
    public float RotateSpeed;
 
    public ICannonAI CannonAi;
 
    public int MaxAmmo;
    private int _ammo;
 
    public event CannonBall.CannonBallHitHandler Hit;
    public event EventHandler NoAmmo;
 
    void Start ()
    {
        Reload();
    }
 
    IEnumerator PrepareShoot(float shootAngle)
    {
        var currentAngle = Vector3.Angle(CannonObject.transform.rotation * Vector3.forward, Vector3.forward);
        var rotateStep = (shootAngle - currentAngle) * RotateSpeed;
 
        for (float angle = currentAngle; Mathf.Abs(angle - shootAngle) > 0.1f; angle += rotateStep)
        {
            CannonObject.transform.rotation = Quaternion.AngleAxis(angle, Vector3.left);
            yield return null;
        }
 
        CannonObject.transform.rotation = Quaternion.AngleAxis(shootAngle, Vector3.left);
 
        yield return new WaitForSeconds(1);
 
        var cannonBall = Instantiate(CannonBallPrefab, CannonObject.transform.position, CannonObject.transform.rotation);
        var cannonBallComponent = cannonBall.GetComponent<CannonBall>();
 
        cannonBallComponent.Hit += CannonBallComponent_Hit;
        cannonBallComponent.Hit += Hit;
    }
 
    private void CannonBallComponent_Hit(bool hitTarget, float distance)
    {
        if (!hitTarget)
        {
            CannonAi.FeedbackHitDistance(distance);
            Shoot();
        }
    }
 
    public void StartShooting(float distance)
    {
        CannonAi.SetTarget(distance);
        Shoot();
    }
 
    public void Reload()
    {
        _ammo = MaxAmmo;
    }
 
    private void Shoot()
    {
        if (_ammo <= 0)
        {
            if (NoAmmo != null) NoAmmo.Invoke(this, EventArgs.Empty);
            return;
        }
 
        _ammo--;
        
        var shootAngle = CannonAi.GetShootAngle();
        StartCoroutine(PrepareShoot((float)shootAngle));
    }
}

Кликните здесь для просмотра всего текста
C#
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
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;
 
public class Main : MonoBehaviour
{
    public Cannon Cannon;
    public GameObject TargetPrefab;
    public int MinTargetDistance;
    public int MaxTargetDistance;
 
    private float _currentDistance;
 
    private GameObject TargetInstance;
 
    void Start () {
        Cannon.CannonAi = new CannonAI();
 
        Cannon.Hit += CannonOnHit;
        Cannon.NoAmmo += CannonOnNoAmmo;
 
        NewTest();
    }
 
    private void CannonOnNoAmmo(object sender, EventArgs eventArgs)
    {
        Debug.Log("Не осталось боеприпасов!");
    }
 
    private void NewTest()
    { 
        _currentDistance = GetNewTargetPosition();
        Cannon.Reload();
        Cannon.StartShooting(_currentDistance);
        TargetInstance = Instantiate(TargetPrefab, new Vector3(0, 0, _currentDistance), new Quaternion());
    }
 
    private void CannonOnHit(bool hitTarget, float distance)
    {
        if (hitTarget)
        {
            Debug.Log("Попадание!");
            Destroy(TargetInstance);
            NewTest();
        }
        else
        {
            Debug.Log(distance < _currentDistance ? "Недолет!" : "Перелет!");
        }
    }
 
    int GetNewTargetPosition()
    {
        return Random.Range(MinTargetDistance, MaxTargetDistance);
    }
}


Но появились ещё вопросы:
1.
C#
1
cannonBallComponent.Hit += CannonBallComponent_Hit;
Почему к переменной прибавляется функция?
2. Как работает event
3.
C#
1
2
var cannonBall = Instantiate(CannonBallPrefab, CannonObject.transform.position, CannonObject.transform.rotation);
var cannonBallComponent = cannonBall.GetComponent<CannonBall>();
Что это такое?

И это нормально для c#, что в файле кода не написано ,какой другой файл он использует?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
08.01.2019, 17:32
Цитата Сообщение от cjv Посмотреть сообщение
На олимпиаде по VR задали задание на языке C# (который я не знаю)
Так может вам рановато заниматься олимпиадными задачами?
А как у вас с физикой и математикой?
Потому что здесь задача больше математическая чем по программированию.
0
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 15
08.01.2019, 17:48  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Потому что здесь задача больше математическая чем по программированию.
Как математическую задачу я примерно понимаю, как её решить. Меня интересует именно специфика языка, кторый я не знаю, но который я должен использовать.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
08.01.2019, 18:10
Цитата Сообщение от cjv Посмотреть сообщение
Нужно написать класс, который будет каким-то образом получать информацию о расстоянии до цели, задавать угол наклона пушки, стрелять и получать информацию о попадании/непопадании.
вот простейшая реализация класса CannonAI:
C#
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
using System;
 
public class CannonAI : ICannonAI
{
    private double V0 = 0;
    private double angle = Math.PI / 4;
    private double targetDistance;
    private const double g = 9.8;
 
    public void SetTarget(double distance)
    {
        //assign distance to target
        targetDistance = distance;
    }
 
    public double GetShootAngle()
    {
        //make first shoot always with 45 degrees
        if (V0 < double.Epsilon)
            return 45;
 
        //calc angle for calcualted V0 and distance to target
        angle = 0.5 * Math.Asin(g * targetDistance / (V0 * V0));
        return angle * 180 / Math.PI;
    }
 
    public void FeedbackHitDistance(double distance)
    {
        //calc V0 for real distance
        V0 = Math.Sqrt(g * distance / Math.Sin(2 * angle));
    }
}
Вставьте этот код в файл CannonAI и запустите тестовый проект. Пушка делает один тестовый выстрел а затем начинает попадать по цели.
Миниатюры
Не могу понять смысл задания на C#/Unity  
1
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
08.01.2019, 20:00
Storm23, если поставить InitVelocity 1500 вместо 2000 для CannonBall, то после нескольких выстрелов пушка отворачивается на 180 градусов и больше никогда не попадает))
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
08.01.2019, 20:39
Цитата Сообщение от 1max1 Посмотреть сообщение
если поставить InitVelocity 1500 вместо 2000 для CannonBall, то после нескольких выстрелов пушка отворачивается на 180 градусов и больше никогда не попадает))
Да, это происходит тогда когда пушка не может достать до цели (синус угла получается больше 1).
Нужно проверять выражение в Asin. И если оно больше 1 то стрелять на 45 градусов.
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
08.01.2019, 20:57
Закину пожалуй еще свой костыльный и неоптимизированный вариант, зато стреляет по дуге
C#
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
using System;
 
public class CannonAI : ICannonAI
{
    const double g = 9.8;
    const double V0 = 33.4;
    
    double timeIterator;
    double angleIterator;
    double targetDistance;
    double correctDistance;
 
    public void SetTarget(double distance)
    {
        timeIterator = 0.01f;
        angleIterator = 0.1f;       
        correctDistance = 1.0f;
        targetDistance = distance;
    }
 
    public double GetShootAngle()
    {     
        for (double angle = 90.0f; angle > 0.0f; angle -= angleIterator)
        {
            for (double t = 0.0f; t < 60.0f; t += timeIterator)
            {
                double a = angle * 0.017453;
 
                double x = V0 * t * Math.Cos(a);
                double y = V0 * t * Math.Sin(a) - 0.5 * g * t * t;
 
                if (y < correctDistance && y > -correctDistance)
                {
                    if (Math.Abs(x - targetDistance) < correctDistance)
                    {
                        return angle;
                    }
                }
 
                if (y < -correctDistance || x > targetDistance + correctDistance)
                {
                    break;
                }
            }
        }
 
        return 45.0;
    }
 
    public void FeedbackHitDistance(double distance)
    {
        timeIterator *= 0.75f;
        angleIterator *= 0.75f;
        correctDistance *= 0.75f;
 
        if (timeIterator < 0.001f)
            timeIterator = 0.001f;
 
        if (angleIterator < 0.01f)
            angleIterator = 0.01f;
 
        if (correctDistance < 0.1f)
            correctDistance = 0.1f;
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.01.2019, 20:57
Помогаю со студенческими работами здесь

Не могу понять смысл данного задания, и написание его кода
В одномерном массиве все отрицательные элементы переместить в начало массива, а остальные — в конец с сохранением порядка следования....

помогите понять смысл задания
(*3.5) Реализуйте версии istream и ostream для чтения и записи чисел в двоич- двоичном виде без преобразования их в символы. Рассмотрите...

Не могу понять понять смысл резидентной программы
Суть препод кинул резидент, сказал чтобы сами разбирались. Увидел что ее выкладывали уже, но в ветке этой темы, там тоже не объяснили, как...

Не могу понять смысл исследования
Читаю исследование и ничего не могу понять. Статья называется Я перевожу это как: &quot;Новое понимание взаимосвязи между...

Не могу понять смысл задачи
Create static method search(String data, String key), which returns amount of String key in data array. In main method, call search method....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru