質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

1079閲覧

タイマー機能と画面遷移機能とランキング機能について

ono1234

総合スコア1

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

1クリップ

投稿2022/07/12 12:05

編集2022/07/12 12:07

前提

processingでライツアウトというパズルゲームを作っています。
タイトル画面のときにエンターキーを押したらゲームが始まり、すべてのマスを黄色にしたらクリア画面にしたいです。
タイトルからゲームに映るのはできたのですが、タイマーがうまくいきません。エンターキーを押したらタイマーがスタートするようにしたいです。
また、クリア時の判定をどのようにすればいいかがわからないので教えていただきたいです。

実現したいこと

・エンターキーを押したらタイマーとゲームがスタートするようにしたい
・すべてのマスを黄色にしたらクリア画面に移したい

発生している問題・エラーメッセージ

・タイトル画面の時点でタイマーがスタートしてしまっている
・クリア時の判定がわからない

該当のソースコード

processing

1ソースコード 2```int bs = 85; 3int aa = 5; 4int bb = 5; 5int stat=0; 6int x1=0,y1; 7int base_time = 0; 8int base_time_mil = 0; 9int base_time_sec = 0; 10int base_time_min = 0; 11int base_time_hou = 0; 12int scene = 0; 13boolean flag; 14int[][] block = new int[aa][bb]; 15void setup(){ 16 size(600,600); 17 textSize(15); 18 frameRate(60); 19} 20void draw(){ 21 background(0); 22 gamePlay(); 23 gameScene(); 24 /* gameInit();*/ 25} 26 27void mousePressed(){ 28 int x = mouseX/bs; 29 int y = mouseY/bs; 30 light(x, y); 31if (x!=0) light(x-1, y); 32if (x!=aa-1) light(x+1, y); 33if (y!=0) light(x, y-1); 34if (y!=bb-1) light(x, y+1); 35} 36 void light(int i,int j){ 37 if(block[i][j]==0){ 38 block[i][j]=1; 39 }else{ 40 block[i][j]=0; 41 } 42} 43void keyPressed(){ 44 if(key==ENTER){ 45 scene = 1; 46 } 47} 48 49void Timer(){ 50 int mil = millis() % 1000; // 経過時間(ミリ秒) 51 int sec = millis() / 1000 % 60; // 経過時間(秒) 52 int min = millis() / 60000 % 60; // 経過時間(分) 53 int hou = millis() / 3600000; // 経過時間(時) 54 55 if(mil/99 == 1){ 56 base_time_mil = 99; 57 } 58 fill(255); 59 textSize(20); 60 text("time " + hou + ":" + min + ":" + sec + ":" + mil + "",430 , 50); 61} 62 63void gamePlay(){ 64 for(int i=0; i<5; i++){ 65 for(int j=0; j<5; j++){ 66 if(block[i][j] == 0){ 67 fill(255); 68 }else{ 69 fill(255,255,0); 70 } 71 rect(i*bs, j*bs, bs, bs); 72 } 73 } 74} 75 76void gameScene(){ 77 switch(scene){ 78 case 0: 79 background(255); 80 fill(0); 81 textSize(30); 82 text("Press ENTER to play!!", 150,height/2); 83 break; 84 case 1: 85 gamePlay(); 86 Timer(); 87 } 88} 89 90### 試したこと 91 92Timer()の場所を色々変えた 93 94### 補足情報(FW/ツールのバージョンなど) 95 96ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2022/07/12 13:45

タグはJavaScriptでなくJavaがいいでしょう。
guest

回答2

0

ベストアンサー

・エンターキーを押したらタイマーとゲームがスタートするようにしたい

millisはプログラムが起動したときからのミリ秒ですので、ゲームがスタートした時のmillisを覚えておいてmillisから引きます。

・すべてのマスを黄色にしたらクリア画面に移したい

gamePlayで全マス見ているので、そこでついでにチェックします。

初めにフラグをtrueにしておき、消えているマスがあればfalseにします。
最後までtrueだったらクリアです。


  • 範囲外をクリックするとArrayIndexOutOfBoundsException
    mousePressedで範囲チェックをしとくといいでしょう。
  • blockboolean[]で十分
    反転させやすくなります。
  • 無駄なグローバル変数は消す・変更されないものはfinal
    変更されるグローバル変数が多いと頭のメモリーを多く使います。少ないに越したことはありません。

Processing

1final int bs = 85; 2final int aa = 5; 3final int bb = 5; 4 5boolean[][] block; 6int baseTime; 7int scene; 8 9void setup() { 10 size(600, 600); 11} 12 13void draw() { 14 switch (scene) { 15 case 0: 16 background(255); 17 fill(0); 18 textSize(30); 19 textAlign(CENTER, CENTER); 20 text("Press ENTER to play!!", 0, 0, width, height); 21 break; 22 23 case 1: 24 background(0); 25 gamePlay(); 26 Timer(); 27 break; 28 29 case 2: 30 background(255); 31 fill(0); 32 textSize(30); 33 textAlign(CENTER, CENTER); 34 text("Congratulations!!", 0, 0, width, height); 35 break; 36 } 37} 38 39void mousePressed() { 40 if (scene != 1) return; 41 42 int x = mouseX / bs; 43 int y = mouseY / bs; 44 if (x < 0 || aa <= x) return; 45 if (y < 0 || bb <= y) return; 46 47 light(x, y); 48 if (x != 0) light(x - 1, y); 49 if (x != aa - 1) light(x + 1, y); 50 if (y != 0) light(x, y - 1); 51 if (y != bb - 1) light(x, y + 1); 52} 53 54void light(int i, int j) { 55 block[i][j] = !block[i][j]; 56} 57 58void keyPressed() { 59 if (key == ENTER) { 60 scene = 1; 61 block = new boolean[aa][bb]; 62 baseTime = millis(); 63 } 64} 65 66void gamePlay() { 67 boolean clear = true; 68 for (int i = 0; i < 5; i++) { 69 for (int j = 0; j < 5; j++) { 70 if (block[i][j]) { 71 fill(255, 255, 0); 72 } else { 73 fill(255); 74 clear = false; 75 } 76 square(i * bs, j * bs, bs); 77 } 78 } 79 80 if (clear) scene = 2; 81} 82 83void Timer() { 84 int m = millis() - baseTime; 85 int mil = m % 1000; 86 int sec = m / 1000 % 60; 87 int min = m / 60000 % 60; 88 int hou = m / 3600000; 89 90 fill(255); 91 textSize(20); 92 textAlign(LEFT); 93 text("time " + hou + ":" + min + ":" + sec + ":" + mil, 430, 50); 94}

投稿2022/07/12 13:44

TN8001

総合スコア9432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2022/07/12 14:09

> ランキング機能 よく見てませんでした^^; とはいえ現状かけらもないので * どんな表示法を考えているのか * 起動中だけでいいのか・永続(ファイルに書く等)か 等整理して何か詰まったら、新たに質問していただけたらと思います。
ono1234

2022/07/12 15:38

ご丁寧な回答ありがとうございます。タイマーと画面遷移は解決しました。 ランキング機能についてですが、タイトル画面でtabキーを押したら1位から3位までのランキングが表示されるようにしたいです。(かかった時間が短い順) 永続(ファイルに書く形式)で考えてます。
TN8001

2022/07/12 16:42

> タイマーと画面遷移は解決しました。 そうですか、よかったです。 ではこの質問は解決済みとしてください。 [ヘルプ > 質問を解決済みにしたい](https://teratail.com/help#resolve-question) > 1位から3位までのランキングが表示されるようにしたいです。(かかった時間が短い順) 00:01:02.500のように時間をゼロ埋めしておけば、文字列のまま簡単にソートできます。 [nf()](https://processing.org/reference/nf_.html) [sort()](https://processing.org/reference/sort_.html) > 永続(ファイルに書く形式)で考えてます。 ファイルには単純に、1行1レコードでそのまま書けばいいでしょう。 [loadStrings()](https://processing.org/reference/loadStrings_.html) [saveStrings()](https://processing.org/reference/saveStrings_.html) 配列はサイズを変更できませんが、便利関数が用意されています。 [append()](https://processing.org/reference/append_.html) [shorten()](https://processing.org/reference/shorten_.html) 試してみてわからない点があれば、新しく質問してください^^
ono1234

2022/07/15 01:44

クリア時のタイムをどうやって保存するかが分かりません...
TN8001

2022/07/15 03:53

> 新たに質問していただけたらと思います。 > 新しく質問してください 「新しい質問」という言葉が通じませんか? ハイスコア機能は需要も多そうですし汎用的に使えます。 「ハイスコア」に絞った内容で、この質問とは別な質問を書いてください。 teratailはナレッジ(知識や情報、知見)になることを重視しています。 ono1234さんにとってはここで解決したほうが楽でしょうが、閲覧者も参考にしやすいようにご協力お願いいたします。
guest

0

まずはTimer関数の呼び出しを(key==ENTER)が真のときの処理に移動してみてはどうでしょうか。

投稿2022/07/12 12:22

usekay

総合スコア395

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ono1234

2022/07/12 12:44

keyPressed()のところでしょうか?そこだとダメでした、すみません。
usekay

2022/07/12 12:47

どうだめでしたか?
ono1234

2022/07/12 15:43

エンターキーを長押ししなければ表示されないような状態になっていました。 また、millis()の機能を勘違いしていたようで私の勉強不足でした。折角回答をいただいたのですが、申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問