89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
1

Игра в 15

01.11.2016, 10:50. Показов 1788. Ответов 14

Студворк — интернет-сервис помощи студентам
Всем привет, нашел на форуме исходник игры в пятнашки. Сейчас хочу переделать. Добавить выбор количества костей например: 3x3, 4x4, 5x5. Добавить сохранение игры через Sterializer. Сейчас застрял на этапе выбора количества костей через MenuStrip.

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
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
namespace WindowsFormsApplication40
{
    public partial class Form1 : Form
    {
        private GameField GF;
        private int sizeOfField;
        private int x, y;
        public Form1(int a, int x, int y)
        {
            sizeOfField = a;
            this.x = x;
            this.y = y;
            InitializeComponent();
            Button[] fieldButtons = new Button[sizeOfField]; // Тут нужно изменять, во избежания артефактов;
            for (int i = 0; i < fieldButtons.Length; i++) 
            {
                fieldButtons[i] = new Button(); 
                fieldButtons[i].ForeColor = Color.Black;
                fieldButtons[i].BackColor = Color.DarkGray; 
                fieldButtons[i].Font = new Font(fieldButtons[i].Font,FontStyle.Bold);  
                fieldButtons[i].Text = (i+1).ToString();
                fieldButtons[i].Size = new Size(50, 50);
            }
            GF = new GameField(this,fieldButtons,new Point(100,100),10,new Size(x,y));  // Размер кнопок
            GF.VictoryEvent += new GameField.FieldEventHandler(Victory);
        }
        private void Victory(object sender, string m)
        {
            MessageBox.Show(m);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            GF.NewGame();
        }
 
        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
        }
 
        private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Программа Пятнашки.");
        }
 
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();  // Выход из приложения;
        }
 
        private void x2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form1 field = new Form1(9,3,3);
        }
    }
}
 
    public class GameField : IDisposable // Выполняет определяемые приложением задачи, 
                                         // связанные с удалением, высвобождением или сбросом неуправляемых ресурсов;
{
 
        //поля
        public event FieldEventHandler VictoryEvent;
        public delegate void FieldEventHandler(object sender, string message);
        //private 
        private Button[] innerbuttons = null;
        private Size fieldSize = new Size(5,5);         // размер поля
        private int sideLength = 50;                    // размер стороны кнопки
        private Point location = new Point(12, 41);     // позиция поля на форме
        private int betweenButtonDistance = 6;          // расстояние между кнопками на форме
        private Form myform = null;                     // форма, на которой расположено поле
 
        //конструкторы, при желании сюда можно еще что-то добавить:)
        public GameField()
        {
            FillButtons();
        }
 
        public GameField(Form form)
        {
            if (form == null) { throw new ArgumentException("Параметр не может быть равен null!"); }
            FillButtons();
            foreach (Button b in innerbuttons) { form.Controls.Add(b); }
        }
 
        public GameField(Form form, Button[] Buttons)
        {
            if (form == null || Buttons == null) { throw new ArgumentException("Параметр не может быть равен null!"); }
            if (Buttons.Length != FieldElementsCount) { throw new ArgumentException("Количество кнопок должно соответствовать размеру поля!"); }
            for (int i = 0; i < FieldElementsCount; i++) { if (Buttons[i] == null || Buttons[i].Width != Buttons[i].Height || Buttons[i].Size != Buttons[0].Size) { throw new ArgumentException("Неподходящие кнопки!"); } }
            this.sideLength = Buttons[0].Width;
            this.innerbuttons = Buttons;
            FillButtons();
            foreach (Button b in innerbuttons) { form.Controls.Add(b); }
        }
 
        public GameField(Form form, Button[] Buttons, Point location, int betweenbuttondist, Size fieldsize)
        {
            if (form == null || Buttons == null) { throw new ArgumentException("Параметр не может быть равен null!"); }
            if (fieldsize.Width <= 0 || fieldsize.Height <= 0) { throw new ArgumentException("Размер поля не может быть нулевым!"); }
            if (location.X < 0 || location.Y < 0) { throw new ArgumentException("Позиция поля не может быть отрицательной"); }
            this.fieldSize = fieldsize;
            if (Buttons.Length != FieldElementsCount) { throw new ArgumentException("Количество кнопок должно соответствовать размеру поля!"); }
            for (int i = 0; i < FieldElementsCount; i++) { if (Buttons[i] == null || Buttons[i].Width != Buttons[i].Height || Buttons[i].Size != Buttons[0].Size) { throw new ArgumentException("Неподходящие кнопки!"); } }
            this.betweenButtonDistance = betweenbuttondist;
            this.sideLength = Buttons[0].Width;
            this.innerbuttons = Buttons;
            this.location = location;
            FillButtons();
            foreach (Button b in innerbuttons) { form.Controls.Add(b); }
        }
Ругается в Programs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace WindowsFormsApplication40
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());  // Тут просит параметры, но при вводе все равно ошибка.
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2016, 10:50
Ответы с готовыми решениями:

Бюджет 4500 гр. Конфигурация работа в Office, AutoCAD, игра Assassin, онлайн игра World of Tanks
Собираю компьютер для сестры. Основные требования: работа в Microsoft Office, AutoCAD, игра...

