teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

別ページへの記入を転載

2019/09/24 07:24

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,17 +1,211 @@
1
1
  Javascriptでタイピングゲームを作っております。
2
2
  システムを作成するうえでいくつか不明点があったので、教えていただきたいです。
3
3
 
4
+ 画面のサンプル
5
+ ---
6
+ **<ユーザー名登録画面>**
7
+ こちらの方はやり方が全く分からない状態です。
8
+ ここで入力された文字列を後に表示するランキングに使います。
9
+ 理想とする画面は以下のような感じです。
4
- 画面のサンプルを記載しました→[https://67sj680e.client.jp](https://67sj680e.client.jp)
10
+ ![イメージ説明](647880adaa48e1e75faa7d07ed718898.png)
5
11
 
12
+ **<ゲーム画面>**
13
+ こちらは何となく作成してみました。JSを下に入力しておきます。なお、表示は以下のようになっています。
14
+ ![イメージ説明](a67732194431aab430bd4bcc4d3dca94.png)
15
+
16
+ **<ランキング画面>**
17
+ ランキングはTOP10あるいはTOP5で考えています。こちらは上記のゲームと組み合わせることができず、単独になってしまいますが、記載します。なお、理想とする画面は以下のような感じです。
18
+ ![イメージ説明](3b9a70d2e622cd36247eec117a61e3b1.png)
19
+
6
20
  上記サンプルは理想とする表示です。
7
21
  できるだけサンプルを参考にお答えいただきたいです。
8
22
 
23
+ HTML・JS・CSS
24
+ ---
25
+ 画面のHTML
26
+ ```HTML
27
+ <!DOCTYPE html>
28
+ <html>
29
+  <head>
30
+   <meta charset="UTF-8" />
31
+   <title>typingGame</title>
32
+   <link rel="stylesheet" type="text/css" media="screen,print" href="style.css" />
33
+  </head>
34
+ <body onLoad="disp()">
35
+ <center>
36
+ <font size="7" color="blue">
37
+ <b>
38
+ タイピングバトル!<br>
39
+ </b>
40
+ </font>
41
+ <font size="5">
42
+ <b>
43
+ 枠内の文字を打ってください。<br>
44
+ </b>
45
+ </font>
46
+ <form action="#" name="form1">
47
+ <input type="text" name="field1" size="2"> 時間
48
+ <input type="text" name="field2" size="2"> 分
49
+ <input type="text" name="field3" size="2"> 秒
50
+ </form>
51
+ <div id="frame"></div>
52
+ <input type="button" class="button" id="restart" value="restart" onclick="gameSet()">
53
+ <script type="text/javascript" src="mainGame.js"></script>
54
+ </center>
55
+ </body>
56
+ </html>
57
+
58
+ ```
59
+ ゲーム本体のJavaScript
60
+ ```JavaScript
61
+ //0~25までの乱数を格納する配列
62
+ var rand = new Array();
63
+ //問題の文字列を格納
64
+ var mondai = "";
65
+ //何問目か格納
66
+ var count = 0;
67
+ //問題数
68
+ var queNum = 200;
69
+
70
+ /*--------------------------------------------*/
71
+
72
+ //キー状態管理変数の定義
73
+ var KEYS = new Array(256);
74
+ //キーの状態を false (押されていない)で初期化
75
+ for(var i=0; i<KEYS.length; i++) {
76
+ KEYS[i] = false;
77
+ }
78
+ //キーが押された時に呼び出される処理を指定
79
+ window.onkeydown = function(e) {
80
+ //キーボードによる自動スクロールの防止
81
+ e.preventDefault();
82
+ //キーを押された状態に更新
83
+ KEYS[e.keyCode] = true;
84
+ typeGame();
85
+
86
+ };
87
+ //キーが離された時に呼び出される処理を指定
88
+ window.onkeyup = function(e) {
89
+ //キーを離された状態に更新
90
+ KEYS[e.keyCode] = false;
91
+ };
92
+ //キーコードを格納する配列
93
+ var kCode = new Array(65,66,67,68,69,70,71,72,73,
94
+ 74,75,76,77,78,79,80,81,82,
95
+ 83,84,85,86,87,88,89,90);
96
+ //文字を格納する配列
97
+ var Alphabet = new Array("A","B","C","D","E","F","G","H","I",
98
+ "J","K","L","M","N","O","P","Q","R",
99
+ "S","T","U","V","W","X","Y","Z");
100
+
101
+ /*--------------------------------------------*/
102
+
103
+ //タイピングゲームの問題をセットする
104
+ function gameSet(){
105
+ //問題文とカウント数とスコアをクリアする
106
+ mondai = "";
107
+ count = 0;
108
+ //0~25までの乱数を queNum 個作成して配列randに格納する
109
+ for (var i = 0;i < queNum ;i++){
110
+ rand[i] = Math.floor( Math.random() * 26 );
111
+ }
112
+
113
+ //問題文の作成
114
+ for ( var i = 0 ; i < queNum ; i++){
115
+ mondai = mondai + Alphabet[rand[i]];
116
+ }
117
+
118
+ //問題枠に表示する
119
+ document.getElementById("frame").innerHTML = mondai;
120
+ }
121
+
122
+ //キー入力を受け取る
123
+ function typeGame(){
124
+ //入力されたキーコードと、問題文のキーコードを比較
125
+ if(KEYS[kCode[rand[count]]]){
126
+ //カウント数を+1にする
127
+ count++;
128
+
129
+ //全文字入力したか確認
130
+ if (count < queNum){
131
+ //問題文の頭の一文字を切り取る
132
+ mondai = mondai.substring(1,mondai.Length);
133
+ //問題枠に表示する
134
+ document.getElementById("frame").innerHTML = mondai;
135
+ }else{
136
+ //問題枠にゲーム終了を表示
137
+ document.getElementById("frame").innerHTML = "ゲーム終了";
138
+ }
139
+ }
140
+ }
141
+
142
+ /*--------------------------------------------*/
143
+
144
+ gameSet();
145
+
146
+
147
+ ```
148
+ ランキング表示単体
149
+ ```JavsScript
150
+ //ランキング表示
151
+ ver r={'30:00.00','25:00.00','20:00.00','15:00,00','12:00.00',};
152
+ console.log(r);
153
+
154
+ (async()=>{
155
+ var s=new Date().getTime();
156
+ await new Promise(resolve=>{
157
+ setTimeout(()=>resolve(),25000); //新たな記録[25秒]を追加と仮定
158
+ });
159
+ var e=new Date().getTime();
160
+ var diff=e-s;
161
+ var time=(100+diff/100000).toString().substr(1,2)+":"+(100+diff/1000).toString().substr(1,2)+"."+(100+diff/10).toString().substr(1,2);
162
+ r.push(time);
163
+ r=r.sort().splice(0,5);
164
+ console.log(r);
165
+ })();
166
+ ```
167
+ 画面表示CSS
168
+ ```CSS
169
+ * {
170
+ margin: 0;
171
+ padding: 0;
172
+ border: 0;
173
+ }
174
+
175
+ body {
176
+ background-image: url(BGdesign.gif);
177
+ font: 30px sans-serif;
178
+ }
179
+ #frame{
180
+ background: #ffffff;
181
+ font: 30px sans-serif;
182
+ border:8px double navy;
183
+ width:400px;
184
+ height:300px;
185
+ font-size:18pt;
186
+ overflow:auto;
187
+ }
188
+ #frame:first-letter{
189
+ color:#5bc0de;
190
+ }
191
+ #restart{
192
+ margin-left: 10px;
193
+ background: #BDBDBD;
194
+ border-bottom: solid 3px #888;
195
+ border-radius: 20px;
196
+ width: 100px;
197
+ height: 50px;
198
+ }
199
+ ```
200
+
9
- わからないこと
201
+ わからないこと
202
+ ---
10
203
  ・ユーザー名の保存の仕方
11
204
  ・クリアタイムの測定
12
205
  ・クリアタイムの早い順のランキングTOP10
13
206
  (TOP10が多ければTOP5で構いません。)
14
-
15
207
  です。
16
208
  たくさんのことを聞いてしまい、申し訳ございません。
209
+
210
+ ---
17
211
  お手数おかけしますが、よろしくお願いします。