Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: ASCII Battleship Program

by roboticus (Chancellor)
on Feb 14, 2012 at 18:43 UTC ( #953743=note: print w/ replies, xml ) Need Help??


in reply to ASCII Battleship Program

Hello, all--

I had another software install over the weekend, and spent my slack time twiddling around with the Battleship game again. I've addressed a couple of the issues, and undoubtedly added some new issues. The current version displays the computer's ships for debugging, but I haven't tweaked the code to let me turn off the computer ship display yet.

I'm posting the updated version just in case I get pulled away again and never see it again. Hopefully someone else will tweak it a little too.

I really need finish tuning it before playing with it, but I couldn't help myself. So there are chunks that I still need to work on, but I had fun modifying the layout and such. Ah, well, it was more interesting than listening to a bunch of people doing database deployments over the weekend.

#!/usr/bin/perl # # Battleship.pl # # From www.perlmonks.com # use v5.10.1; use strict; use warnings; use Data::Dumper; use Getopt::Long; my $dbg=0; # Set to 1 to show computer's board my $fl_print_boards = 'H'; my $shots_per_turn = 3; my $turn; my %Pieces = ( Battleship => 4, Carrier => 5, Destroyer => 3, Patrol => 2, Submarine => 3, ); my @mnu_who_goes_first = ( [ "You", sub { $turn = 'HUMAN' } ], [ "Computer", sub { $turn = 'Computer' }], [ "Random", sub { int(rand(1000)) } ], ); my @mnu_game_mode = ( [ "Regular (one-shot mode)", sub { $shots_per_turn = 1 } ], [ "Salvo (three-shot mode)", sub { $shots_per_turn = 3 } ], ); main::startup(); #********************************************************************* +********* #*******************************STARTUP FUNCTION********************** +********* #********************************************************************* +********* sub main::startup { local $main::startup::name = ""; print "\n\nPlease enter your name: "; chomp($main::startup::name = <STDIN>); main::call(); } #********************************************************************* +********** #******************************MAIN CALL FUNCTION********************* +********** #********************************************************************* +********** sub main::call { srand; local @main::com_ships::com_all_ships = (); local @main::user_ships::user_all_ships = (); local @main::com_ships::com_board = generate_board(); local @main::user_ships::user_board = generate_board(); local @main::letters::letters = ("A" .. "J"); local $main::game_play::whos_first = ''; local $main::game_play::mode = ''; local @main::game_play::user_shots_check; local $main::com_ships::hits = ''; local $main::user_ships::hits = ''; generate_ship_pos::start(); get_user_ship_pos::start(); game_play::start(); } #********************************************************************* +********** #***************************SECONDARY CALL FUNCTIONS****************** +********** #********************************************************************* +********** sub generate_ship_pos::start { for my $k (keys %Pieces) { generate_ship_pos::any_ship($Pieces{$k}, $k); } print_board(\@::main::com_ships::com_board) if $dbg; # Reset the board, we used it as a scratchpad # @main::com_ships::com_board = generate_board(); } sub get_user_ship_pos::start { for my $k (keys %Pieces) { get_user_ship_pos::any_size($k, $Pieces{$k}); } print_board(\@::main::user_ships::user_board); } sub game_play::start { game_play::decide(); game_play::mode(); play_game(); } #********************************************************************* +********** #********************* BOARD HELPER FUNCTIONS ************************ +********** #********************************************************************* +********** sub gen_ship_list { my ($rC, $orient, $size) = @_; my ($x, $y) = @$rC; my $rShip; given ($orient) { when (0) { push @$rShip, [ $x, $y++ ] for 1 .. $size; } when (1) { push @$rShip, [ $x++, $y ] for 1 .. $size; } } return undef if $x>10 or $y>10; $rShip; } sub does_ship_fit { my ($rBoard, $rShip) = @_; my $collisions = 0; for my $P (@$rShip) { my ($x, $y) = @$P; ++$collisions if $$rBoard[$x][$y] ne '0'; } return 0 if $collisions; 1; } #********************************************************************* +********** #*********************COMPUTER SHIP GENERATION FUNCTIONS************** +********** #********************************************************************* +********** sub generate_ship_pos::any_ship { my ($size, $type) = @_; my $rShip; while (1) { # Randomly place a ship my $x = int(rand(10)); my $y = int(rand(10)); my $orient = int(rand(2)); $rShip = gen_ship_list([$x,$y], $orient, $size); redo if ! defined $rShip; last if does_ship_fit(\@main::com_ships::com_board, $rShip); } for my $P (@$rShip) { my ($x, $y) = @$P; $main::com_ships::com_board[$x][$y] = uc(substr $type, 0, 1); push @main::com_ships::com_all_ships, "$x$y"; } } #********************************************************************* +********** #************************USER SHIP GENERATION FUNCTIONS*************** +********** #********************************************************************* +********** sub place_ship { my ($x, $y, $size, $orient, $type) = @_; given (uc $orient) { when ('U') { $x-=$size-1; $orient=1 } when ('D') { $orient=1 } when ('L') { $y-=$size-1; $orient=0 } when ('R') { $orient=0 } } return 0 if $x<0 or $y<0; my $rShip = gen_ship_list([$x,$y], $orient, $size); if (! defined $rShip) { print "Ship can't go off the edge of the board!\n"; return 0; } if (! does_ship_fit(\@main::user_ships::user_board, $rShip)) { print "Can't overlap ships!\n"; return 0; } for my $P (@$rShip) { ($x, $y) = @$P; $main::user_ships::user_board[$x][$y] = substr($type,0,1); push @main::user_ships::user_all_ships, "$x$y"; } 1; } sub get_user_ship_pos::any_size { my ($name, $size) = @_; print_board(\@main::user_ships::user_board); while (1) { print "Position your $name: ('A5 r' starts at A5 and goes righ +t):"; chomp(my $input = <STDIN>); if ($input =~ m/([A-J]\d0?)\s*([UDLRXY])/i) { # Coordinates look good, try placing the ship my ($start, $dir) = ($1, $2); my $rC = parse_coordinate($1); redo unless defined $rC; last if place_ship($$rC[0], $$rC[1], $size, $dir, $name); } print "You have entered invalid input. Please try again.\n\n"; } } #********************************************************************* +********** #*******************************GAME-PLAY FUNCTIONS******************* +********** #********************************************************************* +********** sub handle_menu { my ($ar, $prompt) = @_; while (1) { print "\n", $prompt, "\n"; for (my $i=0; $i<@$ar; ++$i) { print $i+1, ". ", $$ar[$i][0], "\n"; } print "\n\nYour choice: "; chomp(my $decide = <STDIN>); if ($decide>0 and $decide <= @$ar) { return $decide if ! defined $$ar[$decide-1][1]; return &{$$ar[$decide-1][1]}(); } print "Inrecognized choice, please try again.\n"; } } sub game_play::decide { return handle_menu(\@mnu_who_goes_first, "Who goes first?"); } sub game_play::mode { return handle_menu(\@mnu_game_mode, "Please enter game mode: "); } sub play_game { while (!game_play::dead_yet()) { if ($turn eq "Computer") { computer_shots($shots_per_turn); $turn = "HUMAN"; } else { print_both_boards(); player_shots($shots_per_turn); $turn = "Computer"; } } } sub generate_computer_shots { my $num_shots = shift; my %shots; while ($num_shots) { # < @{keys %shots}) { my ($x, $y) = (int(rand(10)), int(rand(10))); my $k = "$x$y"; next if $main::user_ships::user_board[$x][$y] eq 'X' or $main::user_ships::user_board[$x][$y] eq 'O'; next if exists $shots{$k}; $shots{$k} = [ $x, $y ]; --$num_shots; } return values %shots; } sub computer_shots { #game_play::reg_mode::com_shot { my $num_shots = shift; my @shots = generate_computer_shots($num_shots); print "COMPUTER: "; for my $rs (@shots) { my ($x, $y) = @$rs; my $s = coord_to_str($rs); if ($main::user_ships::user_board[$x][$y] =~ /[BCDPS]/) { print "$s:BOOM! "; ++$main::user_ships::hits; $main::user_ships::user_board[$x][$y] = 'X'; } elsif ($main::user_ships::user_board[$x][$y] eq 'X') { print "$s:Boom. "; } else { print "$s: splash "; $main::user_ships::user_board[$x][$y] = 'O'; } } print "\n"; } sub get_player_shots { my $num_shots = shift; while (1) { my @retval; my %shots; print "\nPlease enter your shot(s): "; chomp(my $input = <STDIN>); my @shot_list = ($input =~ m/([A-J]\d0?)/gi); for my $shot (@shot_list) { my $r = parse_coordinate($shot); my ($x, $y) = @$r; my $k = coord_to_str($r); if (exists $shots{$k}) { print "Duplicate entry: $shot\n"; next; } elsif ($main::com_ships::com_board[$x][$y] eq 'X' or $main::com_ships::com_board[$x][$y] eq 'O') { print "You've already shot location $shot\n"; next; } else { push @retval, [ $x, $y ]; $shots{$k} = [ $x, $y ]; } } my @t = keys %shots; if (@t < $num_shots) { print "Not enough shots entered, please try again.\n"; next; } else { return @retval[0 .. $num_shots-1]; } } } sub player_shots { my $num_shots = shift; my @shots = get_player_shots($num_shots); print $main::startup::name, ": "; for my $rs (@shots) { my $s = coord_to_str($rs); my ($x, $y) = @$rs; if ($main::com_ships::com_board[$x][$y] =~ /[BCDPS]/) { print "$s:BOOM! "; ++$main::com_ships::hits; $main::com_ships::com_board[$x][$y] = 'X'; } elsif ($main::com_ships::com_board[$x][$y] eq 'X') { print "$s:Boom. "; } else { print "$s:splash "; $main::com_ships::com_board[$x][$y] = 'O'; } } print "\n"; } =h1 sub xplayer_shots { my $num_shots = shift; INPUT: while (1) { my %shots; if ($num_shots == 1) { print "\nPlease enter your shot: "; } else { print "\nPlease enter your salvo: "; } chomp(my $input = <STDIN>); for my $shot (split '', $input) { my $r = parse_coordinate($shot); next INPUT unless defined $r; my ($x, $y) = @$r; my $k = "$x.$y"; if (exists $shots{$k}) { print "You've already entered $k!\n"; next INPUT; } if (grep { $k eq $_ } @main::game_play::user_shots_check) +{ print "You have entered invalid input. Please try agai +n.\n"; next INPUT; } if ($main::com_ships::com_board[$x][$y] eq 'X') { } elsif ($main::com_ships::com_board[$x][$y] eq 'X') { } else { } } } } =cut =h1 sub xgame_play::salvo_mode::user_salvo { my $input = ''; print "\nPlease enter your three salvo shots: "; chomp($input = <STDIN>); my @user_shots = split(" ", $input); if ($input !~ /^[A-J]\d0?\s[A-J]\d0?\s[A-J]\d0?$/i) { print "You've entered invalid input. Please try again.\n"; game_play::salvo_mode::user_salvo(); return 0; } if ($user_shots[0] eq ($user_shots[1] or $user_shots[2]) or $user_ +shots[1] eq $user_shots[2]) { print "You have entered a co-ordinate twice. Please try again. +\n"; game_play::salvo_mode::user_salvo(); return 0; } foreach my $el (@user_shots) { my $rC = parse_coordinate($el); die "how did I get here?" if ! defined $rC; $el = "$$rC[0]$$rC[1]"; foreach my $lee (@main::game_play::user_shots_check) { if ($el eq $lee) { print "You have entered invalid input. Please try agai +n.\n"; game_play::salvo_mode::user_salvo(); return; } } foreach my $lee (@main::com_ships::com_all_ships) { if ($el eq $lee) { print "Computer ship hit!\n"; $main::com_ships::com_board[$$rC[0]][$$rC[1]] = 'X'; $main::com_ships::hits++; last; } elsif ($el ne $lee) { $main::com_ships::com_board[$$rC[0]][$$rC[1]] = 'O'; } } } push @main::game_play::user_shots_check, @user_shots; } sub xgame_play::reg_mode::user_shot { my $input = ''; print "\nPlease enter your target: "; chomp($input = <STDIN>); if ($input !~ /^[A-J]\d0?$/i) { print "You've entered invalid input. Please try again.\n"; game_play::reg_mode::user_shot(); return 0; } my $rC = parse_coordinate($input); die "eh?" unless defined $rC; my ($let, $num) = (@$rC); $input = "$let" . "$num"; given ($num) { when ($num > 9) { print "Your input is invalid. Please try again.\n\n"; $input = ''; game_play::reg_mode::user_shot(); return; } } foreach my $lee (@main::game_play::user_shots_check) { if ($input eq $lee) { print "You have entered invalid input. Please try again.\n +"; game_play::reg_mode::user_shot(); return; } } foreach my $lee (@main::com_ships::com_all_ships) { if ($input eq $lee) { print "Computer ship hit!\n"; $main::com_ships::com_board[$let][$num] = 'X'; $main::com_ships::hits++; last; } elsif ($input ne $lee) { $main::com_ships::com_board[$let][$num] = 'O'; } } push @main::game_play::user_shots_check, $input; } =cut sub game_play::dead_yet { if ($main::com_ships::hits eq '17') { print "Congratulations! You won, $main::startup::name!\n\n"; exit; } if ($main::user_ships::hits eq '17') { print "Computer won. Better luck next time!\n"; print "Computer used:\n"; print_board(\@main::com_ships::com_board); exit; } } sub get_board_rows { my $ar = shift; my @retval; for (my $i=0; $i<@$ar; ++$i) { push @retval, join(" ", map { $_ eq '0' ? '-' : $_ } @{$$ar[$i +]}); } return @retval; } sub print_both_boards { if ($fl_print_boards eq 'H') { print_both_boards_H(); } else { print_both_boards_V(); } } sub print_both_boards_H { my @U = get_board_rows(\@main::user_ships::user_board); my @C = get_board_rows(\@main::com_ships::com_board); printf <<EOHDR, center_text($main::startup::name,20), center_text( +'Computer',20); %-20.20s %-20.20s 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 -------------------- -------------------- EOHDR for (my $i=0; $i<@U; ++$i) { print "$main::letters::letters[$i]| "; print $U[$i]; print " |$main::letters::letters[$i]| "; print $C[$i]; print " |$main::letters::letters[$i]\n"; } } sub print_both_boards_V { print center_text($main::startup::name,20); print_board(\@main::user_ships::user_board); print center_text("COMPUTER BOARD:", 20);; print_board(\@main::com_ships::com_board); } sub print_board { my $ar = shift; my @rows = get_board_rows($ar); print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; for (my $i=0; $i<@$ar; ++$i) { print "$main::letters::letters[$i]| "; print $rows[$i], "\n"; } } sub coord_to_str { my $r = shift; return substr("ABCDEFGHIJ",$$r[0],1) . sprintf("%u",1+$$r[1]); } sub generate_board { my @t; push @t, [ (0) x 10 ] for 0..9; return @t; } sub parse_coordinate { # converts /[A-J]([1-9]|10)/i to [ [0..9], [0..9] ] my $coord = uc shift; return [ ord($1)-ord('A'), $2-1 ] if $coord =~ /^([A-J])([1-9]|10) +$/; print "Invalid coordinate $coord!\n"; return undef; } sub center_text { my ($text, $len) = @_; return substr($text, 0, $len) if length($text) >= $len; $text = ' ' x ( ($len-length($text))/2 ) . $text; return $text .= ' ' x ($len - length($text)); }

...roboticus

When your only tool is a hammer, all problems look like your thumb.


Comment on Re: ASCII Battleship Program
Download Code
Replies are listed 'Best First'.
Re^2: ASCII Battleship Program
by Anonymous Monk on May 18, 2012 at 11:11 UTC

    I got this running on V. 5.006 from the command line

    It sinks a ship by hitting it once

    There are 5 ships, carrier, battleship, destroyer, submarine, patrol.

    When the computer has hit all the ships and choosen all the spaces it errors, out of memory!

    It assigns a pound sign # to every ship but I changed that to assign a different sign for each ship # * % ^ ~

    I had to remove almost every user input error detector because the regex isn't right.

    I use these 5 example ship positions C2 G6 B1 F5 D3

    It has alot of problems so hack at your own minds risk :)

    #!/usr/bin/perl # # Battleship.pl # only one hit sinks a ship # run from command prompt at C:\Users>perl battleship.pl enter # From www.perlmonks.com # ##use v5.006; ##use strict; ##use warnings; &startup(); #********************************************************************* +********* #*******************************STARTUP FUNCTION********************** +********* #********************************************************************* +********* sub main::startup () { local $main::startup::name = ""; print "\n\nPlease enter your name: "; chomp($main::startup::name = <STDIN>); &main::call; } #********************************************************************* +********** #******************************MAIN CALL FUNCTION********************* +********** #********************************************************************* +********** sub main::call () { srand; local @main::com_ships::com_all_ships = (); local @main::com_ships::com_carrier = (); local @main::com_ships::com_battleship = (); local @main::com_ships::com_destroyer = (); local @main::com_ships::com_submarine = (); local @main::com_ships::com_patrol = (); local @main::user_ships::user_all_ships = (); local @main::user_ships::user_carrier = (); local @main::user_ships::user_battleship = (); local @main::user_ships::user_destroyer = (); local @main::user_ships::user_submarine = (); local @main::user_ships::user_patrol = (); local @main::com_ships::com_board = ( [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], ); local @main::user_ships::user_board = ( [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], ); local @main::letters::letters = ("A" .. "J"); local $main::game_play::whos_first = ''; local $main::game_play::mode = ''; local @main::game_play::com_shots_check; local @main::game_play::user_shots_check; local $main::com_ships::hits = ''; local $main::user_ships::hits = ''; &generate_ship_pos::start(); &get_user_ship_pos::start(); &game_play::start(); } #********************************************************************* +********** #***************************SECONDARY CALL FUNCTIONS****************** +********** #********************************************************************* +********** sub generate_ship_pos::start () { &generate_ship_pos::carrier(); &generate_ship_pos::battleship(); &generate_ship_pos::destroyer(); &generate_ship_pos::submarine(); &generate_ship_pos::patrol(); &generate_ship_pos::correctional(@main::com_ships::com_all_ships); } sub get_user_ship_pos::start () { &get_user_ship_pos::carrier(); &get_user_ship_pos::battleship(); &get_user_ship_pos::destroyer(); &get_user_ship_pos::submarine(); &get_user_ship_pos::patrol(); } sub game_play::start () { $main::game_play::whos_first = &game_play::decide(); $main::game_play::mode = &game_play::mode(); &game_play::tree_branches($main::game_play::whos_first, $main::game_p +lay::mode); } #********************************************************************* +********** #*********************COMPUTER SHIP GENERATION FUNCTIONS************** +********** #********************************************************************* +********** sub generate_ship_pos::carrier () { while (@main::com_ships::com_carrier != 5) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_carrier = ("$x" . "$y", "$x" . "$y"+1, +"$x" . "$y"+2, "$x" . "$y"+3, "$x" . "$y"+4); } if ($y > 2 and $y <= 6) { @main::com_ships::com_carrier = ("$x" . "$y"-2, "$x" . "$y"-1 +, "$x" . "$y", "$x" . "$y"+1, "$x" . "$y"+2); } if ($y > 6) { @main::com_ships::com_carrier = ("$x" . "$y"-4, "$x" . "$y"-3 +, "$x" . "$y"-2, "$x" . "$y"-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_carrier = ("$x" . "$y", "$x"+1 . "$y", +"$x"+2 . "$y", "$x"+3 . "$y", "$x"+4 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_carrier = ("$x"-2 . "$y", "$x"-1 . "$y" +, "$x" . "$y", "$x"+1 . "$y", "$x"+2 . "$y"); } if ($x > 6) { @main::com_ships::com_carrier = ("$x"-4 . "$y", "$x"-3 . "$y" +, "$x"-2 . "$y", "$x"-1 . "$y", "$x" . "$y"); } } push @main::com_ships::com_all_ships, @main::com_ships::com_carrier +; } } sub generate_ship_pos::battleship () { while (@main::com_ships::com_battleship != 4) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_battleship = ("$x" . "$y", "$x" . "$y"+ +1, "$x" . "$y"+2, "$x" . "$y"+3); } if ($y > 2 and $y <= 6) { @main::com_ships::com_battleship = ("$x" . "$y"-2, "$x" . "$y +"-1, "$x" . "$y", "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_battleship = ("$x" . "$y"-3, "$x" . "$y +"-2, "$x" . "$y"-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_battleship = ("$x" . "$y", "$x"+1 . "$y +", "$x"+2 . "$y", "$x"+3 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_battleship = ("$x"-2 . "$y", "$x"-1 . " +$y", "$x" . "$y", "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_battleship = ("$x"-3 . "$y", "$x"-2 . " +$y", "$x"-1 . "$y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_battleship) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_battleship = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_battle +ship; } } sub generate_ship_pos::destroyer () { while (@main::com_ships::com_destroyer != 3) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_destroyer = ("$x" . "$y", "$x" . "$y"+1 +, "$x" . "$y"+2); } if ($y > 2 and $y <= 6) { @main::com_ships::com_destroyer = ("$x" . "$y"-1, "$x" . "$y" +, "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_destroyer = ("$x" . "$y"-2, "$x" . "$y" +-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_destroyer = ("$x" . "$y", "$x"+1 . "$y" +, "$x"+2 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_destroyer = ("$x"-1 . "$y", "$x" . "$y" +, "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_destroyer = ("$x"-2 . "$y", "$x"-1 . "$ +y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_destroyer) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_destroyer = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_destro +yer; } } sub generate_ship_pos::submarine () { while (@main::com_ships::com_submarine != 3) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_submarine = ("$x" . "$y", "$x" . "$y"+1 +, "$x" . "$y"+2); } if ($y > 2 and $y <= 6) { @main::com_ships::com_submarine = ("$x" . "$y"-1, "$x" . "$y" +, "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_submarine = ("$x" . "$y"-2, "$x" . "$y" +-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_submarine = ("$x" . "$y", "$x"+1 . "$y" +, "$x"+2 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_submarine = ("$x"-1 . "$y", "$x" . "$y" +, "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_submarine = ("$x"-2 . "$y", "$x"-1 . "$ +y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_submarine) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_submarine = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_submar +ine; } } sub generate_ship_pos::patrol () { while (@main::com_ships::com_patrol != 2) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_patrol = ("$x" . "$y", "$x" . "$y"+1); } if ($y > 2 and $y <= 6) { @main::com_ships::com_patrol = ( "$x" . "$y", "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_patrol = ("$x" . "$y"-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_patrol = ("$x" . "$y", "$x"+1 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_patrol = ("$x" . "$y", "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_patrol = ("$x"-1 . "$y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_patrol) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_patrol = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_patrol +; } } sub generate_ship_pos::correctional() { foreach my $el (@main::com_ships::com_all_ships) { if (length $el == 1) { $el = '0' . "$el"; } } } #********************************************************************* +********** #************************USER SHIP GENERATION FUNCTIONS*************** +********** #********************************************************************* +********** sub get_user_ship_pos::carrier () { my @user_carrier_check_let = (); my @user_carrier_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your carrier positions (e.g. C2): "; chomp($input = <STDIN>); print $input, "inputted", "\n"; @main::user_ships::user_carrier = split("", $input); print @main::user_ships::user_carrier, "carrier input", "\n"; foreach my $el (@main::user_ships::user_carrier) { ### use C2 as ex +ample my ($let) = split('', $el); ## gdk edit my ($one) = split('', $el); ## gdk edit my ($two) = split('', $el); ## gdk edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "C") { $let = 2; ### gdk edit } my $num = 0; if ($two == 2) { ### if ne to a letter else a number so $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### gdk edit warning push @user_carrier_check_let, $let; push @user_carrier_check_num, $num; } @user_carrier_check_let = sort {$a <=> $b} @user_carrier_check_let; @user_carrier_check_num = sort {$a <=> $b} @user_carrier_check_num; my $string_alet = $user_carrier_check_let[0] . $user_carrier_check_le +t[1] . $user_carrier_check_let[2] . $user_carrier_check_let[3] . $use +r_carrier_check_let[4]; my $string_anum = $user_carrier_check_num[0] . $user_carrier_check_nu +m[1] . $user_carrier_check_num[2] . $user_carrier_check_num[3] . $use +r_carrier_check_num[4]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_carrier) { my ($let) = split('', $el); ### gdk edit my ($num) = split('', $el); ### gdk edit $main::user_ships::user_board[$let][$num] = "#"; } push @main::user_ships::user_all_ships, @main::user_ships::user_carri +er; } sub get_user_ship_pos::battleship () { my @user_battleship_check_let = (); my @user_battleship_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your battleship positions (e.g. G6): "; chomp($input = <STDIN>); @main::user_ships::user_battleship = split("", $input); foreach my $el (@main::user_ships::user_battleship) { ### use G6 a +s example my ($let) = split('', $el); ## gdk edit my ($one) = split('', $el); ## gdk edit my ($two) = split('', $el); ## gdk edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "G") { $let = 6; ### gdk edit } my $num = 0; if ($two == 6) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### gdk edit warning push @user_battleship_check_let, $let; push @user_battleship_check_num, $num; } @user_battleship_check_let = sort {$a <=> $b} @user_battleship_check_ +let; @user_battleship_check_num = sort {$a <=> $b} @user_battleship_check_ +num; my $string_alet = $user_battleship_check_let[0] . $user_battleship_ch +eck_let[1] . $user_battleship_check_let[2] . $user_battleship_check_l +et[3]; my $string_anum = $user_battleship_check_num[0] . $user_battleship_ch +eck_num[1] . $user_battleship_check_num[2] . $user_battleship_check_n +um[3]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_battleship) { my ($let) = split('', $el); ### gdk edit my ($num) = split('', $el); ### gdk edit $main::user_ships::user_board[$let][$num] = "*"; } push @main::user_ships::user_all_ships, @main::user_ships::user_battl +eship; } sub get_user_ship_pos::destroyer () { my @user_destroyer_check_let = (); my @user_destroyer_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your destroyer positions (e.g. B1): "; chomp($input = <STDIN>); @main::user_ships::user_destroyer = split("", $input); foreach my $el (@main::user_ships::user_destroyer) { my ($let) = split('', $el); ## gdk edit my ($one) = split('', $el); ## gdk edit my ($two) = split('', $el); ## gdk edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "B") { $let = 1; ### gdk edit } my $num = 0; if ($two == 1) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### GDK warning push @user_destroyer_check_let, $let; push @user_destroyer_check_num, $num; } @user_destroyer_check_let = sort {$a <=> $b} @user_destroyer_check_le +t; @user_destroyer_check_num = sort {$a <=> $b} @user_destroyer_check_nu +m; my $string_alet = $user_destroyer_check_let[0] . $user_destroyer_chec +k_let[1] . $user_destroyer_check_let[2]; my $string_anum = $user_destroyer_check_num[0] . $user_destroyer_chec +k_num[1] . $user_destroyer_check_num[2]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_destroyer) { my ($let) = split('', $el); ### gdk edit my ($num) = split('', $el); ### gdk edit $main::user_ships::user_board[$let][$num] = "%"; } push @main::user_ships::user_all_ships, @main::user_ships::user_destr +oyer; } sub get_user_ship_pos::submarine () { my @user_submarine_check_let = (); my @user_submarine_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your submarine positions (e.g. F5): "; chomp($input = <STDIN>); @main::user_ships::user_submarine = split("", $input); foreach my $el (@main::user_ships::user_submarine) { my ($let) = split('', $el); ## gdk edit my ($one) = split('', $el); ## gdk edit my ($two) = split('', $el); ## gdk edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "F") { $let = 5; ### gdk edit } my $num = 0; if ($two == 5) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ## GDK warning push @user_submarine_check_let, $let; push @user_submarine_check_num, $num; } @user_submarine_check_let = sort {$a <=> $b} @user_submarine_check_le +t; @user_submarine_check_num = sort {$a <=> $b} @user_submarine_check_nu +m; my $string_alet = $user_submarine_check_let[0] . $user_submarine_chec +k_let[1] . $user_submarine_check_let[2]; my $string_anum = $user_submarine_check_num[0] . $user_submarine_chec +k_num[1] . $user_submarine_check_num[2]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_submarine) { my ($let) = split('', $el); ### gdk edit my ($num) = split('', $el); ### gdk edit $main::user_ships::user_board[$let][$num] = "^"; } push @main::user_ships::user_all_ships, @main::user_ships::user_subma +rine; } sub get_user_ship_pos::patrol () { my @user_patrol_check_let = (); my @user_patrol_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your patrol positions (e.g. D3):"; chomp($input = <STDIN>); @main::user_ships::user_patrol = split("", $input); foreach my $el (@main::user_ships::user_patrol) { my ($let) = split('', $el); ## gdk edit my ($one) = split('', $el); ## gdk edit my ($two) = split('', $el); ## gdk edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "D") { $let = 3; ### gdk edit } my $num = 0; if ($two == 3) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### GDK warning push @user_patrol_check_let, $let; push @user_patrol_check_num, $num; } @user_patrol_check_let = sort {$a <=> $b} @user_patrol_check_let; @user_patrol_check_num = sort {$a <=> $b} @user_patrol_check_num; my $string_alet = $user_patrol_check_let[0] . $user_patrol_check_let[ +1]; my $string_anum = $user_patrol_check_num[0] . $user_patrol_check_num[ +1]; print $user_patrol_check_let[0], $user_patrol_check_let[1], $user_patr +ol_check_num[0], $user_patrol_check_num[1], "patrol", "\n"; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_patrol) { my ($let) = split('', $el); ### gdk edit my ($num) = split('', $el); ### gdk edit $main::user_ships::user_board[$let][$num] = "~"; } push @main::user_ships::user_all_ships, @main::user_ships::user_patro +l; } #********************************************************************* +********** #*******************************GAME-PLAY FUNCTIONS******************* +********** #********************************************************************* +********** sub game_play::decide () { my $decide = ''; while (!$decide) { print "\n1. You ($main::startup::name)"; print "\n2. Computer"; print "\n3. Random"; print "\n\nPlease enter digit to decide who goes first: "; chomp($decide = <STDIN>); if ($decide == 1 or $decide == 2) { return $decide; } elsif ($decide = 3) { return int(rand(1000)); } else { print "Your slection is not recognized. Please try again.\n"; $decide = ''; } } } sub game_play::mode () { my $mode = ''; while (!$mode) { print "\n1. Regular"; print "\n2. Three-shot salvo"; print "\n\nPlease enter mode selection: "; chomp($mode = <STDIN>); if ($mode == 1 or $mode == 2) { return $mode; } else { print "Your slection is not recognized. Please try again.\n"; $mode = ''; } } } sub game_play::tree_branches () { my @deciders = @_; if ($deciders[0]/2 == int($deciders[0]/2)){ &game_play::com_start($deciders[1]); } else { &game_play::user_start($deciders[1]); } } sub game_play::com_start () { my ($decider) = @_; print "COMPUTER STARTS . . . .\n\n"; sleep 1; if ($decider == 2) { &game_play::com_start::salvo_mode(); } elsif ($decider == 1) { &game_play::com_start::reg_mode(); } } sub game_play::user_start () { my ($decider) = @_; print "$main::startup::name STARTS . . . .\n\n"; if ($decider == 2) { &game_play::user_start::salvo_mode(); } else { &game_play::user_start::reg_mode(); } } sub game_play::com_start::salvo_mode() { while (!&game_play::dead_yet()) { &game_play::salvo_mode::com_salvo(); &game_play::dead_yet(); print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "COMPUTER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; $i = 0; foreach my $el (@main::com_ships::com_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } &game_play::salvo_mode::user_salvo(); &game_play::dead_yet(); } } sub game_play::com_start::reg_mode() { while (!&game_play::dead_yet()) { &game_play::reg_mode::com_shot(); &game_play::dead_yet(); print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "COMPUTER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; $i = 0; foreach my $el (@main::com_ships::com_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } &game_play::reg_mode::user_shot(); &game_play::dead_yet(); } } sub game_play::user_start::salvo_mode() { while (!&game_play::dead_yet()) { print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "COMPUTER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; $i = 0; foreach my $el (@main::com_ships::com_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } &game_play::salvo_mode::user_salvo(); &game_play::dead_yet(); &game_play::salvo_mode::com_salvo(); &game_play::dead_yet(); } } sub game_play::user_start::reg_mode() { while (!&game_play::dead_yet()) { print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "COMPUTER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; print " --------------------\n"; $i = 0; foreach my $el (@main::com_ships::com_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } &game_play::reg_mode::user_shot(); &game_play::dead_yet(); &game_play::reg_mode::com_shot(); &game_play::dead_yet(); } } sub game_play::salvo_mode::com_salvo () { my $x1 = int(rand(10)); my $y1 = int(rand(10)); my $x2 = int(rand(10)); my $y2 = int(rand(10)); my $x3 = int(rand(10)); my $y3 = int(rand(10)); my @temp_checker = ("$x1" . "$y1", "$x2" . "$y2", "$x3" . "$y3"); if (($main::user_ships::user_board[$x1][$y1] eq 'X') or ($main::user_ +ships::user_board[$x1][$y1] eq 'O')) { &game_play::salvo_mode::com_salvo; return; } if (($main::user_ships::user_board[$x3][$y3] eq 'X') or ($main::user_ +ships::user_board[$x3][$y3] eq 'O')) { &game_play::salvo_mode::com_salvo; return; } if (($main::user_ships::user_board[$x2][$y2] eq 'X') or ($main::user_ +ships::user_board[$x2][$y2] eq 'O')) { &game_play::salvo_mode::com_salvo; return; } push @main::game_play::com_shots_check, @temp_checker; if (($main::user_ships::user_board[$x1][$y1] eq '#') or ($main::user_ +ships::user_board[$x1][$y1] eq '*') or ($main::user_ships::user_board +[$x1][$y1] eq '%') or ($main::user_ships::user_board[$x1][$y1] eq '~' +) or ($main::user_ships::user_board[$x1][$y1] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $main::user_ships::user_board[$x1][$y1] = 'X'; } elsif ($main::user_ships::user_board[$x1][$y1] eq 'X') { &game_play::salvo_mode::com_salvo; return; } else { $main::user_ships::user_board[$x1][$y1] = 'O'; } if (($main::user_ships::user_board[$x2][$y2] eq '#') or ($main::user_s +hips::user_board[$x2][$y2] eq '*') or ($main::user_ships::user_board[ +$x2][$y2] eq '%') or ($main::user_ships::user_board[$x2][$y2] eq '~') + or ($main::user_ships::user_board[$x2][$y2] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $main::user_ships::user_board[$x2][$y2] = 'X'; } elsif ($main::user_ships::user_board[$x2][$y2] eq 'X') { &game_play::salvo_mode::com_salvo; return; } else { $main::user_ships::user_board[$x2][$y2] = 'O'; } if (($main::user_ships::user_board[$x3][$y3] eq '#') or ($main::user_s +hips::user_board[$x3][$y3] eq '*') or ($main::user_ships::user_board[ +$x3][$y3] eq '%') or ($main::user_ships::user_board[$x3][$y3] eq '~') + or ($main::user_ships::user_board[$x3][$y3] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $main::user_ships::user_board[$x3][$y3] = 'X'; } elsif ($main::user_ships::user_board[$x3][$y3] eq 'X') { &game_play::salvo_mode::com_salvo; return; } else { $main::user_ships::user_board[$x3][$y3] = 'O'; } } sub game_play::salvo_mode::user_salvo () { my $input = ''; print "\n Please enter your three salvo shots (e.g. A4 B6 F4):"; chomp($input = <STDIN>); my @user_shots = split(" ", $input); if ($input !~ /^[A-J]\d0?\s[A-J]\d0?\s[A-J]\d0?$/i) { print "You've entered invalid salvo shot. Please try again.\n"; &game_play::salvo_mode::user_salvo(); return 0; } if ($user_shots[0] eq ($user_shots[1] or $user_shots[2]) or $user_sho +ts[1] eq $user_shots[2]) { print "You have entered a co-ordinate twice. Please try again.\n"; &game_play::salvo_mode::user_salvo(); return 0; } foreach my $el (@user_shots) { my ($let) = split('', $el); ## gdk edit my ($one) = split('', $el); ## gdk edit my ($two) = split('', $el); ## gdk edit if ($el eq "A") { $let = 0; ### gdk edit } if ($el eq "B") { $let = 1; ### gdk edit } if ($el eq "C") { $let = 2; ### gdk edit } if ($el eq "D") { $let = 3; ### gdk edit } if ($el eq "E") { $let = 4; ### gdk edit } if ($el eq "F") { $let = 5; ### gdk edit } if ($el eq "G") { $let = 6; ### gdk edit } if ($el eq "H") { $let = 7; ### gdk edit } if ($el eq "I") { $let = 8; ### gdk edit } if ($el eq "J") { $let = 9; ### gdk edit } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; ### GDK warning foreach my $lee (@main::game_play::user_shots_check) { if ($el eq $lee) { print "You have entered invalid user shot. Please try again. +\n"; &game_play::salvo_mode::user_salvo(); return; } } foreach my $lee (@main::com_ships::com_all_ships) { if ($el eq $lee) { print "Computer ship hit!\n"; $main::com_ships::com_board[$let][$num] = 'X'; $main::com_ships::hits++; last; } elsif ($el ne $lee) { $main::com_ships::com_board[$let][$num] = 'O'; } } } push @main::game_play::user_shots_check, @user_shots; } sub game_play::reg_mode::com_shot () { my $x1 = int(rand(10)); my $y1 = int(rand(10)); my $temp_checker = ("$x1" . "$y1"); if (($main::user_ships::user_board[$x1][$y1] eq 'X') or ($main::user_ +ships::user_board[$x1][$y1] eq 'O')) { &game_play::reg_mode::com_shot; ### all ships were already hit an +d the last choice by computer caused error: out of memory! attempt to + free unreferenced scalar at battleship.pl line 938, <STDIN> line 117 +. return; } push @main::game_play::com_shots_check, $temp_checker; if (($main::user_ships::user_board[$x1][$y1] eq '#') or ($main::user_ +ships::user_board[$x1][$y1] eq '*') or ($main::user_ships::user_board +[$x1][$y1] eq '%') or ($main::user_ships::user_board[$x1][$y1] eq '~' +) or ($main::user_ships::user_board[$x1][$y1] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $main::user_ships::user_board[$x1][$y1] = 'X'; } elsif ($main::user_ships::user_board[$x1][$y1] eq 'X') { &game_play::reg_mode::com_shot; return; } else { $main::user_ships::user_board[$x1][$y1] = 'O'; } } sub game_play::reg_mode::user_shot () { my $input = ''; my $choosen = ''; print "\n Please enter your target: "; chomp($input = <STDIN>); $choosen = $input; my @target_choice = split("", $input); if ($input !~ /^[A-J]\d0?$/i) { print "You've entered invalid target. Please try again.\n"; &game_play::reg_mode::user_shot(); return 0; } foreach my $el (@target_choice) { my ($let) = split('', $el); ## gdk edit my ($one) = split('', $el); ## gdk edit my ($two) = split('', $el); ## gdk edit if ($el eq "A") { $let = 0; ### gdk edit } if ($el eq "B") { $let = 1; ### gdk edit } if ($el eq "C") { $let = 2; ### gdk edit } if ($el eq "D") { $let = 3; ### gdk edit } if ($el eq "E") { $let = 4; ### gdk edit } if ($el eq "F") { $let = 5; ### gdk edit } if ($el eq "G") { $let = 6; ### gdk edit } if ($el eq "H") { $let = 7; ### gdk edit } if ($el eq "I") { $let = 8; ### gdk edit } if ($el eq "J") { $let = 9; ### gdk edit } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $input = "$let" . "$num"; print $el, "el again", "\n"; } ### gdk warning foreach my $lee (@main::game_play::user_shots_check) { if ($choosen eq $lee) { print "You have entered invalid shot check. Please try again.\n" +; &game_play::reg_mode::user_shot(); return; } } foreach my $lee (@main::com_ships::com_all_ships) { if ($choosen eq $lee) { print "Computer ship hit!\n"; $main::com_ships::com_board[$let][$num] = 'X'; $main::com_ships::hits++; last; } elsif ($choosen ne $lee) { $main::com_ships::com_board[$let][$num] = 'O'; } } push @main::game_play::user_shots_check, $el; } sub game_play::dead_yet () { if ($main::com_ships::hits eq '17') { &game_play::end_game(2); } if ($main::user_ships::hits eq '17') { &game_play::end_game(1); } } sub game_play::end_game () { my @winner = @_; if ($winner[0] == 2) { print "Congratulations! You won, $main::startup::name!\n\n"; exit; } else { print "Computer won. Better luck next time!\n"; exit; } } sub game_play::THE_END () { print "\n"; }

      Ok now this is way better

      There is always a satellite at A1

      Object is to make the computer use the most shots of two plays

      The 6 objects are always in the same place

      Use caps or lower case letters ok

      Use Salvo for quicker games

      #!/usr/bin/perl # # Battleship.pl # only one hit sinks a ship # run from command prompt at C:\Users>perl battleship.pl enter # From www.perlmonks.com # a satellite is always at A1 ##use v5.10.1; ##use strict; ##use warnings; ##use strict; &startup(); #********************************************************************* +********* #*******************************STARTUP FUNCTION********************** +********* #********************************************************************* +********* sub main::startup () { local $main::startup::name = ""; print "\n\nPlease enter your name: "; chomp($main::startup::name = <STDIN>); &main::call; } my $pausetillenter = ""; my $countshots = 1; #********************************************************************* +********** #******************************MAIN CALL FUNCTION********************* +********** #********************************************************************* +********** sub main::call () { srand; local @main::com_ships::com_all_ships = (); local @main::com_ships::com_carrier = (); local @main::com_ships::com_battleship = (); local @main::com_ships::com_destroyer = (); local @main::com_ships::com_submarine = (); local @main::com_ships::com_patrol = (); local @main::user_ships::user_all_ships = (); local @main::user_ships::user_carrier = (); local @main::user_ships::user_battleship = (); local @main::user_ships::user_destroyer = (); local @main::user_ships::user_submarine = (); local @main::user_ships::user_patrol = (); local @main::com_ships::com_board = ( [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], ); local @main::user_ships::user_board = ( [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], ); local @main::letters::letters = ("A" .. "J"); local $main::game_play::whos_first = ''; local $main::game_play::mode = ''; local @main::game_play::com_shots_check; local @main::game_play::user_shots_check; local $main::com_ships::hits = ''; local $main::user_ships::hits = ''; &generate_ship_pos::start(); &get_user_ship_pos::start(); &game_play::start(); } #********************************************************************* +********** #***************************SECONDARY CALL FUNCTIONS****************** +********** #********************************************************************* +********** sub generate_ship_pos::start () { &generate_ship_pos::carrier(); &generate_ship_pos::battleship(); &generate_ship_pos::destroyer(); &generate_ship_pos::submarine(); &generate_ship_pos::patrol(); &generate_ship_pos::correctional(@main::com_ships::com_all_ships); } sub get_user_ship_pos::start () { &get_user_ship_pos::carrier(); &get_user_ship_pos::battleship(); &get_user_ship_pos::destroyer(); &get_user_ship_pos::submarine(); &get_user_ship_pos::patrol(); } sub game_play::start () { $main::game_play::whos_first = &game_play::decide(); $main::game_play::mode = &game_play::mode(); &game_play::tree_branches($main::game_play::whos_first, $main::game_p +lay::mode); } #********************************************************************* +********** #*********************COMPUTER SHIP GENERATION FUNCTIONS************** +********** #********************************************************************* +********** sub generate_ship_pos::carrier () { while (@main::com_ships::com_carrier != 5) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_carrier = ("$x" . "$y", "$x" . "$y"+1, +"$x" . "$y"+2, "$x" . "$y"+3, "$x" . "$y"+4); } if ($y > 2 and $y <= 6) { @main::com_ships::com_carrier = ("$x" . "$y"-2, "$x" . "$y"-1 +, "$x" . "$y", "$x" . "$y"+1, "$x" . "$y"+2); } if ($y > 6) { @main::com_ships::com_carrier = ("$x" . "$y"-4, "$x" . "$y"-3 +, "$x" . "$y"-2, "$x" . "$y"-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_carrier = ("$x" . "$y", "$x"+1 . "$y", +"$x"+2 . "$y", "$x"+3 . "$y", "$x"+4 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_carrier = ("$x"-2 . "$y", "$x"-1 . "$y" +, "$x" . "$y", "$x"+1 . "$y", "$x"+2 . "$y"); } if ($x > 6) { @main::com_ships::com_carrier = ("$x"-4 . "$y", "$x"-3 . "$y" +, "$x"-2 . "$y", "$x"-1 . "$y", "$x" . "$y"); } } push @main::com_ships::com_all_ships, @main::com_ships::com_carrier +; } } sub generate_ship_pos::battleship () { while (@main::com_ships::com_battleship != 4) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_battleship = ("$x" . "$y", "$x" . "$y"+ +1, "$x" . "$y"+2, "$x" . "$y"+3); } if ($y > 2 and $y <= 6) { @main::com_ships::com_battleship = ("$x" . "$y"-2, "$x" . "$y +"-1, "$x" . "$y", "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_battleship = ("$x" . "$y"-3, "$x" . "$y +"-2, "$x" . "$y"-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_battleship = ("$x" . "$y", "$x"+1 . "$y +", "$x"+2 . "$y", "$x"+3 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_battleship = ("$x"-2 . "$y", "$x"-1 . " +$y", "$x" . "$y", "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_battleship = ("$x"-3 . "$y", "$x"-2 . " +$y", "$x"-1 . "$y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_battleship) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_battleship = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_battle +ship; } } sub generate_ship_pos::destroyer () { while (@main::com_ships::com_destroyer != 3) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_destroyer = ("$x" . "$y", "$x" . "$y"+1 +, "$x" . "$y"+2); } if ($y > 2 and $y <= 6) { @main::com_ships::com_destroyer = ("$x" . "$y"-1, "$x" . "$y" +, "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_destroyer = ("$x" . "$y"-2, "$x" . "$y" +-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_destroyer = ("$x" . "$y", "$x"+1 . "$y" +, "$x"+2 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_destroyer = ("$x"-1 . "$y", "$x" . "$y" +, "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_destroyer = ("$x"-2 . "$y", "$x"-1 . "$ +y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_destroyer) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_destroyer = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_destro +yer; } } sub generate_ship_pos::submarine () { while (@main::com_ships::com_submarine != 3) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_submarine = ("$x" . "$y", "$x" . "$y"+1 +, "$x" . "$y"+2); } if ($y > 2 and $y <= 6) { @main::com_ships::com_submarine = ("$x" . "$y"-1, "$x" . "$y" +, "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_submarine = ("$x" . "$y"-2, "$x" . "$y" +-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_submarine = ("$x" . "$y", "$x"+1 . "$y" +, "$x"+2 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_submarine = ("$x"-1 . "$y", "$x" . "$y" +, "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_submarine = ("$x"-2 . "$y", "$x"-1 . "$ +y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_submarine) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_submarine = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_submar +ine; } } sub generate_ship_pos::patrol () { while (@main::com_ships::com_patrol != 2) { my $x = int(rand(9)); my $y = int(rand(9)); my $orient = int(rand(1000)); if ($orient < 500) { if ($y <= 2) { @main::com_ships::com_patrol = ("$x" . "$y", "$x" . "$y"+1); } if ($y > 2 and $y <= 6) { @main::com_ships::com_patrol = ( "$x" . "$y", "$x" . "$y"+1); } if ($y > 6) { @main::com_ships::com_patrol = ("$x" . "$y"-1, "$x" . "$y"); } } if ($orient > 500) { if ($x <= 2) { @main::com_ships::com_patrol = ("$x" . "$y", "$x"+1 . "$y"); } if ($x > 2 and $x <= 6) { @main::com_ships::com_patrol = ("$x" . "$y", "$x"+1 . "$y"); } if ($x > 6) { @main::com_ships::com_patrol = ("$x"-1 . "$y", "$x" . "$y"); } } foreach my $el (@main::com_ships::com_all_ships) { foreach my $lee (@main::com_ships::com_patrol) { if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $ +el) or ($lee - 10 == $el)) { @main::com_ships::com_patrol = (); last; } } } push @main::com_ships::com_all_ships, @main::com_ships::com_patrol +; } } sub generate_ship_pos::correctional() { foreach my $el (@main::com_ships::com_all_ships) { if (length $el == 1) { $el = '0' . "$el"; } } } #********************************************************************* +********** #************************USER SHIP GENERATION FUNCTIONS*************** +********** #********************************************************************* +********** sub get_user_ship_pos::carrier () { my @user_carrier_check_let = (); my @user_carrier_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your carrier positions (e.g. C2): "; chomp($input = <STDIN>); print $input, "inputted", "\n"; @main::user_ships::user_carrier = split("", $input); print @main::user_ships::user_carrier, "carrier input", "\n"; foreach my $el (@main::user_ships::user_carrier) { ### use C2 as ex +ample my ($let) = split('', $el); ## ss edit my ($one) = split('', $el); ## ss edit my ($two) = split('', $el); ## ss edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "C") { $let = 2; ### ss edit } my $num = 0; if ($two == 2) { ### if ne to a letter else a number so $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### ss edit warning push @user_carrier_check_let, $let; push @user_carrier_check_num, $num; } @user_carrier_check_let = sort {$a <=> $b} @user_carrier_check_let; @user_carrier_check_num = sort {$a <=> $b} @user_carrier_check_num; my $string_alet = $user_carrier_check_let[0] . $user_carrier_check_le +t[1] . $user_carrier_check_let[2] . $user_carrier_check_let[3] . $use +r_carrier_check_let[4]; my $string_anum = $user_carrier_check_num[0] . $user_carrier_check_nu +m[1] . $user_carrier_check_num[2] . $user_carrier_check_num[3] . $use +r_carrier_check_num[4]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_carrier) { my ($let) = split('', $el); ### ss edit my ($num) = split('', $el); ### ss edit $main::user_ships::user_board[$let][$num] = "#"; } push @main::user_ships::user_all_ships, @main::user_ships::user_carri +er; } sub get_user_ship_pos::battleship () { my @user_battleship_check_let = (); my @user_battleship_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your battleship positions (e.g. G6): "; chomp($input = <STDIN>); @main::user_ships::user_battleship = split("", $input); foreach my $el (@main::user_ships::user_battleship) { ### use G6 a +s example my ($let) = split('', $el); ## ss edit my ($one) = split('', $el); ## ss edit my ($two) = split('', $el); ## ss edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "G") { $let = 6; ### ss edit } my $num = 0; if ($two == 6) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### ss edit warning push @user_battleship_check_let, $let; push @user_battleship_check_num, $num; } @user_battleship_check_let = sort {$a <=> $b} @user_battleship_check_ +let; @user_battleship_check_num = sort {$a <=> $b} @user_battleship_check_ +num; my $string_alet = $user_battleship_check_let[0] . $user_battleship_ch +eck_let[1] . $user_battleship_check_let[2] . $user_battleship_check_l +et[3]; my $string_anum = $user_battleship_check_num[0] . $user_battleship_ch +eck_num[1] . $user_battleship_check_num[2] . $user_battleship_check_n +um[3]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_battleship) { my ($let) = split('', $el); ### ss edit my ($num) = split('', $el); ### ss edit $main::user_ships::user_board[$let][$num] = "*"; } push @main::user_ships::user_all_ships, @main::user_ships::user_battl +eship; } sub get_user_ship_pos::destroyer () { my @user_destroyer_check_let = (); my @user_destroyer_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your destroyer positions (e.g. B1): "; chomp($input = <STDIN>); @main::user_ships::user_destroyer = split("", $input); foreach my $el (@main::user_ships::user_destroyer) { my ($let) = split('', $el); ## ss edit my ($one) = split('', $el); ## ss edit my ($two) = split('', $el); ## ss edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "B") { $let = 1; ### ss edit } my $num = 0; if ($two == 1) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### ss warning push @user_destroyer_check_let, $let; push @user_destroyer_check_num, $num; } @user_destroyer_check_let = sort {$a <=> $b} @user_destroyer_check_le +t; @user_destroyer_check_num = sort {$a <=> $b} @user_destroyer_check_nu +m; my $string_alet = $user_destroyer_check_let[0] . $user_destroyer_chec +k_let[1] . $user_destroyer_check_let[2]; my $string_anum = $user_destroyer_check_num[0] . $user_destroyer_chec +k_num[1] . $user_destroyer_check_num[2]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_destroyer) { my ($let) = split('', $el); ### ss edit my ($num) = split('', $el); ### ss edit $main::user_ships::user_board[$let][$num] = "%"; } push @main::user_ships::user_all_ships, @main::user_ships::user_destr +oyer; } sub get_user_ship_pos::submarine () { my @user_submarine_check_let = (); my @user_submarine_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your submarine positions (e.g. F5): "; chomp($input = <STDIN>); @main::user_ships::user_submarine = split("", $input); foreach my $el (@main::user_ships::user_submarine) { my ($let) = split('', $el); ## ss edit my ($one) = split('', $el); ## ss edit my ($two) = split('', $el); ## ss edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "F") { $let = 5; ### ss edit } my $num = 0; if ($two == 5) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ## ss warning push @user_submarine_check_let, $let; push @user_submarine_check_num, $num; } @user_submarine_check_let = sort {$a <=> $b} @user_submarine_check_le +t; @user_submarine_check_num = sort {$a <=> $b} @user_submarine_check_nu +m; my $string_alet = $user_submarine_check_let[0] . $user_submarine_chec +k_let[1] . $user_submarine_check_let[2]; my $string_anum = $user_submarine_check_num[0] . $user_submarine_chec +k_num[1] . $user_submarine_check_num[2]; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_submarine) { my ($let) = split('', $el); ### ss edit my ($num) = split('', $el); ### ss edit $main::user_ships::user_board[$let][$num] = "^"; } push @main::user_ships::user_all_ships, @main::user_ships::user_subma +rine; } sub get_user_ship_pos::patrol () { my @user_patrol_check_let = (); my @user_patrol_check_num = (); my $input = ''; my $decide = 1; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } print "Please enter your patrol positions (e.g. D3):"; chomp($input = <STDIN>); @main::user_ships::user_patrol = split("", $input); foreach my $el (@main::user_ships::user_patrol) { my ($let) = split('', $el); ## ss edit my ($one) = split('', $el); ## ss edit my ($two) = split('', $el); ## ss edit print $el, "el", $one, "one", $two, "two", "\n"; if ($el eq "D") { $let = 3; ### ss edit } my $num = 0; if ($two == 3) { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; print $el, "el again", "\n"; ### ss warning push @user_patrol_check_let, $let; push @user_patrol_check_num, $num; } @user_patrol_check_let = sort {$a <=> $b} @user_patrol_check_let; @user_patrol_check_num = sort {$a <=> $b} @user_patrol_check_num; my $string_alet = $user_patrol_check_let[0] . $user_patrol_check_let[ +1]; my $string_anum = $user_patrol_check_num[0] . $user_patrol_check_num[ +1]; print $user_patrol_check_let[0], $user_patrol_check_let[1], $user_patr +ol_check_num[0], $user_patrol_check_num[1], "patrol", "\n"; print $string_alet, " alet ", $string_anum, " anum", "\n"; foreach my $el (@main::user_ships::user_patrol) { my ($let) = split('', $el); ### ss edit my ($num) = split('', $el); ### ss edit $main::user_ships::user_board[$let][$num] = "~"; } push @main::user_ships::user_all_ships, @main::user_ships::user_patro +l; } #********************************************************************* +********** #*******************************GAME-PLAY FUNCTIONS******************* +********** #********************************************************************* +********** sub game_play::decide () { my $decide = ''; while (!$decide) { print "\n1. You ($main::startup::name)"; print "\n2. Computer"; print "\n3. Random"; print "\n\nPlease enter digit to decide who goes first: "; chomp($decide = <STDIN>); if ($decide == 1 or $decide == 2) { return $decide; } elsif ($decide = 3) { return int(rand(1000)); } else { print "Your slection is not recognized. Please try again.\n"; $decide = ''; } } } sub game_play::mode () { my $mode = ''; while (!$mode) { print "\n1. Regular"; print "\n2. Three-shot salvo"; print "\n\nPlease enter mode selection: "; chomp($mode = <STDIN>); if ($mode == 1 or $mode == 2) { return $mode; } else { print "Your slection is not recognized. Please try again.\n"; $mode = ''; } } } sub game_play::tree_branches () { my @deciders = @_; if ($deciders[0]/2 == int($deciders[0]/2)){ &game_play::com_start($deciders[1]); } else { &game_play::user_start($deciders[1]); } } sub game_play::com_start () { my ($decider) = @_; print "COMPUTER STARTS . . . .\n\n"; sleep 1; if ($decider == 2) { &game_play::com_start::salvo_mode(); } elsif ($decider == 1) { &game_play::com_start::reg_mode(); } } sub game_play::user_start () { my ($decider) = @_; print "$main::startup::name STARTS . . . .\n\n"; if ($decider == 2) { &game_play::user_start::salvo_mode(); } else { &game_play::user_start::reg_mode(); } } sub game_play::com_start::salvo_mode() { while (!&game_play::dead_yet()) { &game_play::salvo_mode::com_salvo(); &game_play::dead_yet(); print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } ## print "COMPUTER BOARD:"; ## print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; ## $i = 0; ## foreach my $el (@main::com_ships::com_board) { ## print "$main::letters::letters[$i]|"; ## print " @$el\n"; ## $i++; ## } &game_play::salvo_mode::user_salvo(); &game_play::dead_yet(); } } sub game_play::com_start::reg_mode() { while (!&game_play::dead_yet()) { &game_play::reg_mode::com_shot(); &game_play::dead_yet(); print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } ## print "COMPUTER BOARD:"; ## print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; ## $i = 0; ## foreach my $el (@main::com_ships::com_board) { ## print "$main::letters::letters[$i]|"; ## print " @$el\n"; ## $i++; ## } &game_play::reg_mode::user_shot(); &game_play::dead_yet(); } } sub game_play::user_start::salvo_mode() { while (!&game_play::dead_yet()) { print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } ## print "COMPUTER BOARD:"; ## print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; ## $i = 0; ## foreach my $el (@main::com_ships::com_board) { ## print "$main::letters::letters[$i]|"; ## print " @$el\n"; ## $i++; ## } &game_play::salvo_mode::user_salvo(); &game_play::dead_yet(); &game_play::salvo_mode::com_salvo(); &game_play::dead_yet(); } } sub game_play::user_start::reg_mode() { while (!&game_play::dead_yet()) { print "USER BOARD:"; print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; my $i = 0; foreach my $el (@main::user_ships::user_board) { print "$main::letters::letters[$i]|"; print " @$el\n"; $i++; } ## print "COMPUTER BOARD:"; ## print "\n 1 2 3 4 5 6 7 8 9 10\n"; ## print " --------------------\n"; ## $i = 0; ## foreach my $el (@main::com_ships::com_board) { ## print "$main::letters::letters[$i]|"; ## print " @$el\n"; ## $i++; ## } &game_play::reg_mode::user_shot(); &game_play::dead_yet(); &game_play::reg_mode::com_shot(); &game_play::dead_yet(); } } sub game_play::salvo_mode::com_salvo () { my $x1 = int(rand(10)); my $y1 = int(rand(10)); my $x2 = int(rand(10)); my $y2 = int(rand(10)); my $x3 = int(rand(10)); my $y3 = int(rand(10)); my @temp_checker = ("$x1" . "$y1", "$x2" . "$y2", "$x3" . "$y3"); print @temp_checker, "salvo", "\n"; if (($main::user_ships::user_board[$x1][$y1] eq 'X') or ($main::user_ +ships::user_board[$x1][$y1] eq 'O')) { &game_play::salvo_mode::com_salvo; return; } if (($main::user_ships::user_board[$x3][$y3] eq 'X') or ($main::user_ +ships::user_board[$x3][$y3] eq 'O')) { &game_play::salvo_mode::com_salvo; return; } if (($main::user_ships::user_board[$x2][$y2] eq 'X') or ($main::user_ +ships::user_board[$x2][$y2] eq 'O')) { &game_play::salvo_mode::com_salvo; return; } push @main::game_play::com_shots_check, @temp_checker; if (($main::user_ships::user_board[$x1][$y1] eq '#') or ($main::user_ +ships::user_board[$x1][$y1] eq '*') or ($main::user_ships::user_board +[$x1][$y1] eq '%') or ($main::user_ships::user_board[$x1][$y1] eq '~' +) or ($main::user_ships::user_board[$x1][$y1] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $countshots++; print $main::user_ships::hits, " press enter to continue", "\n"; $pausetillenter = <STDIN>; $main::user_ships::user_board[$x1][$y1] = 'X'; } elsif ($main::user_ships::user_board[$x1][$y1] eq 'X') { &game_play::salvo_mode::com_salvo; return; } else { $main::user_ships::user_board[$x1][$y1] = 'O'; } if (($main::user_ships::user_board[$x2][$y2] eq '#') or ($main::user_s +hips::user_board[$x2][$y2] eq '*') or ($main::user_ships::user_board[ +$x2][$y2] eq '%') or ($main::user_ships::user_board[$x2][$y2] eq '~') + or ($main::user_ships::user_board[$x2][$y2] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $countshots++; print $main::user_ships::hits, " press enter to continue", "\n"; $pausetillenter = <STDIN>; $main::user_ships::user_board[$x2][$y2] = 'X'; } elsif ($main::user_ships::user_board[$x2][$y2] eq 'X') { &game_play::salvo_mode::com_salvo; return; } else { $main::user_ships::user_board[$x2][$y2] = 'O'; } if (($main::user_ships::user_board[$x3][$y3] eq '#') or ($main::user_s +hips::user_board[$x3][$y3] eq '*') or ($main::user_ships::user_board[ +$x3][$y3] eq '%') or ($main::user_ships::user_board[$x3][$y3] eq '~') + or ($main::user_ships::user_board[$x3][$y3] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $countshots++; print $main::user_ships::hits, " press enter to continue", "\n"; $pausetillenter = <STDIN>; $main::user_ships::user_board[$x3][$y3] = 'X'; } elsif ($main::user_ships::user_board[$x3][$y3] eq 'X') { &game_play::salvo_mode::com_salvo; return; } else { $main::user_ships::user_board[$x3][$y3] = 'O'; } } sub game_play::salvo_mode::user_salvo () { my $input = ''; print "\n Please enter your three salvo shots (e.g. A4 B6 F4):"; chomp($input = <STDIN>); my @user_shots = split(" ", $input); if ($user_shots[0] eq ($user_shots[1] or $user_shots[2]) or $user_sho +ts[1] eq $user_shots[2]) { print "You have entered a co-ordinate twice. Please try again.\n"; &game_play::salvo_mode::user_salvo(); return 0; } $countshots++; print " shot count=", $countshots, " ", "\n"; foreach my $el (@user_shots) { my ($let) = split('', $el); ## ss edit my ($one) = split('', $el); ## ss edit my ($two) = split('', $el); ## ss edit if ($el eq "A") { $let = 0; ### ss edit } if ($el eq "B") { $let = 1; ### ss edit } if ($el eq "C") { $let = 2; ### ss edit } if ($el eq "D") { $let = 3; ### ss edit } if ($el eq "E") { $let = 4; ### ss edit } if ($el eq "F") { $let = 5; ### ss edit } if ($el eq "G") { $let = 6; ### ss edit } if ($el eq "H") { $let = 7; ### ss edit } if ($el eq "I") { $let = 8; ### ss edit } if ($el eq "J") { $let = 9; ### ss edit } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; ### ss warning foreach my $lee (@main::com_ships::com_all_ships) { if ($el eq $lee) { print "Computer ship hit!\n"; $main::com_ships::com_board[$let][$num] = 'X'; $main::com_ships::hits++; $countshots++; print $main::com_ships::hits, " press enter to continue", "\n"; $pausetillenter = <STDIN>; last; } elsif ($el ne $lee) { $main::com_ships::com_board[$let][$num] = 'O'; } } } push @main::game_play::user_shots_check, @user_shots; } sub game_play::reg_mode::com_shot () { my $x1 = int(rand(10)); my $y1 = int(rand(10)); my $temp_checker = ("$x1" . "$y1"); if (($main::user_ships::user_board[$x1][$y1] eq 'X') or ($main::user_ +ships::user_board[$x1][$y1] eq 'O')) { &game_play::reg_mode::com_shot; ### all ships were already hit an +d the last choice by computer caused error: out of memory! attempt to + free unreferenced scalar at battleship.pl line 938, <STDIN> line 117 +. return; } push @main::game_play::com_shots_check, $temp_checker; if (($main::user_ships::user_board[$x1][$y1] eq '#') or ($main::user_ +ships::user_board[$x1][$y1] eq '*') or ($main::user_ships::user_board +[$x1][$y1] eq '%') or ($main::user_ships::user_board[$x1][$y1] eq '~' +) or ($main::user_ships::user_board[$x1][$y1] eq '^')) { print "You've been hit!\n"; $main::user_ships::hits++; $countshots++; print $main::user_ships::hits, " press enter to continue", "\n"; $pausetillenter = <STDIN>; $main::user_ships::user_board[$x1][$y1] = 'X'; } elsif ($main::user_ships::user_board[$x1][$y1] eq 'X') { &game_play::reg_mode::com_shot; return; } else { $main::user_ships::user_board[$x1][$y1] = 'O'; } } sub game_play::reg_mode::user_shot () { my $input = ''; my $choosen = ''; print "\n Please enter your target: "; chomp($input = <STDIN>); $choosen = $input; my @target_choice = split("", $input); if ($input !~ /^[A-J]\d0?$/i) { print "You've entered invalid target. Please try again.\n"; &game_play::reg_mode::user_shot(); return 0; } $countshots++; print " shot count=", $countshots, " ", "\n"; foreach my $el (@target_choice) { my ($let) = split('', $el); ## ss edit my ($one) = split('', $el); ## ss edit my ($two) = split('', $el); ## ss edit if ($el eq "A") { $let = 0; ### ss edit } if ($el eq "B") { $let = 1; ### ss edit } if ($el eq "C") { $let = 2; ### ss edit } if ($el eq "D") { $let = 3; ### ss edit } if ($el eq "E") { $let = 4; ### ss edit } if ($el eq "F") { $let = 5; ### ss edit } if ($el eq "G") { $let = 6; ### ss edit } if ($el eq "H") { $let = 7; ### ss edit } if ($el eq "I") { $let = 8; ### ss edit } if ($el eq "J") { $let = 9; ### ss edit } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $input = "$let" . "$num"; print $el, "el again", "\n"; } ### ss warning foreach my $lee (@main::game_play::user_shots_check) { if ($choosen eq $lee) { print "You have entered invalid shot check. Please try again.\n" +; &game_play::reg_mode::user_shot(); return; } } foreach my $lee (@main::com_ships::com_all_ships) { if ($choosen eq $lee) { print "Computer ship hit!\n"; $main::com_ships::com_board[$let][$num] = 'X'; $main::com_ships::hits++; $countshots++; print $main::com_ships::hits, " press enter to continue", "\n"; $pausetillenter = <STDIN>; last; } elsif ($choosen ne $lee) { $main::com_ships::com_board[$let][$num] = 'O'; } } push @main::game_play::user_shots_check, $el; } sub game_play::dead_yet () { if ($main::com_ships::hits eq '6') { &game_play::end_game(2); } if ($main::user_ships::hits eq '6') { &game_play::end_game(1); } } sub game_play::end_game () { my @winner = @_; if ($winner[0] == 2) { print "Congratulations! You won, $main::startup::name!\n\n"; exit; } else { print "Computer hit all 6 objects ", $main::startup::name, " Shots +used=", $countshots, "\n"; exit; } } sub game_play::THE_END () { print "\n"; }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://953743]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (7)
As of 2015-07-08 02:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls