Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/222: Рейтинг темы: голосов - 222, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 37

Реализация игры "шахматы"

20.03.2013, 20:22. Показов 43154. Ответов 22

Студворк — интернет-сервис помощи студентам
Данная шахматная доска - поле размером 8 × 8. Пользователь вводит координаты
фигур, из расчета, что (1, 1) - координата нижнего левого угла (направление движения
белых пешек от единицы до восьмерки, а черных от восьмерки до единицы).
Определить , какая фигура нападает или защищает другую, если
пользователь вводит координаты каждой фигуры. Если пользователь сделает не
корректное ввода данных (например, фигуры находятся за пределами поля или
на одной клетке), выдать соответствующее сообщение.
*
белого короля, белого пешки, черного коня;

Добавлено через 8 минут
Данная шахматная доска - поле размером 8 × 8. Пользователь вводит координаты
фигур, из расчета, что (1, 1) - координата нижнего левого угла (направление движения
белых пешек от единицы до восьмерки, а черных от восьмерки до единицы).
Определить , какая фигура нападает или защищает другую, если
пользователь вводит координаты каждой фигуры. Если пользователь сделает не
корректное ввода данных (например, фигуры находятся за пределами поля или
на одной клетке), выдать соответствующее сообщение.
*
белого короля, белого пешки, черного коня;
При выполнении практической работы необходимо использовать только
линейные и разветвленные вычислительные структуры (использование массивов, циклов,
операторов безусловного перехода и прерывания программы запрещается).
Осуществить ввод необходимых данных, выполнить реализацию алгоритма с
использованием операторов условия, обеспечить вывод полученных результатов

Добавлено через 1 минуту
Пример программы
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
 
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int xk, yk, xp, yp, xf, yf;            
            Console.WriteLine("Имитация трех фигур на поле: король(ч), пешка(ч), дамка(б).");
// Ввод короля на поле                
            Console.WriteLine("Введите координаты короля:");
            Console.Write("хk= ");
            xk = Convert.ToInt32(Console.ReadLine());// ввод и инициализация хk
            Console.Write("yk= ");
            yk = Convert.ToInt32(Console.ReadLine());// ввод и инициализация yk
            if(xk<=0 || xk>=9 || yk<=0 || yk>=9){
                Console.WriteLine("Ошибка! Фигура за полем!");
                return;
            }
// Ввод пешки на поле  
            Console.WriteLine("Введите координаты пешки:");
            Console.Write("хp= ");
            xp = Convert.ToInt32(Console.ReadLine());// ввод и инициализация хp
            Console.Write("yp= ");
            yp = Convert.ToInt32(Console.ReadLine());// ввод и инициализация yp
            if (xp <= 0 || xp >= 8 || yp <= 0 || yp >= 8) // пешка за полем или на неположеном месте?
            {
                Console.WriteLine("Ошибка! Фигура за полем!");
                return;
            }
            if (yp == 1)        // пешка стала дамкой дойдя до конца доски?
            {
                Console.WriteLine("Ошибка! Пешка стала дамкой!");
                return;
            }
            if (xp == xk && yp == yk)              // пешка на короле?
            {
                Console.WriteLine("Ошибка! Фигура на фигуре!");
                return;
            }
// Ввод дамки на поле            
            Console.WriteLine("Введите координаты дамки:");
            Console.Write("хf= ");
            xf = Convert.ToInt32(Console.ReadLine());// ввод и инициализация хf   
            Console.Write("yf= ");
            yf = Convert.ToInt32(Console.ReadLine());// ввод и инициализация yf
            if (xf <= 0 || xf >= 9 || yf <= 0 || yf >= 9) // ферзь за полем?
            {
                Console.WriteLine("Ошибка! Фигура за полем!");
                return;
            }
            if ((xf == xk && yf == yk) || (xf==xp && yf==yp) ) // ферзь на другой фигуре?
            {
                Console.WriteLine("Ошибка! Фигура на фигуре!");
                return;
            }
            Console.WriteLine("Фигуры раставлены.");
            Console.WriteLine("Король [{0},{1}], пешка [{2},{3}], дамка [{4},{5}]", xk, yk, xp, yp, xf, yf);
// -------------------------Проверка боя и вывод-----------------------------
            bool boy_korol = false, boy_peshka = false, peshka_Zkorol = false, korol_Zpeshka = false;
// Дамка под боем короля?
            if ((xk+1==xf || xk==xf || xk-1==xf) && (yk - 1 == yf || yk == yf || yk - 1 == yf))
            { 
                Console.WriteLine("Дамка находится под боем короля"); 
            }
           
