Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

comment on

( [id://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":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (5)
As of 2024-04-19 04:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found