syslog.warten.de

Pong

Beim Stöbern in den Untiefen meiner Festplatte fiel mir ein kurzes Perl-Skript in die Hände, das ich vor zwei Jahren geschrieben habe, als ich mich ein wenig mit der Curses-Bibliothek beschäftigt habe. Es ist eine Version des klassischen Breakout (jedoch ohne Steine) bzw. ein Solo-Pong und ich hatte ein paar Minuten Spaß damit.

Damals schrieb ich es, um mich mit den Grundkonzept von Curses vertraut zu machen. Ich habe es nicht weiterentwickelt, weil es seinen Zweck erfüllt hatte. Heute denke ich, dass eine weiterentwickelte Version auf jedem meiner Systeme verfügbar sein sollte. Wenn ich Zeit habe….

#!/usr/bin/env perl
###################
#
# pong -- A version of the classic game written in perl using curses
#
# Author:    Stefan Warten 
# Copyright: (C) 2006 Stefan Warten
# Licence:   GPL-2 
#

use strict;
use warnings;
use Curses;
use Time::HiRes qw(gettimeofday);

initscr();
cbreak();
noecho();
keypad(1);
nodelay(1);
curs_set(0);

my $racket           = " ===== ";
my $racket_column    = int( $COLS / 2 - length($racket) / 2 );
my $racket_line      = $LINES - 2;
my $ball_column      = int( $COLS / 2 );
my $ball_line        = 1;
my $ballspeed_column = 1;
my $ballspeed_line   = 1;
my $time_before      = gettimeofday();
my $time_now;
my $old_ball_column;
my $old_ball_line;

while (1) {
    $old_ball_column = $ball_column;
    $old_ball_line   = $ball_line;
    $time_now        = gettimeofday();
    my $time_elapsed = ( $time_now - $time_before ) * 1000;

    if ( $time_elapsed > 100 ) {
        $time_before = $time_now;

        if ( $ball_column == 0 or $ball_column == $COLS - 1 ) {
            $ballspeed_column = -$ballspeed_column;
        }
        $ball_column  = $ballspeed_column;

        if (
            $ball_line == 0
            or (    $ball_line == $racket_line - 1
                and $ball_column > $racket_column
                and $ball_column < $racket_column   length($racket) )
          )
        {
            $ballspeed_line = -$ballspeed_line;
        }
        $ball_line  = $ballspeed_line;

        if ( $ball_line > $racket_line ) {
            my $gameover = "GAME OVER";
            addstr( int( $LINES / 2 ),
                int( $COLS / 2 - length($gameover) / 2 ), $gameover );
            refresh();
            sleep(4);
            endwin();
            exit;
        }
        addstr( $old_ball_line, $old_ball_column, " " );
        addstr( $ball_line,     $ball_column,     "O" );
        refresh();
    }

    my $char = getch();
    if ( $char eq "q" ) {
        endwin();
        exit;
    }
    elsif ( $char eq KEY_LEFT ) {
        $racket_column-- if $racket_column > 0;
    }
    elsif ( $char eq KEY_RIGHT ) {
        $racket_column   if $racket_column < $COLS - length($racket);
    }
    addstr( $racket_line, $racket_column, $racket );
    refresh();
}