CORBA-ORBit
view release on metacpan or search on metacpan
$self->check_tag ($tag);
if ($self->{reset_wait}) {
if ($ok) {
$self->start_over;
$self->{turn} = 0;
$self->set_status;
}
$self->{reset_wait} = 0;
}
}
sub start_over {
my $self = shift;
$self->{turn} = 1;
$self->{win} = 0;
for my $i (0..2) {
for my $j (0..2) {
$self->update ($i, $j, 0);
}
}
}
my @rwins = ( [ 0, 0, 0 ], [ 1, 1, 1 ], [ 2, 2, 2 ],
[ 0, 1, 2 ], [ 0, 1, 2 ], [ 0, 1, 2 ],
[ 0, 1, 2 ], [ 0, 1, 2 ] );
my @cwins = ( [ 0, 1, 2 ], [ 0, 1, 2 ], [ 0, 1, 2 ],
[ 0, 0, 0 ], [ 1, 1, 1 ], [ 2, 2, 2 ],
[ 0, 1, 2 ], [ 2, 1, 0 ] );
sub check_win {
my $self = shift;
for (my $k = 0; $k <= $#rwins ; $k++) {
my $success = 1;
my $player = 0;
for (my $i = 0; $i < 3 ; $i++) {
my $t = $self->{board}->[$rwins[$k][$i]][$cwins[$k][$i]];
if (!$player) {
$player = $t;
}
if (!$player || ($player != $t)) {
$success = 0;
last;
}
}
if ($success) {
$self->{win} = $player;
$self->set_status;
last;
}
}
}
sub update {
my ($self, $i, $j, $val) = @_;
$self->{board}->[$i][$j] = $val;
$self->{squares}->[$i][$j]->set ($self->{pixmaps}->[$val], undef);
$self->check_win;
}
sub set_status {
my $self = shift;
my $status;
if (!$self->{opponent}) {
$status = "Not connected";
} elsif ($self->{win}) {
$status = ($self->{win} == 1) ? "You won" : "Opponent won";
} else {
$status = $self->{turn} ? "Your turn" : "Opponent's turn";
}
$self->{statusbar}->pop($self->{context});
$self->{statusbar}->push($self->{context}, $status);
}
sub make_ui {
my $self = shift;
my $window = new Gtk::Window 'toplevel';
$window->set_policy (0, 0, 0);
$window->realize;
my $vbox = new Gtk::VBox 0, 0;
$window->add ($vbox);
$vbox->show;
# Hack, create_from_xpm is broken and doesn't currently
# allow undef here.
my $trans = $window->style->white;
$self->{pixmaps}->[0] =
Gtk::Gdk::Pixmap->create_from_xpm ($window->window,
$trans, "empty.xpm");
$self->{pixmaps}->[1] =
Gtk::Gdk::Pixmap->create_from_xpm ($window->window,
$trans, "self.xpm");
$self->{pixmaps}->[2] =
Gtk::Gdk::Pixmap->create_from_xpm ($window->window,
$trans, "opponent.xpm");
my $bbox = new Gtk::HButtonBox;
$vbox->add ($bbox);
$bbox->show;
my $button = new Gtk::Button "Start Over";
$bbox->add ($button);
$button->signal_connect ("clicked",
sub {
if ($self->{opponent}) {
$self->{reset_wait} = 1;
( run in 0.618 second using v1.01-cache-2.11-cpan-13bb782fe5a )