Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: находятся ли две точки в массиве на одной диагонали
 
 автор: pavluxa09   (17.07.2012 в 21:12)   письмо автору
 
 

Здравствуйте. Помогите реализовать как узнать по двумерному массиву находятся ли две заданные точки (с координатами x,y ) на одной диалогонали в массиве (для шашек).

  Ответить  
 
 автор: cheops   (18.07.2012 в 06:12)   письмо автору
 
   для: pavluxa09   (17.07.2012 в 21:12)
 

Возможно вас заинтересует следующее решение
<?php 
  
// Размерность поля
  
$row 5;
  
// Поле для наглядности, в
  // расчетах не участвует
  
$arr = array(00000,
               
00000,
               
00000,
               
10000,
               
01000);
  
// Координаты
  
$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 />";
?>

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 10:51)   письмо автору
 
   для: 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;
}

  Ответить  
 
 автор: confirm   (18.07.2012 в 10:14)   письмо автору
 
   для: pavluxa09   (17.07.2012 в 21:12)
 

Читал вашу эпопею о крестиках-ноликах, даже пытался объяснить, что переписывать надо не объекты, а значения, что собственно вас и интересовало, ан нет, вы начисто все от корня меняли.
Это не только от незнания, но еще и от непонимания. Теперь шашки. Не знаю что вы родили в крестиках, но читая уже эту эпопею, уверен, ничего хорошего. Зачем вы беретесь за решение задач, не зная даже как к ним подступиться?
Ведь то, что вам подсказали (закономерность разницы координат), можно было увидеть, если бы вы на листочке в клеточку нарисовали поле с координатами, посмотрели внимательно, подумали, и заметили бы это. Есть еще одна закономерность в этом квадрате, это равенство сумм координат x,y в каждой из диагоналей. И еще очень много закономерностей, которые можно было найти на той же Вики, в так называемом "магическом квадрате".

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 10:50)   письмо автору
 
   для: confirm   (18.07.2012 в 10:14)
 

я уже это увидел вчера ночью, а ответ сегодня утром прочитал. Я всё прекрасно понимаю, просто мои решения слишком ресурсоёмкие. Для того что бы определять победителя в крестиках ноликах я написал функцию которая поворорачивает массив на 45 градусов, и далее выдираю от туда столбцы и по ним ищу нужную комбинацию. А далее этот массив переворачиваю в другую сторону но уже на 90 градусов и делаю тоже самое. В результате всё сводиться к тому что я получаю массивы всех диалогналей и по ним ищу комбинацию подрядидущих едениц или двоек в количестве n (при помощи переконвертирования массива в строку функцией json_encode и поиском в ней при помощи strpos).

Лень есть и много, но то что ума мало не нужно говорить.

  Ответить  
 
 автор: confirm   (18.07.2012 в 12:09)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 10:50)
 

А я не говорил, что у вас ума нет, я говорил, что многое от непонимания и не знания (это касается того, что вы вытворяли с данными, вернее не с ними, а с объектами на странице). Массив в строку, потом strpos, это ужас, и этот ужас тоже от непонимания.
И еще я вам говорил, что иногда полезно с карандашом и бумагой посидеть, многое интересное можно обнаружить.

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 12:26)   письмо автору
 
   для: confirm   (18.07.2012 в 12:09)
 

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

  Ответить  
 
 автор: confirm   (18.07.2012 в 12:37)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 12:26)
 

>если типа человек сделал ход вместо того что ему нужно обязательно ударить

Вы традиционные шашки пишите или игру в Чапаева? И "быть" или "бить" или может по Шекспиру у вас - "быть или не быть"? )

Я так понимаю, что если не взял шашку, а если так, то можете ответить на вопрос об окружении такой шашки? Еще раз говорю, возьмите карандаш и лист бумаги, сядьте и сами подумайте. Тем более, что на данный вопрос вам уже давали ответ (в романе о крестиках-ноликах), как собственно вам Valick не раз твердил и о том, какой же массив будет удобней, но вы либо выбираете из ответов на свой вкус, либо... не знаю в общем как вы поступаете, но выбираете почему-то не лучшее.

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 17:11)   письмо автору
 
   для: confirm   (18.07.2012 в 12:37)
 

С простыми шашками всё сделал, теперь возникает вопрос. А как проверять есть ли у дамки варианты хода и если есть то какие? Как это собрать в массив координат от куда и куда

  Ответить  
 
 автор: confirm   (18.07.2012 в 17:32)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 17:11)
 

Представляю, что будет, если вы решитесь взяться за шахматы. В шашках хоть диагонали, а там еще и конь буквой Г ходит...
Научились определять диагонали? Можете ли теперь узнать свободна ли диагональ, если нет, то свой или чужой расположен на ней, и как расположен, какие варианты вытекают из этого?

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 17:43)   письмо автору
 
   для: confirm   (18.07.2012 в 17:32)
 

Что нужно писать самому условия в цикле (

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 17:44)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 17:43)
 

бЛин а как перебрать все диалогнали которые пересикаются в точке где стоит шашка циклом?

  Ответить  
 
 автор: confirm   (18.07.2012 в 18:03)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 17:44)
 

А что шашка может владеть массой диагоналей? Максимум на что она может рассчитывать, это две, и для нахождения их разве нужны циклы?
Вы взялись писать это или хотите чтобы форум для вас написал? Лично я на каждый ход вашей игры давать ответы не хочу. ) Ищите решения сами, пишите код, выставляйте его сюда, если возникают сложности, кому будет интересно, подскажут.
А лучше, сперва, попробуйте решать простые задачи, типа поиска по координатам горизонталей (их крайних точек), есть ли занятые клетки на этих горизонталях, и т.п..

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 18:19)   письмо автору
 
   для: confirm   (18.07.2012 в 18:03)
 

Есть такое слово "Нада", а в условиях моей жизни сосредоточиться совсем нет времени.

  Ответить  
 
 автор: confirm   (18.07.2012 в 18:45)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 18:19)
 

Ну это ваши проблемы, и оправдываться что "надо", а сосредоточиться... Не надо лить слез, взялись, делайте, за вас делать никто не станет, ибо остальным это "не надо".
Я вам высказал свое мнение - вы взялись за задачу, о которой и представления не имеете. Зачем, если нет времени и иного?
Вот из вашего же:

# 0 - пустое место;
# 1 - пешка сервера;
# 2 - пешка клиента;
# 3 - дамка сервера;
# 4 - дамка клиента.

Неужто это требует большого сосредоточения, чтобы понять, что такая идентификация взята в прямом смысле с потолка, что первое на ум пришло? Неужели не видно, что в этом случае придется идентифицировать каждое из чисел? А может надо было тогда так:

0 - не занятое поле;
1 - шашка сервера; //в шашках нет пешек
2 - дамка сервера;
3 - шашка клиента;
4 - дамка клиента.

В чем выгода от второго варианта?

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 19:00)   письмо автору
 
   для: confirm   (18.07.2012 в 18:45)
 

Выгода в моём варианте есть, что бы понять шашка это или дамка достаточно выполнить условие if( этот ID < 3 ). А далее смотрим, если он нацело делиться на 2 то это шашка/дамка сервера, иначе клиента. Всё же очевидно!

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 19:01)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 19:00)
 

Но вот как мне найти крайние точки диагоналей, вот в этом вопрос. У меня шашка размещена на доске, я знаю её X и Y и мне нужно понять, от куда нужно начинать перебирать что бы эту диагональ пройти. И как одновременно пройти две диагонали.

  Ответить  
 
 автор: confirm   (18.07.2012 в 19:18)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 19:00)
 

Никой выгоды, так как отдать половину серверу, а вторую клиенту, это выгоднее. В этом случае, то что больше 2, это клиент, а четность/нечетность числа будет указывать шашка это или дамка. Проверка же на четность, это N & 1, что намного выгоднее, чем деление, да еще с проверкой нацело или нет (по модулю). Думать надо.

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 19:28)   письмо автору
 
   для: confirm   (18.07.2012 в 19:18)
 

Ну в принципе Вы правы, но дело в том что я уже практически реализовал. Мне осталось только сделать проверку, что после хода дамки нужно проверить может ли она ещё побить кого-то или нет, с этим я запутался, не как не доходит как пройтись по диалоганям на которых она расположена. Уже и рисовал, не помогает ( Помогите пожалуйста.

Осталось этот вопрос решить, и определение победителя, но если я решу этот то и тот без проблем решается. Помогите прошу Вас ради всего святого

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 20:06)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 19:28)
 

Помогите пожалуйста составить 4 цикла, либо как-то их объединить, что бы я мог пройтись по диагоналям на которых расположена моя дамка.

То есть, у меня есть дамка, о ней я знаю её X и Y координаты. Так же я знаю размер поля. Моя задача первым циклом пройтись по вертикали которая отходит от точки сверху влево, далее сверху справа, далее снизу слева и далее снизу справа.

Как подобный цикл можно реализовать? Помогите пожалуйста, уже все мозги себе вынес.

  Ответить  
 
 автор: Valick   (18.07.2012 в 20:24)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 19:28)
 

вы проверяете то что нафиг не надо проверять
пустое поле, шашка или дамка - это практически константа
цифрами они удобнее только из-за того что так лучше для бд
и в конце концов вы бд используете только для хранения

[поправлено модератором]

  Ответить  
 
 автор: pavluxa09   (18.07.2012 в 20:28)   письмо автору
 
   для: Valick   (18.07.2012 в 20:24)
 

Не совсем то понял при чём тут БД, ну то ладно. Вопрос в другом. Я застрял на том, что у меня дамка выполнила удар, и после этого мне нужно проверить, может она её может побить. Ведь если она ещё может побить то нужно что бы она обязательно это сделала, и не допускать того что бы человек ходил, когда ему необходимо дамкой ещё сделать удар.

Собственно вопрос в том, как пройтись циклом по диагоналям на которых расположена моя дамка, я не знаю как лучше, толи двумя циклами (основная и побочная диалогнали), то ли четырмя (сверху слева, сверху справа, снизу слева, снизу справа). Подскажите, как лучше реализовать эту проверку? И предложите пожалуйста вариант цикла. Я прошу Вас

  Ответить  
 
 автор: Valick   (20.07.2012 в 13:09)   письмо автору
 
   для: pavluxa09   (18.07.2012 в 20:28)
 

Проверять надо все возможные варианты, предварительно отбросив остальные, а это циклы с рекурсиями. Собирать все подходящие по условию варианты и уже из них выбирать окончательный.
Два, четыре или 138 циклов будет это заранее не известно.
Задача легкая только на первый взгляд.
Заставить сервер самостоятельно играть за другого игрока, даже не думайте.
Нужно будет набивать базу сыгранных партий, основываясь на анализе которых сервер будет выбирать подходящие ходы.
А для этого нужна мощная и продуманная организация БД

  Ответить  
 
 автор: Valick   (20.07.2012 в 13:15)   письмо автору
 
   для: 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;
}
//****************************************************************************************
?>

  Ответить  
 
 автор: pavluxa09   (20.07.2012 в 14:00)   письмо автору
 
   для: Valick   (20.07.2012 в 13:15)
 

В принципе игра уже готова, за исключением клиентской части, нужно внешний вид ей предать

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования