Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 23.12.2019
Сообщений: 1

Шашки в Windows Forms

24.12.2019, 01:26. Показов 7337. Ответов 3

Студворк — интернет-сервис помощи студентам
Очень нужна помощь!
Необходимо написать шашки на wf за пару дней
После нескольких часов мучений с пикчбоксом, было решено использовать кнопки
Но из-за этого возникли некоторые проблемы, например: как отслеживать очередность ходов (черные-белые)?
как запомнить два последних нажатия кнопки? (игрок сначала кликает на кнопку с шашкой, которую хочет передвинуть, потом кликает на кнопку, на место которой хочет поставить шашку, и пока не кликнет на последнюю, ничего нельзя делать с первой кнопкой (например, убирать изображение шашки с кнопки), плюс необходимо проверить, можно ли сходиться на ту клетку, которую игрок отметил второй)
Буду рада любой помощи и идеям!
Любые костыли, только бы работало
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2019, 01:26
Ответы с готовыми решениями:

Будут ли работать приложения написанные на Windows Forms на Windows 8
Будут ли работать приложения написанные на Windows Forms на Windows 8? И собсно еще вопрос, вы считаете что время Windows Forms...

Как переделать Windows Forms приложение в Windows Service с UI?
Здравствуйте, уважаемые посетители форума! Вопрос такой. У меня есть приложение C# Win Forms с интерфейсом. Как из него сделать...

Перенос приложения Windows Forms в Windows Market
Как с минимальными затратами времени перенести десктопное приложение на магазин Windows ? Есть ли какая то возможность Использовать тот же...

3
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
24.12.2019, 03:24
Лучший ответ Сообщение было отмечено Жанна1234567876 как решение

Решение

Чтобы упростить все это безобразие я бы порекомендовал сделать машину состояний и при выполнении действия пользователем проверять, что для текущего состояния это действие является валидным.

Примерная идея:

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
public enum State 
{
    NotStarted,
    WhiteTurn,
    WhiteTurnItemPickedUp,
    BlackTurn,
    BlackTurnItemPickedUp,
    GameOver
}
 
// ...
 
private State currentState = State.NotStarted; // текущее состояние игры, будет меняться в зависимости от действий пользователей
private Item pickedUpItem = null; // выбраная шашка, которую хотим переставить
 
private void NewGame()
{
     // подготавливаем доску, и т.д.
     // ...
     // устанавливаем состояние "ход белых"
      currentState = State.WhiteTurn;
}
 
private void ItemClick(Item item) // обработчик клика ячейки
{
    switch(currentState)
    {
        case State.WhiteTurn:            
            if (item.IsWhite) // проверяем что кликнутая шашка является белой
            {
                pickedUpItem = item; // запоминаем шашку
                HighlightItem(item); // подсвечиваем шашку, убираем подсветку с остальных        
                currentState = State.WhiteTurnItemPickedUp; // устанавливаем состояние, что шашка выбрана.
            }
            else
            {
                 Console.Beep(); // вопроизводим звук индикации что действие невозможно, или как то так
            }
            break;
        case State.WhiteTurnItemPickedUp:
            if (item.IsEmpty && IsValidMove(pickedUpItem, item)) // проверяем, что кликнута свободная клетка, проверяем что ход является допустимым
            {
                 pickedUpItem = null;
                 HighlightItem(item);
                 ExecuteMove(pickedUpItem, item); // выполняем ход: обозначаем новую ячейку белым цветом, обозначаем старую ячейку пустой, обозначаем сьеденую черную шашку пустой ячейкой, и т.д.
                 currentState = CalculateNextStateAfterWhiteTurn(item); // определяем чей ход дальше. Если в пределах досягаемости подследней походившей шашку есть черная шашка которую можно сьесть то опять будет ход белых (State.WhiteTurn). Если черных не осталось, то коней игры. Иначе ход черных
            }
            break;
         // и то же самое для черных) и для состояния конец игры
    }
}
1
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
24.12.2019, 09:43
Цитата Сообщение от Жанна1234567876 Посмотреть сообщение
Буду рада любой помощи и идеям!
Вот как-то делалось: Шашки, как способ скоротать время
0
 Аватар для Aferuga
645 / 529 / 324
Регистрация: 20.05.2015
Сообщений: 1,471
24.12.2019, 09:44
Как вариант:
Кликните здесь для просмотра всего текста
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
        public Game gam;
        public Shashki()
        {
            InitializeComponent();
        }
        public class Game
        {
            public int[,] field;
            public bool firstPlayer;
            public Point? tek_sel;
            private bool isSimple;
            private bool canChange;
            public Game()
            {
                firstPlayer = true;
                canChange = true;
                setDefaultField();
            }
 
            private void setDefaultField()
            {
                field = new int[8, 8];
                field.Initialize();
                int par = 0;
                for (int i = 0; i < 8; i++,par++)
                    for (int j = 0; j < 8; j++, par++)
                    {
                        if (par % 2 == 1)
                        {
                            if (i < 3) field[i, j] = 1;
                            if (i > 4) field[i, j] = 3;
                        }
                        else
                        {
                            field[i, j] = -1;
                        }
                    }
            }
            private bool canTarget(int x,int y)
            {
                return (firstPlayer ? (field[x, y] == 1) || (field[x, y] == 2) : (field[x, y] == 3) || (field[x, y] == 4));
            }
            private bool canMove(int x, int y)
            {
                int par_add=firstPlayer?1:-1;
                int x1 = tek_sel.Value.X;
                int y1 = tek_sel.Value.Y;
                if (field[x, y] == 0)
                {
                    if (isSimple)
                    {
 
                        if (((y == y1 + 1) || (y == y1 - 1)) && (x == x1 + par_add)) return true;
                        else
                        {
                            if ((Math.Abs(x - x1) == 2) && (Math.Abs(y - y1) == 2))
                            {
                                int val = field[(x + x1) / 2, (y + y1) / 2];
                                return (firstPlayer ? (val == 3) || (val == 4) : (val == 1) || (val == 2));
                            }
                        }
                    }
                }
                return false;
            }
 
            private bool canAttack()
            {
                int x1 = tek_sel.Value.X;
                int y1 = tek_sel.Value.Y;
                int[,] check = new int[4, 2] { { -1, -1 }, { 1, -1 }, { -1, 1 }, { 1, 1 } };
                    if (isSimple)
                    {
                        for(int i=0; i<4; i++){
                            bool done = false;
                            for (int j = 1; j < 3; j++)
                                if ((x1 + check[i, 0]*j >= 0) && (x1 + check[i, 0]*j < 8) && (y1 + check[i, 1]*j >= 0) && (y1 + check[i, 1]*j < 8))
                                {
                                    int val = field[x1 + check[i, 0]*j, y1 + check[i, 1]*j];
                                    if (j == 2)
                                    {
                                        if ((val == 0) && (done)) return true;
                                    }
                                    else
                                    {
                                        done = firstPlayer ? (val == 3) || (val == 4) : (val == 1) || (val == 2);
                                    }
                                }
                            }
                    }
                
                return false;
            }       
            private void useMove(int x, int y)
            {
                int x1 = tek_sel.Value.X;
                int y1 = tek_sel.Value.Y;
                    if (isSimple)
                    {
                        field[x1, y1] = 0;
                        if ((firstPlayer) && (x == 8)) isSimple = false;
                        if ((!firstPlayer) && (x == 0)) isSimple = false;
 
                        field[x, y] = firstPlayer ? (isSimple? 1:2) : (isSimple?3:4);
 
                        tek_sel = new Point(x, y);
                        if ((Math.Abs(x - x1) == 2) && (Math.Abs(y - y1) == 2))
                        {
                            field[(x + x1) / 2, (y + y1) / 2] = 0;
                            if (!canAttack())
                            {
                                tek_sel = null;
                                canChange = true;
                                firstPlayer = !firstPlayer;
                            }
                            else
                            {
                                canChange = false;
                            }
                        }
                        else
                            {
 
                                tek_sel = null;
                                canChange = true;
                                firstPlayer=!firstPlayer;
                            }
                        
                        
                    }
                
            }
            public void clickOnField(int x, int y)
            {
                if (tek_sel == null)
                {
                    if (canTarget(x, y))
                    {
                        tek_sel = new Point(x, y);
                        isSimple = !((field[x, y] == 2) || (field[x, y] == 4));
                    }
                }
                else
                {
                    if (canMove(x, y))
                    {
                        useMove(x, y);
                    }
                    else
                    {
                        if (canChange)
                        {
                            if (canTarget(x, y))
                            {
                                tek_sel = new Point(x, y);
                                isSimple = !((field[x, y] == 2) || (field[x, y] == 4));
 
                            }
                        }
                    }
                }
 
            }
 
        }
 
        private void createGrid()
        {
            dataGridView1.RowCount = 8;
            dataGridView1.ColumnCount = 8;
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;
                            int par = 0;
                for (int i = 0; i < 8; i++,par++)
                    for (int j = 0; j < 8; j++, par++)
                    {
                            dataGridView1.Rows[i].Cells[j].Style.BackColor = (par%2==1? Color.White:Color.Gray);
                    }
        }
 
        private void Shashki_Load(object sender, EventArgs e)
        {
            createGrid();
            gam = new Game();
            updateGrid();
        }
 
        private void updateGrid()
        {
            int[,] mass = gam.field;
            for (int i = 0; i < 8; i++)
                for (int j = 0; j < 8; j++)
                {
                    if (mass[i, j] >= 0)
                        dataGridView1.Rows[i].Cells[j].Value = (mass[i, j] == 0 ? "" : mass[i, j].ToString());
                }
            dataGridView1.ClearSelection();
            if (gam.tek_sel != null)
                dataGridView1.Rows[gam.tek_sel.Value.X].Cells[gam.tek_sel.Value.Y].Selected = true; 
        }
 
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            gam.clickOnField(e.RowIndex,e.ColumnIndex);
            updateGrid();
        }

З. Ы. Ходы дамками на данный момент не расписаны.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2019, 09:44
Помогаю со студенческими работами здесь

Код для Windows Forms не работает в Web Forms?
В том году я делал лабораторки по Winforms. Естественно, они все у меня сохранились, и я полез в их код, вспоминать былое, так сказать,...

Windows.Forms - Процедуры, цикл for и System.Windows.Forms.Button
Доброго времени суток. Есть WinForms программа: ... private ClickedButtonId, ClickedButtonX, ClickedButtonY:Integer; ...

Давайте создадим шашки онлайн, шашки между людьми
Давайте я создам шашки для двух игроков,со сменой цветов,с именами,с расстановкой шашек и сохранением позиции. А вы сделаете чтобы играть...

Игра шашки: Исправить копирование шашки заместо переставления
Почти написал шашки на с++, но есть одна проблема,При захвате шашки оно ейо не перставляет а копирует,вот код: //...

Выражение типа "System.Windows.Forms.Control" не может быть выражением типа "System.Windows.Forms.Menu"
Перевёл проект с версии 2008 на версию 2010 Наткнулся при компиляции на кучу не объявленных переменных и на 2 ошибки. Собственно с...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru