ButtonTest08: 問題スルー時も「ハズレ」にカウントされるように変更
forked from ButtonTest07: 問題数を増やしてみました(徳川将軍クイズ) (diff: 43)
今回は明治維新のリーダークイズにしてみました。 答えられる質問だけこたえて「次の質問へ」ボタン連射→終了でも解答率が100%になる。。。 ↑を改善しました。 答えずに進むとハズレとしてカウントされます。
ActionScript3 source code
/**
* Copyright siouxcitizen ( http://wonderfl.net/user/siouxcitizen )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/tMmr
*/
// forked from hacker_7daxapax's ButtonTest07: 複数問クイズ形式に正答率計算機能を追加
//今回は明治維新のリーダークイズにしてみました。
//答えられる質問だけこたえて「次の質問へ」ボタン連射→終了でも解答率が100%になる。。。
//↑を改善しました。 答えずに進むとハズレとしてカウントされます。
package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
[SWF(width="500", height="500", backgroundColor="#FFFFFF")]
public class ButtonTest extends Sprite {
private var button01 : SimpleButton;//ボタン1
private var button02 : SimpleButton;//ボタン2
private var button03 : SimpleButton;//ボタン3
private var nextBtn : SimpleButton;//「次の問題へ」ボタン
private var question : TextField;//問題文テキスト
private var questionFormat : TextFormat;//問題文テキストフォーマット
private var judge : TextField;//判定文テキスト
private var judgeFormat : TextFormat;//判定文テキストフォーマット
private var target : CustomButton;//マウスイベントでターゲット情報取得用
private var questionNo : int = 0;//問題番号
private var questionArray : Array = new Array();//問題保持用配列
private var answerArray : Array = new Array();//解答保持用配列
private var answerCnt : int = 0;//解答回数
private var atariCnt : int = 0;//当たり回数
private var hazureCnt : int = 0;//ハズレ回数
private var answered : Boolean = false;//解答チェック 1度も解答せずに次問題に遷移した場合はハズレ回数をカウントアップ
private var atariLock : Boolean = false;//「当たり」ボタン連続押下による当たり回数アップを禁止 「ハズレ」は何回でも可
public function ButtonTest() {
questionArray.push("薩摩(鹿児島県)出身で(明治)維新の三傑\nの一人は?\n1、大久保利通\n2、原田泰造\n3、麻生太郎\n");
answerArray.push(1);
questionArray.push("薩摩(鹿児島県)出身で(明治)維新の三傑\nの一人は?\n1、島津斉彬\n2、西郷隆盛\n3、島津久光\n");
answerArray.push(2);
questionArray.push("長州(山口県)出身で(明治)維新の三傑の\n一人は?\n1、長州力\n2、長州小力\n3、木戸孝允\n");
answerArray.push(3);
questionArray.push("土佐(高知県)出身で仲の悪かった薩摩と\n長州の同盟をあっせんしたのは?\n1、坂本龍馬\n2、福山雅治\n3、玉木宏\n");
answerArray.push(1);
questionArray.push("奇兵隊など諸隊を創設し、長州藩を倒幕\nに方向付けたのは?\n1、大村益次郎\n2、高杉晋作\n3、山縣有朋\n");
answerArray.push(2);
questionArray.push("岩倉使節団を率いて欧米視察したのは?\n1、三条実美\n2、片岡鶴太郎\n3、岩倉具視\n");
answerArray.push(3);
//問題文表示用のテキストを設定
question = new TextField;
question.text = "";
question.x = 10;
question.y = 10;
question.width = 300;
question.height = 170;
question.multiline = true;
addChild(question);
initQuestion();//問題を初期化
//解答判定文表示用のテキストを設定
judge = new TextField;
judge.x = 55;
judge.y = 170;
judge.width = 400;
judge.height = 200;
judge.multiline = true;
judge.text = "";
addChild(judge);
//解答ボタン設定
button01 = new CustomButton("1",1);
button01.x = 350;
button01.y = 50;
button02 = new CustomButton("2",2);
button02.x = 350;
button02.y = 80;
button03 = new CustomButton("3",3);
button03.x = 350;
button03.y = 110;
button01.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
button02.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
button03.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
button01.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
button02.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
button03.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
addChild(button01);
addChild(button02);
addChild(button03);
//「次の問題へ」ボタン設定
nextBtn = new CustomButton("次の問題へ",1);
nextBtn.x = 350;
nextBtn.y = 150;
nextBtn.addEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDown);
addChild(nextBtn);
}
//配列から問題を取り出して問題を初期化
private function initQuestion():void {
//問題文テキスト設定
question.text = "問題 " + (questionNo+1) + "\n"
+ "\n"
+ questionArray[questionNo];
//問題文テキスト用フォーマット設定
questionFormat = new TextFormat();
questionFormat.font = "Courier New";
questionFormat.bold = true;
questionFormat.size = 15;
question.setTextFormat(questionFormat);
atariLock = false;//次問題のために当たり回数カウントアップができるようにする
}
//マウスダウンイベントの処理
private function onMouseDown(evt:MouseEvent):void {
if (questionNo > (questionArray.length-1)) return;//全問終了後は処理を行わない
answered = true; //解答(解答ボタンがクリック)された場合はtrueを設定
target = CustomButton(evt.currentTarget);
//当たりボタンは1問につき1回しかカウントされない
if (target.getBtnNo() == answerArray[questionNo]) {
judge.text = "当たり";
if (atariLock == false) {//同一問題の「当たり」ボタン連続押下時の当たり回数カウントアップを禁止
answerCnt++;//解答回数をカウントアップ
atariCnt++;//当たり回数をカウントアップ
atariLock = true;
}
//ハズレボタン押下時は何度でもカウントアップされる
} else {
answerCnt++;//解答回数をカウントアップ
judge.text = "ハズレ";
hazureCnt++;//ハズレ回数をカウントアップ
}
//判定文テキスト用フォーマット設定
judgeFormat = new TextFormat();
judgeFormat.font = "Courier New";
judgeFormat.bold = true;
judgeFormat.size = 150;
judge.setTextFormat(judgeFormat);
}
//「次の問題へ」ボタンのマウスダウンイベントの処理
private function onNextBtnDown(evt:MouseEvent):void {
if (questionNo > (questionArray.length-1)) return;//全問終了後は処理を行わない
if (answered == false) { //前問題が一度も回答されなかった場合は自動で解答回数とハズレ回数をカウントアップ
answerCnt++;
hazureCnt++;
}
answered = false; //次問題のために初期化
if (questionNo < (questionArray.length-1)) {
questionNo++; //次問題へ遷移するためにカウントアップ
question.text = "";
judge.text = "";
initQuestion();
} else {
questionNo++; //終了処理のためにカウントアップ
question.text = "";
endQuestion();
return; //クイズ終了後はこれ以後の処理を行わない
}
}
//マウスアップイベントの処理
private function onMouseUp(evt:MouseEvent):void {
//judge.text = "";
}
//全問終了後の処理
private function endQuestion():void {
//全問終了後メッセージ設定
//正答率を計算
var rate : int = 0;
if ((answerCnt != 0) && (atariCnt != 0)) {//解答回数と当たり回数がどちらも0でない場合のみ計算
rate = atariCnt/answerCnt*100;
}
question.text = "\n解答結果\n\n"//問題文テキストへ解答結果を設定
+ "解答回数: " + answerCnt + "回\n"
+ "当たり回数: " + atariCnt + "回\n"
+ "ハズレ回数: " + hazureCnt + "回\n"
+ "正答率: " + rate + "%\n";
//問題文テキスト用フォーマット設定
questionFormat = new TextFormat();
questionFormat.font = "Courier New";
questionFormat.bold = true;
questionFormat.size = 13;
question.setTextFormat(questionFormat);
judge.text = "クイズ終了です\nお疲れ様でした\n";//判定文テキストへ設定
//判定文テキスト用フォーマット設定
judgeFormat = new TextFormat();
judgeFormat.font = "Courier New";
judgeFormat.bold = true;
judgeFormat.size = 50;
judge.setTextFormat(judgeFormat);
}
}
}
import flash.display.*;
import flash.system.*;
import flash.text.*;
//カスタムボタン
class CustomButton extends SimpleButton {
private var btnName : String = "";//ボタン名
private var btnNo : int = 0;//ボタン番号
//コンストラクタ
public function CustomButton(label:String="",no:int=0) {
btnName = label;
btnNo = no;
//状態
upState = makeSprite(label,0x00FF00);
overState = upState;
downState = makeSprite(label,0x0000FF);
hitTestState = upState;
}
public function getBtnName():String {
return btnName;
}
public function getBtnNo():int {
return btnNo;
}
//ボタン用スプライト作成
private function makeSprite(text:String,color:uint):Sprite{
//ボタン用ラベル作成
var label : TextField = new TextField();
label.text = text;
label.autoSize = TextFieldAutoSize.CENTER;
label.selectable = false;
//ボタン用スプライト作成
var sp:Sprite = new Sprite();
sp.graphics.beginFill(color);
sp.graphics.drawRoundRect(0, 0, 100, 20, 15);
sp.graphics.endFill();
sp.alpha = 0.8;
sp.addChild(label);
//ラベル用フォーマット設定
var format:TextFormat=new TextFormat();
format.font = "Courier New";
format.bold = true;
format.size = 13;
label.setTextFormat(format);
return sp;
}
}