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

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??

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"; }

In reply to Re^3: ASCII Battleship Program by Anonymous Monk
in thread ASCII Battleship Program by perlStuck

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others imbibing at the Monastery: (18)
    As of 2015-07-30 20:45 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 (273 votes), past polls