|
|
|
| Здравствуйте. Помогите реализовать как узнать по двумерному массиву находятся ли две заданные точки (с координатами x,y ) на одной диалогонали в массиве (для шашек). | |
|
|
|
|
|
|
|
для: pavluxa09
(17.07.2012 в 21:12)
| | Возможно вас заинтересует следующее решение
<?php
// Размерность поля
$row = 5;
// Поле для наглядности, в
// расчетах не участвует
$arr = array(0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 0, 0, 0, 0,
0, 1, 0, 0, 0);
// Координаты
$fst['x'] = 0;
$fst['y'] = 3;
$snd['x'] = 1;
$snd['y'] = 4;
// Вычисляем разницу координат по абсолютной
// величине
$x = abs($snd['x'] - $fst['x']);
$y = abs($snd['y'] - $fst['y']);
// Если $x == $y, точки расположены на одной
// диагонали
if($x == $y) echo "Точки расположены на одной диагонали";
else echo "Точки расположены на разных диагоналях";
echo "<br />";
// Как вычислять координаты в линейном массиве
$fstidx = 15;
$sndidx = 21;
// Первая точка
$y = intval($fstidx / $row);
$x = $fstidx - $y * $row;
echo "(x = $x, y = $y)<br />";
// Вторая точка
$y = intval($sndidx / $row);
$x = $sndidx - $y * $row;
echo "(x = $x, y = $y)<br />";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(18.07.2012 в 06:12)
| | Привёл свою функцию к виду
function MoveObject( &$playGround, $iUserID, $iFromX, $iFromY, $iToX, $iToY ) {
# Определение размера доски :
$iGroundSize = count( $playGround );
# Проверка внешних данных :
if( $iUserID != 1 && $iUserID != 2 )
return -1;
if( $iFromX < 0 || $iFromX >= $iGroundSize || $iFromY < 0 || $iFromY >= $iGroundSize )
return -2;
if( $iToX < 0 || $iToX >= $iGroundSize || $iToY < 0 || $iToY >= $iGroundSize )
return -3;
# Пренадлежит ли перемещаемая шашка текущему игроку ?
if( $playGround[$iFromY][$iFromX] != $iUserID && $playGround[$iFromY][$iFromX] != $iUserID + 2 )
return -4;
# Находится ли место перемещения на диалогонале с перемещаемой шашкой?
if( abs( $iFromX - $iToX ) != abs( $iFromY - $iToY ) )
return -5;
# Место куда хотим поставить должно быть свободным :
if( $playGround[$iToY][$iToX] != 0 )
return -6;
# Если передвигаемая шашка - пешка :
if( $playGround[$iFromY][$iFromX] < 3 ) {
# Пешка может делать ход максимум на две ячейки :
if( abs( $iFromX - $iToX ) > 2 )
return -7;
# Место куда
# ! Пешка может ходить только в одну сторону (в зависимости от того кто игрок).
# ! Если пешка ходит на две клетки, то она бьёт, значит после неё должен быть противник.
# Если пешка может побить ещё раз, то она должна ещё бить.
}
# Если передвигаемая шашка - дамка :
else {
# В процессе пути не должно быть не более 1 шашки при чём только противника.
}
return 1;
}
|
| |
|
|
|
|
|
|
|
для: pavluxa09
(17.07.2012 в 21:12)
| | Читал вашу эпопею о крестиках-ноликах, даже пытался объяснить, что переписывать надо не объекты, а значения, что собственно вас и интересовало, ан нет, вы начисто все от корня меняли.
Это не только от незнания, но еще и от непонимания. Теперь шашки. Не знаю что вы родили в крестиках, но читая уже эту эпопею, уверен, ничего хорошего. Зачем вы беретесь за решение задач, не зная даже как к ним подступиться?
Ведь то, что вам подсказали (закономерность разницы координат), можно было увидеть, если бы вы на листочке в клеточку нарисовали поле с координатами, посмотрели внимательно, подумали, и заметили бы это. Есть еще одна закономерность в этом квадрате, это равенство сумм координат x,y в каждой из диагоналей. И еще очень много закономерностей, которые можно было найти на той же Вики, в так называемом "магическом квадрате". | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 10:14)
| | я уже это увидел вчера ночью, а ответ сегодня утром прочитал. Я всё прекрасно понимаю, просто мои решения слишком ресурсоёмкие. Для того что бы определять победителя в крестиках ноликах я написал функцию которая поворорачивает массив на 45 градусов, и далее выдираю от туда столбцы и по ним ищу нужную комбинацию. А далее этот массив переворачиваю в другую сторону но уже на 90 градусов и делаю тоже самое. В результате всё сводиться к тому что я получаю массивы всех диалогналей и по ним ищу комбинацию подрядидущих едениц или двоек в количестве n (при помощи переконвертирования массива в строку функцией json_encode и поиском в ней при помощи strpos).
Лень есть и много, но то что ума мало не нужно говорить. | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 10:50)
| | А я не говорил, что у вас ума нет, я говорил, что многое от непонимания и не знания (это касается того, что вы вытворяли с данными, вернее не с ними, а с объектами на странице). Массив в строку, потом strpos, это ужас, и этот ужас тоже от непонимания.
И еще я вам говорил, что иногда полезно с карандашом и бумагой посидеть, многое интересное можно обнаружить. | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 12:09)
| | а как можно реализовать проверку что бы если типа человек сделал ход вместо того что ему нужно обязательно ударить, у него забрать шашку которой он должен быть? Переходить по всем его шашками и смотреть может ли какая нить из них сделать удар? | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 12:26)
| | >если типа человек сделал ход вместо того что ему нужно обязательно ударить
Вы традиционные шашки пишите или игру в Чапаева? И "быть" или "бить" или может по Шекспиру у вас - "быть или не быть"? )
Я так понимаю, что если не взял шашку, а если так, то можете ответить на вопрос об окружении такой шашки? Еще раз говорю, возьмите карандаш и лист бумаги, сядьте и сами подумайте. Тем более, что на данный вопрос вам уже давали ответ (в романе о крестиках-ноликах), как собственно вам Valick не раз твердил и о том, какой же массив будет удобней, но вы либо выбираете из ответов на свой вкус, либо... не знаю в общем как вы поступаете, но выбираете почему-то не лучшее. | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 12:37)
| | С простыми шашками всё сделал, теперь возникает вопрос. А как проверять есть ли у дамки варианты хода и если есть то какие? Как это собрать в массив координат от куда и куда | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 17:11)
| | Представляю, что будет, если вы решитесь взяться за шахматы. В шашках хоть диагонали, а там еще и конь буквой Г ходит...
Научились определять диагонали? Можете ли теперь узнать свободна ли диагональ, если нет, то свой или чужой расположен на ней, и как расположен, какие варианты вытекают из этого? | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 17:32)
| | Что нужно писать самому условия в цикле ( | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 17:43)
| | бЛин а как перебрать все диалогнали которые пересикаются в точке где стоит шашка циклом? | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 17:44)
| | А что шашка может владеть массой диагоналей? Максимум на что она может рассчитывать, это две, и для нахождения их разве нужны циклы?
Вы взялись писать это или хотите чтобы форум для вас написал? Лично я на каждый ход вашей игры давать ответы не хочу. ) Ищите решения сами, пишите код, выставляйте его сюда, если возникают сложности, кому будет интересно, подскажут.
А лучше, сперва, попробуйте решать простые задачи, типа поиска по координатам горизонталей (их крайних точек), есть ли занятые клетки на этих горизонталях, и т.п.. | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 18:03)
| | Есть такое слово "Нада", а в условиях моей жизни сосредоточиться совсем нет времени. | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 18:19)
| | Ну это ваши проблемы, и оправдываться что "надо", а сосредоточиться... Не надо лить слез, взялись, делайте, за вас делать никто не станет, ибо остальным это "не надо".
Я вам высказал свое мнение - вы взялись за задачу, о которой и представления не имеете. Зачем, если нет времени и иного?
Вот из вашего же:
# 0 - пустое место;
# 1 - пешка сервера;
# 2 - пешка клиента;
# 3 - дамка сервера;
# 4 - дамка клиента.
Неужто это требует большого сосредоточения, чтобы понять, что такая идентификация взята в прямом смысле с потолка, что первое на ум пришло? Неужели не видно, что в этом случае придется идентифицировать каждое из чисел? А может надо было тогда так:
0 - не занятое поле;
1 - шашка сервера; //в шашках нет пешек
2 - дамка сервера;
3 - шашка клиента;
4 - дамка клиента.
В чем выгода от второго варианта? | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 18:45)
| | Выгода в моём варианте есть, что бы понять шашка это или дамка достаточно выполнить условие if( этот ID < 3 ). А далее смотрим, если он нацело делиться на 2 то это шашка/дамка сервера, иначе клиента. Всё же очевидно! | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 19:00)
| | Но вот как мне найти крайние точки диагоналей, вот в этом вопрос. У меня шашка размещена на доске, я знаю её X и Y и мне нужно понять, от куда нужно начинать перебирать что бы эту диагональ пройти. И как одновременно пройти две диагонали. | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 19:00)
| | Никой выгоды, так как отдать половину серверу, а вторую клиенту, это выгоднее. В этом случае, то что больше 2, это клиент, а четность/нечетность числа будет указывать шашка это или дамка. Проверка же на четность, это N & 1, что намного выгоднее, чем деление, да еще с проверкой нацело или нет (по модулю). Думать надо. | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 19:18)
| | Ну в принципе Вы правы, но дело в том что я уже практически реализовал. Мне осталось только сделать проверку, что после хода дамки нужно проверить может ли она ещё побить кого-то или нет, с этим я запутался, не как не доходит как пройтись по диалоганям на которых она расположена. Уже и рисовал, не помогает ( Помогите пожалуйста.
Осталось этот вопрос решить, и определение победителя, но если я решу этот то и тот без проблем решается. Помогите прошу Вас ради всего святого | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 19:28)
| | Помогите пожалуйста составить 4 цикла, либо как-то их объединить, что бы я мог пройтись по диагоналям на которых расположена моя дамка.
То есть, у меня есть дамка, о ней я знаю её X и Y координаты. Так же я знаю размер поля. Моя задача первым циклом пройтись по вертикали которая отходит от точки сверху влево, далее сверху справа, далее снизу слева и далее снизу справа.
Как подобный цикл можно реализовать? Помогите пожалуйста, уже все мозги себе вынес. | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 19:28)
| | вы проверяете то что нафиг не надо проверять
пустое поле, шашка или дамка - это практически константа
цифрами они удобнее только из-за того что так лучше для бд
и в конце концов вы бд используете только для хранения
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Valick
(18.07.2012 в 20:24)
| | Не совсем то понял при чём тут БД, ну то ладно. Вопрос в другом. Я застрял на том, что у меня дамка выполнила удар, и после этого мне нужно проверить, может она её может побить. Ведь если она ещё может побить то нужно что бы она обязательно это сделала, и не допускать того что бы человек ходил, когда ему необходимо дамкой ещё сделать удар.
Собственно вопрос в том, как пройтись циклом по диагоналям на которых расположена моя дамка, я не знаю как лучше, толи двумя циклами (основная и побочная диалогнали), то ли четырмя (сверху слева, сверху справа, снизу слева, снизу справа). Подскажите, как лучше реализовать эту проверку? И предложите пожалуйста вариант цикла. Я прошу Вас | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 20:28)
| | Проверять надо все возможные варианты, предварительно отбросив остальные, а это циклы с рекурсиями. Собирать все подходящие по условию варианты и уже из них выбирать окончательный.
Два, четыре или 138 циклов будет это заранее не известно.
Задача легкая только на первый взгляд.
Заставить сервер самостоятельно играть за другого игрока, даже не думайте.
Нужно будет набивать базу сыгранных партий, основываясь на анализе которых сервер будет выбирать подходящие ходы.
А для этого нужна мощная и продуманная организация БД | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2012 в 20:28)
| | для примера покажу функцию которую я писал для морского боя
<?php
//****************************************************************************************
// Функция проверки ранен или убит
// $kor - массив выборки кораблей из БД
// $point - точка выстрела
// $x - размерность поля по горизонтали
// $y - размерность поля по вертикали
//****************************************************************************************
// 1 - фрагмент целого корабля
// 3 - фрагмент раненого корабля
// 4 - фрагмент убитого корабля
//****************************************************************************************
// Автор: Каменев ВВ 2010 г.
//****************************************************************************************
function badship($kor,$point,$x,$y){
$r[$point]=4;
$a=1;
if(isset($kor[$point-$a])){
if($kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
if($kor[$point-$a]==3){
while(isset($kor[$point-$a])){
if($kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
$r[$point-$a]=4; $a++;}
}
}
$a=1;
if(isset($kor[$point+$a])){
if($kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
if($kor[$point+$a]==3){
while(isset($kor[$point+$a])){
if($kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
$r[$point+$a]=4; $a++;}
}
}
$a=$y;
if(isset($kor[$point-$a])){
if($kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
if($kor[$point-$a]==3){
while(isset($kor[$point-$a])){
if($kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
$r[$point-$a]=4; $a=$a+$y;}
}
}
$a=$y;
if(isset($kor[$point+$a])){
if($kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
if($kor[$point+$a]==3){
while(isset($kor[$point+$a])){
if($kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
$r[$point+$a]=4; $a=$a+$y;}
}
}
return $r;
}
//****************************************************************************************
?>
|
| |
|
|
|
|
|
|
|
для: Valick
(20.07.2012 в 13:15)
| | В принципе игра уже готова, за исключением клиентской части, нужно внешний вид ей предать | |
|
|
|
|