// Дамка под боем пешки?
            if (yp - 1 == yf && (xp - 1 == xf || xp + 1 == xf))
            {
                Console.WriteLine("Дамка находится под боем пешки");
            }
// Король под боем дамки?            
            if ((xf == xk) || (yf == yk))      // По вертикали и горизонтали
            {
                if (((xk > xp && xk < xf) || (xk < xp && xk > xf)) ||
                    ((yk > yp && yk < yf) || (yk < yp && yk > yf)))
                {
                    korol_Zpeshka = true;  // Король под боем дамки и защищает пешку
                }
                else
                {
                    boy_korol = true; // Король под боем дамки без защиты пешки
                }
            }
            if (Math.Abs(xk - xf) == Math.Abs(yk - yf))       // По диагонялям
            {
                if (Math.Abs(xk - xf) < Math.Abs(xp - xf))
                {
                    korol_Zpeshka = true;// Король под боем дамки и защищает пешку
                }
                else
                {
                    boy_korol = true;                         // Король под боем дамки без защиты пешки
                }
            }
// Пешка под боем дамки?
            if ((xf == xp) || (yf == yp))  // По вертикали и горизонтали
            {
                if (((xp > xk && xp < xf) || (xp < xk && xp > xf)) || 
                    ((yp > yk && yp < yf) || (yp < yk && yp > yf)))
                {
                    peshka_Zkorol = true; // Пешка под боем дамки и защищает короля
                }
                else
                {
                    boy_peshka = true; // Пешка под боем дамки без защиты короля
                }
            }
            if (Math.Abs(xp - xf) == Math.Abs(yp - yf))       // По диагонялям
            {
                if (Math.Abs(xp - xf) < Math.Abs(xk - xf)) 
                {
                    peshka_Zkorol = true;// Пешка под боем дамки и защищает короля
                }else 
                {
                    boy_peshka = true;// Пешка под боем дамки без защиты короля
                }
            }
// Вывод кто под чьим боем
            
            if ((!korol_Zpeshka) && (boy_peshka)) { Console.WriteLine("Пешка находится под боем дамки"); }
            if (peshka_Zkorol) { Console.WriteLine("Пешка находится под боем дамки и защищает короля"); }
 
            if ((!peshka_Zkorol) && (boy_korol)) { Console.WriteLine("Король находится под боем дамки"); }
            if (korol_Zpeshka) { Console.WriteLine("Король находится под боем дамки и защищает пешку"); }
 
            if (!korol_Zpeshka && !boy_peshka && !peshka_Zkorol && !boy_korol) 
            {
                Console.WriteLine("Фигуры не пересекаются"); 
            }
            Console.Read();
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2013, 20:22
Ответы с готовыми решениями:

Шахматы. Нужна информация по написанию логики игры
Здравствуйте, хочу написать шахматы но сразу же столкнулся с проблемой: A)Реализовал класс &quot;Доска&quot; которая хранит инфу: ...

Шахматы, реализация шах и мат
Нужно дописать методы, чтобы шахматы стали полноценной игрой, буду очень благодарен) Файл Program.cs: using MyChess; using...

Создание игры шахматы, WCF
В общем оконные шахматы (без ИИ) у меня есть, необходимо прикрутить сетевое взаимодействие, это WCF как я понимаю, в общем в нём я ничего...

22
Заблокирован
01.04.2013, 13:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от NEbO Посмотреть сообщение
На самом деле, на такой задаче можно научиться оптимизировать количество строк кода.
На этой задаче с этим условием код оптимизировать нельзя.
Цитата Сообщение от NEbO Посмотреть сообщение
Кстати, и по быстродействию тоже: много условных переходов уменьшает вероятность их предсказания, вследствие чего будет много сбросов конвейера. И если выполнять такой код в длиннющем цикле, это сыграет не последнюю роль в производительности. Впрочем, конечно, маловероятно что при решении именно этой задачи кто-то задумывается об этом...
И второе "на самом деле": задача абсолютно адекватная, для прохождения темы условий. Тут не нужны ни циклы, ни паттерны, ни даже(!!!) знание квантовой механики.
Для решения задачи нужно знать как ходят фигуры в задании.
Цитата Сообщение от NEbO Посмотреть сообщение
Количество входных данных константно, и не очень большое. Для реализации задачи нужен только if и пара математических функций, чтобы уменьшить код, и вместо всех возможных состояний (которых аж C(64,3), и на каждое -- строк по 50 кода проверки. если не ошибаюсь) использовать функцию от координат двух фигур. Если сюда впихать что-то еще, задача только распухнет. Ну а реализация полной мат модели шахматной доски займет тоже несколько больше кода, чем было представлено постами выше.
Никакие математические функции здесь не помогут.
Цитата Сообщение от NEbO Посмотреть сообщение
Поэтому даже на такой простой задаче можно запросто увидеть, как человек думает, и думает ли вообще, собственно. Берет ли чужой код и подгоняет под свою задачу, или делает сам. И, наконец, "умный" ли код он копирует (на такой задаче четко видно: зачастую проще реализовать свой алгоритм, чем подгонять код ТС, ибо он неподгонябелен). Это позволит преподавателю подстроиться под студента и помочь ему в освоении материала

Не по теме:

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


Ну и, в конце концов, повторюсь, задача адекватная, для соответствующей темы. Посмотрите на мой код: разве он огромен? при использовании try-catch можно было бы еще и проверки сделать в одну строку, получилось бы еще в два раза меньше. Ну а для проверки состояний им можно назначить чиселки, а внизу уже выводить сообщения, соответствующие состояниям. Кстати, тоже можно реализовать через условия (хотя, какой-нибудь switch-case был бы читабельнее, в данном случае).
Короче, это по всякому лучше, чем реализовывать в чисто имеративном языке обход списка рекурсией или вычисление факториала через нее же, для прохождения темы "рекурсия" (повторюсь, актуально это там, где в курсе не проходят, что такое "хвостовая рекурсия"), реализация длинных чисел или компиляторов на пхп (опять же, речь об учебном процессе), или, скажем, реализация ООП-подобного синтаксиса в Erlang.
Спасибо за внимание!
Можно бесконечно писать пустой треп: "а я мог бы", может лучше один раз прочитать "что от тебя требуется".

На будущее, прежде чем "обсирать" решающего, читаем условие задачи.

Добавлено через 1 час 41 минуту
Можно сделать меньше строк и, даже, заменить одинаковые вычисления модуля отдельными переменными. Потом поставить switch на эти переменные и нагромодить такую гору кода, что код примера автора темы покажется детсадом (такому преподавателю нужно самому идти учиться) и еще многое многое другое.
Ниже показан, один из возможных вариантов решения (отличного от показанного ранее):
Каковы плюсы этого кода: плюс вижу только один, - меньше строк кода.

Какие минусы:
Меньше вычислений? Нет. Больше.
Код стал понятней? Нет стал менее понятным.
Больше гибкость вывода? Нет меньше.
Ушли ненавистные if? Остались.
C#
1
2
3
4
5
6
7
8
9
10
 
            // -------------------------Проверка боя и вывод----------------------------- 
            if (Math.Abs(xk - xf) == 1 && yk == yf) Console.WriteLine("Конь под боем короля");
            if (Math.Abs(yk - yf) == 1 && xk == xf) Console.WriteLine("Конь под боем короля");
            if (Math.Abs(xk - xf) == 1 && Math.Abs(yk - yf) == 1) Console.WriteLine("Конь под боем короля");
            if (Math.Abs(xp - xf) == 1 && yf - yp == 1) Console.WriteLine("Конь под боем пешки");
            if (Math.Abs(xf - xk) == 1 && Math.Abs(yk - yf) == 2) Console.WriteLine("Королю шах от коня");
            if (Math.Abs(xf - xk) == 2 && Math.Abs(yk - yf) == 1) Console.WriteLine("Королю шах от коня");
            if (Math.Abs(xf - xp) == 1 && Math.Abs(yp - yf) == 2) Console.WriteLine("Пешка под боем коня");
            if (Math.Abs(xf - xp) == 2 && Math.Abs(yp - yf) == 1) Console.WriteLine("Пешка под боем коня");
