• ベストアンサー

Perl/CGIでスロットマシンを作っているのですが・・・

Perl/CGIで簡単なスロットマシンを作成しています。 一通りスクリプトは組んだのですが、うまく動作しません。 以下が自分で作成したスクリプトです。どこが不味いのか分からないので、間違えている箇所を教えてください。お願いします。 #!/usr/bin/perl $l = 1; require '/usr/perl5/site_perl/jcode.pl'; &decode; $bet = $FORM{'bet'}; $go = $FORM{'go'}; $coin = 50; if ($FORM{'bet'} = $bet) { $coin = --$coin; $bet = ++1; } elsif ($FORM{'go'} = $go) { @item=("7","BAR","BAR","@","@","@","-","-","-","-"); $a = $item[int(rand(10))]; $b = $item[int(rand(10))]; $c = $item[int(rand(10))]; if($a==$b||$b==$c) { if ($a == 7) {$coin = $coin + $bet * 50;} elsif ($a == BAR) {$coin = $coin + $bet * 10;} elsif ($a == @) {$coin = $coin + $bet * 5;} else {$coin = $coin + $bet * 2;} } } else {$coin = 0;} print<<EOF Content-type: text/html <html> <head> <meta http-equiv="Content-type" content="text/html; charset=euc-jp"> <title>スロットマシン</title> </head> <body> <form method="GET" action="kadai2b.cgi"> <center> コインの所持枚数 ($coin) 賭けるコインの枚数 ($bet)<br> [$a] [$b] [$c]<br> <input type="hidden" name="coin" value="$coin"> <input type="submit" name="bet" value="BET"> <input type="submit" name="go" value="GO"> <input type="reset" name="quit" value="QUIT"> <center> </form> </body> </html> EOF sub decode { $ENV{'REQUEST_METHOD'} =~ tr/A-Z/a-z/; if ($ENV{'REQUEST_METHOD'} eq "post"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode::convert(*value, 'euc'); $FORM{$name} = $value; } }

  • CGI
  • 回答数2
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
  • kt_yuka
  • ベストアンサー率53% (8/15)
回答No.2

何かの課題ですか? 丸投げって・・・。 でも暇だったのでちょっと追ってみました。 ---------------------------------------------------- $coin = --$coin; $bet = ++1; ↓ $coin -= 1; $bet += 1; ---------------------------------------------------- if($a==$b||$b==$c) { if ($a == 7) {$coin = $coin + $bet * 50;} elsif ($a == BAR) {$coin = $coin + $bet * 10;} elsif ($a == @) {$coin = $coin + $bet * 5;} else {$coin = $coin + $bet * 2;} } ↓ if($a eq $b||$b eq $c) { if ($a eq '7') {$coin = $coin + $bet * 50;} elsif ($a eq 'BAR') {$coin = $coin + $bet * 10;} elsif ($a eq '@') {$coin = $coin + $bet * 5;} else {$coin = $coin + $bet * 2;} } ---------------------------------------------------- print<<EOF ↓ print<<EOF; ---------------------------------------------------- とりあえずこれで動く? 動きがおかしいのは考えてね。

kwalkurei
質問者

お礼

回答有難うございました。動作はするようになりました。 まだ思うように動かない箇所は見直してみます。

その他の回答 (1)

回答No.1

ぱっと見は以下の2点ですね。 > if ($FORM{'bet'} = $bet) { if ($FORM{'bet'} == $bet) { > elsif ($FORM{'go'} = $go) { elsif ($FORM{'go'} == $go) {

kwalkurei
質問者

補足

回答有難うございます。 書いてある通りに修正してみましたが、まだ動作しませんでした。。。

関連するQ&A

  • CGI(Perl)を作ったがうまく実行されない

    度々すみません。 ~~~~HTML~~~~ <FORM action="test.cgi" method="POST" NAME="FORM"> <div>最大攻撃力:<INPUT type="text" NAME="att"><br></div> <div>防御力:<INPUT type="text" NAME="def"><br></div> <div>クリティ時与ダメ:<INPUT type="text" NAME="cyo"><br></div> <div>クリティ時被ダメ:<INPUT type="text" NAME="chi"><br></div> <div>EXD時与ダメ:<INPUT type="text" NAME="eyo"><br></div> <div>EXD時被ダメ:<INPUT type="text" NAME="ehi"><br></div> <INPUT type=submit value="実行"> <INPUT type=reset value="リセット"></TD> </FORM> ~~~~CGI~~~~ #! c:/perl/bin/perl if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair(split(/&/,$query)) { ($l_set,$value) = split(/=/,$pair); $form{$l_set}=$value; } $att=$form{'$att'}; $def=$form{'$def'}; $cyo=$form{'$cyo'}; $chi=$form{'$chi'}; $eyo=$form{'$eyo'}; $ehi=$form{'$ehi'}; $hi=int((($chi*2+$def)+(($ehi*2+$def)/1.2))/2); $yo=int(((($att-$cyo*2)*2)+(($att*1.2-$eyo*2)*2))/2); print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN"> <html> <head><title>被ダメテスト</title></head> <body><p>相手攻撃力は約<b>$hi</b>です。</p> <p>相手防御力は約<b>$yo</b>です。</p></body> </html> END このまま数値を入力して実行しても、「0」と出てきてしまいます。 読み込み(代入?)が出来ていないのでしょうか? 間違えている部分があればご指摘ください。 ※コンパイラはApacheです。

    • ベストアンサー
    • Perl
  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Perl 指定行への書き込み

    #!/usr/bin/perl require './jcode.pl'; $file = "houkoku.txt"; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\t//g; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/^\s+//; $value =~ s/\s+$//; $FORM{$name} .= (defined $FORM{$name}) ? "," . $value : $value; } open( WRITE, "+< $file" ); print WRITE $FORM{'name'},",",$FORM{'color'}."\n"; close(WRITE); foreach ( keys %FORM ) { if( $FORM{$_} eq '' ) { $FORM{$_} = '入力がありません'; } } #if ( $FORM{'name'} eq '' ) { $FORM{'name'} = '入力がありません'; } if ( $FORM{'color'} eq '' ) { $FORM{'color'} = '入力がありません'; } print "Content-Type: text/html\n\n"; print <<END_HTML; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <center> <table border="1"> <td> $FORM{'name'}</td> <td> $FORM{'color'}</td></tr> </table> </center> </body> </html> END_HTML exit; として、カンマ仕切りでデータを保存できるようになりました。 これを、指定行への書き込みを行いたいのですが、どのようにしたら良いでしょうか。 たとえば、5行目にこのデータを書き込んで、常に5行目を上書き更新するような感じです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • PerlでCGIを制作している初学者です。

    PerlでCGIを制作している初学者です。 画像付きのアンケートを作ろうとしているのですが、 その際のページの切り替えがうまくいきません。 普通に1ページに、ボタンやフォームを配置したアンケートは作れるのですが、 自身が作りたいのは、紙芝居のごとく、 1ページ目に画像とアンケートの選択肢であるチェックボックスがあり、 チェックボックス入力後に回答を押すと同時に、配列へチェックボックスの答えを格納し、 2ページ目のアンケートへ移るというものです。 1ページ目や2ページ目のhtmlファイルならびにcgiファイルは用意できているのですが、 1ページ目の返答ボタンをおした際の処理の記述がわかりません。 例えば、 1ページ目 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE></TITLE> </HEAD> <BODY> <CENTER> <img src="sample.jpg" alt="01" width=800px height=600px> <FORM method="POST" action="post.cgi"><BR> <INPUT type="radio" name="answer" value="010" checked>complete mismatch  <INPUT type="radio" name="answer" value="011">mismatch  <INPUT type="radio" name="answer" value="012">neutral  <INPUT type="radio" name="answer" value="013">match  <INPUT type="radio" name="answer" value="014">complete match  <BR> <BR> <INPUT type="submit" name="submit" value=" SEND "> <BR> </FORM> </CENTER> </BODY> </HTML> と記述し、 post.cgi #!/perl/bin/perl print "Content-type: text/html\n"; print "\n"; read(STDIN, $data, $ENV{'CONTENT_LENGTH'}); print "REQUEST_METHOD : $ENV{'REQUEST_METHOD'}<br>\n"; print "CONTENT_LENGTH : $ENV{'CONTENT_LENGTH'}<br>\n"; print "DATA : $data<br>\n"; としたとき、 1ページ目でsample.jpgについての意見をラジオボタンで選択し、それをpost.cgiにて表示させるというサンプル(ここを後で変数の格納に変えます)ですが、この時、1ページに似た構成の2ページ目のアンケートへのリンクの仕方がわかりません。 イメージ的には、 1ページ目表示→回答を配列[0]に格納→2ページ目表示→回答を配列[1]に格納→・・・ 最終的には、各ページの回答を記録した配列を出力します。 以上のようなことを実現したいのです。 WEBなどを探してみたのですが、1ページにボタンやフォームがたくさん埋め込まれたものは発見したのですが、この紙芝居的なアンケートのヒントになりそうなものが見つかりませんでした。 アドバイスや、忠告などで結構ですので、回答を頂けると幸いです。

    • 締切済み
    • CGI
  • チェックボックス 横並びに保存

    htmlファイルから、 <form action="./ppp.cgi" method="POST"> <table border="1"> <tr> <td> 好きな色(複数選択可):</td> <td> <input type="checkbox" name="color" value="white">白 <input type="checkbox" name="color" value="red">赤 <input type="checkbox" name="color" value="green">緑 <input type="checkbox" name="color" value="pink">桃色 <input type="checkbox" name="color" value="yellow">黄色 <input type="checkbox" name="color" value="purple">紫 <input type="checkbox" name="color" value="orange">橙色 <input type="checkbox" name="color" value="blue">青 <input type="checkbox" name="color" value="black">黒</td></tr> </table><br> <input type="submit" value=" 送信 "> <input type="reset" value=" クリア "> でデータを送信して、 ------------------------------------- #!/usr/bin/perl require './jcode.pl'; $file = "houkoku.txt"; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } open( WRITE, "+< $file" ); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); # タグ処理 $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\t//g; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/^\s+//; $value =~ s/\s+$//; $FORM{$name} .= (defined $FORM{$name}) ? "," . $value : $value; @value = $value; print WRITE"@value\n"; } foreach ( keys %FORM ) { if( $FORM{$_} eq '' ) { $FORM{$_} = '入力がありません'; } } if ( $FORM{'color'} eq '' ) { $FORM{'color'} = '入力がありません'; } print "Content-Type: text/html\n\n"; print <<END_HTML; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <center> <table border="1"> <td> あなたの好きな色</td> <td> $FORM{'color'}</td></tr> </table> </center> </body> </html> END_HTML exit; ---------------------------------- でデータを受け取って、houkoku.txtに書き込みをしたいのですが、 一応書き込みはされていますが、縦にデータが並んでいます。 横にカンマ仕切りで、white,yellow,redと保存するにはどうしたらよいでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlの文でわからないところがあります。(2)

    こんにちわwindwsです。パールの文章でわからない箇所があります。先輩の皆さま、どうか宜しくお願いします。以下に文章を書きます。 (1) BEGIN {$ENV{PATH} = "/bin/usr/bin";   delete @ENV{pw (IFS CDPATH ENV BASH_ENV)};  ●sub unindent;} 特に●のヵ所はどう考えたら良いのか解りません。サブルーチンを宣言しているのですか?サブルーチンの戻り値を呼び出しているのでしょうか? (2) <FORM ACTION="/cgi/program.cgi" METHOD="POST"> <INPUT TYPE="hidden" NAME="id" ● VALUE="e07a08c4612b0172a162386ca558c6"> ここの●の行で識別子VALUEの値は誰がどのようにして決めるのですか? 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 配列の中身がイコールならばとしたいです。

    こんばんわ。ホームページのフォームを使って色を三色選んでもらい、それに対して貴方はこんな方ですね、としたいのですが、 好きな色3色選んでください。 <form method="post" action="hoge.cgi">  <input type="checkbox" name="q1" value="赤">赤  <input type="checkbox" name="q1" value="青">青  <input type="checkbox" name="q1" value="黄">黄色  <input type="checkbox" name="q1" value="紫">紫  <input type="checkbox" name="q1" value="黒">黒  <input type="checkbox" name="q1" value="白">白  <input type="checkbox" name="q1" value="ピンク">ピンク  <input type="checkbox" name="q1" value="緑">緑 <br> <br> <input type="submit" value="結果を見る!!"> <input type="reset" value="取消"></form> とフォームから3つ選んでもらい、送信します。 そして、perlで記述したCGIで、 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer .= $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $out{$name} = $value; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; if ($name eq "q1") { push (@check1,$value); } } print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head><title>$title</title></head>\n"; print "<body>\n"; #配列の数個を数える。3個以外はプログラムを中止。 $num = $#check1; if ($num ne 2){ print "3個選んでね。"; exit; } #もし配列の中身が次の3つだったら、"貴方は素敵ですね"と答える。 if (@check1 eq "黄","紫","黒"){ print "貴方は素敵ですね。";} #elsif (){;} else { print "ごめんね。データがないよ。";} print "</body>\n"; print "</html>\n"; exit; と、したのですが、どの色を選んでも、貴方は素敵ですね。としか、表示されません。赤と紫と黒を選んでも、同じです。配列を eq としている時点でどうかと思いますが、選んだ3つがイコールの場合、貴方は素敵ですねと表示されるようにしたいです。自分でも調べていますが、よろしかったら是非お教えください。 でわ。

    • ベストアンサー
    • CGI
  • CGI初心者です

    sub html でフォームに入力してもらい、 sub kekka で入力情報を確認し、 sub shori でテキストファイルに登録。 というプログラムを考えているのですが、 フォームから入力されたデータが入った変数$in{'name'} が、sub shori に移ると消えてしまいます。 いろいろ試行錯誤したのですが分かりませんでしたので 教えていただけたらと思います。 以下がサンプルのソースです。 #!/perl/bin/perl require './jcode.pl'; require './cgi-lib.pl'; &ReadParse; if($in{'action'} eq "set"){&kekka;} elsif($in{'action'} eq "sss"){&shori;} else{&html;} sub html{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト1</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="set">\n 名前<br><input type=text name="name" size="30" MAXLENGTH="30"><br>\n <input TYPE="submit" value="確認"><INPUT type="reset" value="リセット">\n </form>\n </body>\n </html>\n EOM } sub kekka{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト2</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="sss">\n name = $in{'name'} <input TYPE="submit" value="登録">\n </form>\n </body>\n </html>\n EOM } sub shori{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト3</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n name = $in{'name'} </form>\n </body>\n </html>\n EOM }

    • ベストアンサー
    • Perl

専門家に質問してみよう