Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Appearance settings
Содержание
- Как я шашки писал
- Предыстория
- Правила игры
- Реализация
- Искусственный Интеллект
- C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
- КОМЕНТАРІ • 28
- C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
- Комментарии • 28
- C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
- ความคิดเห็น • 28
- C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
- Şərh • 28
Как я шашки писал
Предыстория
Так уж получилось, что моим первым более-менее серьёзным проектом, связанным с программированием, была реализация шашек для «Шага в будущее». К несчастью, доделать его до конца у меня так и не получилось, так как через некоторое время концепция проекта резко поменялась. Несмотря на это, программа была практически готова и с ней даже можно было играть, к тому же сам процесс её написания оказался весьма интересным, поэтому я решил поделиться теми идеями и алгоритмами, которые сумел придумать.
Правила игры
Реализация
Сначала необходимо определить, как наша доска будет храниться в памяти. Оптимальным решением, на мой взгляд, является массив из 32 объектов, каждый из которых имеет набор методов и свойств. Свойства хранят всю возможную информацию о клетке, например:
Разумеется, это не все необходимые свойства, однако приводить все я не вижу смысла. Что касается методов, то их немного и они выполняют несложные действия типа изменения полей queen, color и прочих, а затем обновляют изображение. Так, при бое будут вызваны функции для «очищения» той клетки, с которой идёт бой и той клетки, на которой стоит срубленная шашка, а так же для отрисовки шашки на том поле, куда происходит бой.
Однако как же определять, нужно рубить, или нет? Для этого перед каждым ходом доска сканируется, проверяя выполнение нескольких условий, выполнение которых означает, что нужно бить. Но для того, чтобы это сделать, придется разбить доски на диагонали, так как бой происходит именно по ним (это, кстати, нужно и для обычных ходов).
Разбивка на диагонали происходит именно так. Обратите внимание, что все диагонали перечислены снизу-вверх. Это сделано для удобства программиста, хотя и не является обязательным. В свойствах объектов перечислены все эти диагонали, а у тех диагоналей, на которых клетка лежит, стоит true, на остальных — false.
Таким образом, я создал несколько массивов, каждый из которых содержал ссылки на объекты, соответствующие клеткам, которые находятся на диагонали, которой соответствует массив. Это позволяет нам заставить шашки двигаться.
Я не буду расписывать алгоритм до мелочей, опишу лишь в общих чертах: если на какой-либо из диагоналей встречается следующая ситуация:
«шашка(1) — шашка (2) — пустое поле» (где 1 и 2 — игроки и ход сейчас делает игрок №1), либо «пустое поле — шашка(2) — шашка (1)» [для боя в обе стороны], то присвоить свойству первой клетки, отвечающему за информацию о том, должна ли она рубить, единичку. Кроме этого присвоить некой общей переменной(назовем её jumpInd), отвечающей за бои, единичку. Это нужно, потому что может возникнуть ситуация, в которой у игрока будет выбор какой из шашек рубить.
Когда игрок нажимает на какую-либо шашку, первым делом проверяется условие jumpInd. Если jumpInd=1, а шашка, на которую кликнул игрок, не должна бить, то ничего не происходит, либо выводится сообщение о том, что игрок обязан рубить. Если jumpInd=0, то проверяется, может ли эта шашка сделать ход. Проверка выполняется аналогично проверке на бой, только немного короче: если на одной из диагоналей встречается ситуация: «шашка(1) — пустое поле(для белых) и пустое поле — шашка(1)» [для черных], то подсветить это поле. Если jumpInd=1 и игрок выбрал шашку, которой этот бой и будет производиться, то клетка, на которую будет произведен бой, также подсвечивается. Можно подсветить и шашку, которой будет сделан ход. Эти действия нужны лишь для удобства игрока. Следующим действием игрок может кликнуть по другой шашке и тогда алгоритм начнется сначала, а может кликнуть по подсвеченному полю и совершить таким образом ход.
После того, как игрок кликнул по подсвеченному полю, выполняются все методы, «подчищающие хвосты» и меняющие цвета клеток. Если jumpInd был равен нулю, то передаем ход второму игроку. Если jumpInd=1, то нужно проверить, может ли игрок срубить ещё что-либо. Если да, то подсветим поля, на которые он может попасть в результате боя. Не стоит забывать производить проверку того, не стала ли шашка дамкой. Если да, то бой будет производиться уже по дамочным правилам. Если боя вообще нет, то опять проверим на превращение в дамку, обнулим jumpInd и передадим ход.
Нам удалось реализовать простые передвижения шашки, но это только начало. Теперь мы должны реализовать движение дамок. Здесь всё несколько сложнее в реализации, по крайней мере я с ними изрядно попотел, хотя сама суть похожа.
Для каждой диагонали производится проверка условий в обе стороны, но я буду писать лишь в одну, потому что суть лишь в порядке проверок.
Проверка для хода: если встречается ситуация: «дамка — пустое поле», то подсветить эту клетку и проверить следующую. Выполнять до тех пор, пока диагональ не закончится, либо пока не встретится шашка(дамка) противоположного цвета.
Проверка для боя: если встречается ситуация: «дамка — z пустых полей — шашка(дамка) противоположного цвета — n пустых полей» (z>=0, n>0), то подсветить все n пустых полей после шашки соперника (если встретится ещё одна шашка противника, то прекратить) и проделать все те манипуляции с переменными, хранящими информацию о боях, что и в случае с обычной шашкой. После того, как игрок кликнет на подсвеченную клетку, следует проверить возможность ещё одного боя в любую сторону, кроме той, из которой мы пришли. Реализация всех этих проверок и условий заняла у меня много времени и места, но, возможно, я просто что-то упустил и можно было реализовать всё короче и красивее.
И ещё одна очень важная вещь: не стоит забывать о следующем условии: шашку нельзя срубить дважды. Это означает, что если шашка на диагонали, на которой вы сейчас находитесь, уже была срублена, то ход заканчивается (для обычной шашки на том поле, где она сейчас стоит, а для дамки на любым из пустых полей вплоть до этой уже срубленной шашки противника). Как вариант: можно хранить в каком-нибудь массиве адреса уже срубленных шашек, обнуляя его лишь при передаче хода. (собственно, я примерно так и делал)
(Дамка черных обязана рубить следующим путём: h4:e1:c3:e5 и останавливаться, так как шашка g3 всё ещё на доске. После этого белые рубят в дамки и выигрывают)
Весь этот алгоритм можно очень кратко описать следующей блок-схемой:
Первый клик:
Второй клик:
Чтобы программа поняла, где первый клик, а где второй, — создадим логическую переменную, false = первый клик, true = второй клик.
В общем-то, на этом реализация правил игры заканчиваются. Всё выглядит относительно несложно, но при переносе алгоритма в код возникает множество мелких проблем и трудностей, из-за которых код всё разбухает и разбухает. Виноват в этом сам принцип реализации доски, выбранный мной, но это лучшее из того, что пришло в голову за те две-три недели (да и те с ощутимыми перерывами), так как все действия максимально наглядны, запутаться практически невозможно, а код читается достаточно легко. Полагаю, что пожертвовать ради этого лаконичностью кода — допустимо.
Искусственный Интеллект
Однако на этом наши приключения не заканчиваются. Замечательно, что мы научили шашки двигаться, но с кем же мы будем играть? Нам необходимо создать искусственный интеллект для игры. К сожалению, полноценно его реализовать у меня так и не получилось, так как из-за плохой оптимизации программа начинала виснуть при просчете далее, чем на 5-6 ходов (порядка 20-25 тысяч позиций). При реализации я пользовался книгой Программирование шахмат и других логических игр и рекомендую её всем, кто заинтересуется проблемой ИИ в логических играх. Я остановился на улучшенном алгоритме «альфа-бета отсечений», но описывать здесь я его не буду, потому что он уже много раз на Хабре был описан до меня, например:
К несчастью, концепция моего проекта на конкурс, как я уже говорил в начале, поменялась — поэтому ИИ так и остался недоделанным и был отброшен в дальний ящик. Некоторые принципы оценки позиции, которые я успел сформулировать — тоже. Я мог бы привести их здесь, но особого интереса из-за своей специфичности они не представляют. Если кому-то будет интересно, то могу написать отдельную статью про функцию оценки и алгоритм отсечений. Так как всё это дело происходило полгода назад и статью я писал в основном по памяти, то где-то могли возникнуть неточности или несоответствия, буду рад, если вы укажите мне на них в комментариях. Если что-то нужно расписать более подробно, то обращайтесь там же. Спасибо за внимание.
Источник
C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
Показувати елементи керування програвачем
КОМЕНТАРІ • 28
Можешь скинуть весь код?) Немного не разбираюсь в алгоритме писания С#.
На гите есть, ссылка под видео
Спасибо за ответ, это правильное проектирование проекта, согласен
Но я решил не бить на сущности, ввиду маленького масштаба проекта
Можете файл с теми шашками пожалуйста скинуть?
Спрайты есть в папке на гите
Здравствуйте, возникла проблема когда я добираюсь до дамки то после обычного хода дамка может рубить, если такой ход имеется как исправить? Я новичок поэтому очень интересно узнать
@Debrone Constant бывает тоже везде косячу никак не могу идеальную прогу написать)
@Debrone Constant спасибо за ответ, простите пожалуйста я понимаю что это было давно но вы случайно не знаете где в коде можно покапаться чтобы переделать? Я новичок хотелось бы корректную программку😅😅
Видимо, я накосясил)
Неверно сделана логика на ивентовом событии onClick. У тебя получается так, что когда дамка ходит обычным ходом на больше чем 1 клетку, то она проходит проверку на то, что это был ход с рубкой фигуры. Следовательно после обычного хода дамка может рубить, если такой ход имеется.
Здравствуйте, вы смогли решить как правильно логику сделать? И еще насчет того что пешкой назад бить нельзя, я новичок поэтому было бы интересно узнать)
А какой будет код если в конце MessageBox- написать какой цвет выйграл?
@Инабат Кенетаева public void ResetGame()
<
bool player1 = false;
bool player2 = false;
for (int i = 0; i 5 місяців тому
@Debrone Constant Если не сложно можете подсказать где и что нужно написать код
В качестве отображаемого текста добавить номер или цвет выигравшего игрока)
У тебя есть Инстаграм?
Кидай проект с кодом нерабочим архивом в телеге
такая же ошибка, в коде автора работает нормально, у меня же, ошибка, и не знаю как ее решить, потому что если смотреть пошагово код, то вроде должно быть все норм, но ошибку выдает когда в функции CloseStep(), buttons[i, j] начинает приравниваться цвет, и вот вроде передаю buttons[i, j] также как в коде у автора, но все равно выдает ошибку, и не знаю как решить ее
Судя по всему приходит нулевой prevButton
Проверьте, корректно ли он передается
подскажите пожалуйста как изменить позицию всей матрицы чтобы она была по центру?
Debrone Constant у вас доска в левом верхнем углу расположена, как изменить положение?
Источник
C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
Показать панель управления
Комментарии • 28
Можешь скинуть весь код?) Немного не разбираюсь в алгоритме писания С#.
На гите есть, ссылка под видео
Спасибо за ответ, это правильное проектирование проекта, согласен
Но я решил не бить на сущности, ввиду маленького масштаба проекта
Можете файл с теми шашками пожалуйста скинуть?
Спрайты есть в папке на гите
Здравствуйте, возникла проблема когда я добираюсь до дамки то после обычного хода дамка может рубить, если такой ход имеется как исправить? Я новичок поэтому очень интересно узнать
@Debrone Constant бывает тоже везде косячу никак не могу идеальную прогу написать)
@Debrone Constant спасибо за ответ, простите пожалуйста я понимаю что это было давно но вы случайно не знаете где в коде можно покапаться чтобы переделать? Я новичок хотелось бы корректную программку😅😅
Видимо, я накосясил)
Неверно сделана логика на ивентовом событии onClick. У тебя получается так, что когда дамка ходит обычным ходом на больше чем 1 клетку, то она проходит проверку на то, что это был ход с рубкой фигуры. Следовательно после обычного хода дамка может рубить, если такой ход имеется.
Здравствуйте, вы смогли решить как правильно логику сделать? И еще насчет того что пешкой назад бить нельзя, я новичок поэтому было бы интересно узнать)
А какой будет код если в конце MessageBox- написать какой цвет выйграл?
@Инабат Кенетаева public void ResetGame()
<
bool player1 = false;
bool player2 = false;
for (int i = 0; i 5 месяцев назад
@Debrone Constant Если не сложно можете подсказать где и что нужно написать код
В качестве отображаемого текста добавить номер или цвет выигравшего игрока)
У тебя есть Инстаграм?
Кидай проект с кодом нерабочим архивом в телеге
такая же ошибка, в коде автора работает нормально, у меня же, ошибка, и не знаю как ее решить, потому что если смотреть пошагово код, то вроде должно быть все норм, но ошибку выдает когда в функции CloseStep(), buttons[i, j] начинает приравниваться цвет, и вот вроде передаю buttons[i, j] также как в коде у автора, но все равно выдает ошибку, и не знаю как решить ее
Судя по всему приходит нулевой prevButton
Проверьте, корректно ли он передается
подскажите пожалуйста как изменить позицию всей матрицы чтобы она была по центру?
Debrone Constant у вас доска в левом верхнем углу расположена, как изменить положение?
Источник
C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
ความคิดเห็น • 28
Можешь скинуть весь код?) Немного не разбираюсь в алгоритме писания С#.
На гите есть, ссылка под видео
Спасибо за ответ, это правильное проектирование проекта, согласен
Но я решил не бить на сущности, ввиду маленького масштаба проекта
Можете файл с теми шашками пожалуйста скинуть?
Спрайты есть в папке на гите
Здравствуйте, возникла проблема когда я добираюсь до дамки то после обычного хода дамка может рубить, если такой ход имеется как исправить? Я новичок поэтому очень интересно узнать
@Debrone Constant бывает тоже везде косячу никак не могу идеальную прогу написать)
@Debrone Constant спасибо за ответ, простите пожалуйста я понимаю что это было давно но вы случайно не знаете где в коде можно покапаться чтобы переделать? Я новичок хотелось бы корректную программку😅😅
Видимо, я накосясил)
Неверно сделана логика на ивентовом событии onClick. У тебя получается так, что когда дамка ходит обычным ходом на больше чем 1 клетку, то она проходит проверку на то, что это был ход с рубкой фигуры. Следовательно после обычного хода дамка может рубить, если такой ход имеется.
Здравствуйте, вы смогли решить как правильно логику сделать? И еще насчет того что пешкой назад бить нельзя, я новичок поэтому было бы интересно узнать)
А какой будет код если в конце MessageBox- написать какой цвет выйграл?
@Инабат Кенетаева public void ResetGame()
<
bool player1 = false;
bool player2 = false;
for (int i = 0; i 5 หลายเดือนก่อน
@Debrone Constant Если не сложно можете подсказать где и что нужно написать код
В качестве отображаемого текста добавить номер или цвет выигравшего игрока)
У тебя есть Инстаграм?
Кидай проект с кодом нерабочим архивом в телеге
такая же ошибка, в коде автора работает нормально, у меня же, ошибка, и не знаю как ее решить, потому что если смотреть пошагово код, то вроде должно быть все норм, но ошибку выдает когда в функции CloseStep(), buttons[i, j] начинает приравниваться цвет, и вот вроде передаю buttons[i, j] также как в коде у автора, но все равно выдает ошибку, и не знаю как решить ее
Судя по всему приходит нулевой prevButton
Проверьте, корректно ли он передается
подскажите пожалуйста как изменить позицию всей матрицы чтобы она была по центру?
Debrone Constant у вас доска в левом верхнем углу расположена, как изменить положение?
Источник
C# ШАШКИ WINFORMS/ C# CHECKERS WINDOWS FORMS
Oyunçu kontrollarını göstərin
Şərh • 28
Можешь скинуть весь код?) Немного не разбираюсь в алгоритме писания С#.
На гите есть, ссылка под видео
Спасибо за ответ, это правильное проектирование проекта, согласен
Но я решил не бить на сущности, ввиду маленького масштаба проекта
Можете файл с теми шашками пожалуйста скинуть?
Спрайты есть в папке на гите
Здравствуйте, возникла проблема когда я добираюсь до дамки то после обычного хода дамка может рубить, если такой ход имеется как исправить? Я новичок поэтому очень интересно узнать
@Debrone Constant бывает тоже везде косячу никак не могу идеальную прогу написать)
@Debrone Constant спасибо за ответ, простите пожалуйста я понимаю что это было давно но вы случайно не знаете где в коде можно покапаться чтобы переделать? Я новичок хотелось бы корректную программку😅😅
Видимо, я накосясил)
Неверно сделана логика на ивентовом событии onClick. У тебя получается так, что когда дамка ходит обычным ходом на больше чем 1 клетку, то она проходит проверку на то, что это был ход с рубкой фигуры. Следовательно после обычного хода дамка может рубить, если такой ход имеется.
Здравствуйте, вы смогли решить как правильно логику сделать? И еще насчет того что пешкой назад бить нельзя, я новичок поэтому было бы интересно узнать)
А какой будет код если в конце MessageBox- написать какой цвет выйграл?
@Инабат Кенетаева public void ResetGame()
<
bool player1 = false;
bool player2 = false;
for (int i = 0; i 5 ay əvvəl
@Debrone Constant Если не сложно можете подсказать где и что нужно написать код
В качестве отображаемого текста добавить номер или цвет выигравшего игрока)
У тебя есть Инстаграм?
Кидай проект с кодом нерабочим архивом в телеге
такая же ошибка, в коде автора работает нормально, у меня же, ошибка, и не знаю как ее решить, потому что если смотреть пошагово код, то вроде должно быть все норм, но ошибку выдает когда в функции CloseStep(), buttons[i, j] начинает приравниваться цвет, и вот вроде передаю buttons[i, j] также как в коде у автора, но все равно выдает ошибку, и не знаю как решить ее
Судя по всему приходит нулевой prevButton
Проверьте, корректно ли он передается
подскажите пожалуйста как изменить позицию всей матрицы чтобы она была по центру?
Debrone Constant у вас доска в левом верхнем углу расположена, как изменить положение?
Источник
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(); } |
Игра «Шашки». Разрабатываемое приложение представляет собой программную реализацию логической игры “Шашки”. Необходимо реализовать подмножество правил классических шашек на доске 8×8.
Описание программы:
Программа представляет собой приложение Windows Forms, написанное на языке C#, которое реализует игру «Шашки»
Требования:
- начало игры на чистом поле, сброс предыдущей игры;
- игра против компьютер;
- контроль правильности ходов игроков;
- определение конца игры, отслеживание патовых ситуаций;
- индикацию текущего счета;
Фрагмент кода из программы:
//нахождение возможных ходов у шашки компьютера public void EShashkaTurn(Checkers[,] chs, List<Move> Moves1, List<Move> Moves2) { if (id == -3)//заполнение списков с ходами, если шашка - дамка { DamkaTurn(chs, Moves1, Moves2, "computer"); } else//заполнение списков с ходами, если шашка - не дамка { if ((i > 1) && (j > 1) && (chs[i - 2, j - 2].id == 0) && (chs[i - 1, j - 1].id == 1 || chs[i - 1, j - 1].id == 3)) { Moves1.Add(new Move(chs[i, j], chs[i - 2, j - 2], chs[i - 1, j - 1])); } if ((i > 1) && (j < 6) && (chs[i - 2, j + 2].id == 0) && (chs[i - 1, j + 1].id == 1 || chs[i - 1, j + 1].id == 3)) { Moves1.Add(new Move(chs[i, j], chs[i - 2, j + 2], chs[i - 1, j + 1])); } if ((i < 6) && (j > 1) && (chs[i + 2, j - 2].id == 0) && (chs[i + 1, j - 1].id == 1 || chs[i + 1, j - 1].id == 3)) { Moves1.Add(new Move(chs[i, j], chs[i + 2, j - 2], chs[i + 1, j - 1])); } if ((i < 6) && (j < 6) && (chs[i + 2, j + 2].id == 0) && (chs[i + 1, j + 1].id == 1 || chs[i + 1, j + 1].id == 3)) { Moves1.Add(new Move(chs[i, j], chs[i + 2, j + 2], chs[i + 1, j + 1])); } if ((i > 0) && (j > 0) && (chs[i - 1, j - 1].id == 0)) { Moves2.Add(new Move(chs[i, j], chs[i - 1, j - 1])); } if ((i < 7) && (j > 0) && (chs[i + 1, j - 1].id == 0)) { Moves2.Add(new Move(chs[i, j], chs[i + 1, j - 1])); } } }
Содержание работы:
- Архив с исходным кодом программы
Скриншоты архивов проекта:
Видео демонстрация:
Обзор работы программы — https://youtu.be/irIYY24jjhI
Шашки — это классическая настольная игра, которая требует логического мышления и стратегии. Если вы хотите научиться создавать игру шашки с использованием языка программирования C#, то вы на правильном пути!
В нашем пошаговом руководстве, мы представим вам подробные примеры кода и объяснения каждого шага процесса создания игры «Шашки». Вам не нужно быть экспертом в программировании, чтобы начать — достаточно базовых знаний языка C# и желание учиться.
Создание игры «Шашки» на C# — это увлекательное и практическое искусство, которое позволит вам развить свои навыки программирования и применить их на практике. Готовы начать это увлекательное путешествие в мир создания игр? Давайте начинать!
Добро пожаловать в пошаговое руководство по созданию шашек на языке программирования C#! Здесь вы найдете примеры и подробное описание каждого шага в процессе создания игры.
Шашки — одна из самых популярных настольных игр, которая требует логического мышления и тактической стратегии. Создание своей собственной версии шашек на языке C# поможет вам лучше понять основы программирования и научиться применять их на практике.
Первым шагом в создании шашек на C# будет настройка игрового поля. Вы можете использовать таблицу 8×8, состоящую из ячеек, каждая из которых будет представлять отдельное поле для фишки. Для отображения ячеек можно использовать элементы таблицы , и
Следующим шагом будет создание основной логики игры. Вам потребуется класс, представляющий шашку, который будет иметь различные свойства, такие как цвет, тип и текущую позицию. Для удобства можно создать отдельный класс, который будет представлять игровую доску и хранить информацию о расположении шашек на поле.
После этого нужно реализовать правила игры, которые определяют, как шашка может двигаться по доске, а также как она может взаимодействовать с другими шашками. Это включает в себя проверку наличия преграды на пути движения шашки и правила удара, когда одна шашка «съедает» другую.
Важным аспектом создания шашек будет реализация механизма хода игроков. Вы можете добавить проверку на смену хода, когда один игрок сделал свой ход, а также проверку на окончание игры, когда один из игроков достигает определенного условия победы.
В завершение процесса создания шашек на C# можно добавить графический интерфейс пользователя (GUI), который позволит игрокам взаимодействовать с игрой более удобно и наглядно. Для этого можно использовать библиотеки, такие как Windows Forms или WPF.
Теперь вы знаете базовые шаги по созданию шашек на C#. Вы можете использовать эту информацию в качестве отправной точки и дальше самостоятельно развивать свою игру, добавляя новые функции и оптимизируя ее производительность. Удачи в создании шашек на C#!
Подготовка к созданию игры
Прежде чем приступить к созданию шашек на C#, необходимо подготовиться. Вам понадобится:
1. Установить среду разработки
Для создания шашек на C# вам понадобится среда разработки, например, Microsoft Visual Studio. Убедитесь, что вы установили последнюю версию среды разработки и выбрали необходимые компоненты для C# разработки.
2. Изучить основы C#
Для успешного создания игры необходимо иметь хорошие знания языка программирования C#. Изучите основы языка, такие как переменные, условные операторы, циклы и т.д. Это позволит вам лучше понять и создать игровую логику.
3. Изучить принципы работы с графикой
Игра шашки включает в себя работу с графикой, поэтому важно изучить основы работы с графикой в C#. Изучите как рисовать объекты, как управлять их положением и взаимодействовать с ними.
4. Ознакомиться с правилами игры в шашки
Перед созданием игры необходимо быть хорошо ознакомленным с правилами игры в шашки. Изучите основные правила игры, правила ходов и особенности взаимодействия соперников. Это поможет вам создать игру, которая будет соответствовать ожиданиям игроков.
После выполнения этих шагов вы будете готовы приступить к созданию шашек на C# и ожидать положительных результатов. Удачи!
Создание игрового поля
Прежде чем мы начнем создание игры в шашки на языке C#, нам необходимо создать игровое поле, на котором будут размещаться шашки. Для этого мы будем использовать элемент table
в HTML.
Начнем создание игрового поля с определения его размера. Обычно игровое поле для шашек имеет размер 8×8 клеток. Для этого мы можем использовать вложенные элементы table
, tr
и td
.
Пример кода:
<table>
<tr>
<td></td>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
<td>E</td>
<td>F</td>
<td>G</td>
<td>H</td>
</tr>
<tr>
<td>1</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<!-- Остальные строки и клетки -->
</table>
В данном примере мы создаем игровое поле размером 8×8 клеток. В первой строке указываем обозначения столбцов (A-H), а в первой колонке — обозначения строк (1-8). Каждая клетка поля представлена элементом td
. Клетки, которые должны быть пустыми, мы заполняем пробелами
.
Вы можете изменить размер поля или его внешний вид, добавив CSS-стили или другие элементы, но основной принцип создания поля останется неизменным.
Теперь у нас есть основа для создания игрового поля в шашках на языке C#. Мы можем приступить к следующему шагу — размещению шашек на поле.
Определение правил игры
Цель игры — захватить все шашки противника или заблокировать их так, чтобы противник не мог сделать ход. Шашки играются на доске размером 8×8 клеток, на которой чередуются светлые и темные клетки.
Игроки ходят поочередно, начиная с первого игрока. Каждый игрок может сделать только один ход за свой ход. Ход состоит из выбора одной из своих шашек и перемещения ее на соседнюю диагональную клетку. Если на пути шашки находится шашка противника и на следующей клетке за ней есть свободная клетка, то шашка противника «берется» и удаляется с доски.
Если шашка дойдет до последнего ряда противника, она становится «дамкой». Дамка может перемещаться по диагонали как вперед, так и назад и может «брать» шашки противника как вперед, так и назад.
Игра шашки завершается, когда один из игроков захватывает все шашки противника или блокирует его так, что противник не может сделать ход.
Важно отметить, что каждая страна имеет свои немного отличающиеся правила игры, но общие правила описаны здесь.
Разработка логики ходов
В начале игры каждый игрок располагает свои шашки на определенных клетках доски. Перед ходом игрока необходимо проверить, что выбранная шашка может сделать допустимый ход.
Для разработки логики ходов в игре в шашки на C# можно использовать различные подходы. Например, можно создать класс, представляющий игровое поле, и определить методы, которые позволяют получить доступ к текущим позициям шашек и проверить, является ли выбранный ход допустимым.
Один из вариантов реализации логики ходов может выглядеть следующим образом:
- Определение текущего игрока: перед каждым ходом необходимо определить, какой игрок сейчас ходит. Для этого можно использовать переменную, которая будет менять свое значение после каждого хода.
- Выбор шашки: игрок должен выбрать одну из своих шашек, которую он хочет переместить. Для этого можно использовать визуальный интерфейс, позволяющий игроку щелкнуть на шашку.
- Проверка допустимости хода: после выбора шашки необходимо проверить, является ли выбранный ход допустимым. Допустимость хода можно определить, проверив, что выбранная шашка может сделать разрешенный ход на пустую клетку или на клетку, на которой находится шашка противника.
- Выполнение хода: если выбранный ход допустим, нужно переместить шашку на новую позицию и обновить игровое поле.
- Проверка условия окончания игры: после каждого хода необходимо проверить, выполняется ли условие окончания игры, например, проверить, остались ли у одного из игроков шашки на доске. Если условие окончания игры выполняется, можно объявить победителя и закончить игру.
Таким образом, разработка логики ходов в игре в шашки на C# требует внимания к деталям и учета всех возможных вариантов ходов. Важно продумать каждый шаг игры, чтобы создать интересный и увлекательный геймплей для игроков.
Реализация логики взятия шашек
В этом разделе мы рассмотрим основные правила и принципы реализации логики взятия шашек в игре на C#.
Основной механизм взятия шашек состоит в том, чтобы обнаружить возможные ситуации, когда одна шашка находится рядом с шашкой противника и может быть взята. Если такая ситуация обнаружена, игрок может выбрать шашку для взятия и выполнить соответствующие действия.
Для реализации логики взятия шашек вам необходимо:
- Определить условия и правила, при которых шашка может быть взята.
- Описать алгоритм, который будет проверять все возможные ходы и определять, есть ли возможность взятия шашек.
- Реализовать соответствующие функции и методы, которые будут выполнять взятие шашек.
Важно помнить, что логика взятия шашек может быть сложной и требует тщательного анализа всех возможных ситуаций. Необходимо учесть все правила и ограничения игры, чтобы обеспечить правильное поведение шашек и создать справедливую игровую среду.
Надеемся, что это руководство поможет вам создать увлекательную игру в шашки на языке C#, где игроки смогут наслаждаться логикой взятия шашек и развивать свои стратегические навыки.
Таблица | С заголовками | Для наглядности |
---|---|---|
1 | Пример | Таблицы |
Создание пользовательского интерфейса
Сначала мы можем создать главное окно программы. В нем будут располагаться все элементы интерфейса, такие как доска для шашек, кнопки, поле для отображения информации и т.д.
Затем мы можем добавить элементы управления, такие как кнопки «Начать новую игру», «Сохранить игру», «Загрузить игру» и т.д. Каждая кнопка будет выполнять определенное действие при нажатии.
Также нам потребуется элемент для отображения текущего состояния игры. Это может быть поле, где будет отображаться информация о ходе, текущем игроке и т.д.
Не забудьте добавить возможность взаимодействия с доской для шашек. Пользователи должны иметь возможность делать ходы, выделять и перемещать шашки и т.д.
Таким образом, создание пользовательского интерфейса включает в себя создание графического окна, добавление элементов управления и возможность взаимодействия с игровым полем.
С помощью C# и различных графических библиотек, таких как Windows Forms или WPF, вы сможете создать красивый и удобный пользовательский интерфейс для своей игры в шашки.
Тестирование и отладка игры
После того как вы создали игру «Шашки на C#» согласно пошаговому руководству, вам необходимо приступить к ее тестированию. Тестирование поможет выявить и исправить возможные ошибки и недочеты игры, а также убедиться в ее корректной работе.
Важным шагом в тестировании игры является проверка всех основных функций и возможностей. Убедитесь, что игра запускается без ошибок и открывается корректно на разных устройствах и разрешениях экрана. Проверьте, что игра правильно отображается и корректно работает на различных операционных системах.
Также необходимо протестировать все игровые механики, проверить правильность расчетов и перемещений шашек, а также поведение в случае некорректных действий игрока. Выявить и исправить возможные ошибки в алгоритмах, чтобы игра работала без сбоев и непредвиденных ситуаций.
Помимо тестирования, не забудьте об отладке игры. Отладка позволяет выявить и исправить ошибки в коде и логике игры. Используйте отладчик для пошагового выполнения программы, анализа значений переменных и отслеживания работы игровых функций. Отладка поможет вам разобраться в возможных проблемах и исправить их до выпуска игры.
После завершения тестирования и отладки игры, убедитесь, что все основные функции работают корректно и игра готова к использованию. Поздравляем, вы создали шашки на C# и готовы предложить ее своим игрокам!
Также читайте:
- Как самому сделать амортизатор для радиоуправляемой модели — подробный мастер-класс по изготовлению
- Как понять, что твоя сексуальная активность приносит удовольствие партнеру и\или себе?
- Что делать, если на работе тебя не оформили и не заплатили зарплату
- Нейтрализация конденсата для котлов — принципы работы, основные проблемы и эффективные решения
- Секреты создания качественных фото с текстовым содержимым на чистом белом фоне для их дальнейшей распечатки
×
Изучаем создание шашек на C#, чтение правил игры и создание интерфейса для диалога с пользователем
Доступно в Telegram