Advertisement
Sabriel

MyRev

Oct 24th, 2012
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.58 KB | None | 0 0
  1. use Tk;
  2. use strict;
  3. use warnings;
  4. $\ = $/;
  5. my $mw = MainWindow->new;
  6. $mw->title('Reversi');
  7. $mw->geometry("512x412");
  8. my $canvas = $mw->Canvas(
  9.     -width      => 400,
  10.     -height     => 400,
  11.     -background => "black",
  12.     -relief     => "groove"
  13. )->pack( -side => "left" );
  14.  
  15.  
  16. my @pole;
  17. my @right = ();
  18. my $u     = 1;
  19.  
  20. for ( my $i = 0 ; $i < 8 ; $i++ ) {
  21.     for ( my $j = 0 ; $j < 8 ; $j++ ) {
  22.         $pole[$i][$j] = 0;
  23.     }
  24. }
  25. my $x = 10;
  26. my $y = 10;
  27.  
  28. for ( $x = 10 ; ( $x + 40 ) < 400 ; $x += 45 ) {
  29.     for ( $y = 10 ; ( $y + 40 ) < 400 ; $y += 45 ) {
  30.         my $rec = $canvas->createRectangle(
  31.             $x, $y, $x + 40, $y + 40,
  32.             -fill    => "red",
  33.             -outline => "orange",
  34.             -width   => 2.0
  35.         );
  36.         my $oval = $canvas->createOval(
  37.             $x + 2, $y + 2, $x + 38, $y + 38,
  38.             -fill    => "red",
  39.             -outline => "red"
  40.         );
  41.         $canvas->bind( $oval, '<ButtonPress>' => [ \&callBack, $oval ] );
  42.     }
  43.     $y = 10;
  44. }
  45. my $exit = $mw->Button(
  46.     -text    => 'Exit',
  47.     -command => [ $mw => 'destroy' ]
  48. )->pack( -side => "right", -padx => 30 );
  49. $canvas->pack;
  50. $exit->pack;
  51. setUp();
  52. MainLoop;
  53.  
  54. sub setUp {
  55.     $pole[3][3] = 1;
  56.     $pole[4][4] = 1;
  57.     $pole[3][4] = 2;
  58.     $pole[4][3] = 2;
  59.     $u          = 2;
  60.     push @right, 3, 4, 4, 3;
  61.     draw();
  62.     $u = 1;
  63.     push @right, 3, 3, 4, 4;
  64.     draw();
  65.  
  66. }
  67.  
  68. sub callBack {
  69.     my $c;
  70.     my $d;
  71.     $b = $_[1];
  72.  
  73.     $c = int( ( $b - 2 ) / 16 );
  74.     $d = ( ( $b - 2 ) % 16 ) / 2;
  75.  
  76.     hod( $c, $d );
  77.    
  78.  
  79. }
  80.  
  81. sub f {
  82.     my $x       = shift;    #координаты
  83.     my $y       = shift;
  84.     my $sdvig_x = shift;    # и на сколько мы их сдвигаем
  85.     my $sdvig_y = shift;
  86.     my @ther    = ();
  87.  
  88.     $x += $sdvig_x;
  89.     $y += $sdvig_y;
  90.    
  91.     while ( $x < 8 && $x >= 0 && $y < 8 && $y >= 0 ) {  #цикл начался
  92.  
  93.         if ( $pole[$x][$y] == 0 ) {    #если 0 то выходим
  94.             last;
  95.         }
  96.         if ( $pole[$x][$y] ==
  97.             ( $u == 1 ? 2 : 1 ) )      #если 1 кладём 2 иначе 1
  98.         {    # если вражеские то кладём
  99.  
  100.             push @ther, $x, $y;
  101.             print $x, $y, $pole[$x][$y];
  102.  
  103.             $x += $sdvig_x;
  104.             $y += $sdvig_y;
  105.         }
  106.  
  107.         if ( $pole[$x][$y] == $u ) {
  108.            
  109.             last;
  110.         }
  111.  
  112.     }
  113.     if ( ( scalar @ther ) > 1 ) {
  114.         push @right, @ther;
  115.     }
  116.  
  117.     #конец цикла
  118. }
  119.  
  120. #каждый элимент поля 1 - чёрный,2 - белый,0 - пустой
  121. #функция которая говорит сделан ли ход
  122.  
  123. sub hod {
  124.  
  125.     #берем координаты хода
  126.     $a = $_[0];
  127.     $b = $_[1];
  128.  
  129.     #проверка в поисках фишки того же юзера
  130.  
  131.     #проверка по строкам
  132.     f( $a, $b, +1, 0 );
  133.     f( $a, $b, -1, 0 );
  134.  
  135.     #проверка по столбцам
  136.     f( $a, $b, 0, -1 );
  137.     f( $a, $b, 0, +1 );
  138.  
  139.     #диагональки
  140.     f( $a, $b, -1, -1 );
  141.     f( $a, $b, +1, +1 );
  142.     f( $a, $b, +1, -1 );
  143.     f( $a, $b, -1, +1 );
  144.     for ( my $r = 0 ; $r < $#pole ; $r++ ) {
  145.         for ( my $t = 0 ; $t < $#pole ; $t++ ) {
  146.             print $pole[$t][$r];
  147.         }
  148.     }
  149.  
  150.     if ( scalar @right == 0 ) { print "Can't do that! \n"; }
  151.     else {
  152.         push @right, $a, $b;
  153.  
  154.         #print $a, $b;
  155.         $u = $u == 1 ? 2 : 1;                   #переход хода
  156.         for ( my $i = 0 ; $i < ( scalar @right ) ; $i += 2 ) {
  157.             $pole[ $right[$i] ][ $right[ $i + 1 ] ] = $u;
  158.         }    #меняем состояние нужной клетки
  159.         draw();
  160.     }
  161.  
  162. }
  163.  
  164. sub draw {
  165.     for ( my $i = 0 ; $i < ( scalar @right ) ; $i += 2 ) {
  166.  
  167.         my $id = $right[$i] * 16 + $right[ $i + 1 ] * 2 + 2;
  168.  
  169.         if ( $u == 2 ) {
  170.             $canvas->itemconfigure( $id, -fill => "black" );
  171.         }
  172.         else {
  173.             $canvas->itemconfigure( $id, -fill => "white" );
  174.         }
  175.  
  176.     }
  177.     @right = ();
  178.  
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement