Простые крестики-нолики в php/html код


Я делаю простые крестики-нолики с поддержкой PHP, генерирующий только HTML код.

Несколько заметок:

  • Я еще не удосужилась дать ИИ противников (ОС), и это намеренно.
  • Нет стилей CSS к нему, я собираюсь добавить его в CSS-файл.
  • tictactoe.php естественно имя самого скрипта, так что каждый ссылки имеете в виду на саму страницу.

Теперь я не знаю, если я сделал все правильно, вот моя проблема:

  • Если я хочу, чтобы расширить функциональные возможности игры в будущем (возможность добавления JavaScript, противник назначения, новые игровые возможности), я опасаюсь, что структура кода не приспособлен для этого. Я должен изменить мой код, так что он является объектно-ориентированным? Редактировать я имею в виду, чтобы добавить новые функции в игру, такие как полномочия, которые изменили бы состояние платы, как отмотать до предыдущего состояния и; некоторые CSS и JavaScript в ненавязчивой форме и добавить какой-нибудь способ проверить, если параметры отключены (как JavaScript/вспышка), а также проверить версию браузера для HTML5/CSS3 особенности.
  • Как сейчас, его легко "обмануть" и непосредственно познакомить пожелал Государственного совета. Я хотел бы предотвратить это, и если возможно без использования JavaScript, как я хочу, чтобы игра была играбельной и без него.
<table>
<?php
//Determine if a player as aligned three of its symbols and return the id of the player (1
//for X Player, -1 for O Player(Computer)). Otherwise return 0;
function isWinState($board){
    $winning_sequences = '012345678036147258048642';
    for($i=0;$i<=21;$i+=3){
        $player = $board[$winning_sequences[$i]];
        if($player == $board[$winning_sequences[$i+1]]){
            if($player == $board[$winning_sequences[$i+2]]){
                if($player!=0){
                    return $player;
                }
            } 
        }   
    }
    return 0;
}

//Player O plays its turn at random
function OsTurn($board){
    if(in_array(0,$board)){
        $i = mt_rand(0,8);
        while($board[$i]!=0){
            $i = mt_rand(0,8);
        }
        $board[$i]=-1;
    }
    return $board;
}

$winstate = 0;
$values = array();

if(empty($_GET['values'])){
    //initializing the board
    $values = array_fill(0,9,0);
    //determine who begins at random
    if(mt_rand(0,1)){
        $values = OsTurn($values);
    }
}else{
    //get the board
    $values = explode(',',$_GET['values']);
    //Check if a player X won, if not, player 0 plays its turn.
    $winstate = isWinState($values);
    if($winstate==0){
        $values = OsTurn($values);
    }
    //Check if a player 0 won
    $winstate = isWinState($values);    
}
//Display the board as a table
for($i=0;$i<9;$i++){
    //begin of a row
    if(fmod($i,3)==0){echo '<tr>';}
    echo '<td>';
    //representation of the player token, depending on the ID
    if($values[$i]==1){
        echo 'X';
    }else if($values[$i]==-1){
        echo 'O';
    }else{
        //If noone put a token on this, and if noone won, make a link to allow player X to
        //put its token here. Otherwise, empty space.
        if($winstate==0){
            $values_link = $values;
            $values_link[$i]=1;
            echo '<a href="tictactoe.php?values='.implode(',',$values_link).'">&nbsp;</a>';
        }else{
            echo '&nbsp;';
        }
    }
    echo '</td>';
    //end of a row
    if(fmod($i,3)==2){echo '</tr>';}
}
?>
</table>
<?php
//If someone won, display the message
if($winstate!=0){
    echo '<p><b>Player '.(($winstate==1)?'X':'O').' won!</b></p>';
}
?>


12109
12
задан 28 января 2011 в 12:01 Источник Поделиться
Комментарии
1 ответ

На самом деле не существует причин, чтобы сделать это "более объектно-ориентированный", если вам не надо. Чтобы добавить более создает ИИ, например, вы можете сделать:

switch ($aiLevel) {
case 1: $values = $OsTurn($values);
case 2: $values = $betterAi($values);
case 3: $values = $unbeatableAi($values);
}

Добавление дополнительных функций может быть сделано схожим образом. Я не уверен, что точно WHT вы имеете в виду, так что я могу только сделать некоторые общие замечания. Разбить все на функции, и убедитесь, что это легко, чтобы увидеть поток программы. Как вы структурированный код-это хорошо. Это не должно быть трудно добавить дополнительные функции, если вы используете стиль похож.

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

Я верю, когда вы говорите о жульничестве, вы говорите, что вы можете послать популярная настольная значением сценарий, введя url самостоятельно. Чтобы предотвратить это необходимо для сохранения государства. Куки-файл может быть простой способ, чтобы начать; сохранение текущего состояния доски в его после каждого вызова страницы, и убедитесь, что единственным изменением стало размещение другой кусок. Более надежный, но несколько сложнее, решением будет использовать переменные сессии, чтобы сохранить состояние. Это позволит избежать "cookys плохие" проблемы и возможности того, что кто-то может подделать кухарка!

8
ответ дан 28 января 2011 в 01:01 Источник Поделиться