PHP dasturlash tilida Tic tac toe o'yini
o'yinni ishga tushirish uchun buyruqlar satrida
$: php ticTac.php| <?php | |
| function translateKeypress( $string ) { | |
| switch ($string) { | |
| // Yuqoriga harakatlantirish tugmasi | |
| case "\033[A": | |
| return "UP"; | |
| // Pastga harakatlantirish tugmasi | |
| case "\033[B": | |
| return "DOWN"; | |
| // O'ngga harakatlantirish tugmasi | |
| case "\033[C": | |
| return "RIGHT"; | |
| // Chapga harakatlantirish tugmasi | |
| case "\033[D": | |
| return "LEFT"; | |
| // ENTER (kiritish) tugmasi | |
| case "\n": | |
| return "ENTER"; | |
| // Bo'sh joy tugmasi | |
| case " ": | |
| return "SPACE"; | |
| // Satrdan belgini o'chirish tugmasi | |
| case "\010": | |
| case "\177": | |
| return "BACKSPACE"; | |
| // Tabulator tugmasi | |
| case "\t": | |
| return "TAB"; | |
| // Bekor qilish tugmasi | |
| case "\e": | |
| return "ESC"; | |
| } | |
| return $string; | |
| } | |
| function move( $stdin, &$state, &$activeCell, &$player ) { | |
| $key = fgets( $stdin ); | |
| if ( $key ) { | |
| $key = translateKeypress( $key ); | |
| switch ($key) { | |
| case "UP": | |
| if ( $activeCell[0] >= 1 ) $activeCell[0]--; | |
| break; | |
| case "DOWN": | |
| if ( $activeCell[0] < 2 ) $activeCell[0]++; | |
| break; | |
| case "RIGHT": | |
| if ( $activeCell[1] < 2 ) $activeCell[1]++; | |
| break; | |
| case "LEFT": | |
| if ( $activeCell[1] >= 1 ) $activeCell[1]--; | |
| break; | |
| case "ENTER": | |
| case "SPACE": | |
| if ( $state[ $activeCell[ 0 ] ][ $activeCell[ 1 ] ] == '' ) { | |
| $state[ $activeCell[ 0 ] ][ $activeCell[ 1 ] ] = $player; | |
| $player = ( $player == 'X' ) ? 'O' : 'X'; | |
| } | |
| break; | |
| } | |
| } | |
| } | |
| function renderGame( $state, $activeCell, $player ) { | |
| $output = ''; | |
| $output .= 'O\'yinchi: ' . $player . PHP_EOL; | |
| foreach ( $state as $x => $line ) { | |
| $output .= '|'; | |
| foreach ( $line as $y => $item ) { | |
| switch ( $item ) { | |
| case ''; | |
| $cell = ' '; | |
| break; | |
| case 'X'; | |
| $cell = 'X'; | |
| break; | |
| case 'O'; | |
| $cell = 'O'; | |
| break; | |
| } | |
| $cell = ( $activeCell[ 0 ] == $x && $activeCell[ 1 ] == $y ) ? '-'. $cell . '-' : ' ' . $cell . ' '; | |
| $output .= $cell . '|'; | |
| } | |
| $output .= PHP_EOL; | |
| } | |
| return $output; | |
| } | |
| function isWinState( $state ) { | |
| foreach ( [ 'X', 'O' ] as $player ) { | |
| foreach ($state as $x => $line) { | |
| // Gorizontal qator mavjud. | |
| if ( $state[ $x ][ 0 ] == $player && $state[ $x ][ 1 ] == $player && $state[ $x ][ 2 ] == $player ) exit( $player . ' yutdi' . PHP_EOL ); | |
| foreach ( $line as $y => $item ) { | |
| // Vertikal qator mavjud. | |
| if ( $state[ 0 ][ $y ] == $player && $state[ 1 ][ $y ] == $player && $state[ 2 ][ $y ] == $player ) exit( $player . ' yutdi' . PHP_EOL ); | |
| } | |
| } | |
| // Diagonal chiziq yuqoridan, chapdan, pastdan o'ngga shaklda topildi. | |
| if ( $state[ 0 ][ 0 ] == $player && $state[ 1 ][ 1 ] == $player && $state[ 2 ][ 2 ] == $player ) exit( $player . ' yutdi' . PHP_EOL ); | |
| // Diagonal chiziq pastdan, chapdan, yuqoriga o'ngga shaklda topildi. | |
| if ( $state[ 2 ][ 0 ] == $player && $state[ 1 ][ 1 ] == $player && $state[ 0 ][ 2 ] == $player ) exit( $player . ' yutdi' . PHP_EOL ); | |
| } | |
| // Durang holati | |
| $blankQuares = 0; | |
| foreach ( $state as $x => $line ) { | |
| foreach ( $line as $y => $item ) { | |
| if ( $state[ $x ][ $y ] == '' ) $blankQuares++; | |
| } | |
| } | |
| // Agar bo'sh kataklar qolmasa va yuqoridagi shartlar bajarilmasa durang deb e'lon qilish. | |
| if ( $blankQuares == 0 ) exit( 'Durang natija!' . PHP_EOL ); | |
| } | |
| $stdin = fopen( 'php://stdin', 'r' ); | |
| stream_set_blocking( $stdin, 0 ); | |
| system( 'stty cbreak -echo' ); | |
| $state = [ | |
| [ '', '', '' ], | |
| [ '', '', '' ], | |
| [ '', '', '' ], | |
| ]; | |
| $player = 'X'; | |
| $activeCell = [ 0 => 0, 1 => 0 ]; | |
| while( 1 ) { | |
| system( 'clear'); | |
| move( $stdin, $state, $activeCell, $player ); | |
| echo renderGame( $state, $activeCell, $player ); | |
| isWinState( $state ); | |
| } |