このスレッドはロックされています。記事の閲覧のみとなります。
トップページ > 記事閲覧
元のマスに戻ったあと前のマスに行けない
名前:マーク42 日時: 2019/09/27 02:10

問題があります。 1、ロックオンして攻撃して、addattcktimeを利用して追加攻撃をした後に元の位置に戻るのですが、 なぜか前のマスに進めません。 2、if文で攻撃を食らった時のみ敵が右を向くように作ったんですが、戦闘開始状態からずっと右を向いたままでいます。 以下を加えてからそうなることはわかったのですが、なぜそうなるのか原因はわからずにいます。 敵は基本、ダメージを受けた時のみenemyImage = enemyGHandle[5]となるので最初から右向きの状態で始まることはないのですが、 どこかで間違ったことを書いてしまっているのかもしれません。 if (enemyImage = enemyGHandle[5]) { stopenemytime = 1; ++frames; if (frames % 20 == 0) { ++stopenemytime; if (stopenemytime > 50) { stopenemytime = 0; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 }//stopenemytimeが0になれば初期値扱いなので通常通りの動きとなる。enemyGHandle[5]のまま動くことは出来ないため、この方法の方が簡単かもしれない。 } 3、以下のように攻撃を食らったら敵が右横を向くように作り、if文で右を向いた場合キーKによりダメージが入るはずなのですがうまく機能しません。 if (Key[KEY_INPUT_A] == 1 && count == 50) { //殴る//(lock){}の中に書くとロックする度にcountが0になるので意味がない //count++;  ここにcount書くとifの条件よりcountが0の時の下のlockやplayerX = enemyX - 1など条件になるため、++でcountが1になったらロックできても攻撃できないんだ //ここのcountの情報がそのまま下の描画関数に渡されるだけ。 //if (count >= 0 && ++count > 40) {//countが0から15になるまでを一フレームで表しただけでは?ようはcountを0〜1にするのに15フレームかかっただけでは?いや、単純にここにフレームは働いていないなので++count > 40と書いて39回行うはずがフレームが働かないので1しか上がっていないので一回しか攻撃が出来ないのだ lock = 0;//lock = 1の時の「lock!!」の描画を消すためにlockの値を0に変更。 lockonMove = 0;//アタックする時 ロックオンの画像が消えるように値を0にする。 preplayerX = playerX; // 元の位置を保持 playerX = enemyX - 1; // 俺は敵の眼前へ if (playerX == enemyX - 1) { preplayerX; playerImage = playerGHandle[4]; }//敵の前に言ったら、移動する前の残像が残る。 //after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。 enemyImage = enemyGHandle[5];//攻撃を食らうと右向きになるようにする count = count - 50;//キーAを押すたびに10だけ引く addattacktime = 500; zannzou = 20; if (enemyGHandle[5]) { enemyHP = enemyHP - 50; }//if (Key[KEY_INPUT_A] == 1 && count <= 500)に直接enemyHP = enemyHP - 50;を書き込むか、殴るが成立した時にif (enemyGHandle[5]) { enemyHP = enemyHP - 50; }と書いても良い。 } の後に以下を付けたしました。 if (Key[KEY_INPUT_K] == 1 && Kcount == 50) {//攻撃がキックだった場合 Kcount = Kcount - 50;//キーKを押すたびに50だけ引く if (enemyImage = enemyGHandle[5])//攻撃を食らうと右向きになるようにする { enemyHP = enemyHP - 50; playerImage = playerGHandle[4]; addattacktime = 500; } } 何度も読み直しているのですがどこが変なのかわかりません。 以下は全体のコードです。 #include "DxLib.h" int Key[256]; int gpUpdateKey() { char tmpKey[256]; GetHitKeyStateAll(tmpKey); for (int i = 0; i < 256; i++) (tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++; return 0; } int stage[4][7][2]; // 盤上のマスの格子点の座標 int pos[3][6][2]; // キャラ描画座標 void init_stage() // stage と pos を初期化する { for (int j = 0; j < 7; j++) { int w = (j - 3) * 100, h = 300; for (int i = 4; --i >= 0; ) { stage[i][j][0] = w + 400, stage[i][j][1] = h - 100; w = w * 9 / 10, h = h * 9 / 10; } } for (int i = 0; i < 3; i++) for (int j = 0; j < 6; j++) { pos[i][j][0] = (stage[i][j][0] + stage[i + 1][j + 1][0]) / 2 - 25; pos[i][j][1] = (stage[i][j][1] + stage[i + 1][j + 1][1]) / 2 - 65; } } int White; int function_status;//戦闘画面中は1とするための変数function_statusの定義 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetGraphMode(780, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 init_stage(); // stage, pos の初期化 int enemyX = 4, enemyY = 1; // 敵の位置 int playerX = 1, playerY = 1; // 俺の位置 int enemyMove = 0; // 敵の移動状態 // 俺の移動状態//1〜21で右に振り向きのプログラム@が終わり、22になったら足踏みするAを実行するようにする。 int playerMove = 1; int lockonMove = 0; int lockonHandle[3]; function_status = 1;//最初は1にして戦闘画面状態にする。 int lock = 0; // ロック状態 int enemyGHandle[12]; // 敵のグラフィックハンドル格納用配列 int playerGHandle[12]; // 俺のグラフィックハンドル格納用配列 // 0-2:後ろ向き、3-5:右向き、6-8:前向き、9-11:左向き LoadDivGraph("charall.png", 12, 3, 4, 49, 66, enemyGHandle); LoadDivGraph("charall.png", 12, 3, 4, 49, 66, playerGHandle); SetTransColor(255, 255, 255); // 読み込む画像の前にこいつを置くことで透明化できる。ループ内にも書いて正しく動くが毎回読み込むようになってしまうため処理が遅くなる。 LoadDivGraph("lockon.bmp", 3, 3, 1, 23, 23, lockonHandle);//なので、一度読み込むだけ画像は使えるし、処理を遅くしないためにループに入る前かつWinMainの中に書いた。 int enemyImage = enemyGHandle[11]; // 敵 左向き int playerImage = playerGHandle[4]; // 俺 右向き int lockImge = lockonHandle[3]; int preplayerX = 0; int after = 0; unsigned int count = 50; int count2 = 50; unsigned int count3 = 50; int Kcount = 50;//キック攻撃のゲージ int Kcount2 = 50; int attackdamage = 0;//殴る際の攻撃判定として作った。 int addattacktime = 0;//追加攻撃をするための変数 int addattackimage = 20;//描画するための追加アタックのためのゲージ int zannzou = 20; int frames = 0; // フレーム数 int stopenemytime = 0; const int MOVE_INTERVAL = 1000; // 何ミリ秒ごとに移動処理をするか int nextMoveTime = GetNowCount() + MOVE_INTERVAL; // 次回移動処理をする時刻 int stopCount = 0; // 動かないのがあと何回か int enemyHP = 300;
メンテ

Page: 1 | 2 | 3 | 4 | 5 |

Re: 元のマスに戻ったあと前のマスに行けない ( No.28 )
名前:紺帽子 日時:2019/09/30 20:06

> if (addattacktime <= 500 && --addattacktime > 0) > は先に優先順位が高い--addattacktimeが行われます.その次に&&の左右の比較が行われ,最後に,&&が行われます 論理演算子は左から順に評価されます。 if (addattacktime <= 500 && --addattacktime > 0) は、 1.(addattacktime <= 500) 2.(--addattacktime > 0) の順に評価されます。 またその評価は全体の真、偽が決定した時点で終わるため 1.(addattacktime <= 500) が偽になった時点で全体の式が真になることはないため打ち切られます。 よって 2.(--addattacktime > 0) は実行されません。 サンプルコード ttps://ideone.com/JgXLtS 優先順位と評価順序 | Microsoft Docs ttps://docs.microsoft.com/ja-jp/cpp/c-language/precedence-and-order-of-evaluation?view=vs-2019
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.29 )
名前:マーク42 日時:2019/09/30 23:37

紺帽子さんありがとうございます! あのどんさんに質問なのですが、 if (addattacktime == 501 && count < 50) では,addattacktime==501が行われ,count < 50が行われ,&&が実行されます とのことですが、 addattacktime == 501 && count < 50 は,count < 50 が先に行われ,次に501 && count < 50となり,最後に,代入が行われます. なので,count < 50の真偽と501の倫理積の結果がaddattacktimeに代入されます. に関してなのですが、攻撃するとcountは0なので、count<50は真になり、addattacktime == 501の時に以下の{}が実行されると思うのですが、 if (addattacktime == 501 && count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。 if (frames % 5 == 0) { ++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 } 実際はされません。優先順位があるとはいえ、なぜaddattacktime==501とcount < 50は両方とも真なのに、{}の中身が実行されなかったのでしょうか。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.30 )
名前:どん 日時:2019/10/01 01:39

{}とは,どの部分のことでしょうか どちらの{}にしろ, if (addattacktime == 501 && count < 50)++frames; は,条件を満たしても,後ろの++frames;しか実行されません. if (addattacktime == 501 && count < 50) ++frames; と if (frames % 5 == 0) { ++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 } は完全に独立しているので,if (addattacktime == 501 && count < 50) を満たしているのと,{}の中身の実行は,別の話です. インデントしているので,そう見えてしまっていると思いますが,入れ子にはなっていないので, 整理し直したほうがいいと思います. {}の中が実行されない原因は,今のソースコードの状態がないのでわかりませんが,printfや,MessageBox関数を入れて, どこまで実行されているのかを確認したらいいと思います
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.31 )
名前:マーク42 日時:2019/10/01 02:02

addattacktime<=500&&--addattacktime>0に関しては &&であるが、全体の--が優先されるため、500<=0は「無視」され、addattacktimeは500なので-1されていき、と>0に関しては>0に対して偽なので、結果は偽になり、処理はされずaddattacktimeは負の値になったため、addattacktimeが負の場合に送られて、その時の{ }の処理を行い、addattacktimeは1となり、上を繰り返していて-1になった。 以上のようにaddattacktime<=500&&--addattacktime>0の処理のされ方を考えたのですが、正しいでしょうか?
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.32 )
名前:マーク42 日時:2019/10/01 02:33

どんさん、どうもありがとうございます! すいません、{}ではなく、 if (addattacktime == 501 && count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。 if (frames % 5 == 0) { ++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 } の ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。 if (frames % 5 == 0) { ++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 } の部分です。後ろの++frames;しか実行されません.と教えて頂けたことで分かったので、 {}としていないことで反映されていなかったのかもしれません。 これからは{}を付けて処理をまとめます。 ただ、仮に{}を付けて以下のようにして、実行してもcountは1にしかなりませんでした。 if (addattacktime == 501 && count < 50) { ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。 if (frames % 5 == 0) { ++count; if (count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 } } このプログラムにおいては{}を付けて実行したのに、フレームが反映されないのはaddattacktime == 501の値が固定されてしまっているため この固定された値とは別に以下のようにif(count < 50)の時と書く必要があるのかもしれません。(優先順位とかではなく、値が固定されてしまったために countが1度しか働かなかったのかもしれません。) もし違った場合は正しい理由を教えて頂けるとありがたいです。 if(addattacktime == 0) { playerX = preplayerX; playerImage = playerGHandle[4]; addattacktime = 501;//addattacktimeが0にると、元の位置に戻る } if(addattacktime == 501){ //★あるフレームが進んでから画像がを動くまでを遅くした、ならば、あるフレームが進んだら数字も次の数字に移るまで遅くできるのは?と考えた。 if(count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。 if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 } 以下のように書いてはif(addattacktime == 0)が真のとき(addattacktimeが0の時)でないと中に含んだif(addattacktime == 501) の時の{}の中の処理を行わないので(addattacktimeが501になっては前のif文if(addattacktime == 0)は偽になってしまうため、 if(addattacktime == 501)の{}の処理が行われない。そのためaddattacktimeが501になってもcountは繰り上がらなかった。) 上のように{}とは別に新しいif文でif(addattacktime == 501)を書く必要があります。 if(addattacktime == 0) { playerX = preplayerX; playerImage = playerGHandle[4]; addattacktime = 501;//addattacktimeが0にると、元の位置に戻る if(addattacktime == 501){ //★あるフレームが進んでから画像がを動くまでを遅くした、ならば、あるフレームが進んだら数字も次の数字に移るまで遅くできるのは?と考えた。 if(count < 50) ++frames;//framesが5で割りきれる時に+countが+1されいく。//countが50より小さい時、framesがフレームにより+1ずつされていき、10で割り切れる際にcountが50になるまで+1される、++により最初+1が追加され49かい+1されるので結果的にcountは50になる。 if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; }//★上限はないためcountが49より大きくなったらcount = 50により50にする。 } } } addattacktime<=500&&--addattacktime>0に関しては &&であるが、全体の--が優先されるため、500<=0は「無視」され、 addattacktimeは500なので-1されていき、と>0に関しては>0に対して偽なので、結果は偽になり、 処理はされずaddattacktimeは負の値になったため、addattacktimeが負の場合に送られて、その時の{ }の処理を行い、 addattacktimeは1となり、上を繰り返していて-1になった。 と書きましたが、これは&&による<=や>よりも--が優先され(&&による<=や>は無視された?)、引き算され、 500より小さく、0より大きい値までとのことで値は固定ではないため 繰り返し引き算され、--が優先されたため、addattacktimeは負の値になったと考えました。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.33 )
名前:マーク42 日時:2019/10/01 16:14

どんさんに質問があるのですが if(count < 50) ++frames; if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; } } if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない if(frames % 20 == 0) {      ++Kcount; if(Kcount > 50) { Kcount = 50; } } の if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない if(frames % 20 == 0) {      ++Kcount; if(Kcount > 50) { Kcount = 50; } } に関してなのですが、Kcount < 50 && count >= 50の&&により<と>=は優先されますが、 なぜcountが50以上の時にKcountが50より小さい時に+1ずつ繰り上げるのでしょうか。 実際にはcountとKcountが同フレームで上がっていきますが、なぜこのように書けたのかわかりません。 Kcount < 50は50より小さい時なのでわかるのですが、そのあとのcountが50以上の時と書くと、 countが50以上の時にKcountが50より小さいため上がっていく、すなわちcountが50になってからKcountが上がっていくように思えました。 なぜcountはcount >= 50と書けたのでしょうか。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.34 )
名前:どん 日時:2019/10/01 21:01