Но какова цель разработчика?
1 Сделать код наиболее читабельным и понятным для сопровождения.
2 Наименее нагрузочным для системных ресурсов
3 Наиболее кратким и простым.
Согласно вышесказанному, подходит только код который был представлен ранее (просто, понятно, логично, линейно), согласно условия задания. Да, пример примитивный, но иногда приходится на простых примерах рассказывать, чтобы потом на сложных не пришлось просиживать ночи.
Этот ответ последний.
0
0 / 0 / 0
Регистрация: 19.10.2015
Сообщений: 1
21.11.2015, 13:32
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
using System;
namespace ChessCsharp
{
    class Program
    {
        static void Main(string[] args)
        {
            byte d12x, d13x, d23x, d12y, d13y, d23y;//дистанция до фигуры
            //d1 - король, d2 - пешка, d3 - конь
            Console.WriteLine("Имитация трех фигур на поле: король(б), пешка(б), конь(ч).");
            
            // Ввод короля на поле                
            Console.WriteLine("\nВведите координаты короля:");
            Console.Write("х = ");
            byte x1 = byte.Parse(Console.ReadLine());
            Console.Write("y = ");
            byte y1 = byte.Parse(Console.ReadLine());
            if (x1 < 1 || x1 > 8 || y1 < 1 || y1 > 8)
            {
                Console.WriteLine("\nОшибка! Фигура за пределами доски!");
            }
            
            Console.WriteLine("\nВведите координаты пешки:");
            Console.Write("х = ");
            byte x2 = byte.Parse(Console.ReadLine());
            Console.Write("y = ");
            byte y2 = byte.Parse(Console.ReadLine());
            if (x2 < 1 || x2 > 8 || y2 < 1 || y2 > 8)
            {
                Console.WriteLine("\nОшибка! Фигура за пределами доски!");
            }
            if(y2 == 1)
            {
                Console.WriteLine("\nОшибка! Пешка не может занимать 1 горизонталь!");
            }
            if (y2 == x2 && y1 == y2)
            {
                Console.WriteLine("\nОшибка! Белый король и белая пешка - в одной клетке!");
            }
            
            Console.WriteLine("\nВведите координаты коня:");
            Console.Write("х = ");
            byte x3 = byte.Parse(Console.ReadLine());
            Console.Write("y = ");
            byte y3 = byte.Parse(Console.ReadLine());
            if (x3 < 1 || x3 > 8 || y3 < 1 || y3 > 8)
            {
                Console.WriteLine("\nОшибка! Фигура за пределами доски!");
            }
            if (x1 == x3 && y1 == y3)
            {
                Console.WriteLine("\nОшибка! Белый король и чорный конь - в одной клетке!");
            }
            if (x2 == x3 && y2 == y3)
            {
                Console.WriteLine("\nОшибка! Белая пешка и чорный конь - в одной клетке!");
            }
 
            d12x = Convert.ToByte(Math.Abs(x1 - x2)); d13x = Convert.ToByte(Math.Abs(x1 - x3)); d23x = Convert.ToByte(Math.Abs(x2 - x3));
            d12y = Convert.ToByte(Math.Abs(y1 - y2)); d13y = Convert.ToByte(Math.Abs(y1 - y3)); d23y = Convert.ToByte(Math.Abs(y2 - y3));
 
            if (d12x == 1 && d12y == 1)
            {
                Console.WriteLine("\nБелая пешка под защитой белого короля!");
            }            
            if(d13x == 1 && d13y == 2 || d13x == 2 && d13y == 1)
            {
                Console.WriteLine("\nБелому королю шах от чорного коня!");
            }
            if (d23x == 1 && d23y == 1)
            {
                Console.WriteLine("\nБелая пешка атакует чёрного коня!");
            }
            if(d13x == 1 && d13y == 1)
            {
                Console.WriteLine("\nБелый король атакует чёрного коня!");
            }
            if(d23x == 1 && d23y == 2 || d23x == 2 && d23y == 1)
            {
                Console.WriteLine("\nЧорный конь атакует белую пешку!");
            }
            //превращение пешки
            if (y2 == 8)
            {
                Console.WriteLine("\nПешка стала ферзём!");
            }
 
            Console.ReadKey();           
        }
 
    }
 
}
0
 Аватар для Jesterru
3 / 2 / 2
Регистрация: 19.06.2016
Сообщений: 299
18.07.2018, 18:16
Цитата Сообщение от Wolfdp Посмотреть сообщение
абстрактный класс "фигура" и наследуемы от неё "пешка", "слон", "ладья" и прочее
Можно в классе "Фигура" указать id этой фигуры (например, 0 - король, 1 - пешка и т.д.), а доска - Массив чисел, обозначающих id
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2018, 18:16

Создание логической игры Шахматы. Надо разделить код на классы
Надо отделить логику игры в отдельный класс. А так же что бы в текст бокс выводился сделанный ход, и доска была с обозначениями от 1 -8 и...

Пропали игры (шахматы)
У меня компьютер Aser и ОС Win 10 64 bit. Установил игры Win7Games4Win10_8_81_v2 Через некоторое время игры исчезли, хотя в...

Шахматы, реализация окраски StringGrid-а
Проблема не сложная, препод задал сделать хождение фигур по доске. Сделал шахматную доску заполнил ее но делал без оформления ( тупо + и -...

Шахматы: Реализация истории ходов
Здравствуйте! Хочу хранить историю ходов для последующего сохранения в файл. Также хочется откравать сохраненный файл и иметь...

Разработка компьютерной игры Шахматы
Всем привет. Задали РГР по программированию, на тему &quot;Разработка компьютерной игры Шахматы&quot;. Описание: Программа должна давать...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru