Возникли проблемы с вызовом функций для игры в кости, я пишу на Perl - PullRequest
0 голосов
/ 27 сентября 2019

Я пишу игру в кости на 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 

1 Ответ

2 голосов
/ 27 сентября 2019

Всякий раз, когда вы читаете данные из STDIN, используя <STDIN>, вы получаете новую строку, присоединенную к концу строки.Обычно вы этого не хотите, поэтому вы удалите его, используя chomp().

Итак, где у вас есть:

$betorleave=<STDIN>;

Вам необходимо иметь:

chomp($betorleave=<STDIN>);

Еще несколько (бесплатных!) Советов:

  1. Пожалуйста, научитесь отступать свой код.
  2. Пожалуйста, не используйте прототипы в подпрограммах (если вы не можете объяснить, почему они не должныиспользоваться в большинстве случаев).
  3. Подумайте о сфере действия ваших переменных.В целом, глобальные переменные плохие, и внутри подпрограммы следует использовать только те переменные, которые либо передаются в подпрограмму в качестве параметров, либо объявляются внутри подпрограммы.Например, ваша переменная $betorleave всегда используется только в подпрограмме main(), поэтому она должна быть объявлена ​​внутри этой подпрограммы.
...