in reply to ASCII Battleship Program
Hello, all--
I had another software install over the weekend, and spent my slack time twiddling around with the Battleship game again. I've addressed a couple of the issues, and undoubtedly added some new issues. The current version displays the computer's ships for debugging, but I haven't tweaked the code to let me turn off the computer ship display yet.
I'm posting the updated version just in case I get pulled away again and never see it again. Hopefully someone else will tweak it a little too.
I really need finish tuning it before playing with it, but I couldn't help myself. So there are chunks that I still need to work on, but I had fun modifying the layout and such. Ah, well, it was more interesting than listening to a bunch of people doing database deployments over the weekend.
#!/usr/bin/perl
#
# Battleship.pl
#
# From www.perlmonks.com
#
use v5.10.1;
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;
my $dbg=0; # Set to 1 to show computer's board
my $fl_print_boards = 'H';
my $shots_per_turn = 3;
my $turn;
my %Pieces = (
Battleship => 4, Carrier => 5, Destroyer => 3,
Patrol => 2, Submarine => 3,
);
my @mnu_who_goes_first = (
[ "You", sub { $turn = 'HUMAN' } ],
[ "Computer", sub { $turn = 'Computer' }],
[ "Random", sub { int(rand(1000)) } ],
);
my @mnu_game_mode = (
[ "Regular (one-shot mode)", sub { $shots_per_turn = 1 } ],
[ "Salvo (three-shot mode)", sub { $shots_per_turn = 3 } ],
);
main::startup();
#*********************************************************************
+*********
#*******************************STARTUP FUNCTION**********************
+*********
#*********************************************************************
+*********
sub main::startup {
local $main::startup::name = "";
print "\n\nPlease enter your name: ";
chomp($main::startup::name = <STDIN>);
main::call();
}
#*********************************************************************
+**********
#******************************MAIN CALL FUNCTION*********************
+**********
#*********************************************************************
+**********
sub main::call {
srand;
local @main::com_ships::com_all_ships = ();
local @main::user_ships::user_all_ships = ();
local @main::com_ships::com_board = generate_board();
local @main::user_ships::user_board = generate_board();
local @main::letters::letters = ("A" .. "J");
local $main::game_play::whos_first = '';
local $main::game_play::mode = '';
local @main::game_play::user_shots_check;
local $main::com_ships::hits = '';
local $main::user_ships::hits = '';
generate_ship_pos::start();
get_user_ship_pos::start();
game_play::start();
}
#*********************************************************************
+**********
#***************************SECONDARY CALL FUNCTIONS******************
+**********
#*********************************************************************
+**********
sub generate_ship_pos::start {
for my $k (keys %Pieces) {
generate_ship_pos::any_ship($Pieces{$k}, $k);
}
print_board(\@::main::com_ships::com_board) if $dbg;
# Reset the board, we used it as a scratchpad
# @main::com_ships::com_board = generate_board();
}
sub get_user_ship_pos::start {
for my $k (keys %Pieces) {
get_user_ship_pos::any_size($k, $Pieces{$k});
}
print_board(\@::main::user_ships::user_board);
}
sub game_play::start {
game_play::decide();
game_play::mode();
play_game();
}
#*********************************************************************
+**********
#********************* BOARD HELPER FUNCTIONS ************************
+**********
#*********************************************************************
+**********
sub gen_ship_list {
my ($rC, $orient, $size) = @_;
my ($x, $y) = @$rC;
my $rShip;
given ($orient) {
when (0) { push @$rShip, [ $x, $y++ ] for 1 .. $size; }
when (1) { push @$rShip, [ $x++, $y ] for 1 .. $size; }
}
return undef if $x>10 or $y>10;
$rShip;
}
sub does_ship_fit {
my ($rBoard, $rShip) = @_;
my $collisions = 0;
for my $P (@$rShip) {
my ($x, $y) = @$P;
++$collisions if $$rBoard[$x][$y] ne '0';
}
return 0 if $collisions;
1;
}
#*********************************************************************
+**********
#*********************COMPUTER SHIP GENERATION FUNCTIONS**************
+**********
#*********************************************************************
+**********
sub generate_ship_pos::any_ship {
my ($size, $type) = @_;
my $rShip;
while (1) {
# Randomly place a ship
my $x = int(rand(10));
my $y = int(rand(10));
my $orient = int(rand(2));
$rShip = gen_ship_list([$x,$y], $orient, $size);
redo if ! defined $rShip;
last if does_ship_fit(\@main::com_ships::com_board, $rShip);
}
for my $P (@$rShip) {
my ($x, $y) = @$P;
$main::com_ships::com_board[$x][$y] = uc(substr $type, 0, 1);
push @main::com_ships::com_all_ships, "$x$y";
}
}
#*********************************************************************
+**********
#************************USER SHIP GENERATION FUNCTIONS***************
+**********
#*********************************************************************
+**********
sub place_ship {
my ($x, $y, $size, $orient, $type) = @_;
given (uc $orient) {
when ('U') { $x-=$size-1; $orient=1 }
when ('D') { $orient=1 }
when ('L') { $y-=$size-1; $orient=0 }
when ('R') { $orient=0 }
}
return 0 if $x<0 or $y<0;
my $rShip = gen_ship_list([$x,$y], $orient, $size);
if (! defined $rShip) {
print "Ship can't go off the edge of the board!\n";
return 0;
}
if (! does_ship_fit(\@main::user_ships::user_board, $rShip)) {
print "Can't overlap ships!\n";
return 0;
}
for my $P (@$rShip) {
($x, $y) = @$P;
$main::user_ships::user_board[$x][$y] = substr($type,0,1);
push @main::user_ships::user_all_ships, "$x$y";
}
1;
}
sub get_user_ship_pos::any_size {
my ($name, $size) = @_;
print_board(\@main::user_ships::user_board);
while (1) {
print "Position your $name: ('A5 r' starts at A5 and goes righ
+t):";
chomp(my $input = <STDIN>);
if ($input =~ m/([A-J]\d0?)\s*([UDLRXY])/i) {
# Coordinates look good, try placing the ship
my ($start, $dir) = ($1, $2);
my $rC = parse_coordinate($1);
redo unless defined $rC;
last if place_ship($$rC[0], $$rC[1], $size, $dir, $name);
}
print "You have entered invalid input. Please try again.\n\n";
}
}
#*********************************************************************
+**********
#*******************************GAME-PLAY FUNCTIONS*******************
+**********
#*********************************************************************
+**********
sub handle_menu {
my ($ar, $prompt) = @_;
while (1) {
print "\n", $prompt, "\n";
for (my $i=0; $i<@$ar; ++$i) {
print $i+1, ". ", $$ar[$i][0], "\n";
}
print "\n\nYour choice: ";
chomp(my $decide = <STDIN>);
if ($decide>0 and $decide <= @$ar) {
return $decide if ! defined $$ar[$decide-1][1];
return &{$$ar[$decide-1][1]}();
}
print "Inrecognized choice, please try again.\n";
}
}
sub game_play::decide {
return handle_menu(\@mnu_who_goes_first, "Who goes first?");
}
sub game_play::mode {
return handle_menu(\@mnu_game_mode, "Please enter game mode: ");
}
sub play_game {
while (!game_play::dead_yet()) {
if ($turn eq "Computer") {
computer_shots($shots_per_turn);
$turn = "HUMAN";
}
else {
print_both_boards();
player_shots($shots_per_turn);
$turn = "Computer";
}
}
}
sub generate_computer_shots {
my $num_shots = shift;
my %shots;
while ($num_shots) { # < @{keys %shots}) {
my ($x, $y) = (int(rand(10)), int(rand(10)));
my $k = "$x$y";
next if $main::user_ships::user_board[$x][$y] eq 'X'
or $main::user_ships::user_board[$x][$y] eq 'O';
next if exists $shots{$k};
$shots{$k} = [ $x, $y ];
--$num_shots;
}
return values %shots;
}
sub computer_shots { #game_play::reg_mode::com_shot {
my $num_shots = shift;
my @shots = generate_computer_shots($num_shots);
print "COMPUTER: ";
for my $rs (@shots) {
my ($x, $y) = @$rs;
my $s = coord_to_str($rs);
if ($main::user_ships::user_board[$x][$y] =~ /[BCDPS]/) {
print "$s:BOOM! ";
++$main::user_ships::hits;
$main::user_ships::user_board[$x][$y] = 'X';
}
elsif ($main::user_ships::user_board[$x][$y] eq 'X') {
print "$s:Boom. ";
}
else {
print "$s: splash ";
$main::user_ships::user_board[$x][$y] = 'O';
}
}
print "\n";
}
sub get_player_shots {
my $num_shots = shift;
while (1) {
my @retval;
my %shots;
print "\nPlease enter your shot(s): ";
chomp(my $input = <STDIN>);
my @shot_list = ($input =~ m/([A-J]\d0?)/gi);
for my $shot (@shot_list) {
my $r = parse_coordinate($shot);
my ($x, $y) = @$r;
my $k = coord_to_str($r);
if (exists $shots{$k}) {
print "Duplicate entry: $shot\n";
next;
}
elsif ($main::com_ships::com_board[$x][$y] eq 'X'
or $main::com_ships::com_board[$x][$y] eq 'O') {
print "You've already shot location $shot\n";
next;
}
else {
push @retval, [ $x, $y ];
$shots{$k} = [ $x, $y ];
}
}
my @t = keys %shots;
if (@t < $num_shots) {
print "Not enough shots entered, please try again.\n";
next;
}
else {
return @retval[0 .. $num_shots-1];
}
}
}
sub player_shots {
my $num_shots = shift;
my @shots = get_player_shots($num_shots);
print $main::startup::name, ": ";
for my $rs (@shots) {
my $s = coord_to_str($rs);
my ($x, $y) = @$rs;
if ($main::com_ships::com_board[$x][$y] =~ /[BCDPS]/) {
print "$s:BOOM! ";
++$main::com_ships::hits;
$main::com_ships::com_board[$x][$y] = 'X';
}
elsif ($main::com_ships::com_board[$x][$y] eq 'X') {
print "$s:Boom. ";
}
else {
print "$s:splash ";
$main::com_ships::com_board[$x][$y] = 'O';
}
}
print "\n";
}
=h1
sub xplayer_shots {
my $num_shots = shift;
INPUT: while (1) {
my %shots;
if ($num_shots == 1) {
print "\nPlease enter your shot: ";
}
else {
print "\nPlease enter your salvo: ";
}
chomp(my $input = <STDIN>);
for my $shot (split '', $input) {
my $r = parse_coordinate($shot);
next INPUT unless defined $r;
my ($x, $y) = @$r;
my $k = "$x.$y";
if (exists $shots{$k}) {
print "You've already entered $k!\n";
next INPUT;
}
if (grep { $k eq $_ } @main::game_play::user_shots_check)
+{
print "You have entered invalid input. Please try agai
+n.\n";
next INPUT;
}
if ($main::com_ships::com_board[$x][$y] eq 'X') {
}
elsif ($main::com_ships::com_board[$x][$y] eq 'X') {
}
else {
}
}
}
}
=cut
=h1
sub xgame_play::salvo_mode::user_salvo {
my $input = '';
print "\nPlease enter your three salvo shots: ";
chomp($input = <STDIN>);
my @user_shots = split(" ", $input);
if ($input !~ /^[A-J]\d0?\s[A-J]\d0?\s[A-J]\d0?$/i) {
print "You've entered invalid input. Please try again.\n";
game_play::salvo_mode::user_salvo();
return 0;
}
if ($user_shots[0] eq ($user_shots[1] or $user_shots[2]) or $user_
+shots[1] eq $user_shots[2]) {
print "You have entered a co-ordinate twice. Please try again.
+\n";
game_play::salvo_mode::user_salvo();
return 0;
}
foreach my $el (@user_shots) {
my $rC = parse_coordinate($el);
die "how did I get here?" if ! defined $rC;
$el = "$$rC[0]$$rC[1]";
foreach my $lee (@main::game_play::user_shots_check) {
if ($el eq $lee) {
print "You have entered invalid input. Please try agai
+n.\n";
game_play::salvo_mode::user_salvo();
return;
}
}
foreach my $lee (@main::com_ships::com_all_ships) {
if ($el eq $lee) {
print "Computer ship hit!\n";
$main::com_ships::com_board[$$rC[0]][$$rC[1]] = 'X';
$main::com_ships::hits++;
last;
} elsif ($el ne $lee) {
$main::com_ships::com_board[$$rC[0]][$$rC[1]] = 'O';
}
}
}
push @main::game_play::user_shots_check, @user_shots;
}
sub xgame_play::reg_mode::user_shot {
my $input = '';
print "\nPlease enter your target: ";
chomp($input = <STDIN>);
if ($input !~ /^[A-J]\d0?$/i) {
print "You've entered invalid input. Please try again.\n";
game_play::reg_mode::user_shot();
return 0;
}
my $rC = parse_coordinate($input);
die "eh?" unless defined $rC;
my ($let, $num) = (@$rC);
$input = "$let" . "$num";
given ($num) {
when ($num > 9) {
print "Your input is invalid. Please try again.\n\n";
$input = '';
game_play::reg_mode::user_shot();
return;
}
}
foreach my $lee (@main::game_play::user_shots_check) {
if ($input eq $lee) {
print "You have entered invalid input. Please try again.\n
+";
game_play::reg_mode::user_shot();
return;
}
}
foreach my $lee (@main::com_ships::com_all_ships) {
if ($input eq $lee) {
print "Computer ship hit!\n";
$main::com_ships::com_board[$let][$num] = 'X';
$main::com_ships::hits++;
last;
} elsif ($input ne $lee) {
$main::com_ships::com_board[$let][$num] = 'O';
}
}
push @main::game_play::user_shots_check, $input;
}
=cut
sub game_play::dead_yet {
if ($main::com_ships::hits eq '17') {
print "Congratulations! You won, $main::startup::name!\n\n";
exit;
}
if ($main::user_ships::hits eq '17') {
print "Computer won. Better luck next time!\n";
print "Computer used:\n";
print_board(\@main::com_ships::com_board);
exit;
}
}
sub get_board_rows {
my $ar = shift;
my @retval;
for (my $i=0; $i<@$ar; ++$i) {
push @retval, join(" ", map { $_ eq '0' ? '-' : $_ } @{$$ar[$i
+]});
}
return @retval;
}
sub print_both_boards {
if ($fl_print_boards eq 'H') {
print_both_boards_H();
}
else {
print_both_boards_V();
}
}
sub print_both_boards_H {
my @U = get_board_rows(\@main::user_ships::user_board);
my @C = get_board_rows(\@main::com_ships::com_board);
printf <<EOHDR, center_text($main::startup::name,20), center_text(
+'Computer',20);
%-20.20s %-20.20s
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
-------------------- --------------------
EOHDR
for (my $i=0; $i<@U; ++$i) {
print "$main::letters::letters[$i]| ";
print $U[$i];
print " |$main::letters::letters[$i]| ";
print $C[$i];
print " |$main::letters::letters[$i]\n";
}
}
sub print_both_boards_V {
print center_text($main::startup::name,20);
print_board(\@main::user_ships::user_board);
print center_text("COMPUTER BOARD:", 20);;
print_board(\@main::com_ships::com_board);
}
sub print_board {
my $ar = shift;
my @rows = get_board_rows($ar);
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
for (my $i=0; $i<@$ar; ++$i) {
print "$main::letters::letters[$i]| ";
print $rows[$i], "\n";
}
}
sub coord_to_str {
my $r = shift;
return substr("ABCDEFGHIJ",$$r[0],1) . sprintf("%u",1+$$r[1]);
}
sub generate_board {
my @t;
push @t, [ (0) x 10 ] for 0..9;
return @t;
}
sub parse_coordinate {
# converts /[A-J]([1-9]|10)/i to [ [0..9], [0..9] ]
my $coord = uc shift;
return [ ord($1)-ord('A'), $2-1 ] if $coord =~ /^([A-J])([1-9]|10)
+$/;
print "Invalid coordinate $coord!\n";
return undef;
}
sub center_text {
my ($text, $len) = @_;
return substr($text, 0, $len) if length($text) >= $len;
$text = ' ' x ( ($len-length($text))/2 ) . $text;
return $text .= ' ' x ($len - length($text));
}
...roboticus
When your only tool is a hammer, all problems look like your thumb.
Re^2: ASCII Battleship Program
by Anonymous Monk on May 18, 2012 at 11:11 UTC
|
I got this running on V. 5.006
from the command line
It sinks a ship by hitting it once
There are 5 ships, carrier, battleship, destroyer, submarine, patrol.
When the computer has hit all the ships and choosen all the spaces it errors, out of memory!
It assigns a pound sign # to every ship but I changed that to assign a different sign for each ship
# * % ^ ~
I had to remove almost every user input error detector because the regex isn't right.
I use these 5 example ship positions C2 G6 B1 F5 D3
It has alot of problems so hack at your own minds risk :)
#!/usr/bin/perl
#
# Battleship.pl
# only one hit sinks a ship
# run from command prompt at C:\Users>perl battleship.pl enter
# From www.perlmonks.com
#
##use v5.006;
##use strict;
##use warnings;
&startup();
#*********************************************************************
+*********
#*******************************STARTUP FUNCTION**********************
+*********
#*********************************************************************
+*********
sub main::startup () {
local $main::startup::name = "";
print "\n\nPlease enter your name: ";
chomp($main::startup::name = <STDIN>);
&main::call;
}
#*********************************************************************
+**********
#******************************MAIN CALL FUNCTION*********************
+**********
#*********************************************************************
+**********
sub main::call () {
srand;
local @main::com_ships::com_all_ships = ();
local @main::com_ships::com_carrier = ();
local @main::com_ships::com_battleship = ();
local @main::com_ships::com_destroyer = ();
local @main::com_ships::com_submarine = ();
local @main::com_ships::com_patrol = ();
local @main::user_ships::user_all_ships = ();
local @main::user_ships::user_carrier = ();
local @main::user_ships::user_battleship = ();
local @main::user_ships::user_destroyer = ();
local @main::user_ships::user_submarine = ();
local @main::user_ships::user_patrol = ();
local @main::com_ships::com_board = (
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
);
local @main::user_ships::user_board = (
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
);
local @main::letters::letters = ("A" .. "J");
local $main::game_play::whos_first = '';
local $main::game_play::mode = '';
local @main::game_play::com_shots_check;
local @main::game_play::user_shots_check;
local $main::com_ships::hits = '';
local $main::user_ships::hits = '';
&generate_ship_pos::start();
&get_user_ship_pos::start();
&game_play::start();
}
#*********************************************************************
+**********
#***************************SECONDARY CALL FUNCTIONS******************
+**********
#*********************************************************************
+**********
sub generate_ship_pos::start () {
&generate_ship_pos::carrier();
&generate_ship_pos::battleship();
&generate_ship_pos::destroyer();
&generate_ship_pos::submarine();
&generate_ship_pos::patrol();
&generate_ship_pos::correctional(@main::com_ships::com_all_ships);
}
sub get_user_ship_pos::start () {
&get_user_ship_pos::carrier();
&get_user_ship_pos::battleship();
&get_user_ship_pos::destroyer();
&get_user_ship_pos::submarine();
&get_user_ship_pos::patrol();
}
sub game_play::start () {
$main::game_play::whos_first = &game_play::decide();
$main::game_play::mode = &game_play::mode();
&game_play::tree_branches($main::game_play::whos_first, $main::game_p
+lay::mode);
}
#*********************************************************************
+**********
#*********************COMPUTER SHIP GENERATION FUNCTIONS**************
+**********
#*********************************************************************
+**********
sub generate_ship_pos::carrier () {
while (@main::com_ships::com_carrier != 5) {
my $x = int(rand(9));
my $y = int(rand(9));
my $orient = int(rand(1000));
if ($orient < 500) {
if ($y <= 2) {
@main::com_ships::com_carrier = ("$x" . "$y", "$x" . "$y"+1,
+"$x" . "$y"+2, "$x" . "$y"+3, "$x" . "$y"+4);
}
if ($y > 2 and $y <= 6) {
@main::com_ships::com_carrier = ("$x" . "$y"-2, "$x" . "$y"-1
+, "$x" . "$y", "$x" . "$y"+1, "$x" . "$y"+2);
}
if ($y > 6) {
@main::com_ships::com_carrier = ("$x" . "$y"-4, "$x" . "$y"-3
+, "$x" . "$y"-2, "$x" . "$y"-1, "$x" . "$y");
}
}
if ($orient > 500) {
if ($x <= 2) {
@main::com_ships::com_carrier = ("$x" . "$y", "$x"+1 . "$y",
+"$x"+2 . "$y", "$x"+3 . "$y", "$x"+4 . "$y");
}
if ($x > 2 and $x <= 6) {
@main::com_ships::com_carrier = ("$x"-2 . "$y", "$x"-1 . "$y"
+, "$x" . "$y", "$x"+1 . "$y", "$x"+2 . "$y");
}
if ($x > 6) {
@main::com_ships::com_carrier = ("$x"-4 . "$y", "$x"-3 . "$y"
+, "$x"-2 . "$y", "$x"-1 . "$y", "$x" . "$y");
}
}
push @main::com_ships::com_all_ships, @main::com_ships::com_carrier
+;
}
}
sub generate_ship_pos::battleship () {
while (@main::com_ships::com_battleship != 4) {
my $x = int(rand(9));
my $y = int(rand(9));
my $orient = int(rand(1000));
if ($orient < 500) {
if ($y <= 2) {
@main::com_ships::com_battleship = ("$x" . "$y", "$x" . "$y"+
+1, "$x" . "$y"+2, "$x" . "$y"+3);
}
if ($y > 2 and $y <= 6) {
@main::com_ships::com_battleship = ("$x" . "$y"-2, "$x" . "$y
+"-1, "$x" . "$y", "$x" . "$y"+1);
}
if ($y > 6) {
@main::com_ships::com_battleship = ("$x" . "$y"-3, "$x" . "$y
+"-2, "$x" . "$y"-1, "$x" . "$y");
}
}
if ($orient > 500) {
if ($x <= 2) {
@main::com_ships::com_battleship = ("$x" . "$y", "$x"+1 . "$y
+", "$x"+2 . "$y", "$x"+3 . "$y");
}
if ($x > 2 and $x <= 6) {
@main::com_ships::com_battleship = ("$x"-2 . "$y", "$x"-1 . "
+$y", "$x" . "$y", "$x"+1 . "$y");
}
if ($x > 6) {
@main::com_ships::com_battleship = ("$x"-3 . "$y", "$x"-2 . "
+$y", "$x"-1 . "$y", "$x" . "$y");
}
}
foreach my $el (@main::com_ships::com_all_ships) {
foreach my $lee (@main::com_ships::com_battleship) {
if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $
+el) or ($lee - 10 == $el)) {
@main::com_ships::com_battleship = ();
last;
}
}
}
push @main::com_ships::com_all_ships, @main::com_ships::com_battle
+ship;
}
}
sub generate_ship_pos::destroyer () {
while (@main::com_ships::com_destroyer != 3) {
my $x = int(rand(9));
my $y = int(rand(9));
my $orient = int(rand(1000));
if ($orient < 500) {
if ($y <= 2) {
@main::com_ships::com_destroyer = ("$x" . "$y", "$x" . "$y"+1
+, "$x" . "$y"+2);
}
if ($y > 2 and $y <= 6) {
@main::com_ships::com_destroyer = ("$x" . "$y"-1, "$x" . "$y"
+, "$x" . "$y"+1);
}
if ($y > 6) {
@main::com_ships::com_destroyer = ("$x" . "$y"-2, "$x" . "$y"
+-1, "$x" . "$y");
}
}
if ($orient > 500) {
if ($x <= 2) {
@main::com_ships::com_destroyer = ("$x" . "$y", "$x"+1 . "$y"
+, "$x"+2 . "$y");
}
if ($x > 2 and $x <= 6) {
@main::com_ships::com_destroyer = ("$x"-1 . "$y", "$x" . "$y"
+, "$x"+1 . "$y");
}
if ($x > 6) {
@main::com_ships::com_destroyer = ("$x"-2 . "$y", "$x"-1 . "$
+y", "$x" . "$y");
}
}
foreach my $el (@main::com_ships::com_all_ships) {
foreach my $lee (@main::com_ships::com_destroyer) {
if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $
+el) or ($lee - 10 == $el)) {
@main::com_ships::com_destroyer = ();
last;
}
}
}
push @main::com_ships::com_all_ships, @main::com_ships::com_destro
+yer;
}
}
sub generate_ship_pos::submarine () {
while (@main::com_ships::com_submarine != 3) {
my $x = int(rand(9));
my $y = int(rand(9));
my $orient = int(rand(1000));
if ($orient < 500) {
if ($y <= 2) {
@main::com_ships::com_submarine = ("$x" . "$y", "$x" . "$y"+1
+, "$x" . "$y"+2);
}
if ($y > 2 and $y <= 6) {
@main::com_ships::com_submarine = ("$x" . "$y"-1, "$x" . "$y"
+, "$x" . "$y"+1);
}
if ($y > 6) {
@main::com_ships::com_submarine = ("$x" . "$y"-2, "$x" . "$y"
+-1, "$x" . "$y");
}
}
if ($orient > 500) {
if ($x <= 2) {
@main::com_ships::com_submarine = ("$x" . "$y", "$x"+1 . "$y"
+, "$x"+2 . "$y");
}
if ($x > 2 and $x <= 6) {
@main::com_ships::com_submarine = ("$x"-1 . "$y", "$x" . "$y"
+, "$x"+1 . "$y");
}
if ($x > 6) {
@main::com_ships::com_submarine = ("$x"-2 . "$y", "$x"-1 . "$
+y", "$x" . "$y");
}
}
foreach my $el (@main::com_ships::com_all_ships) {
foreach my $lee (@main::com_ships::com_submarine) {
if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $
+el) or ($lee - 10 == $el)) {
@main::com_ships::com_submarine = ();
last;
}
}
}
push @main::com_ships::com_all_ships, @main::com_ships::com_submar
+ine;
}
}
sub generate_ship_pos::patrol () {
while (@main::com_ships::com_patrol != 2) {
my $x = int(rand(9));
my $y = int(rand(9));
my $orient = int(rand(1000));
if ($orient < 500) {
if ($y <= 2) {
@main::com_ships::com_patrol = ("$x" . "$y", "$x" . "$y"+1);
}
if ($y > 2 and $y <= 6) {
@main::com_ships::com_patrol = ( "$x" . "$y", "$x" . "$y"+1);
}
if ($y > 6) {
@main::com_ships::com_patrol = ("$x" . "$y"-1, "$x" . "$y");
}
}
if ($orient > 500) {
if ($x <= 2) {
@main::com_ships::com_patrol = ("$x" . "$y", "$x"+1 . "$y");
}
if ($x > 2 and $x <= 6) {
@main::com_ships::com_patrol = ("$x" . "$y", "$x"+1 . "$y");
}
if ($x > 6) {
@main::com_ships::com_patrol = ("$x"-1 . "$y", "$x" . "$y");
}
}
foreach my $el (@main::com_ships::com_all_ships) {
foreach my $lee (@main::com_ships::com_patrol) {
if (($lee + 1 == $el) or ($lee - 1 == $el) or ($lee + 10 == $
+el) or ($lee - 10 == $el)) {
@main::com_ships::com_patrol = ();
last;
}
}
}
push @main::com_ships::com_all_ships, @main::com_ships::com_patrol
+;
}
}
sub generate_ship_pos::correctional() {
foreach my $el (@main::com_ships::com_all_ships) {
if (length $el == 1) {
$el = '0' . "$el";
}
}
}
#*********************************************************************
+**********
#************************USER SHIP GENERATION FUNCTIONS***************
+**********
#*********************************************************************
+**********
sub get_user_ship_pos::carrier () {
my @user_carrier_check_let = ();
my @user_carrier_check_num = ();
my $input = '';
my $decide = 1;
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "Please enter your carrier positions (e.g. C2): ";
chomp($input = <STDIN>);
print $input, "inputted", "\n";
@main::user_ships::user_carrier = split("", $input);
print @main::user_ships::user_carrier, "carrier input", "\n";
foreach my $el (@main::user_ships::user_carrier) { ### use C2 as ex
+ample
my ($let) = split('', $el); ## gdk edit
my ($one) = split('', $el); ## gdk edit
my ($two) = split('', $el); ## gdk edit
print $el, "el", $one, "one", $two, "two", "\n";
if ($el eq "C") {
$let = 2; ### gdk edit
}
my $num = 0;
if ($two == 2) { ### if ne to a letter else a number so
$num = "$one" . "$two";
$num = $num - 1;
} else {
$num = $one - 1;
}
$el = "$let" . "$num";
print $el, "el again", "\n";
### gdk edit warning
push @user_carrier_check_let, $let;
push @user_carrier_check_num, $num;
}
@user_carrier_check_let = sort {$a <=> $b} @user_carrier_check_let;
@user_carrier_check_num = sort {$a <=> $b} @user_carrier_check_num;
my $string_alet = $user_carrier_check_let[0] . $user_carrier_check_le
+t[1] . $user_carrier_check_let[2] . $user_carrier_check_let[3] . $use
+r_carrier_check_let[4];
my $string_anum = $user_carrier_check_num[0] . $user_carrier_check_nu
+m[1] . $user_carrier_check_num[2] . $user_carrier_check_num[3] . $use
+r_carrier_check_num[4];
print $string_alet, " alet ", $string_anum, " anum", "\n";
foreach my $el (@main::user_ships::user_carrier) {
my ($let) = split('', $el); ### gdk edit
my ($num) = split('', $el); ### gdk edit
$main::user_ships::user_board[$let][$num] = "#";
}
push @main::user_ships::user_all_ships, @main::user_ships::user_carri
+er;
}
sub get_user_ship_pos::battleship () {
my @user_battleship_check_let = ();
my @user_battleship_check_num = ();
my $input = '';
my $decide = 1;
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "Please enter your battleship positions (e.g. G6): ";
chomp($input = <STDIN>);
@main::user_ships::user_battleship = split("", $input);
foreach my $el (@main::user_ships::user_battleship) { ### use G6 a
+s example
my ($let) = split('', $el); ## gdk edit
my ($one) = split('', $el); ## gdk edit
my ($two) = split('', $el); ## gdk edit
print $el, "el", $one, "one", $two, "two", "\n";
if ($el eq "G") {
$let = 6; ### gdk edit
}
my $num = 0;
if ($two == 6) {
$num = "$one" . "$two";
$num = $num - 1;
} else {
$num = $one - 1;
}
$el = "$let" . "$num";
print $el, "el again", "\n";
### gdk edit warning
push @user_battleship_check_let, $let;
push @user_battleship_check_num, $num;
}
@user_battleship_check_let = sort {$a <=> $b} @user_battleship_check_
+let;
@user_battleship_check_num = sort {$a <=> $b} @user_battleship_check_
+num;
my $string_alet = $user_battleship_check_let[0] . $user_battleship_ch
+eck_let[1] . $user_battleship_check_let[2] . $user_battleship_check_l
+et[3];
my $string_anum = $user_battleship_check_num[0] . $user_battleship_ch
+eck_num[1] . $user_battleship_check_num[2] . $user_battleship_check_n
+um[3];
print $string_alet, " alet ", $string_anum, " anum", "\n";
foreach my $el (@main::user_ships::user_battleship) {
my ($let) = split('', $el); ### gdk edit
my ($num) = split('', $el); ### gdk edit
$main::user_ships::user_board[$let][$num] = "*";
}
push @main::user_ships::user_all_ships, @main::user_ships::user_battl
+eship;
}
sub get_user_ship_pos::destroyer () {
my @user_destroyer_check_let = ();
my @user_destroyer_check_num = ();
my $input = '';
my $decide = 1;
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "Please enter your destroyer positions (e.g. B1): ";
chomp($input = <STDIN>);
@main::user_ships::user_destroyer = split("", $input);
foreach my $el (@main::user_ships::user_destroyer) {
my ($let) = split('', $el); ## gdk edit
my ($one) = split('', $el); ## gdk edit
my ($two) = split('', $el); ## gdk edit
print $el, "el", $one, "one", $two, "two", "\n";
if ($el eq "B") {
$let = 1; ### gdk edit
}
my $num = 0;
if ($two == 1) {
$num = "$one" . "$two";
$num = $num - 1;
} else {
$num = $one - 1;
}
$el = "$let" . "$num";
print $el, "el again", "\n";
### GDK warning
push @user_destroyer_check_let, $let;
push @user_destroyer_check_num, $num;
}
@user_destroyer_check_let = sort {$a <=> $b} @user_destroyer_check_le
+t;
@user_destroyer_check_num = sort {$a <=> $b} @user_destroyer_check_nu
+m;
my $string_alet = $user_destroyer_check_let[0] . $user_destroyer_chec
+k_let[1] . $user_destroyer_check_let[2];
my $string_anum = $user_destroyer_check_num[0] . $user_destroyer_chec
+k_num[1] . $user_destroyer_check_num[2];
print $string_alet, " alet ", $string_anum, " anum", "\n";
foreach my $el (@main::user_ships::user_destroyer) {
my ($let) = split('', $el); ### gdk edit
my ($num) = split('', $el); ### gdk edit
$main::user_ships::user_board[$let][$num] = "%";
}
push @main::user_ships::user_all_ships, @main::user_ships::user_destr
+oyer;
}
sub get_user_ship_pos::submarine () {
my @user_submarine_check_let = ();
my @user_submarine_check_num = ();
my $input = '';
my $decide = 1;
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "Please enter your submarine positions (e.g. F5): ";
chomp($input = <STDIN>);
@main::user_ships::user_submarine = split("", $input);
foreach my $el (@main::user_ships::user_submarine) {
my ($let) = split('', $el); ## gdk edit
my ($one) = split('', $el); ## gdk edit
my ($two) = split('', $el); ## gdk edit
print $el, "el", $one, "one", $two, "two", "\n";
if ($el eq "F") {
$let = 5; ### gdk edit
}
my $num = 0;
if ($two == 5) {
$num = "$one" . "$two";
$num = $num - 1;
} else {
$num = $one - 1;
}
$el = "$let" . "$num";
print $el, "el again", "\n";
## GDK warning
push @user_submarine_check_let, $let;
push @user_submarine_check_num, $num;
}
@user_submarine_check_let = sort {$a <=> $b} @user_submarine_check_le
+t;
@user_submarine_check_num = sort {$a <=> $b} @user_submarine_check_nu
+m;
my $string_alet = $user_submarine_check_let[0] . $user_submarine_chec
+k_let[1] . $user_submarine_check_let[2];
my $string_anum = $user_submarine_check_num[0] . $user_submarine_chec
+k_num[1] . $user_submarine_check_num[2];
print $string_alet, " alet ", $string_anum, " anum", "\n";
foreach my $el (@main::user_ships::user_submarine) {
my ($let) = split('', $el); ### gdk edit
my ($num) = split('', $el); ### gdk edit
$main::user_ships::user_board[$let][$num] = "^";
}
push @main::user_ships::user_all_ships, @main::user_ships::user_subma
+rine;
}
sub get_user_ship_pos::patrol () {
my @user_patrol_check_let = ();
my @user_patrol_check_num = ();
my $input = '';
my $decide = 1;
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "Please enter your patrol positions (e.g. D3):";
chomp($input = <STDIN>);
@main::user_ships::user_patrol = split("", $input);
foreach my $el (@main::user_ships::user_patrol) {
my ($let) = split('', $el); ## gdk edit
my ($one) = split('', $el); ## gdk edit
my ($two) = split('', $el); ## gdk edit
print $el, "el", $one, "one", $two, "two", "\n";
if ($el eq "D") {
$let = 3; ### gdk edit
}
my $num = 0;
if ($two == 3) {
$num = "$one" . "$two";
$num = $num - 1;
} else {
$num = $one - 1;
}
$el = "$let" . "$num";
print $el, "el again", "\n";
### GDK warning
push @user_patrol_check_let, $let;
push @user_patrol_check_num, $num;
}
@user_patrol_check_let = sort {$a <=> $b} @user_patrol_check_let;
@user_patrol_check_num = sort {$a <=> $b} @user_patrol_check_num;
my $string_alet = $user_patrol_check_let[0] . $user_patrol_check_let[
+1];
my $string_anum = $user_patrol_check_num[0] . $user_patrol_check_num[
+1];
print $user_patrol_check_let[0], $user_patrol_check_let[1], $user_patr
+ol_check_num[0], $user_patrol_check_num[1], "patrol", "\n";
print $string_alet, " alet ", $string_anum, " anum", "\n";
foreach my $el (@main::user_ships::user_patrol) {
my ($let) = split('', $el); ### gdk edit
my ($num) = split('', $el); ### gdk edit
$main::user_ships::user_board[$let][$num] = "~";
}
push @main::user_ships::user_all_ships, @main::user_ships::user_patro
+l;
}
#*********************************************************************
+**********
#*******************************GAME-PLAY FUNCTIONS*******************
+**********
#*********************************************************************
+**********
sub game_play::decide () {
my $decide = '';
while (!$decide) {
print "\n1. You ($main::startup::name)";
print "\n2. Computer";
print "\n3. Random";
print "\n\nPlease enter digit to decide who goes first: ";
chomp($decide = <STDIN>);
if ($decide == 1 or $decide == 2) {
return $decide;
} elsif ($decide = 3) {
return int(rand(1000));
} else {
print "Your slection is not recognized. Please try again.\n";
$decide = '';
}
}
}
sub game_play::mode () {
my $mode = '';
while (!$mode) {
print "\n1. Regular";
print "\n2. Three-shot salvo";
print "\n\nPlease enter mode selection: ";
chomp($mode = <STDIN>);
if ($mode == 1 or $mode == 2) {
return $mode;
} else {
print "Your slection is not recognized. Please try again.\n";
$mode = '';
}
}
}
sub game_play::tree_branches () {
my @deciders = @_;
if ($deciders[0]/2 == int($deciders[0]/2)){
&game_play::com_start($deciders[1]);
} else {
&game_play::user_start($deciders[1]);
}
}
sub game_play::com_start () {
my ($decider) = @_;
print "COMPUTER STARTS . . . .\n\n";
sleep 1;
if ($decider == 2) {
&game_play::com_start::salvo_mode();
} elsif ($decider == 1) {
&game_play::com_start::reg_mode();
}
}
sub game_play::user_start () {
my ($decider) = @_;
print "$main::startup::name STARTS . . . .\n\n";
if ($decider == 2) {
&game_play::user_start::salvo_mode();
} else {
&game_play::user_start::reg_mode();
}
}
sub game_play::com_start::salvo_mode() {
while (!&game_play::dead_yet()) {
&game_play::salvo_mode::com_salvo();
&game_play::dead_yet();
print "USER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "COMPUTER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
$i = 0;
foreach my $el (@main::com_ships::com_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
&game_play::salvo_mode::user_salvo();
&game_play::dead_yet();
}
}
sub game_play::com_start::reg_mode() {
while (!&game_play::dead_yet()) {
&game_play::reg_mode::com_shot();
&game_play::dead_yet();
print "USER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "COMPUTER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
$i = 0;
foreach my $el (@main::com_ships::com_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
&game_play::reg_mode::user_shot();
&game_play::dead_yet();
}
}
sub game_play::user_start::salvo_mode() {
while (!&game_play::dead_yet()) {
print "USER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "COMPUTER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
$i = 0;
foreach my $el (@main::com_ships::com_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
&game_play::salvo_mode::user_salvo();
&game_play::dead_yet();
&game_play::salvo_mode::com_salvo();
&game_play::dead_yet();
}
}
sub game_play::user_start::reg_mode() {
while (!&game_play::dead_yet()) {
print "USER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
my $i = 0;
foreach my $el (@main::user_ships::user_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
print "COMPUTER BOARD:";
print "\n 1 2 3 4 5 6 7 8 9 10\n";
print " --------------------\n";
$i = 0;
foreach my $el (@main::com_ships::com_board) {
print "$main::letters::letters[$i]|";
print " @$el\n";
$i++;
}
&game_play::reg_mode::user_shot();
&game_play::dead_yet();
&game_play::reg_mode::com_shot();
&game_play::dead_yet();
}
}
sub game_play::salvo_mode::com_salvo () {
my $x1 = int(rand(10));
my $y1 = int(rand(10));
my $x2 = int(rand(10));
my $y2 = int(rand(10));
my $x3 = int(rand(10));
my $y3 = int(rand(10));
my @temp_checker = ("$x1" . "$y1", "$x2" . "$y2", "$x3" . "$y3");
if (($main::user_ships::user_board[$x1][$y1] eq 'X') or ($main::user_
+ships::user_board[$x1][$y1] eq 'O')) {
&game_play::salvo_mode::com_salvo;
return;
}
if (($main::user_ships::user_board[$x3][$y3] eq 'X') or ($main::user_
+ships::user_board[$x3][$y3] eq 'O')) {
&game_play::salvo_mode::com_salvo;
return;
}
if (($main::user_ships::user_board[$x2][$y2] eq 'X') or ($main::user_
+ships::user_board[$x2][$y2] eq 'O')) {
&game_play::salvo_mode::com_salvo;
return;
}
push @main::game_play::com_shots_check, @temp_checker;
if (($main::user_ships::user_board[$x1][$y1] eq '#') or ($main::user_
+ships::user_board[$x1][$y1] eq '*') or ($main::user_ships::user_board
+[$x1][$y1] eq '%') or ($main::user_ships::user_board[$x1][$y1] eq '~'
+) or ($main::user_ships::user_board[$x1][$y1] eq '^')) {
print "You've been hit!\n";
$main::user_ships::hits++;
$main::user_ships::user_board[$x1][$y1] = 'X';
} elsif ($main::user_ships::user_board[$x1][$y1] eq 'X') {
&game_play::salvo_mode::com_salvo;
return;
} else {
$main::user_ships::user_board[$x1][$y1] = 'O';
}
if (($main::user_ships::user_board[$x2][$y2] eq '#') or ($main::user_s
+hips::user_board[$x2][$y2] eq '*') or ($main::user_ships::user_board[
+$x2][$y2] eq '%') or ($main::user_ships::user_board[$x2][$y2] eq '~')
+ or ($main::user_ships::user_board[$x2][$y2] eq '^')) {
print "You've been hit!\n";
$main::user_ships::hits++;
$main::user_ships::user_board[$x2][$y2] = 'X';
} elsif ($main::user_ships::user_board[$x2][$y2] eq 'X') {
&game_play::salvo_mode::com_salvo;
return;
} else {
$main::user_ships::user_board[$x2][$y2] = 'O';
}
if (($main::user_ships::user_board[$x3][$y3] eq '#') or ($main::user_s
+hips::user_board[$x3][$y3] eq '*') or ($main::user_ships::user_board[
+$x3][$y3] eq '%') or ($main::user_ships::user_board[$x3][$y3] eq '~')
+ or ($main::user_ships::user_board[$x3][$y3] eq '^')) {
print "You've been hit!\n";
$main::user_ships::hits++;
$main::user_ships::user_board[$x3][$y3] = 'X';
} elsif ($main::user_ships::user_board[$x3][$y3] eq 'X') {
&game_play::salvo_mode::com_salvo;
return;
} else {
$main::user_ships::user_board[$x3][$y3] = 'O';
}
}
sub game_play::salvo_mode::user_salvo () {
my $input = '';
print "\n Please enter your three salvo shots (e.g. A4 B6 F4):";
chomp($input = <STDIN>);
my @user_shots = split(" ", $input);
if ($input !~ /^[A-J]\d0?\s[A-J]\d0?\s[A-J]\d0?$/i) {
print "You've entered invalid salvo shot. Please try again.\n";
&game_play::salvo_mode::user_salvo();
return 0;
}
if ($user_shots[0] eq ($user_shots[1] or $user_shots[2]) or $user_sho
+ts[1] eq $user_shots[2]) {
print "You have entered a co-ordinate twice. Please try again.\n";
&game_play::salvo_mode::user_salvo();
return 0;
}
foreach my $el (@user_shots) {
my ($let) = split('', $el); ## gdk edit
my ($one) = split('', $el); ## gdk edit
my ($two) = split('', $el); ## gdk edit
if ($el eq "A") {
$let = 0; ### gdk edit
}
if ($el eq "B") {
$let = 1; ### gdk edit
}
if ($el eq "C") {
$let = 2; ### gdk edit
}
if ($el eq "D") {
$let = 3; ### gdk edit
}
if ($el eq "E") {
$let = 4; ### gdk edit
}
if ($el eq "F") {
$let = 5; ### gdk edit
}
if ($el eq "G") {
$let = 6; ### gdk edit
}
if ($el eq "H") {
$let = 7; ### gdk edit
}
if ($el eq "I") {
$let = 8; ### gdk edit
}
if ($el eq "J") {
$let = 9; ### gdk edit
}
my $num = 0;
if ($two ne "") {
$num = "$one" . "$two";
$num = $num - 1;
} else {
$num = $one - 1;
}
$el = "$let" . "$num";
### GDK warning
foreach my $lee (@main::game_play::user_shots_check) {
if ($el eq $lee) {
print "You have entered invalid user shot. Please try again.
+\n";
&game_play::salvo_mode::user_salvo();
return;
}
}
foreach my $lee (@main::com_ships::com_all_ships) {
if ($el eq $lee) {
print "Computer ship hit!\n";
$main::com_ships::com_board[$let][$num] = 'X';
$main::com_ships::hits++;
last;
} elsif ($el ne $lee) {
$main::com_ships::com_board[$let][$num] = 'O';
}
}
}
push @main::game_play::user_shots_check, @user_shots;
}
sub game_play::reg_mode::com_shot () {
my $x1 = int(rand(10));
my $y1 = int(rand(10));
my $temp_checker = ("$x1" . "$y1");
if (($main::user_ships::user_board[$x1][$y1] eq 'X') or ($main::user_
+ships::user_board[$x1][$y1] eq 'O')) {
&game_play::reg_mode::com_shot; ### all ships were already hit an
+d the last choice by computer caused error: out of memory! attempt to
+ free unreferenced scalar at battleship.pl line 938, <STDIN> line 117
+.
return;
}
push @main::game_play::com_shots_check, $temp_checker;
if (($main::user_ships::user_board[$x1][$y1] eq '#') or ($main::user_
+ships::user_board[$x1][$y1] eq '*') or ($main::user_ships::user_board
+[$x1][$y1] eq '%') or ($main::user_ships::user_board[$x1][$y1] eq '~'
+) or ($main::user_ships::user_board[$x1][$y1] eq '^')) {
print "You've been hit!\n";
$main::user_ships::hits++;
$main::user_ships::user_board[$x1][$y1] = 'X';
} elsif ($main::user_ships::user_board[$x1][$y1] eq 'X') {
&game_play::reg_mode::com_shot;
return;
} else {
$main::user_ships::user_board[$x1][$y1] = 'O';
}
}
sub game_play::reg_mode::user_shot () {
my $input = '';
my $choosen = '';
print "\n Please enter your target: ";
chomp($input = <STDIN>);
$choosen = $input;
my @target_choice = split("", $input);
if ($input !~ /^[A-J]\d0?$/i) {
print "You've entered invalid target. Please try again.\n";
&game_play::reg_mode::user_shot();
return 0;
}
foreach my $el (@target_choice) {
my ($let) = split('', $el); ## gdk edit
my ($one) = split('', $el); ## gdk edit
my ($two) = split('', $el); ## gdk edit
if ($el eq "A") {
$let = 0; ### gdk edit
}
if ($el eq "B") {
$let = 1; ### gdk edit
}
if ($el eq "C") {
$let = 2; ### gdk edit
}
if ($el eq "D") {
$let = 3; ### gdk edit
}
if ($el eq "E") {
$let = 4; ### gdk edit
}
if ($el eq "F") {
$let = 5; ### gdk edit
}
if ($el eq "G") {
$let = 6; ### gdk edit
}
if ($el eq "H") {
$let = 7; ### gdk edit
}
if ($el eq "I") {
$let = 8; ### gdk edit
}
if ($el eq "J") {
$let = 9; ### gdk edit
}
my $num = 0;
if ($two ne "") {
$num = "$one" . "$two";
$num = $num - 1;
} else {
$num = $one - 1;
}
$input = "$let" . "$num";
print $el, "el again", "\n";
}
### gdk warning
foreach my $lee (@main::game_play::user_shots_check) {
if ($choosen eq $lee) {
print "You have entered invalid shot check. Please try again.\n"
+;
&game_play::reg_mode::user_shot();
return;
}
}
foreach my $lee (@main::com_ships::com_all_ships) {
if ($choosen eq $lee) {
print "Computer ship hit!\n";
$main::com_ships::com_board[$let][$num] = 'X';
$main::com_ships::hits++;
last;
} elsif ($choosen ne $lee) {
$main::com_ships::com_board[$let][$num] = 'O';
}
}
push @main::game_play::user_shots_check, $el;
}
sub game_play::dead_yet () {
if ($main::com_ships::hits eq '17') {
&game_play::end_game(2);
}
if ($main::user_ships::hits eq '17') {
&game_play::end_game(1);
}
}
sub game_play::end_game () {
my @winner = @_;
if ($winner[0] == 2) {
print "Congratulations! You won, $main::startup::name!\n\n";
exit;
} else {
print "Computer won. Better luck next time!\n";
exit;
}
}
sub game_play::THE_END () {
print "\n";
}
| [reply] [d/l] |
|
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";
}
| [reply] [d/l] |
|
|