Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

comment on

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

This is a program I wrote some number of months back for an ASCII based battleship program, when I had much less of a concept of the optimization of code. It is certainly not the most effective use of the code. That is, there is quite a lot of repetition, and I have some rather useless prototyping in there that really doesn't mean a lot. As well, I never really got around to building the AI subs for it. Please note that also, the program tends to freeze in salvo mode, due to the fact that it has to figure out a way to "fire" in a manner that wouldn't make it so that locations would be hit more than once. Anyway, just thought I'd put it up here. If you want to change the code around to optimize it or make it function better, that would be great, and I'd love to see it. Or, if you just want to download it and feel completely old-school as you're playing, feel free to do that as well! Enjoy! Happy perling!

#!\usr\local\bin\perl use v5.10.1; 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; } #********************************************************************* +********** #******************************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_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. A4): "; chomp($input = <STDIN>); @main::user_ships::user_carrier = split(" ", $input); unless ($input =~ /^([A-J]\d0?\s){4}[A-J]\d0?$/i) { print "You have entered invalid input. Please try again.\n\n"; $input = ''; @main::user_ships::user_carrier = (); $decide = 0; } unless ($decide) { &get_user_ship_pos::carrier(); return 0; } foreach my $el (@main::user_ships::user_carrier) { my ($let, $one, $two) = split('', $el); given ($let) { when (/A/i) { $let = 0; } when (/B/i) { $let = 1; } when (/C/i) { $let = 2; } when (/D/i) { $let = 3; } when (/E/i) { $let = 4; } when (/F/i) { $let = 5; } when (/G/i) { $let = 6; } when (/H/i) { $let = 7; } when (/I/i) { $let = 8; } when (/J/i) { $let = 9; } } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; given ($num) { when ($num > 9) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_carrier = (); &get_user_ship_pos::carrier(); } } 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]; if ('0123456789' =~ /$string_anum/ and '0123456789' =~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_carrier = (); &get_user_ship_pos::carrier(); return 0; } if ('0123456789' !~ /$string_anum/ and '0123456789' !~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_carrier = (); &get_user_ship_pos::carrier(); return 0; } foreach my $el (@main::user_ships::user_carrier) { my ($let, $num) = split('', $el); $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: "; chomp($input = <STDIN>); @main::user_ships::user_battleship = split(" ", $input); unless ($input =~ /^([A-J]\d0?\s){3}[A-J]\d0?$/i) { print "You have entered invalid input. Please try again.\n\n"; $input = ''; @main::user_ships::user_battleship = (); $decide = 0; } unless ($decide) { &get_user_ship_pos::battleship(); return 0; } foreach my $el (@main::user_ships::user_battleship) { my ($let, $one, $two) = split('', $el); given ($let) { when (/A/i) { $let = 0; } when (/B/i) { $let = 1; } when (/C/i) { $let = 2; } when (/D/i) { $let = 3; } when (/E/i) { $let = 4; } when (/F/i) { $let = 5; } when (/G/i) { $let = 6; } when (/H/i) { $let = 7; } when (/I/i) { $let = 8; } when (/J/i) { $let = 9; } } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; given ($num) { when ($num > 9) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_battleship = (); &get_user_ship_pos::battleship(); } } push @user_battleship_check_let, $let; push @user_battleship_check_num, $num; } foreach my $el (@main::user_ships::user_all_ships) { foreach my $lee (@main::user_ships::user_battleship) { if ($lee =~ /$el/i and $el =~/$lee/i) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_battleship = (); &get_user_ship_pos::battleship(); return 0; } } } @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]; if ('0123456789' =~ /$string_anum/ and '0123456789' =~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_battleship = (); &get_user_ship_pos::battleship(); return 0; } if ('0123456789' !~ /$string_anum/ and '0123456789' !~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_battleship = (); &get_user_ship_pos::battleship(); return 0; } foreach my $el (@main::user_ships::user_battleship) { my ($let, $num) = split('', $el); $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. A4): "; chomp($input = <STDIN>); @main::user_ships::user_destroyer = split(" ", $input); unless ($input =~ /^([A-J]\d0?\s?){2}[A-J]\d0?$/i) { print "You have entered invalid input. Please try again.\n\n"; $input = ''; @main::user_ships::user_destroyer = (); $decide = 0; } unless ($decide) { &get_user_ship_pos::destroyer(); return 0; } foreach my $el (@main::user_ships::user_destroyer) { my ($let, $one, $two) = split('', $el); given ($let) { when (/A/i) { $let = 0; } when (/B/i) { $let = 1; } when (/C/i) { $let = 2; } when (/D/i) { $let = 3; } when (/E/i) { $let = 4; } when (/F/i) { $let = 5; } when (/G/i) { $let = 6; } when (/H/i) { $let = 7; } when (/I/i) { $let = 8; } when (/J/i) { $let = 9; } } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; given ($num) { when ($num > 9) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_destroyer = (); &get_user_ship_pos::destroyer(); } } push @user_destroyer_check_let, $let; push @user_destroyer_check_num, $num; } foreach my $el (@main::user_ships::user_all_ships) { foreach my $lee (@main::user_ships::user_destroyer) { if ($lee =~ /$el/i and $el =~/$lee/i) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_destroyer = (); &get_user_ship_pos::destroyer(); return 0; } } } @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]; if ('0123456789' =~ /$string_anum/ and '0123456789' =~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_destroyer = (); &get_user_ship_pos::destroyer(); return 0; } if ('0123456789' !~ /$string_anum/ and '0123456789' !~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_destroyer = (); &get_user_ship_pos::destroyer(); return 0; } foreach my $el (@main::user_ships::user_destroyer) { my ($let, $num) = split('', $el); $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. A4): "; chomp($input = <STDIN>); @main::user_ships::user_submarine = split(" ", $input); unless ($input =~ /^([A-J]\d0?\s?){2}[A-J]\d0?$/i) { print "You have entered invalid input. Please try again.\n\n"; $input = ''; @main::user_ships::user_submarine = (); $decide = 0; } unless ($decide) { &get_user_ship_pos::submarine(); return 0; } foreach my $el (@main::user_ships::user_submarine) { my ($let, $one, $two) = split('', $el); given ($let) { when (/A/i) { $let = 0; } when (/B/i) { $let = 1; } when (/C/i) { $let = 2; } when (/D/i) { $let = 3; } when (/E/i) { $let = 4; } when (/F/i) { $let = 5; } when (/G/i) { $let = 6; } when (/H/i) { $let = 7; } when (/I/i) { $let = 8; } when (/J/i) { $let = 9; } } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; given ($num) { when ($num > 9) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_submarine = (); &get_user_ship_pos::submarine(); } } push @user_submarine_check_let, $let; push @user_submarine_check_num, $num; } foreach my $el (@main::user_ships::user_all_ships) { foreach my $lee (@main::user_ships::user_submarine) { if ($lee =~ /$el/i and $el =~/$lee/i) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_submarine = (); &get_user_ship_pos::submarine(); return 0; } } } @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]; if ('0123456789' =~ /$string_anum/ and '0123456789' =~ /$string_alet/ +) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_submarine = (); &get_user_ship_pos::submarine(); return 0; } if ('0123456789' !~ /$string_anum/ and '0123456789' !~ /$string_alet/ +) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_submarine = (); &get_user_ship_pos::submarine(); return 0; } foreach my $el (@main::user_ships::user_submarine) { my ($let, $num) = split('', $el); $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: "; chomp($input = <STDIN>); @main::user_ships::user_patrol = split(" ", $input); unless ($input =~ /^[A-J]\d0?\s[A-J]\d0?$/i) { print "You have entered invalid input. Please try again.\n\n"; $input = ''; @main::user_ships::user_patrol = (); $decide = 0; } unless ($decide) { &get_user_ship_pos::patrol(); return 0; } foreach my $el (@main::user_ships::user_patrol) { my ($let, $one, $two) = split('', $el); given ($let) { when (/A/i) { $let = 0; } when (/B/i) { $let = 1; } when (/C/i) { $let = 2; } when (/D/i) { $let = 3; } when (/E/i) { $let = 4; } when (/F/i) { $let = 5; } when (/G/i) { $let = 6; } when (/H/i) { $let = 7; } when (/I/i) { $let = 8; } when (/J/i) { $let = 9; } } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; given ($num) { when ($num > 9) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_patrol = (); &get_user_ship_pos::patrol(); } } push @user_patrol_check_let, $let; push @user_patrol_check_num, $num; } foreach my $el (@main::user_ships::user_all_ships) { foreach my $lee (@main::user_ships::user_patrol) { if ($lee =~ /$el/i and $el =~/$lee/i) { print "Your input is invalid. Please try again.\n\n"; @main::user_ships::user_patrol = (); &get_user_ship_pos::patrol(); return 0; } } } @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]; if ('0123456789' =~ /$string_anum/ and '0123456789' =~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_patrol = (); &get_user_ship_pos::patrol(); return 0; } if ('0123456789' !~ /$string_anum/ and '0123456789' !~ /$string_alet/ +) { print "Your input is invalid. Please try aaaaagain.\n\n"; @main::user_ships::user_patrol = (); &get_user_ship_pos::patrol(); return 0; } foreach my $el (@main::user_ships::user_patrol) { my ($let, $num) = split('', $el); $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 '#') { 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 '#') { 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 '#') { 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: "; 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_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, $one, $two) = split('', $el); given ($let) { when (/A/i) { $let = 0; } when (/B/i) { $let = 1; } when (/C/i) { $let = 2; } when (/D/i) { $let = 3; } when (/E/i) { $let = 4; } when (/F/i) { $let = 5; } when (/G/i) { $let = 6; } when (/H/i) { $let = 7; } when (/I/i) { $let = 8; } when (/J/i) { $let = 9; } } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $el = "$let" . "$num"; given ($num) { when ($num > 9) { print "Your input is invalid. Please try again.\n\n"; @user_shots = (); &game_play::salvo_mode::user_salvo(); return; } } foreach my $lee (@main::game_play::user_shots_check) { if ($el eq $lee) { print "You have entered invalid input. 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; return; } push @main::game_play::com_shots_check, $temp_checker; if ($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 = ''; print "\n Please 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 ($let, $one, $two) = split('', $input); given ($let) { when (/A/i) { $let = 0; } when (/B/i) { $let = 1; } when (/C/i) { $let = 2; } when (/D/i) { $let = 3; } when (/E/i) { $let = 4; } when (/F/i) { $let = 5; } when (/G/i) { $let = 6; } when (/H/i) { $let = 7; } when (/I/i) { $let = 8; } when (/J/i) { $let = 9; } } my $num = 0; if ($two ne "") { $num = "$one" . "$two"; $num = $num - 1; } else { $num = $one - 1; } $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; } 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"; }

In reply to 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!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • 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 taking refuge in the Monastery: (10)
    As of 2021-03-02 20:29 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?
      My favorite kind of desktop background is:











      Results (62 votes). Check out past polls.

      Notices?