CORBA-MICO

 view release on metacpan or  search on metacpan

tictactoe  view on Meta::CPAN

	throw Tictactoe::BadTag;
    }

    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 1.749 second using v1.01-cache-2.11-cpan-13bb782fe5a )