Шашки в си шарп

Шашки в Windows Forms

Очень нужна помощь!
Необходимо написать шашки на wf за пару дней
После нескольких часов мучений с пикчбоксом, было решено использовать кнопки
Но из-за этого возникли некоторые проблемы, например: как отслеживать очередность ходов (черные-белые)?
как запомнить два последних нажатия кнопки? (игрок сначала кликает на кнопку с шашкой, которую хочет передвинуть, потом кликает на кнопку, на место которой хочет поставить шашку, и пока не кликнет на последнюю, ничего нельзя делать с первой кнопкой (например, убирать изображение шашки с кнопки), плюс необходимо проверить, можно ли сходиться на ту клетку, которую игрок отметил второй)
Буду рада любой помощи и идеям!
Любые костыли, только бы работало

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

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

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

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

Лучший ответ

Сообщение было отмечено Жанна1234567876 как решение

Решение

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

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; // и то же самое для черных) и для состояния конец игры } }

ЦитатаСообщение от Жанна1234567876 Посмотреть сообщение

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)  (field[x, y] == 2) : (field[x, y] == 3)  private bool canMove(int x, int y)  } } } 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; i4; 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  } } } 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)  } else { if (canMove(x, y)) { useMove(x, y); } else  } } } } } 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(); }

Источник

Как реализовать ход шашки

Обозначающий расположение шашек на поле. Не как не могу придумать как реализовать ход(т.е. к примеру, единица двигается на один элемент по диагонали, там где 0 записывается 1, а на прежнее место 1-цы ставится 0). Помогите пожалуется господа программеры.

Как реализовать обратный ход динамического программирования
Имеется задача такого содержания: есть n приборов, каждый прибор имеет m реализаций, каждая.

Как убрать шашки с 5 и 4 горизонтали?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;.

Как увидеть ход программы?
Приветствую, есть написанная программа, компилируется, относительно работает. Работает не так.

Пишу шашки на C#, как организовать логику игры
Я пишу шашки, но пока что я начинающий сишарпер и мне нужно сформировать условие, а заключается оно.

var temp = mas[0,0]; mas[0,0] = mas[0,1]; mas[0,1] = temp;

p.s. вы уж сразу всю проблему(задачу) описывайте. Создавая каждый день темы типа «я не могу придумать», «вы» шашки будете писать очень долго.

tarasalk,Ну в общем задача была поставлена так: написать программу-игру, консольную, входное значение это шаг типа:»wd2-we3;» w- white шаги по очереди b-blue. Перед ходом показывается список возможных ходов.

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
namespace draughts { class Program { static void Main(string[] args) { int[,] desk = {{0,2,0,2,0,2,0,2}, {2,0,2,0,2,0,2,0}, {0,2,0,2,0,2,0,2}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {1,0,1,0,1,0,1,0}, {0,1,0,1,0,1,0,1}, {1,0,1,0,1,0,1,0}}; for (int i = 0; i  desk.GetLength(0); i++) { for (int j = 0; j  desk.GetLength(1); j++) { Console.Write(desk[i,j]+" "); } Console.WriteLine(); } var temp = desk[2, 2]; desk[2, 2] = desk[3, 1]; desk[3, 1] = temp; Console.WriteLine(); Console.WriteLine(); for (int i = 0; i  desk.GetLength(0); i++) { for (int j = 0; j  desk.GetLength(1); j++) { Console.Write(desk[i, j] + " "); } Console.WriteLine(); } Console.ReadLine(); } } }
// из tmp_from = desk[4,5]; // в tmp_in = desk[4,6]; // меняем desk[4,5] = tmp_in; desk[4,6] = tmp_from;

Да нет, не трудно, просто запутался в индексах массива, и менял местами два 0.

Добавлено через 24 минуты
Помогите пожалуйста доделать шашки. Собственно, вот что есть:

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
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace draughts { class Program { static void Main(string[] args) { //массив с полем int[,] desk = {{0,2,0,2,0,2,0,2}, {2,0,2,0,2,0,2,0}, {0,2,0,2,0,2,0,2}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {1,0,1,0,1,0,1,0}, {0,1,0,1,0,1,0,1}, {1,0,1,0,1,0,1,0}}; ShowDesk(desk); Console.WriteLine("\nEnter your move:"); var move = Console.ReadLine(); //ввод строки хода в формате wd2-we3 w-white /* for (int i = 0; i < desk.GetLength(0); i++)   for (int j = 0; j < desk.GetLength(1); j++)   if(desk[i+1,j+1] ==0 || desk[i+1,j-1] ==0) // как то так выглядит проверка на возможность хода   > Console.Write(desk[i, j] + " "); > Console.WriteLine(); >*/ //Как то так выглядит ход int temp = desk[2, 1]; desk[2, 1] = desk[3, 0]; desk[3, 0] = temp; Console.ReadLine(); } //метод отображения доски private static void ShowDesk(int[,] desk) { for (int i = 0; i  desk.GetLength(0); i++) { for (int j = 0; j  desk.GetLength(1); j++) { Console.Write(desk[i, j] + " "); } Console.WriteLine(); } } } }

Как сделать так что бы ход работал по очереди и двигал именно те шашки, координаты которых вводят пользователи??

Эксперт .NETАвтор FAQ

ЦитатаСообщение от Evdos Посмотреть сообщение

Как сделать так что бы ход работал по очереди и двигал именно те шашки, координаты которых вводят пользователи??

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
using System; using System.Text.RegularExpressions; namespace ConsoleApplication158 { class Program { static void Main(string[] args) { //массив с полем int[,] desk = { {1,0,1,0,1,0,1,0}, {0,1,0,1,0,1,0,1}, {1,0,1,0,1,0,1,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,2,0,2,0,2,0,2}, {2,0,2,0,2,0,2,0}, {0,2,0,2,0,2,0,2} }; while (true) { Console.Clear(); ShowDesk(desk); Console.Write("\nEnter your move: "); var s = Console.ReadLine(); //ввод строки хода в формате wd2-e3 w-white //parse move var m = Regex.Match(s, "([wd])([abcdefgh])([12345678])-([abcdefgh])([12345678])"); if (!m.Success) continue; var fromX = m.Groups[2].Value[0] - 'a'; var fromY = m.Groups[3].Value[0] - '1'; var toX = m.Groups[4].Value[0] - 'a'; var toY = m.Groups[5].Value[0] - '1'; var color = m.Groups[1].Value[0] == 'w' ? 1 : 2; //check move if(desk[fromY, fromX] != color) { Console.WriteLine("There is not your draught!"); Console.ReadKey(); continue; } if (desk[toY, toX] != 0) { Console.WriteLine("Target field is not empty!"); Console.ReadKey(); continue; } //make move desk[fromY, fromX] = 0; desk[toY, toX] = color; } } //метод отображения доски private static void ShowDesk(int[,] desk) { char[] chars = new[] { '░', '☻', '☺' }; for (int i = 7; i >=0; i--) { Console.Write((i + 1) + " "); for (int j = 0; j  8; j++) Console.Write(chars[desk[i, j]] + "░"); Console.WriteLine(); } Console.WriteLine(); Console.WriteLine(" a b c d e f g h"); } } }

Источник

Читайте также:  Unicode use in html
Оцените статью