同フレームでKcountとcountが変化しない理由として,framesが2回足されているのが原因ではないかと思いました if(count < 50) ++frames; if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; } } if(Kcount < 50) ++frames; if(frames % 20 == 0) {      ++Kcount; if(Kcount > 50) { Kcount = 50; } } この場合,count,Kcountが共に50未満の場合,framesが19だったとすると,1行目で,framesが20になり, 2行目のif文の中に入りますが,5行目でもframesが足され21になり,6行目のif文内には入りません. frames++は一回だけでいいのでは?と思ったので, if(count < 50) ++frames; if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; } } if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない if(frames % 20 == 0) {      ++Kcount; if(Kcount > 50) { Kcount = 50; } } としました. 6行目に条件を追加することで,count,Kcountが共に50未満の場合でも,1行目の条件は満たされますが, 6行目は満たされないようにしました. 6行目の条件を満たすには,Kcountが50未満で,countが50以上,つまり,1行目が実行されていない場合のみ実行されるようになります.
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.35 )
名前:マーク42 日時:2019/10/03 06:49

どんさんありがとうございます! ちゃんと理解できるように何度も読んで理解します。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.36 )
名前:マーク42 日時:2019/10/03 18:53

countが50以上でなくてもKcountが上がるようにKcount < 50 && count >= 50と書いたということでしょうか。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.37 )
名前:どん 日時:2019/10/03 21:22

countとKcountが共に50より大きくてもframesを一回だけしか足さないようにしたということです
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.38 )
名前:マーク42 日時:2019/10/04 19:44

ありがとうございます。どんさん。 countのframeが上がるたびに、 Kcountに&&countとする事で 同時にKcountが上がるわけでしょうか? 理解が悪くてすいません。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.39 )
名前:どん 日時:2019/10/04 20:58

いまいち質問の意図がわからず間違えていたらすいません if(count < 50) ++frames; if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; } } if(Kcount < 50) ++frames; if(frames % 20 == 0) {      ++Kcount; if(Kcount > 50) { Kcount = 50; } } このソースコードでは,framesが5の倍数のときに,countが上がり,20の倍数のときに,Kcountが上がります. 別々にframesを足していることで, 例えば,framesが19,countが10,Kcountが10だったときに,上のコードが実行されたとすると,1行目のif文の条件が真となり, framesが20になります.そうすると,2行目のframesが5の倍数でアルということを満たし,countが1足されます. しかし,5行目の条件も真となり,またframesが足され,framesが21となり,6行目の条件を満たさなくなってしまい, 結果的に,countとKcountが同時にカウントアップしなくなってしまいます. そこで,このコードが実行されたときに,framesが最大で1回しか足されないようにします. ここまでは大丈夫でしょうか? if(count < 50) ++frames; if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; } } if(Kcount < 50 && count >= 50) ++frames;//すでに足されているときはしない if(frames % 20 == 0) {      ++Kcount; if(Kcount > 50) { Kcount = 50; } } 5行目にcount >= 50を追加することで,1行目が実行された条件を満たしているか否かを判断します. 1行目のframes++が実行されたということは,countは50未満です.すると,5行目の条件の後半を満たさないので,5行目のframes++は実行されません. 1行目でframes++が実行されなければ,countは50以上なので,5行目の条件の後半を満たし,5行目のframes++は実行されます. ややこしいようなら,次のようにしたほうがいいかもしれません int flag = 0;//framesが1回足されたかを見張る変数 if(count < 50){ ++frames; flag = 1;//1回frames++を実行した } if(frames % 5 == 0) { ++count; if(count > 50) { count = 50; } } if(Kcount < 50 && flag == 0) ++frames;//すでに足されているときはしない if(frames % 20 == 0) {      ++Kcount; if(Kcount > 50) { Kcount = 50; } }
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.40 )
名前:マーク42 日時:2019/10/05 11:59

返信ありがとうございます。 >>countは50以上なので,5行目の条件の後半を満たし,5行目のframes++は実行されます countが50以上という設定をすることでcountが50以上の時のKcountとなり、同時に上がることが出来るということでしょうか。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.41 )
名前:どん 日時:2019/10/05 16:13

いまいち質問の意味がわかりませんが,1行目の逆の条件を5行目に追加することで, 絶対にどちらか一方しか実行されないようにしています もしかしたら,意図が伝わっていないかもしれないので, どこまで把握しているかを教えてくれるとありがたいです. 1.countとKcountが同時に上がらない原因については,理解できましたか? 2.1が理解した上で,framesを1度だけ足せばいいというのはわかりましたか? 3.2の具体的な方法がわからないのでしょうか? 上記についてどこまで把握しているのかを教えてくれると助かります
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.42 )
名前:マーク42 日時:2019/10/07 00:38

返信遅くなり申し訳ありません。 ご親切にどうもありがとうございます。 1.countとKcountが同時に上がらない原因については,理解できましたか? すいません、どうか教えてください。 2.1が理解した上で,framesを1度だけ足せばいいというのはわかりましたか? framesが一度だけ足せばいい理由は、Kcountでcountのframesを利用すれば良いと思うのでなんとなくわかります。 3.2の具体的な方法がわからないのでしょうか? はい、理解したいのですが詳しい方法はわからないです。 どうかよろしくお願いいたします。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.43 )
名前:どん 日時:2019/10/07 18:14

もとのプログラムにおいて,countとKcountが同時に上がらない理由は,framesが if(frames % 5 == 0)とif(frames % 20 == 0)のときで値が変わってしまっているからです 下のプログラムにおいて,count=0,Kcount=0,frames=19とします 下のプログラムを実行すると,各変数は次のように変化します if(count < 50) ++frames; //count=0,Kcount=0,frames=20 if(frames % 5 == 0) { //framesが20なので条件を満たす ++count; //count=1,Kcount=0,frames=20 if(count > 50) { //countが50以下なので満たさない count = 50; } } if(Kcount < 50) ++frames;      //count=0,Kcount=0,frames=21 if(frames % 20 == 0) { //framesが21なので条件を満たさない      ++Kcount; if(Kcount > 50) { Kcount = 50; } } countとKcountは同時に上昇したいので,上の状況のときにはcountとKcountが 1になるのが望まれますが,実際には,countしか1になりません if(frames % 5 == 0)とif(frames % 20 == 0)の前で値が変わってしまっているからです framesが20の倍数のときは,1行目でframesが21に変わってしまうので,if(frames % 20 == 0) は満たされず,同時に2つの変数が上がれないのです. もし,これについて理解できなければ,かんたんなプログラムを作って,printfデバックやら,デバッガ なりで,理解してください.
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.44 )
名前:マーク42 日時:2019/10/07 23:17

わざわざどうもありがとうございます! 少し理解出来てきました。ですが、少し疑問があります。 もとのプログラムにおいて,countとKcountが同時に上がらない理由は,framesが if(frames % 5 == 0)とif(frames % 20 == 0)のときで値が変わってしまうためでありますが、 count=0,Kcount=0,frames=18とした場合、確かにcountとKcountが同時に上がることはないですが Kcountは以下のようになるので同時に上がらないだけでKcountは上がると考えたのですが、どこが間違っているでしょうか。 if(count < 50) ++frames; //count=0,Kcount=0,frames=19 if(frames % 5 == 0) { //framesが20なので条件を満たす ++count; //count=1,Kcount=0,frames=19 if(count > 50) { //countが50以下なので満たさない count = 50; } } if(Kcount < 50) ++frames;      //count=0,Kcount=0,frames=20 if(frames % 20 == 0) { //framesが20なので条件を満たさない      ++Kcount; if(Kcount > 50) { Kcount = 50; } } 出来が悪くてすいません、、、。
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.45 )
名前:どん 日時:2019/10/08 18:01

>>if(frames % 5 == 0) { //framesが20なので条件を満たす ?このときはframesはまだ19なので,満たしませんよ >>if(frames % 20 == 0) { //framesが20なので条件を満たさない このときは,framesは20で,frames % 20は0になるので,条件を満たします >>Kcountは以下のようになるので同時に上がらないだけでKcountは上がると考えた 同時に上がるのが目的だったのでは?
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.46 )
名前:Tatu 日時:2019/10/08 18:50

(1)以下のコードを実行して結果を見てください。 (2)int frames = 1;をint frames = 0;にしてもう一度実行し、結果を見てください。 #include <stdio.h> int main() { int frames = 1; int count = 0; int Kcount = 0; while (count < 50) { printf("frames=%d,count=%d,Kcount=%d\n", frames, count, Kcount); if (count < 50) ++frames; if (frames % 5 == 0) { ++count; if (count > 50) { count = 50; } } if (Kcount < 50) ++frames; if (frames % 20 == 0) { ++Kcount; if (Kcount > 50) { Kcount = 50; } } } printf("frames=%d,count=%d,Kcount=%d\n", frames, count, Kcount); return 0; }
メンテ
Re: 元のマスに戻ったあと前のマスに行けない ( No.47 )
名前:マーク42 日時:2019/10/08 19:50

返信ありがとうございます。 はい!同時に上がるのが目的です。 ですので以下のように考えました。 0,1,2,3,4,,,frames=5の時、if(frames % 5 == 0)を満たし、6,7,8,9,frames=10の時、if(frames % 5 == 0)を満たし、 11,12,13,14,frames=15の時、if(frames % 5 == 0)を満たし、16,17,18.19.frames=20の時、if(frames % 20 == 0)を満たします。 この時点でcountは3、Kcountは1となると考えたのですが、実際は同時に上がらないのでcountは3、Kcountは0です。 ですが、なぜそうなるのか理由がわからないです。 同じことを聞いているようですいません。
メンテ

Page: 1 | 2 | 3 | 4 | 5 |