Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

comment on

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



  • 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 about the Monastery: (7)
As of 2024-04-18 17:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found