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

Шашки. Ход дамки

22.02.2022, 12:44. Показов 809. Ответов 1

Author24 — интернет-сервис помощи студентам
Шашки. Это код для прыжка вперед влево. изначально это выглядело так:
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
        private List<List<int>> _CanJump(List<int> GameBoard, int X, int Y, int Player)
        {
            List<List<int>> ValidPositions = new List<List<int>> { }; // store valid board locations at end of the move
 
            if (GameBoard[8 * X + Y] != -1)
            {
                // Jump forward and left
 
                // X = row on board Y = column. both have limits 0<X<8 & 0<Y<8
                // valid if opponent piece is placed diagonally next to player piece, and square behind is free.
                List<int> JumpFL = new List<int> {  };
                if ((X - 2 >= 0 && X - 2 < 8) && (Y - 2 >= 0) && (GameBoard[8 * (X - 1) + (Y - 1)] == -Player || GameBoard[8 * (X - 1) + (Y - 1)] == -2 * Player) && GameBoard[8 * (X - 2) + (Y - 2)] == 0)
                {
                    // List<int> JumpFL = new List<int> { 8 * X + Y, 8 * (X - 1) + (Y - 1), 8 * (X - (2)) + (Y - 2) };
                    JumpFL.Add(8 * X + Y);
                    JumpFL.Add(8 * (X - 1) + (Y - 1));
                    JumpFL.Add(8 * (X - (2)) + (Y - 2));
 
    
 
                    ValidPositions.Add(JumpFL);
                }
. . . .
}
Но дамка не может рубить шашки, которые находятся по диагонали. (1 картинка)
И я попытался добавить это. Сначала я попытался реализовать это первым способом (который сейчас закомментирован).Но результат остался прежним. затем я попытался сделать то же самое вторым способом, но где-то определенно есть ошибка, так как произошло следующее (то есть дамка не может идти вперед влево..да что уж там..теперь я не могу ходить вниз вправо и вниз влево.. )(2 картинка)
(-1 и 1 - обычные шашки, -2 и 2 - дамки соответственно)
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
        private List<List<int>> _CanJump(List<int> GameBoard, int X, int Y, int Player)
        {
            List<List<int>> ValidPositions = new List<List<int>> { }; // store valid board locations at end of the move
 
            if (GameBoard[8 * X + Y] != -1)
            {
                // Jump forward and left
 
                // X = row on board Y = column. both have limits 0<X<8 & 0<Y<8
                // valid if opponent piece is placed diagonally next to player piece, and square behind is free.
                List<int> JumpFL = new List<int> {  };
                if ((X - 2 >= 0 && X - 2 < 8) && (Y - 2 >= 0) && (GameBoard[8 * (X - 1) + (Y - 1)] == -Player || GameBoard[8 * (X - 1) + (Y - 1)] == -2 * Player) && GameBoard[8 * (X - 2) + (Y - 2)] == 0)
                {
                    // List<int> JumpFL = new List<int> { 8 * X + Y, 8 * (X - 1) + (Y - 1), 8 * (X - (2)) + (Y - 2) };
                    JumpFL.Add(8 * X + Y);
                    JumpFL.Add(8 * (X - 1) + (Y - 1));
                    JumpFL.Add(8 * (X - (2)) + (Y - 2));
 
                    /*  if ((GameBoard[8 * X + Y] == 2 * Player))
                      {
                          int saveY = Y-2;
                          int index = (8 * X + Y) - 2 * 9;
                          while (saveY >= 0)
                          {
 
                              if ((GameBoard[index] == -Player) && (GameBoard[index - 9] == 0))
                              {
                                  int saveindex = index;
                                  int intnumber = saveindex / 8;
                                  int remains = saveindex % 8;
                                  JumpFL.Add(8 * intnumber + remains);
                                  JumpFL.Add(8 * (intnumber - 1) + (remains - 1));
                                  JumpFL.Add(8 * (intnumber - (2)) + (remains - 2));
                              }
                              index = index - 9;
                              saveY--;
                          } 
                      }*/
                    if ((GameBoard[8 * X + Y] == 2 * Player))
                    {
                        int saveY = Y - 2;
                        int shift_index = 2;
                        while (saveY >= 0)
                        {
 
                            if ((GameBoard[8 * (X - shift_index) + (Y - shift_index)] == -Player) && (GameBoard[8 * (X - shift_index - 1) + (Y - shift_index - 1)] == 0))
                            {
                                JumpFL.Add(8 * X + Y);
                                JumpFL.Add(8 * (X - shift_index) + (Y - shift_index));
                                JumpFL.Add(8 * (X - shift_index - 1) + (Y - shift_index - 1));
                            }
 
                            shift_index++;
                            saveY--;
                        }
                    }
 
                    ValidPositions.Add(JumpFL);
                }
. . . . . 
}
Подскажите пожалуйста, как сделать так, чтобы дамка могла рубить шашки по диагонали? так как я, видимо, напутал в тех алгоритмах, которые должны это делать. Но я пока не могу понять, в чем дело.
Идея, которую я хотел осуществить, была следующая: Внутри сделать дополнительное условие, если это дамка.И если у нас на диагонали( а именно которая направлена вперед влево) есть шашка противника, добавить движения. Но видать напортачил.
Сразу скажу, что я свободно могу ходить по диагонали, с этим проблем нет.Но если на пути есть шашка, при том, не на "соседней" клетке диагонали, то перепрыгнуть и захватить я её не могу. На это сейчас и направлены мои попытки.
Напомню, что этот кусочек только для движения вперед влево.
Я буду благодарен вам за помощь. Заранее спасибо.

(также определитель прыжка)

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
   private List<List<int>> DeterminJumps(List<int> GameBoard, int X, int Y, int Player)
    {
        List<List<int>> Moves = new List<List<int>> { };
 
        // Determine all aviable Jumping moves by recussion.
        List<List<int>> Jump = _CanJump(GameBoard, X, Y, Player);
        if (Jump.Any())
        {
            for (int i = 0; i < Jump.Count; i++)
            {
                // convert jump cordinates into new game board
                List<int> NewGameState = new List<int> { };
                NewGameState.AddRange(GameBoard);
                NewGameState[Jump[i][2]] = NewGameState[Jump[i][0]];
                NewGameState[Jump[i][0]] = 0;
                NewGameState[Jump[i][1]] = 0;
 
                // promote peice if needed
                if (Jump[i][2] / 8 == 0 && Player == 1) { NewGameState[Jump[i][2]] = 2; }
                else if (Jump[i][2] / 8 == 7 && Player == -1) { NewGameState[Jump[i][2]] = -2; }
 
                List<List<int>> FutureJumps = DeterminJumps(NewGameState, Jump[i][2] / 8, Jump[i][2] % 8, Player);
                if (FutureJumps.Any()) { Moves.AddRange(FutureJumps); }
                else { Moves.Add(NewGameState); }
            }
        }
 
        return Moves;
    }
Миниатюры
Шашки. Ход дамки   Шашки. Ход дамки  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2022, 12:44
Ответы с готовыми решениями:

Как реализовать ход шашки
Помогите с кодом, есть такая задача: Есть массив 8х8, вот такой: 02020202 20202020 02020202...

Как сделать ход шашки?
Подскажите,пожалуйста,как реализовать ход шашки? Чтобы именно та шашка,которую я выбрал - начинала...

"Шашки", нужно сделать ход дамки
нужно сделать хождение дамкой selectedCellI_ и selectedCellJ_ - координаты дамки int xx, yy; ...

Шашки 3х3 - поменять черные и белые шашки местами
Целью является сделать последовательность ходов, а именно поменять черные и белые шашки местами. На...

1
0 / 0 / 1
Регистрация: 11.05.2021
Сообщений: 92
22.02.2022, 19:24  [ТС] 2
Я немного поразмышлял, и это условие как по мне более корректно. Но я по-прежнему не могу рубить по диагонали

C#
1
2
3
4
5
6
7
8
9
                      if ((GameBoard[8 * X + Y] == 2) || (GameBoard[8 * X + Y] == -2)) //проверка на дамку
                      {
                          int saveY = Y-2;
                          int index = (8 * X + Y) - 2 * 9;
                          while (saveY >= 0)
                          {
 
                              if (((GameBoard[index] == -Player) && (GameBoard[index - 9] == 0)) || ((GameBoard[index] == -0.5*Player) && (GameBoard[index - 9] == 0))) //проверяем, стоит ли шашка противника на позиции и свободна ли клетка за этой шашкой
                              {
Добавлено через 30 минут
Исправления(всё еще не работает)
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
               if ((X - 2 >= 0 && X - 2 < 8) && (Y - 2 >= 0) && (GameBoard[8 * (X - 1) + (Y - 1)] == -Player || GameBoard[8 * (X - 1) + (Y - 1)] == -2 * Player) && GameBoard[8 * (X - 2) + (Y - 2)] == 0)
                {
                    // List<int> JumpFL = new List<int> { 8 * X + Y, 8 * (X - 1) + (Y - 1), 8 * (X - (2)) + (Y - 2) };
                    JumpFL.Add(8 * X + Y);
                    JumpFL.Add(8 * (X - 1) + (Y - 1));
                    JumpFL.Add(8 * (X - (2)) + (Y - 2));
 
                      if ((GameBoard[8 * X + Y] == 2) || (GameBoard[8 * X + Y] == -2))
                      {
                          int saveY = Y-2;
                          int index = (8 * X + Y) - 2 * 9;
                          while (saveY >= 0)
                          {
 
                              if (((GameBoard[index] == -Player) && (GameBoard[index - 9] == 0)) || ((GameBoard[index] == -0.5*Player) && (GameBoard[index - 9] == 0)))
                              {
                                  int saveindex = index;
                                  int intnumber = saveindex / 8;
                                  int remains = saveindex % 8;
                                  JumpFL.Add(8 * X + Y);
                                  JumpFL.Add(8 * intnumber + remains);
                                  JumpFL.Add(8 * (intnumber - 1) + (remains - 1));
   
                              }
                              index = index - 9;
                              saveY--;
                          } 
                      }
 
 
                    ValidPositions.Add(JumpFL);
                }
(Т.е. если для дамки на "соседней" клетке диагонали не стоит шашка противника, то будем искать стоит ли на этой диагонали вообще шашка противника. Если нашли, то в список JumpFL добавляем позицию дамки, позицию противника и клетку за противником. Но я опять что-то сделал неправильно, и по-прежнему не могу рубить).
0
22.02.2022, 19:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2022, 19:24
Помогаю со студенческими работами здесь

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

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

Шашки: как осуществить рубку шашки
Добрый день. Возник вопрос как осуществить рубку шашек?Есть массив шашек. Я предположил что-то...

Шашки, Варианты хода шашки
Доброго времени суток, форумчане! Дали задание задание в университет, но в голове одна каша и не...

Шашки. создание игры шашки
Здравствуйте ребята я тут нашел книгу про создание шахмат и шашки на С++ проблема в том что при...

Шашку — в дамки
Шашку — в дамки На шахматной доске (8×8) стоит одна белая шашка. Сколькими способами она может...

Шашку — в дамки
Шашку — в дамки На шахматной доске (8×8) стоит одна белая шашка. Сколькими способами она может...


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

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