Форум программистов, компьютерный форум, киберфорум
Игровые движки
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
1

Шахматы. Определить в какой клетке фигура

06.08.2024, 16:53. Показов 3445. Ответов 65
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1) создали словарик или массив с координатами все клеток
2) создали цикл в котором универсальное условие:
в котором берем координаты из массива или словарика и определяем
по клику в клетку в какой координате был клик типа А1, B5, E2 и т п
как это можно записать ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2024, 16:53
Ответы с готовыми решениями:

Шахматы: как определить, есть ли на пути ладьи другая фигура?
Здравствуйте, пишу многострадальные шахматы) Подскажите как определить при ходе ладьии - есть ли...

Определить, угрожает ли фигура, стоящая на клетке (х1,у1), клетке с заданными координатами
Ввести координаты двух полей шахматного поля.Определить угрожает ли фигура стоящая на клетке...

По координатам точек определить в какой плоскости лежит фигура и что это за фигура
Вводятся координаты 4 точек надо определить в какой плоскости лежит фигура и что это за фигура

Шахматы: определить, может ли белая фигура пойти на поле (e, f), не попав при этом под удар черной фигуры
Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит восьми:...

65
Эксперт С++
4109 / 1908 / 958
Регистрация: 01.06.2021
Сообщений: 6,732
Записей в блоге: 6
06.08.2024, 17:25 2
Цитата Сообщение от Mr_den Посмотреть сообщение
как это можно записать ?
K король,
Q ферзь,
R ладья,
B слон,
N конь,
P пешка
Заглавные буквы это белые, строчные - черные.

char массив подойдет
0
3696 / 2646 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
06.08.2024, 17:46 3
Набор бессвязных слов ...
0
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
06.08.2024, 19:25  [ТС] 4
Крч еще раз
вот создал словарики
var a1 = {x1: 10, x2:15}
var a2 = {x1: 120, x2:155 }
и надо определить в какой промежуток войдет число B
var B = 122

можно конечно каждый раз писать
Python
1
2
3
4
if ( a1[x1]<B)&&(B<a1[x2]):
  print(" ФИГУРА НА A1") // если совпало условие
   if ( a2[x1]<B)&&(B<a2[x2]):
   print(" ФИГУРА НА A2") // если совпало условие
кАК Это записать чтобы каждый раз условие IF НЕ ПИСАТЬ ?

Если в массив как то определить может [a1, a2, a3]
а как потом в условие одинаковое для всех вставить ?
чТОбы перебрать все элементы,пока не определиться нужный сектор ?
0
Эксперт С++
4109 / 1908 / 958
Регистрация: 01.06.2021
Сообщений: 6,732
Записей в блоге: 6
06.08.2024, 19:40 5
Mr_den, при чем тут С++?
0
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
06.08.2024, 19:43  [ТС] 6
Да какая разница, ну напиши на С++ пфф
Это скрипт GODOT там я не знаю как С++ вставить
0
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
06.08.2024, 20:23  [ТС] 7
вот создал словарики
var a1 = {x1: 10, x2:15}
var a2 = {x1: 120, x2:155 }
и надо определить в какой промежуток войдет число B
var B = 122

можно конечно каждый раз писать
Python
1
2
3
4
if ( a1[x1]<B)&&(B<a1[x2]):
  print(" ФИГУРА НА A1") // если совпало условие
   if ( a2[x1]<B)&&(B<a2[x2]):
   print(" ФИГУРА НА A2") // если совпало условие


Python
1
2
3
4
func _process(delta):
    label1.text=str(a1[x1])+"__"+str(a1[x2])
    var arr = [x1,x2]
    print(arr)

кАК Это записать чтобы каждый раз условие IF НЕ ПИСАТЬ ?
а как потом в условие одинаковое для всех вставить ?
чТОбы перебрать все элементы,пока не определиться нужный сектор ?

При переборке массива Лабэл выдал такое
Шахматы. Определить в какой клетке фигура


в консоли вообще нули
[<null>, <null>]

[<null>, <null>]
0
Эксперт С++
4109 / 1908 / 958
Регистрация: 01.06.2021
Сообщений: 6,732
Записей в блоге: 6
06.08.2024, 20:37 8
Цитата Сообщение от Mr_den Посмотреть сообщение
Это скрипт GODOT
так написал бы сразу, а то я голову ломаю, понять не могу, что за смесь JS и Python

Цитата Сообщение от Mr_den Посмотреть сообщение
ну напиши
сперва условие нужно понять, но пока я его не вижу и вынужден согласиться, что у вас

Цитата Сообщение от SmallEvil Посмотреть сообщение
Набор бессвязных слов ...
и магических чисел
0
3696 / 2646 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
06.08.2024, 20:42 9
Цитата Сообщение от Mr_den Посмотреть сообщение
по клику в клетку
Что за клетки ? Кто куда кликает ?

Один виджет для доски, размер клеток известен.
Получаем координаты :
C++
1
2
a = client_x / cell_width;
b = client_y / cell_height;
Где client_x и client_y - координаты клика мыши.
cell_width и cell_height - размер одной шахматной ячейки.

У вас в примерах нет ничего ни про шахматы ни про ячейки, вместо этого диапазоны.
Вхождение в один из непересекающихся диапазонов, можно найти бинарным поиском в отсортированном массиве точек диапазонов.

Пример (на ваших данных).
{10 15 120 155} - 5 диапазонов, их нумерация (0,1,2,3,4), нас интересуют только нечетные, диапазоны 1 и 3.
ищем бинарным (upper_bound) поиском B=122, получаем индекс 3.
Нечетный, значит попали в нужный диапазон.
Это 3/2 + 1 = 2 наш второй диапазон.

При этом, у нас полуоткрытые диапазоны. [L, R)
0
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
06.08.2024, 21:20  [ТС] 10
Какой то бред у меня выводит при обычном выводе содержимого массива

Python
1
2
3
4
5
6
7
8
9
10
var m1
var m2
var a1 = {m1: 10, m2:22} #ТУТ СОЗДАЛИ СЛОВАРИКИ
var a2 = {m1: 120, m2:155 }
var B
 
func _process(delta):
    label1.text=str(a1[m1])+"__"+str(a1[m2]) 
    var arr = [a1,a2]
    print(arr)
Шахматы. Определить в какой клетке фигура

как лабэл так и на консоль выводит почему то последний элемет вложенного в массив словаря

m1 он вообще читает как число, хотя это ключ от словаря
0
Эксперт С++
4109 / 1908 / 958
Регистрация: 01.06.2021
Сообщений: 6,732
Записей в блоге: 6
06.08.2024, 21:45 11
Mr_den, тебе так нужно?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
extends Node2D
 
@onready var tilemap : TileMap = $TileMap
@onready var label : Label = $CanvasLayer/Control/LabelCoordinate
 
func _process(_delta):
    if Input.is_action_just_pressed("mouse_left"):
        var mouse_pos = get_viewport().get_mouse_position()
        var cell_pos = tilemap.local_to_map(mouse_pos)
        label.set_text(chess_coord(cell_pos))
 
func chess_coord(cell_pos : Vector2i) -> String:
    const letter = "ABCDEFGH"
    if cell_pos.x < 8 and cell_pos.y < 8:
        return letter[cell_pos.x] + str(8-cell_pos.y)
    return ""
Вложения
Тип файла: 7z ChessBoard.7z (16.52 Мб, 9 просмотров)
1
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
06.08.2024, 21:55  [ТС] 12
у меня вулкан не работает не могу открыть
Напиши просто как число прогнать по интервалам массива и сравнить чтобы
оно подошло в нужный интервал. Я делаю не через тайлмап
Короче как я понял идея перед тем как ставить куда то фигуру надо прописывать поле куда она встанет.
0
Эксперт С++
4109 / 1908 / 958
Регистрация: 01.06.2021
Сообщений: 6,732
Записей в блоге: 6
06.08.2024, 22:21 13
Цитата Сообщение от Mr_den Посмотреть сообщение
у меня вулкан не работает не могу открыть
поменял на OpenGL
Вложения
Тип файла: 7z ChessBoard.7z (16.52 Мб, 5 просмотров)
1
Эксперт С++
4109 / 1908 / 958
Регистрация: 01.06.2021
Сообщений: 6,732
Записей в блоге: 6
07.08.2024, 00:03 14
Цитата Сообщение от Mr_den Посмотреть сообщение
Я делаю не через тайлмап
ну тогда тебе просто нужно написать свою функцию для перевода координат курсора в координаты шахматной доски

SmallEvil тебе написал, как это сделать

Mr_den, кстати, это 3d шахматы или это просто имитация посредством проекции?

Mr_den, если это 3d шахматы, то не советую работать с глобальными координатами и хардкодить расположения клеток доски, а потом их проверять. Такой метод хорошо подходит для 2d, но не для 3d.

Советую каждую клетку сделать как отдельный объект со своим collision box. Дальше испускаете луч с камеры и получаете объект, которого луч коснулся. Можно даже без луча, использую сигнал нажатия мышью на коллайдер.
0
Just Do It!
4011 / 2395 / 639
Регистрация: 23.09.2014
Сообщений: 7,659
Записей в блоге: 2
07.08.2024, 00:54 15
Цитата Сообщение от Mr_den Посмотреть сообщение
как это можно записать ?
Допустим:
1. Верхняя левая точка координаты шахматной доски U.x, U.y
2. Нижняя правая точка координаты шахматной доски D.x, D.y
3. Рандомный клик мауса с координатами M.x, M.y
4. То:
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
#include <iostream>
 
struct  Vec2{ int x, y; };
 
Vec2 U = {120, 120};     /// Верхняя левая точка координаты шахматной доски.
Vec2 D = {200, 200};     /// Нижняя правая точка координаты шахматной доски.
 
void check(const Vec2 M) /// Рандомный клик мауса с координатами { M.x, M.y }
{
    static std::string bx = {"abcdefgh"};
    static std::string by = {"12345678"};
 
    const int Cell = (D.x - U.x) / 8;
 
    Vec2 B = {M.x - U.x,
              M.y - U.y};
 
    unsigned ix = B.x /  Cell;
    unsigned iy = B.y /  Cell;
 
    if(ix < 8 && iy < 8)
    {   std::cout << "Cell::" << bx[ix] << "," << by[iy] << '\n';
    }
    else std::cout << "Past the board...\n";
}
 
int main()
{
    check({121, 121});
    check({199, 199});
    check({199, 222});
}
1
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
07.08.2024, 11:41  [ТС] 16
У меня клетки не одинаковые Клетка первого ряда подобна клеткам вышестоящим, но отличается от соседней.
Я трансформировал плоскость фронтально и заужается в переспективе. Я задал коэффициент наклона, но если его подставлять во все клетки то углы наклона не сходяться
0
3696 / 2646 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
07.08.2024, 12:55 17
Цитата Сообщение от Mr_den Посмотреть сообщение
У меня клетки не одинаковые
И это всплыло только в 9-ом посте. И то без подробностей.

Цитата Сообщение от Mr_den Посмотреть сообщение
кАК Это записать чтобы каждый раз условие IF НЕ ПИСАТЬ ?
Если в массив как то определить может [a1, a2, a3]
а как потом в условие одинаковое для всех вставить ?
чТОбы перебрать все элементы,пока не определиться нужный сектор ?
Такие вопросы для программиста, даже новичка - это нонсенс.

По диапазонам, у вас их всего 8 ? Можно и перебирать.
Просто добавьте их в массив. Перебирайте в цикле.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <string>
 
std::string in_range(const std::vector<std::pair<std::string, std::pair<int,int>>> ranges, const int val){
   for(auto [name, range] : ranges){
      if (auto [from, to] = range; val > from && val < to )
         return name;
   }
   return "";
}
 
int main()
{
   auto range_name = in_range({{"a1",{10,25}},{"a2",{120,150}}}, 12);
   std::cout << (range_name == "" ? "Not in the any range" : range_name) << std::endl;
}
0
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
07.08.2024, 13:11  [ТС] 18
Уря сделал но только для одного столбца

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func _process(_delta):
    
    if Input.is_action_just_pressed("click"):
        b=0
        a=0
        var mous = get_global_mouse_position()
        #mous = snapped(get_global_mouse_position(), Vector2(1,52))
        print_rich("[b][color=red]","X = ",mous.x," .")
        print_rich("[b][color=blue]","Y = ",mous.y," .")
        label2.text ="mouse x = "+str(mous.x) +" mouse y = "+str(mous.y)
        inst(Vector2(mous.x,mous.y))
        if (mous.y < 610)&&(mous.y>118):
            N = 11 - int(mous.y/54)
            b+=N*54-54
            a=N*20-20
            #a+=20  // коэф смещения по Х
            $a0.queue_redraw()
Шахматы. Определить в какой клетке фигура
0
9 / 7 / 2
Регистрация: 06.09.2022
Сообщений: 308
07.08.2024, 13:52  [ТС] 19
Да я же скрин давал. Когда 4 координаты углов клетки записать в словарь и из клеток сделать массив,
то почему то на консоль выдает только последнюю координату
0
Эксперт С++
4109 / 1908 / 958
Регистрация: 01.06.2021
Сообщений: 6,732
Записей в блоге: 6
08.08.2024, 00:41 20
Mr_den, вот 3d доска
Вложения
Тип файла: 7z ChessBoard3D.7z (16.57 Мб, 7 просмотров)
0
08.08.2024, 00:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2024, 00:41
Помогаю со студенческими работами здесь

Шахматы: определить, может ли белая фигура пойти на поле (e, f), не попав при этом под удар черной фигуры
Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит восьми:...

Определить, бьет ли ферзь, стоящий на клетке (k,l), фигуру, стоящую на клетке (m,n)
В программу вводятся натуральные числа k,l,m,n, которые являются координатами клеток шахматной...

Определить, бьет ли ферзь, стоящий на клетке (k, l), фигуру, стоящую на клетке (m, n)
В программу вводятся натуральные числа k, l, m, n, которые являются координатами клеток шахматной...

Определить, бьет ли конь, стоящий на клетке с указанными координатами, фигуру, стоящую на другой указанной клетке
Помогите пожалуйста с задачей написать код в Паскале АБЦ Требуется определить, бьет ли конь,...

Определить, бьет ли ладья, стоящая на клетке с указанными координатами, фигуру, стоящую на другой указанной клетке
Требуется определить, бьет ли ладья, стоящая на клетке с указанными координатами (номер строки и...

Определить, бьет ли ладья, стоящая на клетке с указанными координатами, фигуру, стоящую на другой указанной клетке
Помогите пожалуйста с задачей! Условие: Требуется определить, бьет ли ладья, стоящая на клетке с...

Необходимо сделать шахматы. Ходить должна только фигура ферзя.
Помогите, пожалуйста. Необходимо сделать шахматы на html с применением javascipt.Ходить должна...


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

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