#!/usr/bin/perl use 5.010; use strict; use warnings; # spielernamen: print "Player 1: "; chomp( my $player1 = ); $player1 =~ s/^\s*$/Player1/; print "Player 2: "; chomp( my $player2 = ); $player2 =~ s/^\s*$/Player2/; $player2 .= '2' if $player2 eq $player1; my @board; # spielfeld my $winner; # gewinner my $color = 1; # 1 = X, 0 = O # hauptschleife: while ( not defined $winner and scalar( grep defined, @board ) != 9 ) { draw_board(); handle_input(); check_winner(); } # while # ausgabe des gewinners: if ( defined $winner ) { draw_board(); say "\nCongratulations ". ($winner eq 'X' ? $player1 : $player2) ."!"; say "You are the winner!"; } # if else { draw_board(); say "\nDraw."; } # else # spielfeld zeichnen: sub draw_board { print "\n" x 24; # bildschirm "loeschen" (edit) say " A | B | C\n -----------"; printf( "%s: %s | %s | %s\n". ($_ == 2 ? '' : " ---+---+---\n"), $_ + 1, $board[3*$_ ] // ' ',#/ $board[3*$_+1] // ' ',#/ $board[3*$_+2] // ' ',#/ ) for 0 .. 2; } # draw_board # eingabe entgegennehmen und behandeln: sub handle_input { my( $name, $sym ) = $color ? ($player1, 'X') : ($player2, 'O'); print "\nIt's your turn, $name ($sym): "; chomp( my $cell = ); if ( $cell =~ /([abcABC])([123])/ ) { my( $x, $y ) = ( $1, $2 - 1 ); $x = { 'a' => 0, 'b' => 1, 'c' => 2 }->{ lc $x }; if ( defined $board[3*$y+$x] ) { say "This cell is already taken."; ; } # if else { $board[3*$y+$x] = $sym; $color = !$color; # naechster spieler } # else } # if else { say "I'd appreciate something like A1 or b3."; ; } # else } # handle_input # ueberpruefen ob jemand gewonnen hat: sub check_winner { my $eq = sub { # edit: diese routine stände wohl besser in einem my $cmp = my $r = $board[shift]; # scope neben check_winner $r &&= $cmp eq $board[$_] for @_; return $r; }; # $eq # horizontal, vertikal, diagonal: for ( 0, 3, 6 ) { return $winner = $board[$_] if $eq->($_, $_+1, $_+2) } for ( 0, 1, 2 ) { return $winner = $board[$_] if $eq->($_, $_+3, $_+6) } $winner = $board[4] if $eq->(0, 4, 8) or $eq->(6, 4, 2); } # check_winner __END__