Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8

Морской бой на C# с использованием библиотек DirectX: нужны исходники

19.10.2012, 22:55. Показов 5541. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток

Задали написать вот такой вот курсач В программировании я не особо разбираюсь, а уж тем более в Direct`e, поэтому хотелось бы получить какието исходники подобных программ, если ктото таким занимался и не сложно скинуть. Заранее благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2012, 22:55
Ответы с готовыми решениями:

Морской бой - нужны идеи реализации
Вообщем, нужна помощь. Мне нужно сделать по информатике программу "Морской Бой" в Бейсике. Как делать не объясняли. У самого идей...

Написать консольный морской бой с использованием ООП
Вечер добрый! Хочу написать консольный морской бой. Требования такие: 1. Поле должно быть размером 10х10 (полей должно быть два:...

Использование уже написанного api для игры в морской бой с использованием Qt
В общем задался вопросом: Совсем недавно, а точней час назад дописал api для игры в морской бой. Писал в Visual Studio и отлаживал в...

17
 Аватар для Expirupor
2 / 2 / 0
Регистрация: 09.10.2012
Сообщений: 16
20.10.2012, 14:39
Тебе еще может лично приехать и объяснить что и как работает? Некоторые студенты меня прямо удивляют.

1. Гугл никто не отменял, там много всего есть по теме
2. Почему именно DirectX? На нем разработка значительно сложнее, кроме того, DirectX для C# не нативная технология
3. Если есть выбор технологий, я порекомендовал бы тебе взять GDI+ или, еще лучше WPF
4. И если совсем уж лениво думать, обратись к кому-нибудь за деньги получишь готовую программу
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
20.10.2012, 14:41  [ТС]
Рылся в гугле, исходников того что мне надо нету, а DirectX стоит в постановке задания.
0
 Аватар для Expirupor
2 / 2 / 0
Регистрация: 09.10.2012
Сообщений: 16
20.10.2012, 14:50
Каков твой уровень знаний в программировании? Если совсем нулевой, то самостоятельно не справишься, задачку не назвать совсем тривиальной. Если хотя бы более-менее разбираешься, то за недельку сделать запросто сможешь, проблем никаких.

Добавлено через 1 минуту
Для толкового разработчика несколько часов работы.
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
20.10.2012, 17:15  [ТС]
У меня не работает логика разработки алгоритмов и т.д. Набирать код понимаю что нужно сделать и как это не проблема, а вот у меня это не получается. Поэтому и обратился сюда, надеясь что у когото есть исходники или чтото в этом роде.
0
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
20.10.2012, 18:23
BoneOne, Скидывай наработки, может и сделаешь с мира по нитке.
0
 Аватар для Expirupor
2 / 2 / 0
Регистрация: 09.10.2012
Сообщений: 16
21.10.2012, 03:49
Мне кажется полностью готового решения найти тебе не удастся. Если есть конкретные вопросы или проблемы, то спрашивай - поможем.
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
21.10.2012, 11:21  [ТС]
Допустим есть алгоритм самой игры (расстановка кораблей, выстрелы и т.д.), но на форме. Мне интересно как это всё перенести на ДиректХ, чтобы выстрелы шли по картинкам кораблей например, а не по ячейкам стандартного Grid`a, и как сделать чтобы рисовалось нужное кол-во кораблей, т.е. 1 4-хпалубная, 2 3-х палубные и т.д.?
0
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
21.10.2012, 11:48
Я под DirectX понятия не имею, как программировать, но работал с XNA.
Я сделал бы так: составил бы табличку (10*10) к примеру. И расставлял бы там кораблики. Для простоты можно было бы так:
0 0 1 0 0
0 0 0 0 0
4 4 4 4 0
0 0 0 0 0
2 2 0 2 2
Типа такого, находишь цифру, смотришь куда направлено - вставляешь текстуру кораблика.
Можно все кораблики единичками, но по моему разницы нету, а так понимать проще. Единственна небольшая проблема - правило, что корабли не должны соприкасаться, но при наставлении (пользователем) проверяешь координаты (в какую ячейку он его хочет загнать) и смотришь окружающие..также надо крутить его на 90 градусов.

А рисование снаряда\пули - берется начальная координата и конечная, а дальше банальная математика, раскладываешь движение по осям oX и oY и двигаешь, если к примеру начальные
(0,0) а конечные (10, 50), двигаешь 10 раз по оси oX на 1 и одновременно по оси oY на 5. А чтобы снаряд красиво вылетал из середины корабля - ставь спрайт со взрывом или шейдр..но с шейдерами провозишься сначала, но будет очень красиво)
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
21.10.2012, 12:07
Вот~, я здесь нарисовал некоторую заготовку для примера:
Пример использования DirectDraw
1. Создать новый проект типа Windows Forms Application.
2. Удалить Form1.cs.
3. Добавить следующие ссылки: Microsoft.DirectX и Microsoft.DirectX.DirectDraw.
4. Создать новую форму с названием GameScreen и удалить из нее дизайнер с ресурсами.
5. Program.cs изменить на:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Windows.Forms;
 
namespace DX9
{
    internal static class Program
    {
        [STAThread]
        private static void Main()
        {
            using (var game = new GameScreen())
            {
                game.Show();
                game.InitializeGraphics();
                Application.Run(game);
            }
        }
    }
}
6. Реализацию самой же формы изменить на:
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
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectDraw;
 
namespace DX9
{
    public class GameScreen : Form
    {
        private Device device; // Устройство, на котором отображаем результат
 
        private Surface primary; // Поверхность, которую видит пользователь
        private Surface backBuffer; // Поверхность, на которой рисуется следующий кадр
 
        // Спрайт, который я буду двигать по экрану в качестве примера
        private Surface spriteSurface;
        private readonly Rectangle spriteSize = new Rectangle(0, 0, 48, 48);
 
        public GameScreen()
        {
            // Настрока удобного отображения формы для полноэкранного режима
            FormBorderStyle = FormBorderStyle.None;
            // Следующая строка решает некоторые проблемы отрисовки
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
        }
 
        public void InitializeGraphics()
        {
            // Настройка устройства: полноэкранный режим с размером 800x600 и глубиной цветов 32 бита
            device = new Device();
            device.SetCooperativeLevel(this, CooperativeLevelFlags.FullscreenExclusive);
            device.SetDisplayMode(800, 600, 32, 0, false);
 
            // Настройка способа отрисовки поверхностей (используется 1 буфер)
            var description = new SurfaceDescription
                {SurfaceCaps = {PrimarySurface = true, Flip = true, Complex = true}, BackBufferCount = 1};
 
            // Создание основной и вспомогательной поверхностей
            primary = new Surface(description, device);
            backBuffer = primary.GetAttachedSurface(new SurfaceCaps { BackBuffer = true });
 
            // Создание спрайта + черный цвет считать за прозрачный
            spriteSurface = new Surface("sprite.bmp", new SurfaceDescription(), device);
            spriteSurface.SetColorKey(ColorKeyFlags.SourceDraw, new ColorKey());
        }
 
        // Метод, который двигает спрайт при каждом вызове отрисовки
        private int position; // Позиция спрайта по x и y
        protected override void OnPaint(PaintEventArgs e)
        {
            DirectXException.IgnoreExceptions();
            position++;
            backBuffer.ColorFill(Color.Black); // Очищаем поверхность
            // Рисуем спрайт
            backBuffer.DrawFast(position, position, spriteSurface, spriteSize, DrawFastFlags.DoNotWait | DrawFastFlags.SourceColorKey);
            // Только после того как нарисовали все спрайты на задней поверхности, меняем местами переднюю и заднюю поверхность
            primary.Flip(backBuffer, FlipFlags.DoNotWait);
            Invalidate(); // Форсим новую перерисовку экрана
        }
 
        protected override void OnKeyUp(KeyEventArgs e)
        {
            // Выход из приложения на клавишу Esc 
            if (e.KeyCode == Keys.Escape) Close();
            base.OnKeyUp(e);
        }
    }
}
7. Добавить в проект изображение sprite.bmp и изменить его свойство Copy to Output Directory на Copy if newer. Т.е. в моем простом случае изображение должно лежать вместе с исполняемым файлом.
8. В свойствах проекта изменить Platform target на x86. Под x64 работать не будет.

А вообще баловаться с Managed DirectX не хорошо, лучше использовать SharpDX или XNA, так как порог вхождения довольно высокий.
P.S. Я специально не выкладываю проект, так как лучше все же разобраться в том, как создаются проекты подобного рода. (:
P.S.S. Данный пример точно будет работать под XP и 7.
1
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
21.10.2012, 18:42
Нашел все-таки старые проекты на XNA, вот реализация пульки 2D игры
Пишу только метод, который производил расчет будущего движения
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Engine()
        {
            spritePosition = startPosition;
            float AC =finishPosition.X- startPosition.X;
            float CB = finishPosition.Y - startPosition.Y;      
 // как бы у нас координаты не из центра экрана, а из левого верхнего идут    
            if (AC < 0) AC = -AC;                
            if (CB < 0) CB = -CB;
            float AB =(float)Math.Sqrt(AC * AC + CB * CB); 
            float wtf =(AB / speedSprite.Y);
            Vector2 speed = new Vector2(AC / wtf, CB / wtf);
 
            if (finishPosition.Y < startPosition.Y) speed.Y = -speed.Y;
            if (finishPosition.X < startPosition.X) speed.X = -speed.X;
 
            speedSprite = speed;
        }
А вот такая строчка была в UpDate пульки
C#
1
spritePosition +=speedSprite;
Все что тут не инициализировано - поля типа Vector2.
Фактически это [float, float] к которым обращаются, как к X и Y.
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
21.10.2012, 19:20  [ТС]
Ну по идее мне не надо прорисоывать движение пули и саму пулю, надо просто чтобы были прорисованы корабли и тыкать по ним, и при попадении/непопадении по кораблю прорисовывать например картинку взрыва/картинку промаха.
0
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
21.10.2012, 20:24
хм...тогда точно так же, как и рисование корабля - на его месте отрисовываешь спрайт взрыва..почитай про спрайтовую анимацию и все поймешь
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
21.10.2012, 22:01  [ТС]
А определять корабли по рисунку как? местоположение их точнее...координат как я понимаю нету, это же не grid

Добавлено через 54 минуты
Погуглил, почитал, пришёл к выводу что Директ и Шарп не особо дружат друг с другом, а темболее на х64 ОС: библиотеки Директа не подключаются и т.д.
0
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
21.10.2012, 22:22
Да тебе пофигу на чем делать, в принципе вся логика игры одинакова. Привязать матрицу к координатам попробуй. Попросту создай 2-х мерный массив ( твой Grid) и домножай номер столбца\строки на n-кол-во пикселов. там и рисуй - вот тебе и гриП
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
21.10.2012, 22:40  [ТС]
Так в том то и дело, что стоит задание написать с использывание Директа и никак иначе. Если б можно было хоть как писать, главное чтобы игра получилась, то понятно что писалось бы на простой форме использую стандартный Grid и возможно какието картинки, хз.

Почемуто мне кажется что завтра поговорю с преподом и сменю тему, ато менять ОС на х86 не охота xD
0
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
22.10.2012, 13:23
BoneOne, Ты меня совершенно не понял. Почитай, хоть, как цикл игры сформировать..сделай начала в WinForms...только по "правилам" аппаратно-ускоряемые библиотек. Тогда потом портировать на DirectX не составит труда.
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
22.10.2012, 13:38  [ТС]
Вобщем поменял я тему курсача, спасибо всем за ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2012, 13:38
Помогаю со студенческими работами здесь

"Морской бой": нужны комментарии/замечания
Написал морской бой. Просьба прокоменнтировать, улучшить где возможно и помочь написать ИИ. Вот исходники: #include &lt;iostream&gt;...

Игра "Морской бой" для Android в С#, с использованием Uniti 2d или 3d
Помогите плиз)

Морской бой
Здраствуйте. Простите пожалуйста, немогли бы вы мне помочь в поиске компонента C# для реализации поля в морском бое. Никак не могу найти...

Морской бой
Здравствуйте. Я новичок в програмировании, в целях изучения решил создать примитивный &quot;Морской Бой&quot;. С &quot;консольной&quot;...

Морской бой
Здравствуйте.Прошу помочь. Задался целью написать морской бой под консолью. Для начала решил рандомно заполнить поле игрока тремя...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru