#!/usr/bin/perl
#
# Interface Graphique Perl/Tk pour zeDuel
# NoMan
#
#
# format du fichier log :
# - des lignes de la forme "X Y\n" pour chaque tour
#
use Tk;
require Tk::FileSelect;
$version="1.3";
$dirlog="./logs";
$main=MainWindow->new();
$main->title("zeDuel / Interface PerlTk v$version / NoMan");
$main->minsize( qw(450 550) );
$main->maxsize( qw(450 550) );
$fileinfo=$main->Label(-anchor=>'w', -relief=>'raised', -height=>1, -width=>80)->pack();
$fileinfo->configure(-text=>"Aucun fichier utlilisé");
$canv=$main->Canvas(-height=>440, -width=>400, -background=>'lightgrey');
for my $i (0..20) {
$canv->createLine(31,20*$i+31,431,20*$i+31);
$canv->createLine(20*$i+31,31,20*$i+31,431);
}
for my $i (0..19) {
$canv->createText(42+20*$i,10,-text=>$i+1, -anchor=>'n', -fill=>'red');
$canv->createText(10,42+20*$i,-text=>$i+1, -anchor=>'w', -fill=>'red');
}
$canv->pack(-side=>'top', -fill=>'x', -padx=>5, -pady=>5);
$txttrace=$main->Label(-anchor=>'w', -relief=>'raised', -height=>2, -width=>50)->pack();
$main->Button(-command=>\&quitter, -text=>"Quitter")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&fin, -text=>">|")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&suivant, -text=>">")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&precedent, -text=>"<")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&debut, -text=>"|<")->pack(-side=>'right', -expand=>1);
$main->Button(-command=>\&charge, -text=>"Charger")->pack(-side=>'right', -expand=>1);
&charge;
MainLoop;
#----------------------------------------------------------------------------#
sub charge {
#initialise l'interface avec les E/S
$fsWindow=$main->FileSelect(-directory =>$dirlog);
$nomficlog=$fsWindow->Show;
if ($nomficlog eq "") {return;}
open(ficlog,$nomficlog) or die "Erreur d'acces fichier : $nomficlog\n";
#flog contient tout le fichier
@flog=<ficlog>;
close(ficlog);
$cligne=0;
$maxligne=0;
$nomficlog=~ /(.*)\/(.*)_(.*)/;
@nomsjoueurs=(0,$2,$3);
foreach my $ligne (@flog) {$maxligne++}
$joueur=1;
for my $i(1..20) { for my $j (1..20) {enleve_pion($i,$j);} }
$txttrace->configure(-text=>"Début du jeu !");
$gagnant=@nomsjoueurs[($maxligne+1) % 2 +1];
if ($maxligne==400) { $gagnant="match null"; }
$fileinfo->configure(-text=>"$2 (rouge) VS $3 (bleu), gagnant : $gagnant en $maxligne coup(s)");
};
sub pose_pion {
#affiche un pion en x,y couleur joueur
my($x, $y, $joueur)=@_;
if ($joueur==1) {$couleur='red'} else {$couleur='blue'}
$x--; $y--;
$canv->createOval($x*20+32,$y*20+32,$x*20+20+30,$y*20+20+30, -fill=>$couleur, -outline=>'black');
}
sub enleve_pion {
#efface le pion en x,y
my($x, $y)=@_;
$x--; $y--;
$canv->createRectangle($x*20+32,$y*20+32,$x*20+20+30,$y*20+20+30, -fill=>'lightgrey', -outline=>'lightgrey');
}
sub suivant {
if ($cligne==$maxligne) {$txttrace->configure(-text=>"Fin du jeu !"); return;}
($x, $y)=split(/ /,@flog[$cligne],2);
$coup=$cligne+1;
$txttrace->configure(-text=>"(@nomsjoueurs[$joueur]) coup n°$coup : $x,$y");
pose_pion($x,$y,$joueur);
$joueur=$joueur % 2 +1; # ->1 ou 2
$cligne++;
}
sub precedent {
if ($cligne==0) {$txttrace->configure(-text=>"Début du jeu !"); return;}
$cligne--;
$joueurp=$joueur;
$joueur=$joueur % 2 +1; # ->1 ou 2
($x, $y)=split(/ /,@flog[$cligne],2);
enleve_pion($x,$y);
$clignep=$cligne-1;
($xp,$yp)=split(/ /,@flog[$clignep],2);
$coup=$cligne+1;
$txttrace->configure(-text=>"(@nomsjoueurs[$joueurp]) coup n°$coup : $xp,$yp");
}
sub debut {
while ($cligne>0) {
&precedent;
}
$txttrace->configure(-text=>"Début du jeu !");
}
sub fin {
while ($cligne<$maxligne) {
&suivant;
}
}
sub quitter {
print("interface : Bye bye, j'espere que ça vous a plu ;-) !\n");
print("Pour tout commentaire : \n \t mail : nomanseb\@ifrance.com\n");
exit;
};