Skip to content

Instantly share code, notes, and snippets.

@jeremy-brenner
Forked from jquast/ncurses_pong.php
Created November 14, 2012 11:10
Show Gist options
  • Save jeremy-brenner/4071573 to your computer and use it in GitHub Desktop.
Save jeremy-brenner/4071573 to your computer and use it in GitHub Desktop.
ncurses pong in php, -jbrenner
#! /usr/bin/env php
# $Id: pong.phps,v 1.2 2006/01/28 14:45:22 dingo Exp $
# imported via lynx -dump 2006 jdq, orig by theedge@efnet
<?php
/*
Jeremy Brenner 2005
*/
ncurses_init();
ncurses_timeout(0);
ncurses_cbreak();
ncurses_start_color();
ncurses_init_pair(1,NCURSES_COLOR_RED,NCURSES_COLOR_BLACK);
ncurses_init_pair(2,NCURSES_COLOR_GREEN,NCURSES_COLOR_BLACK);
ncurses_init_pair(3,NCURSES_COLOR_YELLOW,NCURSES_COLOR_BLACK);
ncurses_init_pair(4,NCURSES_COLOR_BLUE,NCURSES_COLOR_BLACK);
ncurses_init_pair(5,NCURSES_COLOR_MAGENTA,NCURSES_COLOR_BLACK);
ncurses_init_pair(6,NCURSES_COLOR_CYAN,NCURSES_COLOR_BLACK);
ncurses_init_pair(7,NCURSES_COLOR_WHITE,NCURSES_COLOR_BLACK);
$x=1;
$y=1;
$xdir = 1;
$ydir = 1;
$delay = 100000;
$go = TRUE;
$count = 0;
$gameover = " *Game Over* ";
$tryagain = "Try Again? (Y/N)";
$paddle = "|=========|";
ncurses_getmaxyx(STDSCR, $H, $W);
$p = ceil ( $W / 2 ) - ceil ( strlen ( $paddle ) / 2 );
$pdir = 0;
$bwin = ncurses_newwin($H, $W, 0, 0);
ncurses_wborder($bwin, 0, 0, 0, 0, 0, 0, 0, 0);
while($go){
$ch = ncurses_getch();
switch( $ch ){
case FALSE:
break;
case NCURSES_KEY_UP:
// $delay = ( $delay >= 10000 ) ? $delay - 10000 : 1;
break;
case NCURSES_KEY_DOWN:
// $delay = $delay + 10000;
break;
case NCURSES_KEY_LEFT:
$pdir = ( $pdir <= -4 ) ? -4 : $pdir - 1;
break;
case NCURSES_KEY_RIGHT:
$pdir = ( $pdir >= 4 ) ? 4 : $pdir + 1;
break;
case ord('q'):
case ord('Q'):
die();
}
ncurses_getmaxyx(STDSCR, $H, $W);
ncurses_wmove($bwin, $y , $x );
ncurses_wcolor_set($bwin, 2);
ncurses_waddstr($bwin, ' ' );
ncurses_wmove($bwin, $H-2 , $p );
ncurses_wcolor_set($bwin, 4);
ncurses_waddstr($bwin, str_repeat(' ',strlen($paddle)) );
ncurses_wcolor_set($bwin, 1);
ncurses_wmove($bwin, $H-1 , $W-1 );
$y += $ydir;
$x += $xdir;
$p += $pdir;
if($x >= $W - 1 ){
$xdir *= -1;
$x = $W - 2;
}elseif($x <= 1){
$xdir *= -1;
$x = 1;
}
if($y >= $H - 1){
$ydir = -1;
}elseif($y == 1){
$ydir = 1;
}
$pe = $p + strlen ( $paddle ) ;
if($p <= 1){
$pdir = 0;
$p = 1;
}
if($pe >= $W-1){
$pdir = 0;
$p = $W - strlen ( $paddle ) - 1;
}
ncurses_wmove($bwin, $y , $x );
ncurses_wcolor_set($bwin, 2);
ncurses_waddstr($bwin, '#' );
ncurses_wmove($bwin, $H-2 , $p );
ncurses_wcolor_set($bwin, 4);
ncurses_waddstr($bwin, $paddle );
ncurses_wcolor_set($bwin, 1);
ncurses_wmove($bwin, $H-1 , $W-1 );
ncurses_wrefresh($bwin);
if( $y == $H - 3 && $x >= $p-1 && $x <= $pe ){
$ydir = -1;
$xdir += $pdir;
if( $xdir == 0 ){
$xdir = ( abs( $pdir ) > $pdir ) ? -1 : 1;
}
$xdir = ( $xdir > 5 ) ? 5 : $xdir;
$xdir = ( $xdir < -5 ) ? -5 : $xdir;
$delay = ( $delay >= 2000 ) ? $delay - 2000 : 1000;
$count++;
}
if( $y == $H - 1 ){
$gw = strlen($tryagain)+2;
$gy = ceil ( $H / 2 ) - 2;
$gx = ceil( $W / 2 ) - ceil( $gw / 2 );
$gwin = ncurses_newwin( 5, $gw , $gy , $gx );
ncurses_wborder($gwin, 0, 0, 0, 0, 0, 0, 0, 0);
ncurses_wmove($gwin,1,1);
ncurses_waddstr($gwin, $gameover );
ncurses_wmove($gwin,2,1);
ncurses_waddstr($gwin, "Bounces: " . $count );
ncurses_wmove($gwin,3,1);
ncurses_waddstr($gwin, $tryagain );
ncurses_wrefresh($gwin);
$dead = TRUE;
while( $dead ){
$ch = ncurses_getch();
switch( chr($ch) ){
case 'y':
case 'Y':
$x=1;
$y=1;
$xdir = 1;
$ydir = 1;
$delay = 100000;
$dead = FALSE;
$go = TRUE;
$p = ceil ( $W / 2 ) - ceil ( strlen ( $paddle ) /
2 );
$pdir = 0;
$count = 0;
break;
case 'q':
case 'Q':
case 'n':
case 'N':
$go = FALSE;
$dead = FALSE;
break;
}
}
}
// ncurses_refresh();
usleep($delay);
}
ncurses_end()
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment