Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
> /dev/null
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
1

Крестики-Нолики - указать на недочеты

14.04.2015, 18:30. Показов 1806. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Вчера начил изучать C#, сейчас сделал простую игру "крестики нолики".

Хочу попросить совета, какие ошибки допущены? Что лучше изменить? Какой способ реализации не верный?

Form1.cs
Кликните здесь для просмотра всего текста

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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
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;
 
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public string[] pole = new string[9]; // Поле
        public string now = "X"; //Текущий игрок
        public Image setImage = null; //Изображение текущего игрока
        /** Счет **/
        public int score_X = 0;
        public int score_O = 0;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            now_label.Text = this.now;
        }
 
        /* Очистка поля */
        private void clear()
        {
            this.pole = new string[9];
            this.now = "X";
            pole0.Image = null;
            pole1.Image = null;
            pole2.Image = null;
            pole3.Image = null;
            pole4.Image = null;
            pole5.Image = null;
            pole6.Image = null;
            pole7.Image = null;
            pole8.Image = null;
        }
 
        /* Метод отвечает за вывод и очистку поля */
        private void model()
        {
            string winner = who_win();
 
            if (winner == "Ничья")
            {
                MessageBox.Show("Победила дружба!");
                clear();
            }
            else if (winner == "X" | winner == "O")
            {
                MessageBox.Show("Победили " + winner + "-ки");
 
                if (winner == "X") this.score_X++;
                else this.score_O++;
 
                label_score_o.Text = Convert.ToString(this.score_O);
                label_score_x.Text = Convert.ToString(this.score_X);
 
                clear();
            }     
        }
        /* Проверка на победу */
        private string who_win()
        {
            /* Горизонталь */
            if (this.pole[0] == this.pole[1] & this.pole[1] == this.pole[2]) 
                return this.pole[0];
            if (this.pole[3] == this.pole[4] & this.pole[4] == this.pole[5])
                return this.pole[3];
            if (this.pole[6] == this.pole[7] & this.pole[7] == this.pole[8])
                return this.pole[6];
            /* Вертикаль */
            if (this.pole[0] == this.pole[3] & this.pole[3] == this.pole[6])
                return this.pole[0];
            if (this.pole[1] == this.pole[4] & this.pole[4] == this.pole[7])
                return this.pole[1];
            if (this.pole[2] == this.pole[5] & this.pole[5] == this.pole[8])
                return this.pole[2];
 
            /*  горизонтали */
            if (this.pole[0] == this.pole[4] & this.pole[4] == this.pole[8])
                return this.pole[0];
            if (this.pole[2] == this.pole[4] & this.pole[4] == this.pole[6])
                return this.pole[2];
 
            /* Ничья */
            int a = 0;
            
            /* Проверяем полностью ли заполнен массив */
            foreach (string value in this.pole)
            {
                if (value != null) a++;
            }
            
            if ((a - 9) == 0) return "Ничья";
            /* Возвращяеи что нибуть, так как надо вернуть значение */
            return "false";
        }
        /** Метод отвечает за заполнение клетки **/
        private void set(int cell)
        {
            if (this.pole[cell] != null)
            {
                MessageBox.Show("Место занято!");
                return;
            }
            //Ставим в массиве
            this.pole[cell] = this.now;
            /** Меняем игрока и устанавливаем его изображение **/
            if (this.now == "X")
            {
                this.now = "O";
                this.setImage = krest_ex.Image;
            }
            else if (this.now == "O")
            {
                this.now = "X";
                this.setImage = circle_ex.Image;
            }
            /** Отображаем пользователю **/
            switch (cell)
            {
                case 0:
                    pole0.Image = this.setImage;
                    break;
                case 1:
                    pole1.Image = this.setImage;
                    break;
                case 2:
                    pole2.Image = this.setImage;
                    break;
                case 3:
                    pole3.Image = this.setImage;
                    break;
                case 4:
                    pole4.Image = this.setImage;
                    break;
                case 5:
                    pole5.Image = this.setImage;
                    break;
                case 6:
                    pole6.Image = this.setImage;
                    break;
                case 7:
                    pole7.Image = this.setImage;
                    break;
                case 8:
                    pole8.Image = this.setImage;
                    break;
            }
            
            now_label.Text = this.now;
 
            return;
        }
 
        private void pole0_Click(object sender, EventArgs e)
        {
            set(0);
            model();
        }
 
        private void pole1_Click(object sender, EventArgs e)
        {
            set(1);
            model();
        }
 
        private void pole2_Click(object sender, EventArgs e)
        {
            set(2);
            model();
        }
 
        private void pole3_Click(object sender, EventArgs e)
        {
            set(3);
            model();
        }
 
        private void pole4_Click(object sender, EventArgs e)
        {
            set(4);
            model();
        }
 
        private void pole5_Click(object sender, EventArgs e)
        {
            set(5);
            model();
        }
 
        private void pole6_Click(object sender, EventArgs e)
        {
            set(6);
            model();
        }
 
        private void pole7_Click(object sender, EventArgs e)
        {
            set(7);
            model();
        }
 
        private void pole8_Click(object sender, EventArgs e)
        {
            set(8);
            model();
        }
 
        private void restart_Click(object sender, EventArgs e)
        {
            clear();
        }
    }
}

Элементы
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private System.Windows.Forms.PictureBox pictureBox1;
        private System.Windows.Forms.PictureBox pictureBox2;
        private System.Windows.Forms.PictureBox pictureBox3;
        private System.Windows.Forms.PictureBox pictureBox4;
        private System.Windows.Forms.PictureBox pole4;
        private System.Windows.Forms.PictureBox pole5;
        private System.Windows.Forms.PictureBox pole7;
        private System.Windows.Forms.PictureBox pole8;
        private System.Windows.Forms.PictureBox pole0;
        private System.Windows.Forms.PictureBox pole3;
        private System.Windows.Forms.PictureBox pole6;
        private System.Windows.Forms.PictureBox pole1;
        private System.Windows.Forms.PictureBox pole2;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label now_label;
        private System.Windows.Forms.PictureBox krest_ex;
        private System.Windows.Forms.PictureBox circle_ex;
        private System.Windows.Forms.Button restart;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Label label4;
        private System.Windows.Forms.Label label_score_x;
        private System.Windows.Forms.Label label_score_o;


Проект в MS Visual Studio 2010 внизу

Заранее спасибо!
Вложения
Тип файла: zip tic-tac-toe.zip (69.5 Кб, 40 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2015, 18:30
Ответы с готовыми решениями:

Крестики нолики
Всем привет, нужно написать игру крестики-нолики, при нажатии на pictureBox менялась картинка со...

Игра Крестики-Нолики
Подскажите, как задать условие для ничьи? private Button btnField; private...

Крестики-нолики. Критика к коду
Код с обычными крестиками-ноликами. Хотелось бы послушать критику и адреса, в которые вы меня с...

Крестики-нолики. Решение деревьями
Было задание от преследователя написать крестики-нолики, и что бы против нас играл компьютер....

5
> /dev/null
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
14.04.2015, 19:02  [ТС] 2
И какое приложение вы бы посоветовали дальше делать?
0
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
14.04.2015, 19:12 3
Лучший ответ Сообщение было отмечено Блеф как решение

Решение

1)Методы с большой буквы. И более четкие названия. Если это проверка, то Check... если получение информации то Get... Вот например метод "model" вообще не очевиден, а комментарии на самом деле зло, в идеале код должен легко читаться и без них.
2)Везде this не обязательно писать.
3)
Вот так не очень хорошо делать.
return "Ничья"
if(winner == "Ничья")

А такое еще хуже
/* Возвращяеи что нибуть, так как надо вернуть значение */
return "false";

Используйте Enum или константы.

4)
Это явно надо в массив запихать.
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
switch (cell)
            {
                case 0:
                    pole0.Image = this.setImage;
                    break;
                case 1:
                    pole1.Image = this.setImage;
                    break;
                case 2:
                    pole2.Image = this.setImage;
                    break;
                case 3:
                    pole3.Image = this.setImage;
                    break;
                case 4:
                    pole4.Image = this.setImage;
                    break;
                case 5:
                    pole5.Image = this.setImage;
                    break;
                case 6:
                    pole6.Image = this.setImage;
                    break;
                case 7:
                    pole7.Image = this.setImage;
                    break;
                case 8:
                    pole8.Image = this.setImage;
                    break;
            }
5) операторы && и || предпочтительней чем & и | в большинстве случаев.

6)Видите две проверки winner == "X"? тоже не хорошо.
C#
1
2
3
4
5
else if (winner == "X" | winner == "O")
            {
                MessageBox.Show("Победили " + winner + "-ки");
 
                if (winner == "X") this.score_X++;
7) pole1_Click, pole2_Click, pole3_Click...
Так не делают, сделайте одно событие на все кнопки. Они ведь у вас только числом отличаются.

8) Вообще, хорошо бы добавить классы и переписать в ООП стиле.

9) Постарайтесь отделить логику приложение, от ее визуализации.
Цитата Сообщение от bleef159 Посмотреть сообщение
И какое приложение вы бы посоветовали дальше делать?
Гомоку. Это почти тоже самое но уже надо 5 подряд собрать и поле побольше. Там как раз все эти ошибки учтете. А потом еще попробуйте ИИ приделать.
1
> /dev/null
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
15.04.2015, 15:08  [ТС] 4
tarasalk, спасибо за ответ. Не могли бы пожалуйста уточнить по этим пунктам?
4) как именно?
7) если один обработчик как потом определить какая кнопка была нажата?
8) какие основные классы и за что каждый должен отвечать? На данном примере.

Спасибо, и-за очень низких знаний не получается написать толково, приходиться придумывать всякие костыли.
0
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
15.04.2015, 16:32 5
4)
C#
1
2
3
4
5
6
7
PictureBox[] mas = new PictureBox[9];
mas[0] = pole0;
mas[1] = pole1;
....
mas[8] = pole8;
 
mas[cell].Image = this.setImage;
7) Так получаете кнопку(другое аналогично) на которую нажали.
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
        }
Потом с ней что хотите делайте. Например можно в Tag каждого контрола поместить номер клетки и вытаскивать его так btn.Tag.

8) Первое что приходит на ум: игра, игрок, клетка. Хотя в такой простой игре это может и излишнее, но я бы старался сразу в ООП стиле делать.
1
> /dev/null
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
15.04.2015, 17:12  [ТС] 6
tarasalk, спасибо огромное!
0
15.04.2015, 17:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2015, 17:12
Помогаю со студенческими работами здесь

Советы по реализации Крестики-нолики
Доброго времени суток! Начал изучение С#, и решил забацать сабж на простой форме. С "высоты" своего...

Очистка поля в Крестики-Нолики
я создал игру крестики нолики и там у меня после игры пишет какой то пользователь выиграл, я...

Разработать приложение «Крестики-нолики»
помогите пожалуйста с написанием приложения. Вот задание:Разработать приложение «Крестики-нолики»,...

Приложение Крестики-нолики. Игра с компьютером
Доброго времени суток. Дело вот в чем. Как в игре Крестики-нолики добавить режим "игра с...


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

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