Advertisement
Guest User

Untitled

a guest
Mar 12th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6.99 KB | None | 0 0
  1. use Tk;
  2. use strict;
  3. use warnings;
  4. my $mw = MainWindow->new;
  5.         my $main_menu = $mw->Menu();
  6.         $mw->configure(-menu => $main_menu);
  7.  
  8.         my $btn = $main_menu->Menubutton(-text => "File",
  9.                                          -underline => 0, -tearoff=>0);
  10.         $btn->command(-label => "New Game",
  11.                       -activebackground => "orange",
  12.                       -foreground => "green",
  13.                         -command => [ \&start ]);
  14.  
  15.         $btn->command(-label => "Away",
  16.                       -activebackground => "red",
  17.                       -activeforeground => "black",
  18.                       -background => "yellow",
  19.                       -foreground => "green",
  20.                       -command => sub{$mw->messageBox(-message => "Ups")});
  21.  
  22.         $btn->command(-label => "Exit", -command => sub{exit});
  23.  
  24. $mw->title('Reversi');
  25. $mw->geometry("512x412");
  26. my $canvas = $mw->Canvas(
  27.     -width      => 400,
  28.     -height     => 400,
  29.     -background => "black",
  30.     -relief     => "groove"
  31. )->pack( -side => "left" );
  32.  
  33. my $icon = $mw->Photo(-file => '1.bmp');
  34. $mw->iconimage($icon);
  35.  
  36. my @pole;
  37.  
  38. my @right = ();
  39.  
  40. my $u = 1;
  41.  
  42. my $semafor = 0;
  43.  
  44. my $x = 10;
  45.  
  46. my $y = 10;
  47.  
  48. for ( $x = 10 ; ( $x + 40 ) < 400 ; $x += 45 ) {
  49.  
  50.     for ( $y = 10 ; ( $y + 40 ) < 400 ; $y += 45 ) {
  51.  
  52.         my $rec = $canvas->createRectangle(
  53.  
  54.             $x, $y, $x + 40, $y + 40,
  55.  
  56.             -fill => "red",
  57.  
  58.             -outline => "orange",
  59.  
  60.             -width => 2.0
  61.  
  62.         );
  63.  
  64.         my $oval = $canvas->createOval(
  65.  
  66.             $x + 2, $y + 2, $x + 38, $y + 38,
  67.  
  68.             -fill => "red",
  69.  
  70.             -outline => "red"
  71.  
  72.         );
  73.  
  74.         $canvas->bind( $oval, '<ButtonPress>' => [ \&callBack, $oval ] );
  75.  
  76.     }
  77.  
  78.     $y = 10;
  79.  
  80. }
  81.  
  82. my $start = $mw->Button(
  83.  
  84.     -text => 'Start',
  85.  
  86.     -command => [ \&start ]
  87.  
  88. )->pack( -side => "right", -padx => 10 );
  89.  
  90. $canvas->pack;
  91.  
  92. $start->pack;
  93. my $type_game = $mw->Button(-text => "Chose type of game",
  94.                           -command => \&button1_sub)->pack(-side => "right",-ipadx=>5 );
  95. my $typeGame = 0;
  96.  
  97. #0- User vs AI
  98. #1- User vs User
  99. #2 AI vs AI
  100. sub button1_sub{
  101. my $game = $mw->Toplevel;
  102. $game->geometry("300x150");
  103. $game->title("Choosing type");
  104.  
  105. my $radio_frame = $game->Frame()->pack();
  106. $radio_frame->Label( -text => "Type of game:" )->pack();
  107. my $radio_us_ai = $radio_frame->Radiobutton(
  108.     -text     => "User vs Computer",
  109.     -value    => "0",
  110.     -variable => \$typeGame
  111. )->pack( -side => "top" );
  112. my $radio_us_us = $radio_frame->Radiobutton(
  113.     -text     => "User vs User",
  114.     -value    => "1",
  115.     -variable => \$typeGame
  116. )->pack( -side => "top" );
  117. my $radio_ai_ai = $radio_frame->Radiobutton(
  118.     -text     => "Computer vs Computer",
  119.     -value    => "2",
  120.     -variable => \$typeGame
  121. )->pack( -side => "top" );
  122. my $game_ex = $game->Button(
  123.     -text    => "OK",
  124.     -command => [ $game => 'destroy' ]
  125. )->pack();
  126. }
  127. MainLoop();
  128.  
  129. sub start {
  130.  
  131.     setUp();
  132.  
  133. }
  134.  
  135. sub setUp {
  136.  
  137.     for ( my $i = 0 ; $i < 8 ; $i++ ) {
  138.  
  139.         for ( my $j = 0 ; $j < 8 ; $j++ ) {
  140.  
  141.             $pole[$i][$j] = 0;
  142.  
  143.         }
  144.  
  145.     }
  146.  
  147.     for ( my $i = 2 ; $i <= 8 * 8 * 2 ; $i += 2 ) {
  148.  
  149.         $canvas->itemconfigure( $i, -fill => "red" );
  150.  
  151.     }
  152.  
  153.     $pole[3][3] = 1;
  154.  
  155.     $pole[4][4] = 1;
  156.  
  157.     $pole[3][4] = 2;
  158.  
  159.     $pole[4][3] = 2;
  160.  
  161.     $u = 2;
  162.  
  163.     push @right, 3, 4, 4, 3;
  164.  
  165.     draw();
  166.  
  167.     $u = 1;
  168.  
  169.     push @right, 3, 3, 4, 4;
  170.  
  171.     draw();
  172.  
  173.     $semafor = 1;
  174.  
  175. }
  176.  
  177. sub callBack {
  178.  
  179.     my $c;
  180.  
  181.     my $d;
  182.  
  183.     $b = $_[1];
  184.  
  185.     $c = int( ( $b - 2 ) / 16 );
  186.  
  187.     $d = ( ( $b - 2 ) % 16 ) / 2;
  188.  
  189.     if ($semafor) {
  190.  
  191.         if ( hod( $c, $d ) ) {
  192.             if ( $typeGame == 0 || $typeGame == 2 ) {
  193.                 $semafor =
  194.                   0;    #ВЫКЛЮЧАЕМ ХОД ПОЛЬЗОВАТЕЛЯ
  195.  
  196.                 $canvas->after( 500, \&callAI )
  197.                   ;     #ВЫЗЫВАЕМ ХОД БОТА
  198.             }
  199.  
  200.         }
  201.  
  202.     }
  203.  
  204. }
  205.  
  206. sub f {
  207.  
  208.     my $x = shift;      #координаты
  209.  
  210.     my $y = shift;
  211.  
  212.     my $sdvig_x = shift;    # и на сколько мы их сдвигаем
  213.  
  214.     my $sdvig_y = shift;
  215.  
  216.     my @ther = ();
  217.  
  218.     $x += $sdvig_x;
  219.  
  220.     $y += $sdvig_y;
  221.  
  222.     while ( $x < 8 && $x >= 0 && $y < 8 && $y >= 0 )
  223.  
  224.     {                       #цикл начался
  225.  
  226.         if ( $pole[$x][$y] == 0 ) {    #если 0 то выходим
  227.  
  228.             last;
  229.  
  230.         }
  231.  
  232.         if (
  233.  
  234.             $pole[$x][$y] ==
  235.  
  236.             ( $u == 1 ? 2 : 1 )
  237.  
  238.           )                            #если 1 кладём 2 иначе 1
  239.  
  240.         {    # если вражеские то кладём
  241.  
  242.             push @ther, $x, $y;
  243.  
  244.             #print $x, $y, $pole[$x][$y];
  245.  
  246.             $x += $sdvig_x;
  247.  
  248.             $y += $sdvig_y;
  249.  
  250.         }
  251.  
  252.         else {
  253.  
  254.             if ( $pole[$x][$y] == $u ) {
  255.  
  256.                 push @right, @ther;
  257.  
  258.                 last;
  259.  
  260.             }
  261.  
  262.         }
  263.  
  264.     }
  265.  
  266.     #конец цикла
  267.  
  268. }
  269.  
  270. #каждый элимент поля 1 - чёрный,2 - белый,0 - пустой
  271.  
  272. #функция которая говорит сделан ли ход
  273.  
  274. sub hod {
  275.  
  276.     #берем координаты хода
  277.  
  278.     my $a = $_[0];
  279.  
  280.     my $b = $_[1];
  281.  
  282.     #берем флаг count
  283.  
  284.     my $countFlag = $_[2];
  285.  
  286.     if ( $pole[$a][$b] == 0 ) {
  287.  
  288.         #проверка в поисках фишки того же юзера
  289.  
  290.         #проверка по строкам
  291.  
  292.         f( $a, $b, +1, 0 );
  293.  
  294.         f( $a, $b, -1, 0 );
  295.  
  296.         #проверка по столбцам
  297.  
  298.         f( $a, $b, 0, -1 );
  299.  
  300.         f( $a, $b, 0, 1 );
  301.  
  302.         #диагональки
  303.  
  304.         f( $a, $b, -1, -1 );
  305.  
  306.         f( $a, $b, +1, +1 );
  307.  
  308.         f( $a, $b, +1, -1 );
  309.  
  310.         f( $a, $b, -1, +1 );
  311.  
  312.         if ( scalar @right == 0 ) {
  313.  
  314.             return 0;
  315.  
  316.         }
  317.  
  318.         else {
  319.  
  320.             my $rightLen = scalar @right;
  321.  
  322.             if ( !$countFlag ) {
  323.  
  324.                 push @right, $a, $b;
  325.  
  326.                 #print $a, $b;
  327.  
  328.                 for ( my $i = 0 ; $i < ( scalar @right ) ; $i += 2 ) {
  329.  
  330.                     $pole[ $right[$i] ][ $right[ $i + 1 ] ] = $u;
  331.  
  332.                 }    #меняем состояние нужной клетки
  333.  
  334.                 draw();
  335.  
  336.                 $u = $u == 1 ? 2 : 1;    #переход хода
  337.  
  338.                 my @hod = hasHod($u);
  339.  
  340.                 print join ":", @hod;
  341.  
  342.                 print "\n";
  343.  
  344.                 if ( !$hod[2] ) {
  345.                     @hod = hasHod( $u == 1 ? 2 : 1 );
  346.  
  347.                     if ( !$hod[2] ) {
  348.  
  349.                         $semafor = 0;
  350.  
  351.                         getResult();
  352.                         return 0;
  353.  
  354.                     }
  355.  
  356.                     $u = $u == 1 ? 2 : 1;
  357.  
  358.                     return 1;
  359.  
  360.                 }
  361.  
  362.             }
  363.  
  364.             @right = ();
  365.  
  366.             return $rightLen;
  367.  
  368.         }
  369.  
  370.     }
  371.  
  372. }
  373.  
  374. sub hasHod {
  375.  
  376.     my $buf_u = $u;
  377.  
  378.     $u = $_[0];
  379.  
  380.     my $lenHod = 0;
  381.  
  382.     my $a = 0;
  383.  
  384.     my $b = 0;
  385.  
  386.     for ( $x = 0 ; $x < 8 ; $x++ ) {
  387.  
  388.         for ( $y = 0 ; $y < 8 ; $y++ ) {
  389.  
  390.             if ( hod( $x, $y, 1 ) > $lenHod ) {
  391.  
  392.                 $lenHod = hod( $x, $y, 1 );
  393.  
  394.                 $a = $x;
  395.  
  396.                 $b = $y;
  397.  
  398.             }
  399.  
  400.         }
  401.  
  402.     }
  403.  
  404.     $u = $buf_u;
  405.  
  406.     return ( $a, $b, $lenHod );
  407.  
  408. }
  409.  
  410. sub draw {
  411.  
  412.     for ( my $i = 0 ; $i < ( scalar @right ) ; $i += 2 ) {
  413.  
  414.         my $id = $right[$i] * 16 + $right[ $i + 1 ] * 2 + 2;
  415.  
  416.         if ( $u == 1 ) {
  417.  
  418.             $canvas->itemconfigure( $id, -fill => "black" );
  419.  
  420.         }
  421.  
  422.         else {
  423.  
  424.             $canvas->itemconfigure( $id, -fill => "white" );
  425.  
  426.         }
  427.  
  428.     }
  429.  
  430.     @right = ();
  431.  
  432. }
  433.  
  434. sub getResult {
  435.  
  436.     my @result = ();
  437.  
  438.     for ( $x = 0 ; $x < 8 ; $x++ ) {
  439.  
  440.         for ( $y = 0 ; $y < 8 ; $y++ ) {
  441.  
  442.             $result[ $pole[$x][$y] ]++;
  443.  
  444.         }
  445.  
  446.     }
  447.  
  448.     print "user: ", $result[1], "; AI: ", $result[2], "\n";
  449.  
  450. }
  451.  
  452. #AI section
  453.  
  454. sub callAI {
  455.  
  456.     my @hod = hasHod($u);
  457.  
  458.     if ( hod( $hod[0], $hod[1] ) ) {
  459.  
  460.         if ( $typeGame == 0 ) {
  461.             $semafor = 1;
  462.         }
  463.         elsif ( $typeGame == 2 ) {
  464.             $canvas->after( 500, \&callAI );
  465.         }
  466.     }
  467.  
  468. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement