Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/33: Рейтинг темы: голосов - 33, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 61
1

Морской бой

23.10.2010, 21:32. Показов 6138. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот решил написать морской бой. Как всё это сделать примерно понимаю, но вот хочу посоветоваться с вами по некоторым вопросам.

1) Как лучше нарисовать поле для игры? Делал так:

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace MorskojBoj
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            makefield();
        }
 
        public Brush MyBrushB = Brushes.Black;
        public Brush MyBrushW = Brushes.White;
        public Pen MyPenR = Pens.Red;
 
        int[,] mas1 = new int[10, 10];
        int[,] mas2 = new int[10, 10];
 
 
        private void makefield()//рисует поле
        {
            Graphics g = pictureBox1.CreateGraphics();
 
            for (int i = 1; i <10; i++)
            {
                for (int j = 1; j < 10; j++)
                {
                    if (mas1[i, j] == 0)
                    {
                        g.FillRectangle(MyBrushW, i * 30, j * 30, 30, 30);
                    }
                    g.DrawRectangle(MyPenR, i * 30, j * 30, 30, 30);
                }
            }
        }
 
 
    }
}
Но этот вариант мне не нравиться тем, что после того как сверну программу, поле исчезает. Как лучше мне нарисовать поле?

2) Как организовать передачу данных по сети? код за меня писать не надо, это попробую сделать сам. Скажите просто через, что в C# можно организовать передачу данных по сети? Ни разу не писал приложения работающие по сети
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2010, 21:32
Ответы с готовыми решениями:

Морской Бой
Вопрос в том как сделать меню какоенибудь чтоб выбор в игре был пример 1-палубные и двух палобные...

Морской бой
хочу написать игру... но если честно, то даже не знаю с какой стороны подойти и как должно это...

Морской бой
Ребят, а как написать код, чтоб корабли в притык нельзя было ставить?! Зарание спасибо! вот мой...

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

12
86 / 85 / 13
Регистрация: 21.10.2010
Сообщений: 349
23.10.2010, 21:43 2
Цитата Сообщение от [JB] Посмотреть сообщение
Вот решил написать морской бой. Как всё это сделать примерно понимаю, но вот хочу посоветоваться с вами по некоторым вопросам.

1) Как лучше нарисовать поле для игры? Делал так:

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace MorskojBoj
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            makefield();
        }
 
        public Brush MyBrushB = Brushes.Black;
        public Brush MyBrushW = Brushes.White;
        public Pen MyPenR = Pens.Red;
 
        int[,] mas1 = new int[10, 10];
        int[,] mas2 = new int[10, 10];
 
 
        private void makefield()//рисует поле
        {
            Graphics g = pictureBox1.CreateGraphics();
 
            for (int i = 1; i <10; i++)
            {
                for (int j = 1; j < 10; j++)
                {
                    if (mas1[i, j] == 0)
                    {
                        g.FillRectangle(MyBrushW, i * 30, j * 30, 30, 30);
                    }
                    g.DrawRectangle(MyPenR, i * 30, j * 30, 30, 30);
                }
            }
        }
 
 
    }
}
Но этот вариант мне не нравиться тем, что после того как сверну программу, поле исчезает. Как лучше мне нарисовать поле?

2) Как организовать передачу данных по сети? код за меня писать не надо, это попробую сделать сам. Скажите просто через, что в C# можно организовать передачу данных по сети? Ни разу не писал приложения работающие по сети
А тебе критично именно на кнопку вешать вызов подпрограммы? На онлоад формы не?
И на сколько я помню можно рисовать прямо на самой форме в определенном диапазоне.
0
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 61
23.10.2010, 21:50  [ТС] 3
Цитата Сообщение от Vangok Посмотреть сообщение
А тебе критично именно на кнопку вешать вызов подпрограммы? На онлоад формы не?
И на сколько я помню можно рисовать прямо на самой форме в определенном диапазоне.
В данный момент мне всё равно куда вешать подпрограмму. Это я сделал для теста. А в дальнейшем поле будет рисоваться при загрузки программы.

Меня сам метод интересует. Надо сделать, так, что бы оно не исчезала. Хотелось бы всё таки нарисовать на picturboxe, но попробую сейчас нарисовать на самой форме.
0
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
23.10.2010, 22:12 4
что то похожая проблема была - исчезали прорисованные формы, когда сворачивал и накладывал поверх другое окно. тут нужно делать перерисовку всего после того как нарисовал линии (ну или что там задано).

Цитата Сообщение от [JB
]2) Как организовать передачу данных по сети?
рекомендую почитать инфо по сокетам, передача данных по сети. на форуме много и неоднократно уже об этом писалось, обсуждалось. Там особо ничего сложного нет.
0
Заблокирован
24.10.2010, 21:30 5
Цитата Сообщение от Vangok Посмотреть сообщение
Но этот вариант мне не нравиться тем, что после того как сверну программу, поле исчезает. Как лучше мне нарисовать поле?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public Brush MyBrushB = Brushes.Black;
        public Brush MyBrushW = Brushes.White;
        public Pen MyPenR = Pens.Red;
 
        int[,] mas1 = new int[10, 10];
        int[,] mas2 = new int[10, 10];
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
 
            for (int i = 1; i < 10; i++)
            {
                for (int j = 1; j < 10; j++)
                {
                    if (mas1[i, j] == 0)
                    {
                        g.FillRectangle(MyBrushW, i * 30, j * 30, 30, 30);
                    }
                    g.DrawRectangle(MyPenR, i * 30, j * 30, 30, 30);
                }
            }
        }
0
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 61
24.10.2010, 22:27  [ТС] 6
Не помогло, так тоже исчезает при сворачивании программы. Может есть какой нибудь другой метод, не
Graphics g = this.CreateGraphics();, а какой нибудь другой?

А если каждый раз refresh делать, то не красиво получается. Получается, что поле моргает ...
0
Заблокирован
24.10.2010, 22:56 7
[JB], ты не ошибаешься? Ты внимательно посмотрел на событие? Form1_Paint?
Каждый раз твоя форма перерисовывается и каждый раз рисуются твои клетки.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
24.10.2010, 23:06 8

Не по теме:

SSV, зачем заново создавать Graphics когда он уже существует в параметре 'e'.

Цитата Сообщение от SSV Посмотреть сообщение
Graphics g = this.CreateGraphics();
C#
1
2
3
...
Graphics g = e.Graphics;
...


А вообще [JB] косяк где-то у тебя, код который привел SSV рабочий. Я предполагаю что-ты просто не добавил событие Paint формы в дизайнере.
0
Su
9 / 9 / 0
Регистрация: 09.10.2010
Сообщений: 22
24.10.2010, 23:38 9
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
82
83
84
85
86
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace MCom
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            int iX = 0, iY = 0;
            for (int i = 0; i != 9; i++)
            {
                CButton b = new CButton();
                b.Parent = this;
                iX += b._iH;
                if (i % 3 == 0)
                {
                    iY += b._iH;
                    iX = 0;
                }
 
                b.Location = new Point(10 + iX, 10 + iY);
            }
        }
 
        public class CButton : Button
        {
            private bool bIsClick = false;
            public int _iH
            {
                get { return this.Height; }
            }
 
            public CButton()
            { 
                this.Size = new Size(25,25);
            }
            public override string Text
            {
                get
                {
                    return base.Text;
                }
            }
 
            protected override void OnClick(EventArgs e)
            {
                base.OnClick(e);
                bIsClick = (bIsClick == false) ? (bIsClick = true) : (bIsClick = false);
                this.Invalidate(true);
            }
            protected override void OnPaint(PaintEventArgs pevent)
            {
                base.OnPaint(pevent);
                Rectangle r = pevent.ClipRectangle;
                Pen p = new Pen(Brushes.Black,2f);
                pevent.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.GammaCorrected;
                r.Inflate(-5, -5);
 
                if (bIsClick)
                {
                    pevent.Graphics.DrawEllipse(p, r);
                }
                else
                {
                    pevent.Graphics.DrawLine(p,
                        r.X, r.Y,
                        r.Right, r.Bottom);
 
                    pevent.Graphics.DrawLine(p,
                                            r.Right, r.Y,
                                            r.X, r.Bottom);
 
                }
            }
 
            
        }
    }
}
0
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 61
26.10.2010, 22:33  [ТС] 10
Вот приложил, то что уже сделал. Просьба на оформление не обращать внимание, так как это пока ещё всё в процессе разработки.

Запустите программу. Отметьте "ХХ" и попробуйте поводить курсором по picturboxu. В richtextbox отображается массив, с помощью которого рисуется поля. Не получается закрепить кораблик. То есть, что бь после выбора позиции он остался на поле и можно было добавить следующий корабль. Самое главное, что примерно представляю как это можно сделать, но как начинаю писать, ни чего не выходит.

Посмотрите, может вы на свежую голову поймёте.


Думаю надо делать как то так: перед выборам фигуры сохранить mas1 в mas2, потом выбрать позицию корабля при выборе mas1(при выборе первый массив всё время обновляется и хранит только координаты текущего положения кормабля), после того как кликнули по picturboxu значения mas1 должны добавится в значения mas2 и потом mas1 = mas2. В общем посмотрите сами ....



Su, не понял, что ты этим кодом хотел сказать .... но за ответ всё равно спасибо
Вложения
Тип файла: rar morskoj_boj.rar (661.9 Кб, 447 просмотров)
0
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 61
14.11.2010, 22:13  [ТС] 11
Есть небольшая проблема, теоретически понимаю как это сделать, а практически, что то не получается.

Есть массив 10х10:

1000000000
0001000000
0001000100
0001000100
0001000000
0000000000
0100000100
0100110100
0000000100
1110000000

Мне надо посчитать сколько отдельных единичек. Пример:
10
00

или

000
010
000

Сколько отдельный двойных единичек. Пример:

0000
0110
0000

или

000
010
010
000


Сколько отдельный тройных единичек. Пример:

00000
01110
00000

или

000
010
010
010
000


Сколько отдельный четверных единичек. Пример:

000000
011110
000000

или

000
010
010
010
010
000




Помогите. Если всё таки сам додумаюсь, то поделюсь ответом, как только будет доступ к интернету.

Иногда бывает, что на самом простом как застрянешь, так и стоишь на месте
0
51 / 49 / 7
Регистрация: 09.11.2010
Сообщений: 93
15.11.2010, 02:04 12
Ваша проблема - в неправильной модели данных. Ваша модель должна хранить не нолики и единички, а корабли, их координаты, ориентацию и длину. Тогда и проблем не будет.
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
15.11.2010, 08:37 13
[JB], вот моя мысль по размещению кораблей По-мойму так проще чем рисовать каждый корабль
0
15.11.2010, 08:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2010, 08:37
Помогаю со студенческими работами здесь

Морской бой в консоли
Создать игру «Морской бой» (для одного игрока). Игровое поле — квадрат 10х10. Клетки поля...

Написать игру: морской бой
Помогите написать игру, вернее подскажите как писать сам буду)) С чего вообще надо начинать писать...

Игра морской бой: никак не придумаю как лучше реализовать корабли в игре
Пишу игру &quot;Морской бой&quot; на c# и никак не решу как лучше реализовать в программе корабли.

Метод проверки корректности размещения кораблей в игре "морской бой"
Добрый день. В игре &quot;морской бой&quot; необходимо проверить корректность размещения кораблей. Первым...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru