Unityでクイズゲーム

ayumegu(プログラマー)
よろしくお願いします。

はい、今回はクイズゲームの基盤作ってみました,unityでw
ちなみにJavascriptでの実装です

現在の状態

WebPlayerでビルドしたものです。
スマホ用なので、本来は画面の両端は表示されないはずです・・・

クイズゲームのようなもの

とりあえず○×、4択、並べ替え、線つなぎの4パターン作ってみました。
上の方にいるモンスターは飾りです。まったく動かないです
単語は10個しかリストに登録していないです。

問題のデータ

問題のデータは非常にシンプル。
連番、ラテン語、読み、意味を配列に入れているだけです。
読みは現在は使っていません、はいw
あとこのフォント「〜」のもじがないみたいw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class DataBase{
    public static var WordData:Array = new Array(
"1,abeo,アベオ,立ち去る",
"2,ac,アク,そして(接続詞)",
"3,accipio,アッキピオ,受け取る",
"4,ad,アド,〜の方へ",
"5,ad hoc,アドホック,暫定の、臨時の",
"6,ad libitium,アド リビティウム,即興、アドリブ",
"7,admontio,アドモニティオー,忠告",
"8,adversus,アドウェルサス,反対の、逆の",
"9,aeon,イーオン,永遠",
"10,aera,アエラ,時代"
    );
}

単語の問題にしたのは単語さえあればここから上記4つの種類の問題を作成できるからです。 いちいち問題考えるのがめんどくさいからこうしたかんじですね

クイズのクラス

リファクタリングなどしていないので自由に作成したままのソースですが、問題を作成しているクラスです

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#pragma strict

public class Quiz{
  
  var kind:int; // 0:○× 1:4択 2:線つなぎ 3:Order
  var questionType:int;
  var question:String;
  var answerCount:int;  // answerCount
  var answerNo:int;         // answer list no
    var answerList:Array;   // Word List
    var quizWordList:Array; // 同じ単語が選択されないためのリスト
  var wordList:Array;     // DB
  
  
  function Quiz(){
      wordList = DataBase.WordData;
      question = "";
      quizWordList = new Array();
      for(var i = 0; i < wordList.length; i++){
          quizWordList.push(i);
      }
  }
  
  function create(){
      answerCount = 0;
      answerList = new Array();
      kind = Random.Range(0, ConstData.QUESTION_KIND);
  
      var wordCount:int;
      if(kind == 0){
          wordCount = 2;
          answerNo = 0;
          questionType = Random.Range(0,2);
      }else if(kind == 1){
          wordCount = 4;
          answerNo = Random.Range(0,4);
      }else if(kind == 2){
          wordCount = 4;
          answerNo = 0;
      }else if(kind == 3){
          wordCount = 1;
          answerNo = 0;
      }
      
      for(var i = 0; i < wordCount; i++){
          var rand:int = Random.Range(0,quizWordList.length);
          SetData(wordList[quizWordList[rand]]);
          quizWordList.splice(rand, 1);
      }
      var data:Word = answerList[answerNo];
      if(kind == 0){
          // select2
          if(questionType == 0){
              rand = Random.Range(0,2);
              if(rand == 0){
                  var batuAnswer:Word = answerList[1];
                  question = "ラテン語で " + data.latin +"\n日本語では " + batuAnswer.japanese + "である";
                  answerNo = 0;
              }else{
                  question = "ラテン語で " + data.latin +"\n日本語では " + data.japanese + "である";
                  answerNo = 1;
              }
          }else{
              rand = Random.Range(0,2);
              if(rand == 0){
                  batuAnswer = answerList[1];
                  question = "日本語で " + data.japanese +"\nラテン語では " + batuAnswer.latin + "である";
                  answerNo = 0;
              }else{
                  question = "日本語で " + data.japanese +"\nラテン語では " + data.latin + "である";
                  answerNo = 1;
              }
          }
      }else if(kind == 1){
          // select4
          if(questionType == 0){
              question = "ラテン語で " + data.latin +"\n日本語では?";
          }else{
              question = "日本語で " + data.japanese +"\nラテン語では?";
          }
      }else if(kind == 2){
          // lineConnect
          question = "日本語とラテン語の意味があうように\n線をつなげ";
          var str = "";
          var tmp:Array = new Array();
          // 一桁目の0は消えてしまうので1〜にする
          for(i = 1; i < 5; i++){
              tmp.push(i);
          }
          
          for(i = 0; i < wordCount; i++){
              rand = Random.Range(0,tmp.length);
              str += tmp[rand].ToString();
              tmp.splice(rand, 1);
          }
          answerNo = int.Parse(str);
      }else if(kind == 3){
          // order
          var answer:String = data.latin;
          question = "日本語で " + data.japanese +"\nラテン語では\n";
          
          if(answer.Length > 5){
              rand = Random.Range(4,answer.Length);
              if(rand <= 8){
                  answerCount = rand;
              }else{
                  answerCount = 8;
              }
          }else{
              answerCount = answer.Length;
          }
          for(i = 0; i < answer.Length; i++){
              if(i < answerCount){
                  question += "○";
              }else{
                  question += answer.Substring(i, 1);
              }
          }            
      }
  }

  function SetData(str:String){
      var splitData:Array = str.Split(","[0]);
      var word:Word = new Word();
      word.no = int.Parse(splitData[0]);
      word.latin = splitData[1];
      word.read = splitData[2];
      word.japanese = splitData[3];   
      answerList.push(word); 
  }
  
}
1
2
3
4
5
6
7
8
9
10
public class Word{

  // DBData
  var no:int;
  var latin:String;
  var read:String;
  var japanese:String;
  var english:String; // TODO

}

WordクラスはDataBaseのWordDataを格納するクラスです
Questクラス内で問題を作成しています。

各クイズの実装方針

○×クイズ

全体の配列から2つの単語をランダムに取得
さらにランダムで正解の場合は1つ目をそのまま表示
間違いの場合はもう一つのほうの単語を表示しています

4択クイズ

全体の配列から4つの単語をランダムに取得
そのなかからランダムで回答になる単語を取得し表示させています

線つなぎクイズ

全体の配列から4つの単語をランダムに取得
そのなかから回答の順番をランダムで作成し、表示しています。
answerCountに1234のように回答を入れています。
0は一桁目になるとなくなってしまうので1から入れました
あとは表示側がちょっとめんどくさいだけです。
線は手っ取り早くLineRenderer使ってます

単語並べ替えクイズ

全体の配列から1つ単語をランダムに取得
画面の横幅的に8こくらいまでかなということで、最大8文字までにしています。
5文字以上の場合、4〜8こ(最大は文字数まで)でanswerCountを設定しています。
頭からanswerCountが○になるようにしているので、もう少しいじればランダムな箇所からになります
あとは表示がわでランダムに1文字ずつ表示しています

今回の感想

そろそろちゃんとcocos2d-xもやろう
麻雀はほどほどにね。。。wうん