Игра в загадки. Загадать загадку. Если ответ верен – поздравить пользователя. Затем сообщить, что игра окончена.
Всем привет! Меня зовут VitoScaletta, совсем недавно начал обучаться JS, но очень тяжело в голову...

Игра в «Одиннадцать предметов», игра Баше.
прошу помощи в создании программы! Разработать программную модель следующей игры двух...

Как сделать так, чтобы при нажатии на кнопку "Новая игра" игра начиналась заново?
Как сделать так, чтобы при нажатии на кнопку &quot;Новая игра&quot; игра начиналась заново? unit1.cpp void...

14
910 / 814 / 332
Регистрация: 03.02.2015
Сообщений: 5,247
Записей в блоге: 9
01.11.2016, 10:52 2
Думаю в классе GameField нужно смотреть. Без исходов вам врятли подскажут - тут форум а не битва экстросенсов.
0
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
01.11.2016, 11:01  [ТС] 3
Пожалуйста. Вот исходник.
Вложения
Тип файла: rar MyGreatPuzzles.rar (4.30 Мб, 31 просмотров)
0
910 / 814 / 332
Регистрация: 03.02.2015
Сообщений: 5,247
Записей в блоге: 9
01.11.2016, 11:09 4
Jman, не запускается ) Уже что то правили?

Добавлено через 2 минуты
Jman, нормальный давайте проект, без правок, а то Ваше творчество не работает)
0
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
01.11.2016, 11:12  [ТС] 5
Закоментил моменты, где хотел изменять по событию MenuStrip. В конструктор хотел передавать количество костей и буфер из общего количества.
Вложения
Тип файла: rar MyGreatPuzzles.rar (4.30 Мб, 17 просмотров)
0
910 / 814 / 332
Регистрация: 03.02.2015
Сообщений: 5,247
Записей в блоге: 9
01.11.2016, 11:24 6
Jman, я поправил уже
0
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
01.11.2016, 11:25  [ТС] 7
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Jman, я поправил уже
Спасибо. Поделитесь пожалуйста, как вы сделали?
0
910 / 814 / 332
Регистрация: 03.02.2015
Сообщений: 5,247
Записей в блоге: 9
01.11.2016, 11:28 8
Лучший ответ Сообщение было отмечено Jman как решение

Решение

Jman, Наслаждайтесь. Если честно не самая удачная реализация.
Вложения
Тип файла: 7z MyGreatPuzzles.7z (2.46 Мб, 57 просмотров)
1
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
01.11.2016, 18:39  [ТС] 9
Спасибо огромное! Теперь буду пилить сохранение.

Добавлено через 6 часов 58 минут
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Если честно не самая удачная реализация.
В чем?
0
976 / 871 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
01.11.2016, 23:10 10
Узнаю свой старый кривой код из этой темы
Цитата Сообщение от Jman Посмотреть сообщение
В чем?
Как минимум в том, что у меня там в классе используется массив кнопок, кои являются несериализуемыми объектами и вообще так делать-моветон. В результате, чтобы сохранить настройки самих кнопок, придется писать отдельный код, вместо того, чтобы просто сериализовать этот класс как есть. Да и ссылка на форму туда подается, чего делать тоже явно не стоит. По уму надо было делать отдельный класс для ячейки, в массиве держать объекты этого класса(а не кнопки), а рисовать все в методе Draw(Graphics g). А про контролы и формы этому классу знать вообще ничего не положено, достаточно графикса. Тогда бы и сериализовывался этот класс легко и просто. Да и по мелочи там есть к чему придраться.
Правда, надо сказать, что сериализовывать что-то, кроме позиции пустой клетки и пары настроек, там в ряд ли кому придет в голову
2
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
01.11.2016, 23:14  [ТС] 11
Да, именно там я его и взял =) Сейчас пытаюсь сериализовать. Пока не знаю правда как, бибку в проект включил уже.
0
976 / 871 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
01.11.2016, 23:27 12
Jman, проще всего обычно использовать бинарную сериализацию (BinaryFormatter). Но, как я уже сказал, целиком сериализовать объект класса GameField не получится. Либо надо сделать отдельный класс с настройками поля и сериализовывать/десериализовывать только их, а потом на их основании уже создавать GameField, либо переписать сам класс поля так, как я указал выше.
0
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
01.11.2016, 23:53  [ТС] 13
Цитата Сообщение от EvilFromHell Посмотреть сообщение
либо переписать сам класс поля так, как я указал выше.
Это пока для меня вверх профессионализма =)

Добавлено через 14 минут
Кстати такой вопрос к Вам ка к автору, как можно сделать так, что бы при запуске программы, кнопки на поле не отображались и игра начиналась только при нажатии на старт?
0
976 / 871 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
01.11.2016, 23:58 14
Jman, просто создавайте GameField по нажатию кнопки, а не в конструкторе формы.
1
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
03.11.2016, 12:59  [ТС] 15
Ребята помогите пожалуйста сериализовать плитки в этой игре... Не получается...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2016, 12:59
Помогаю со студенческими работами здесь

Игра Кости, игра с компьютером
Всем привет! Делаю консольную игру Кости. Условия такие: 1) Перед игрой все игроки бросают...

Игра слов, игра Scrabble
Задание: Создать программу для решения задачи построения слова из некоторого множества букв (игра...

Существует ли игра такая игра?
Всем привет. Существует ли такая игра, где, допустим, мы находимся на космическом корабле, в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru