ラウンジ(兼FAQ掲示板)

画像式スロットにメッセージを付けたい
過去ログ NO.1160870229
□ taka [2006年10月10日14時55分]
申し訳ありません、また質問させて下さい。
スクリプトの質問というよりも、javascriptの記述法についての質問ですので、
こちらの掲示板の趣旨には合ってないかと思いますが、ご教授頂けましたら幸いです。

画像式スロットのスクリプトを頂戴しまして、いろいろ手を加えてみましたが、
今回、ある特定のスコアに到達したときにフォームにメッセージを流したいと思い、
メッセージを表示するところまでは何とかできました。

ただ、あるメッセージが表示されると、他のメッセージの条件を満たすまではそのままそのメッセージが表示されたままになってしまいます。

これをメッセージを表示後任意の時間で消えるとか、
スタートを押すと消えるなどできないでしょうか?

以下、長いですがスクリプトのソースを貼り付けておきます。


funtion comp(){
document.slot_form.elements[0].value = "すた〜と♪";
lock = 0;
if (s1 == s2 && s2 == s3) {
if (s1 == 0) pay += (100 * x *50);
else if (s1 == 1) pay += (100 * x *50);

==========以下、中略==========

else if (s1 == 8) pay += (100 * x *-5);
else if (s2 == 8) pay += (100 * x *-5);
else if (s3 == 8) pay += (100 * x *-5);

//以下の記述を追加

if (pay >= 10000) mes();
if (pay >= 100000) mes();
if (pay >= 1000000) mes();
if (pay < 2000) mes();

//ここまでを追加

if (pay <= 0) over();
else pre();
}

//以下、新しく記述(メッセージ用のフォームはmes_slot、フォーム名はmes

function mes() {
if (pay <= 2000){
document.mes_form.mes.value = "ああ〜ん、大丈夫ぅ〜?";
}
if (pay >= 10000){
document.mes_form.mes.value = "まずは¥10000だネ♪";
}
if (pay >= 100000){
document.mes_form.mes.value = "¥100000突破だよ!がんばってるネ♪";
}
if (pay >= 1000000){
document.mes_form.mes.value = "スゴ〜い!¥1000000だよお〜";
}
}

//ここまでを新たに記述

function over() {
if (confirm("あ〜ん!なくなっちゃったぁ〜……続ける?")) {
pay = 3000;
x = 1;
}
else alert("また遊んでネ♪");
document.slot_form.elements[1].value = "x1";
pre();
}

onload = pre;

// Copyright (C) 2002-2002 suepon , All rights reserved.
// Script found at
http://suepon.com/


スロットのページはまだ更新していませんが、URL書いておきます。

http://www15.plala.or.jp/kleineburg/slot.htm
□ NXer [2006年10月10日22時57分]

>javascriptの記述法
も含めてラウンジのテーマと思います。NXerです。

>メッセージを流し
もし、デザイン的に問題がなければ
--------------------------------------------
if (pay == 800) {alert("おめでとう");} //alertで処理する例
---------------------------------------------
alertなどのjavascriptに組み込まれた機能を使うのがエレガント
(合理的)な気がします。とても簡単です。

Takaさんのメッセージ用関数
document.mes_form.mes.value
は、エラーが出ました。そこで

document.slot_form.elements[2].value
を使ってみました。確かに、残りますね。
初期状態をHTML文で下の例のようにして、次に
初期値のcoment文に戻す関数を作成してみました。

>押すと消える
例です。(alertの例は//で無効にしてあります。使わない時は削除します。)
------------------------------------------------
else if (s1 == 3 && s2 == 3) pay += (100 * x *5);
else if (s1 == 3) pay += (100 * x);
// if (pay == 800) {alert("おめでとう");} //alertで処理する例
if (pay == 800) {coment();} //takaさんのmessage関数起動
if (pay <= 0) over();
else pre();
}
function coment(){//条件文とメッセージ、すぐテストできる一例のみ掲載
if (pay == 800){
document.slot_form.elements[2].value = "おめでとう";
}
}

function coment_init(){//メッセージを初期値に戻す関数
document.slot_form.elements[2].value = "coment";
}
-------------------------------------------------------------------
HTML文中
<INPUT type="button" onclick="slot(this);blur()" value="START"> <BR>
<BR>
BET <INPUT type="button" onclick="bet(this);blur()" value="x1"> <BR>
<BR><BR>
coment <INPUT type="button" onclick="coment_init(this);blur()" value="coment"><BR>
<BR>以下略
-------------------------------------------------------------
関数の注意点は、elements[2] の引数2を指定する点です。
ボタンをクリックするとメッセージは、初期の文に戻り
ます。適当な表現に変えてお試しください。

すえぽんさんの原作を模倣する程度の知識しかありませんが、
動作しましたので、プログラミングやデザインはエレガンスを
欠くと思いますが、お知らせします。

以上です。
************************************************
なおご質問にはありませんが、貴電光!のリロードについてです。
Takaさんのcgi歴が不明であることとjavascriptと混乱する恐れが
あるために注意が必要ですが、スロットゲームが一段落して時間の
あるときに次の点を検討されてはいかがでしょうか。

契約するプロバイダーのサーバは
1 cgi用サーバ と
2 html用サーバ と
が異なる仕様であるのか、ないのかです。
もし1.1と1.2を一つのサーバで処理しているならリロードしなくても
新規投稿が電光!に反映されます。

しかし、別のサーバの場合は、スクリプト中に書いてあるとおりに
#+++++ 以下自動更新モード設定
部分を初期設定すれば、おそらくうまく動作すると思います。動作
しない恐れも十分にあります。慎重にお願いします。
試す場合、現在のdenkoh.cgiはそのままにして
denkohv2.cgiのように別のcgiファイル名にして初期設定や動作を
試されれば、不具合解消後そのまま新しい版を使い、旧版は削除
します。

ついでにスロットゲームの最高点ですが、今は自己申告制です。
利用者やTakaさんを信頼していますが、しかし、自動登録でない
ことから、電光!の画像表示機能を省略しないで、そこに
最高点をゲットした画像を初期設定の画像サイズ(例 20K以下)
で、できる方にはアップロードしていただくようにすれば、信頼性が
向上すると思います。
ただし、サーバの仕様で画像ファイルにアクセスできる環境が保障
されている必要があります。貴サーバの仕様などは不明なままに愚見、
愚案で失礼します。
□ taka [2006年10月11日06時40分]
NXerさん、前回に引き続き貴重なアドバイスありがとうございます。

>>alertなどのjavascriptに組み込まれた機能を使うのがエレガント
(合理的)な気がします。とても簡単です。

確かにこの方法ですとJavaScript初心者の私でも簡単にできて便利なのですが、
alertは警告ウィンドウが開きます(と思うのですが)から、
利用者にいちいちウィンドウを消してもらわなければいけないですよね?
ウィンドウのデザインもいかにも「警告」みたいで無味乾燥なので、
メッセージをいろいろなパターンで流したい私としては、
alertを多用するのはなるべく避けたい(せいぜいが所持金がゼロになったときくらいにしたいです)ところなんです。

メッセージ関数に関してですが、
正直、スクリプトの知識が皆無に近く、オリジナルのスクリプトを見ながら
「こうすれば出るのかな?」と試行錯誤している状態です。
例を提示して頂きましたので、参考にしつつやっていこうと思います。
アドバイスありがとうございます。

後、電光掲示板の件までご意見を頂きありがとうございます。

仰られる通り、私の契約サーバー(plala)はhtmlとcgiを別々のサーバーに置く仕様の上、
スロットのページにそのまま電光の表示スクリプトを置くと、スロットも動かなくなってしまいます。
こちらのFAQの過去ログにどうやらスクリプト変数の競合でそういう現象が起こることもあるので、
フレームで表示してはどうかとありましたので、
電光掲示板のみを別ページに置いて、インラインフレームで表示するという手法を取ってみました。

画像アップ機能も使いたかったのですが、画像自体はアップされるのですが
htmlとcgiが別サーバーなためなのか、あるいはフレーム表示のせいなのか分かりませんが、
アップされた画像(16kb程度のjpg画像でテストしてみました)が使用不可になってしまいます。

いろいろと貴重なアドバイス、ご意見ありがとうございました。
今後ともお世話になるかと思いますが、よろしくお願いいたします。


□ taka [2006年10月11日22時13分]
いろいろ試行錯誤した結果、以下のようにソースをいじったら
スタートボタンを押すことで、メッセージを初期状態に戻せるようになりました。
果たしてこれが「正しい」記述なのかは分かりませんが、
とりあえずうまく行きそうです。

function slot(parts) {
if (parts.value == "すた〜と♪") {
reach = 0 ;
if (pay <= 0) { over(); return; }
else if (100 * x > pay) {
alert("そんなに賭けられないよぉ〜");
return;
}
else lock = 1;
pay -= (100 * x);
pre();
document.slot_form.elements[0].value = "ちょっと待って…";
   document.mes_form.mes.value = "何が出るかな?";//この部分
shfl1();
setTimeout("shfl2()",500);
setTimeout("shfl3(1)",1000);
}
else if (parts.value == "ひだり") {
clearTimeout(id1);
document.slot_form.elements[0].value = "まんなか";
}
else if (parts.value == "まんなか") {
clearTimeout(id2);
document.slot_form.elements[0].value = "みぎ";
}
else if (parts.value == "みぎ") {
d = new Date();
min = d.getSeconds();
stop1(1);
}
}

いろいろとアドバイス、ありがとうございました。
とりあえず今回の件で返信あるかもしれませんので、
もうしばらく継続中にしておきたいと思います。
□ NXer [2006年10月12日21時12分]

Takaさん、ゲームが進化している様子のごていねいな報告、
うれしいです。また心からありがとうございます。NXerです。

練習などを除き、プログラミングには、その源に伝えたい、
何かストーリが必要です。複雑な内容でも、javascript
などの初歩的なルールを使って、かなり表現できます。また、
一人ひとり作品作りは異なるところが面白いと思います。

以下は、たとえば、私の考えた、メッセージの主を明示する
方法です。s1のキャラが3の場合で、所持金1100円
になった時、3キャラ固有のセリフがあるように思いますが、下の
例では、平凡な祝福のことばを使っています。

ゲームにも、山(クライマックス)あり谷(アンチクライマックス)あり、
そして時に、思わぬ展開に落ちをつけることも、それらのメッセージで
可能かもしれません。
ゲームを通して、ささやかであるにしてもTakaさんのさわやかな、また
熱いメッセージが伝わるものになれば、趣味を同じくする人はもちろん
そうでない人にとっても、意味のある作品になると愚考します。

if (条件文){式、 さらにif(条件)式;} とストーリを
展開することができます。else if さもなければも{ }に
加えるとかなり複雑になり、キャラに矛盾しない発言にするような
注意が必要です。数値を比較する時は、== です。= は値の代入です。

------------------------例 s1 3キャラで 所持金が1100円なら
else if (s1 == 3) {pay += (100 * x);
if (pay == 1100) coment();}

---------------------------------------------
function coment(){
if (s1 == 1){
document.slot_form.elements[2].value = "(1キャラから)がんばってね";
}
else if(s1 == 2){
document.slot_form.elements[2].value = "(2キャラから)一つ上を目指してね";
}
else if(s1 == 3){
document.slot_form.elements[2].value = "(3キャラから)おめでとう";
}
}
-------------------------------------------

pay >= 1100円 の条件文では、1100以上は次の設定値まで常に同一メッ
セージが繰り返し表示されます。通過ポイントの時は、== で1100円
の時だけにすることができます。

単純なコメントや愚案でかえって貴重な創作のための時間を浪費させたり
しました点はご容赦ください。貴サイトが、より多くのひとびとに
アクセスされて、Takaさんの暖かいメッセージが伝わることになれば
うれしい限りです。レスの機会を与えていただきましたこと、ありが
とうございます。ラウンジ主宰のすえぽんさんには、いつもとかわら
ない感謝を申し上げます。
□ taka [2006年10月14日08時25分]
NXerさん、本当にありがとうございます。

アドバイスを参考にスロットに止まったキャラクターと、
その時点での得点によりメッセージを細分化できるようになりました。

まだ各レベル?でのセリフは1種類ですが、
それでも得点レベルが9段階ありますし、キャラクターも12種類ありますから、
現在は108種類のメッセージ表示パターンがあることになります(外部スクリプトにして正解でした…)。
これで各キャラごとにelse ifなどで条件分岐をつけると、
さらに面白くなりそうですね(レアセリフとか…)。

今後は大当たり目が出たときの演出などをやってみようと思ってます。

改めまして、貴重なアドバイスへのお礼申し上げます。
ありがとうございました。




□ NXer [2006年10月14日21時09分]

>大当たり目

のようなますます発展するスクリプトに必要となるかもしれないjavascript
のデータ処理方法、配列について追記します。NXerです。

scriptの最初で、次のようにセリフを定義します。
-------------------------------------------------------
data =new Array("がんばってね(キャラ1セリフ)","(キャラ2)",略,
,"(キャラ11)","(キャラ12)");
msg1=new Array;  //配列宣言
for (i=0;i<12;i++) //配列は0から始めます 
{
msg1[i]=data[i]; //配列にセリフを格納
}

----------------------------セリフ確認用に3〜1のいずれかとしています
else if (s1 == 3 || s1 == 2 || s1 == 1) {pay += (100 * x);coment();}

-----------------------------------coment関数 msg2[i]定義は割愛
function coment(){
if (pay==1100){
document.slot_form.elements[2].value = msg2[s1-1];}
if (pay==900 || pay == 1000){ //確認用に出やすい値、ここが大当たり目
document.slot_form.elements[2].value = msg1[s1-1];}
}
---------------------------------------
msg1[s1-1] の-1は、配列を0から初めているのとスロットの数字が
1から始まるズレの補正です。プログラミングでは、メモリーを0位置
から数えるために、通例、配列1とは0の次で2番目の位置を示す数です。

このような配列の処理で、セリフ文字列の保守性が向上する効果
があります。
他に、外部スクリプトの場合、サーバに負荷をかけることから、スクリプト
を少しでもコンパクトにすることができます。
外部スクリプトの特徴を参考書からまとめておきます。

1 利点 ブラウザからjavascriptを隠すことができます。
2 欠点 HTMLとjsファイルを、サーバからダウンロードします。
     そのため、サーバに負荷がかかります。
1 サーバの処理が遅い
2 すでに高負荷である
ような場合に、不具合が発生する恐れがあるようです。
(宮坂雅輝、JavaScript Handbook ソフトバンク 2002 p.19)

4年前の出版時とはサーバの性能も格段に向上していることから、
この程度の少々長く、複雑なスクリプトに問題はないと思われます。
しかし、これからアクセスが増えて、大勢の人が同時にアクセス
をした場合、何か不具合(メッセジ表示の遅延など)が発生する
かもわかりません。もちろん、念のために、サーバの仕様、制限には
十分すぎるほど、ご注意ください。

より高度なスクリプトは、最新の参考書やウェブで検索してください。
それは、当方の能力を越えますので、これにてjavascriptの件は、勝手
ながら、終結させていただきます。
□ taka [2006年10月15日08時56分]
NXerさん、いつも本当にありがとうございます。

javascriptはとにかくできることが多いみたいですから、
今後、少しずつ勉強しながらいろいろといじって行きたいと考えてます。

私などのためにお時間と知恵を頂きましたこと、
この場を借りましてお礼申し上げます。

さしあたっては当スレッドはこれにて終了させ、
過去ログに移したいと思います。

私のようなjavascript素人でもやりようでは何とかなる、
という実例くらいにはなってくれたと信じて、終了の挨拶にしたく思います。
ありがとうございました。

suepon.com | CGI作成/CGI制作 | JavaScript | ドメイン検索 | バナー自動作成 | Google ダンスツール | 松浦亜弥 | H.P.memo | パソコン | ネイル

Copyright (C) 2002 - 2008 suepon , All rights reserved. Powered by CGI Script Market.