トップページ > 記事閲覧
ライフゲームについて
名前:FFGX 日時: 2020/04/19 14:53

これでライフゲームを作ろうとしています。 #include<DxLib.h> #define ONE 48 #define PX 10 int T[2]; int f[2][ONE][ONE]; int mx, my; int current; int generation = 1; int count(int _x, int _y) { int count = 0; for (int y = -1; y <= 1; y++) { for (int x = -1; x <= 1; x++) { if (x == 0 && y == 0) continue; int x2 = (ONE + _x + x) % ONE; int y2 = (ONE + _y + y) % ONE; count += f[current][y2][x2]; } } return count; } void P() { for (int y = 0; y < ONE; y++) { for (int x = 0; x < ONE; x++) { DrawExtendGraph(x * PX, y * PX, x * PX + PX, y * PX + PX, T[f[current][y][x]], false); } } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetOutApplicationLogValidFlag(false); SetWindowText("ライフゲーム"); ChangeWindowMode(true); SetDrawScreen(DX_SCREEN_BACK); DxLib_Init(); LoadDivGraph("madia\\a.png", 2, 2, 1, PX, PX, T, false); while (ProcessMessage() == -1 || CheckHitKey(KEY_INPUT_ESCAPE)) { ClearDrawScreen(); P(); DrawFormatString(480,0,GetColor(255,255,255),"第%d世代",generation); while (1) { if (GetMouseInput() & MOUSE_INPUT_LEFT) { GetMousePoint(&mx, &my); f[current][my / PX][mx / PX] ^= 1; } } if (CheckHitKey(KEY_INPUT_RETURN)) { for (int y = 0; y < ONE; y++) { for (int x = 0; x < ONE; x++) { int n = count(x, y); int next = f[current][y][x]; if (f[current][y][x]) { if (n <= 1 || n >= 4) { next = 0; } } else { if (n == 3) { next = 1; } } f[current ^ 1][y][x] = next; } } current ^= 1; generation++; } ScreenFlip(); } DxLib_End(); return 0; } これではすぐに画面が閉じる為、 escが押された場合に画面を閉じたいのですがどうにかなりませんか?
メンテ

Page: 1 |

Re: ライフゲームについて ( No.1 )
名前:名無三 日時:2020/04/19 15:11

問題点を挙げると 1: > while (ProcessMessage() == -1 || CheckHitKey(KEY_INPUT_ESCAPE)) { ココが違う、サンプルを見ておらず、whileについて理解できてない 2: > while (1) { > if (GetMouseInput() & MOUSE_INPUT_LEFT) { > GetMousePoint(&mx, &my); > f[current][my / PX][mx / PX] ^= 1; > } > } でループしてしまい画面の更新処理ができない その他の問題点もあるので前回こちらが書いたソースを基に ・グローバル変数をやめクラスを使う(スマートポインタは使わなくてOK) ・無限ループを作る際にはbreakで抜けられる場所を作る ・SetWindowTextを使わずともDXLIBの機能を使った方がいいのでは? ・前回同様xとyが逆だったりそうじゃなかったりするのを改善 その他を改善してもらいたい
メンテ
Re: ライフゲームについて ( No.2 )
名前:kanamaru 日時:2020/04/19 15:25

別にグローバル変数を使ってもいいとは思いますけどね。 むしろこの手のゲームならかえって複雑になるだけだと思います。 それこそステージがいくつかあるゲームとかじゃないとクラスを使う必要はないと思います。 あとSetWindowTextはdxlibの関数の一つですよ?(どっかに同名の関数があるのかもしれないけど) そこを指摘するぐらいだったら僕はこのスレッドを含むFFGXさんのプログラムすべてに対して言いたいことがあります。 といってもだれか指摘するかと思ったのですが指摘しないのに驚きました。 1.作るゲームを一つに絞る 2.プログラムを投稿する際は「実行できる」プログラムにする。   (画像を読み込んでいる場合は。画像をダウンロードできるようにしたり、画像を使わないように書き換える。) 誰も指摘しないところを見るともしかして当たり前じゃないんでしょうか?
メンテ
Re: ライフゲームについて ( No.3 )
名前:名無三 日時:2020/04/19 15:54

> グローバル変数 ここは少々押し付けだったかもしれません > SetWindowText SetMainWindowTextのほうをリファレンスで記述しておりますのですが、そちらもDXLIBの関数だったのですね、失礼しました > そこを指摘するぐらいだったら〜 それは失念していました、自分は実行環境のURL全投げ+該当行数を記述していたので気にしておりませんでした…
メンテ
Re: ライフゲームについて ( No.4 )
名前:kanamaru 日時:2020/04/19 16:08

すいません。SetWindowTextってdxlibの関数かと思ったらSetWindowMainTextと勘違いしていたようです。 ネットで調べる限り結構dxlibのプログラムで使っているのでdxlibの関数かと。
メンテ
Re: ライフゲームについて ( No.5 )
名前:FFGX 日時:2020/04/19 16:32

a.pngは白、黒の順にに並んだ10×20pixelの画像です 48行目にbreak;を追加しました。 40行目はwhile (ProcessMessage() == -1) {としました。 コンソール版で作ってみました。 その時は上手くいきます。 どうにかなりませんか?
メンテ
Re: ライフゲームについて ( No.6 )
名前:名無三 日時:2020/04/19 16:48

ProcessMessageのリファレンスからの抜粋 > 宣言 int ProcessMessage( void ) ; > 概略 ウインドウのメッセージを処理する > 引数 なし > 戻り値  0:成功 >   −1:エラー発生・若しくはウインドウが閉じられた > 解説  この関数は Windowsアプリや Androidアプリのプログラムに付きまとうメッセージ( イベント )処理を肩代わりしてくれる関数です。 >  この関数がなにをしているのか、というのは特に気にする必要はありませんが、とにかく定期的にこの関数を呼び出してやる必要があります。 >  目安としては60分の1秒に一回程度、用はゲームのループに一回程度です。この関数を呼び出さないと結果としてシステムが異常に重くなったり不安定になったりします。 >  あと、戻り値が-1( エラー発生・若しくはDXライブラリのウインドウが閉じられた )になったらなるべく早めに DxLib_End でライブラリ使用を終了し、同時にプログラムも終了する必要があります。( そうしないとウインドウを閉じてもプロセスが残るという事態になります ) この通り、ProcessMessage() == -1なら通常falseが帰ってくる。 そしてc++のリファレンス( ttps://ja.cppreference.com/w/cpp/language/while)から抜粋 > while ループ > condition の値が false になるまで、 statement を繰り返し実行します。 テストは繰り返しの各回の前に行われます。 修正通りだとループしないよ 『サンプルを見ておらず、whileについて理解できてない』
メンテ
Re: ライフゲームについて ( No.7 )
名前:FFGX 日時:2020/04/19 18:19

1.画面をクリアする 2.描画する 3.ScreenFlipを使う 4.マウスの左が押されたらそこを生か死の状態にする 5.もしもエンターキーが押されたら世代を進める 6.もしもエスケープキーが押されたらdxライブラリの使用を中止する このような流れになってほしいわけです
メンテ
Re: ライフゲームについて ( No.8 )
名前:名無三 日時:2020/04/19 18:49

そういえば、 > コンソール版で作ってみました。 ってのは何を指しているんです?
メンテ
Re: ライフゲームについて ( No.9 )
名前:FFGX 日時:2020/04/19 20:06

コンソール版でライフゲームを作ったという事です
メンテ
Re: ライフゲームについて ( No.10 )
名前:名無三 日時:2020/04/19 21:00

コンソール版というのがCMD上でTUIじみたものを作ったという認識でいいのかどうか判断がつかないのですが、 それならばcの書き方がわからない訳ではないはず…それは本当にコンソールアプリケーションです???
メンテ
Re: ライフゲームについて ( No.11 )
名前:FFGX 日時:2020/04/20 07:53

はい。コンソール版とdxライブラリの違いを挙げると 無限ループで動作が停止しましたにはならない。 これの違いに悩んでいるのです。 コンソール版のコードをもとに作っています 一応初心者です。
メンテ
Re: ライフゲームについて ( No.12 )
名前:名無三 日時:2020/04/20 11:06

それができているなら何故 > 40行目はwhile (ProcessMessage() == -1) {としました。 のようにリファレンス不読なことができるんですか?
メンテ
Re: ライフゲームについて ( No.13 )
名前:FFGX 日時:2020/04/20 12:55

ちなみに>はい。の所は動画を見て作ったものです
メンテ
Re: ライフゲームについて ( No.14 )
名前:名無三 日時:2020/04/20 13:54

理由を聞いています。これらができていないのにスレ乱立しないでください。
メンテ
Re: ライフゲームについて ( No.15 )
名前:FFGX 日時:2020/04/20 14:59

理解が足りなかったのかもしれません。
メンテ
Re: ライフゲームについて ( No.16 )
名前:FFGX(解決) 日時:2020/04/20 17:08

すみませんでした。 自分の力で手直ししたら、ライフゲームが完成しました。 協力して下さった皆様、 ありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存