Я пишу игру в кости на Perl (правила предоставлены в комментариях к исходному коду).Одной из особенностей этой игры в кости, написанной на Perl, является возможность спросить пользователя, хотят ли они продолжать делать ставки или хотят ли они покинуть игру.Проблема, с которой я сталкиваюсь, состоит в том, что всякий раз, когда пользователь вводит в 'bet', кажется, что ни одна из других функций не вызывается, и программа просто завершает работу так же, как она должна завершаться, когда пользователь вводит 'exit'.
Я попытался разделить программу на еще больше функций и отследить направление вызовов функций вручную.Хотя я считаю, что имею опыт программирования на других языках, я относительно новичок в Perl, и синтаксис сильно отличается от других языков.Ожидаемые результаты:
ввод ставки вызывает другие функции, и в зависимости от броска костей эти функции вызывают другие функции, а когда пользователь вводит программу, она просто завершается.
Фактические результаты:
программа завершается, как только пользователь вводит что-либо на клавиатуре
use strict;
use warnings;
my $user_money= 500;#AMOUNT OF MONEY THE USER STARTS OUT WITH
my $die=0;#WHAT NUMBER THE DIE ROLLS, IS BETWEEN 1 AND 6
my $total_dicenum=0; #TOTAL VALUE OF THE ROLL
my $betorleave="";#TAKES IN USER INPUT REGARDING WHETHER THEY WANT TO CONTINUE BETTING OR LEAVE THE GAME
my $wager=0;#HOW MUCH MONEY THE USER BETS
my $numrolls=0;#KEEPS TRACK OF THE NUMBER OF TIMES THE USER HAS ROLLED THE DICE
my $player_point=0;#THE PLAYER'S 'POINT' THAT GET'S DETERMINED AFTER THE FIRST ROLL OF DICE
#DETERMINES WHETHER THE PLAYER HAS WON OR LOST A GAME
sub result(){
if($numrolls==1){
if($total_dicenum==7 or $total_dicenum==11){
print"you won!\n";
$player_point=$total_dicenum;
$user_money = $user_money +($wager*2);
$total_dicenum==0;
}
elsif($total_dicenum==2 or $total_dicenum==3 or $total_dicenum==12){
print"you lost\n";
$player_point=$total_dicenum;
$user_money = $user_money-$wager;
$total_dicenum==0;
}
else{
bet();
}
}
else{#ROLLS FOLLWING THE INITAL ROLL
if($total_dicenum==$player_point){
print"you won!\n";
$user_money = $user_money+($wager*2);
$total_dicenum=0;
main();
}
elsif($total_dicenum==7){
print"you lost\n";
$user_money = $user_money-$wager;
$total_dicenum=0;
main();
}
else{
bet();
}
}
}
#DICE ROLLER FUNCTION
sub rollDice(){
print"rolling dice...\n";
$die = 1 + int rand(6);
print"you rolled $die\n";
}
#BETTING FUNCTION
sub bet(){
print"how much money do you want to wager?\n";
print"you currently have $user_money dollars\n";
$wager=<STDIN>;
rollDice();
$total_dicenum+=$die;
print"your total score is $total_dicenum\n";
$numrolls++;
result();
}
#BELOW IS MAIN SUBROUTINE WHERE ALL THE ABOVE SUBROUTINES ARE CALLED
sub main(){
print"Welcome to craps! Here's $user_money dollars!\n";
print"would you like to place a bet or would you like to leave?(bet/leave)\n";
$betorleave=<STDIN>;
if($betorleave eq 'bet'){
bet();
}
if($betorleave eq 'leave'){
print"FINAL BALANCE:\n";
print"$user_money\n";
}
}
#CALLS THE MAIN FUNCTION
main();
#WHAT THIS PROGRAM IS SUPPOSED TO DO:
#Each player will start with $500.00. Initially, and after each turn give the user the option of betting or leaving the program.
#Implement this any way you wish, but make it clear to the user what their options are.
#If the user chooses to place a bet, ask for the amount that will be wagered and start that “turn,” or bet.
#Each turn will consist of one or more rolls of the dice.
#For each roll, the program should display the result of both die and the total value of the roll.
#Then indicate the outcome from that roll (win/lose/continue rolling).
#Once a turn, or bet is finished, indicate the outcome of the bet and the updated balance.
#When the user chooses to exit the program display their final balance.
#Total value of dice after first roll: 7 or 11 – player wins 2, 3, or 12 – player loses
#Any other value and the player rolls again – the total of the dice is now their “point”
#Total value of dice following the initial roll: The players “point” – player wins 7 – player loses
#Any other value and the player rolls again until rolling a 7 or their point