• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラムの画面表示のことで)

プログラムの画面表示の問題

このQ&Aのポイント
  • プログラムの画面表示に問題があります。
  • プレイヤーが倒されてもHPが0にならずに残ってしまいます。
  • 画面の構成を変えずにHPを0にする方法はあるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.2

system("cls");//クリア dungeon(pc, mc);//ダンジョンの表示 この2行を、ダンジョン&ステータスを更新したいつど記述すればよいのでは?1カ所にしか記述できないということはありませんので。 たとえば、上記2行を「○○は倒されてしまった・・・」と表示する直前にも追加してみてはどうでしょうか。

Black_Skal
質問者

お礼

ありがとうございます。 上手くいきました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.1

コマンドプロンプトでは上に戻って書き換えることはできませんので、 たとえば、「勇者を見つけた!!」の次にダンジョン&情報を再度表示して、「勇者は倒されてしまった・・・」と表示するような形式にしてはどうでしょうか。

Black_Skal
質問者

お礼

久々に見たらお礼していなかったので・・・ ものすごく遅ればせながらですが、ありがとうございます

Black_Skal
質問者

補足

指摘していただいた通りにやってみるため、もう少し細かく関数かさせてみて実験してみました。 結果は確かにHPが0になるのですが、戦闘になるとダンジョンの表示が消えるパターンと、ダンジョンの上に戦闘時のセリフが挟まる形で出たりと、残念ながら思ったようにはいきません。 出来てるところまで -------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <windows.h> static int field[][10]={ {9,0,9,9,9,9,9,9,9,9}, {9,0,9,0,0,0,0,0,0,9}, {9,0,9,0,9,9,9,0,0,9}, {9,0,9,0,9,8,9,0,0,9}, {9,0,9,0,9,0,9,0,0,9}, {9,0,9,0,9,0,9,9,0,9}, {9,0,9,0,9,0,0,0,0,9}, {9,0,9,0,9,0,9,9,9,9}, {9,0,0,0,9,0,0,0,0,9}, {9,9,9,9,9,9,9,9,7,9} }; typedef struct player{ char name[24]; int lv; int hp; int gold; int atk; int y; int x; }PC; PC pc; typedef struct monster{ char name[24]; int lv; int hp; int gold; int atk; int y; int x; }MC; MC mc; void move_monster(MC *mc, PC *pc, int field[][10]);//モンスターの移動 void dungeon(PC *pc, MC *mc);//ダンジョン(ゲーム画面全体)の表示 void status(PC *pc, MC *mc, int y);//ステータス void check_mons(PC *pc, MC *mc);//モンスターがプレイヤーを見つけるための関数 void m_attack(MC *mc, PC *pc);//モンスターの攻撃 char m_search(int x, int y);//プレイヤーを見つけた後の当たり判定 char p_search(int x, int y);//モンスターとの当たり判定 int keyput(PC *pc, MC *mc, int field[][10], int m_there);//キー入力 & 各関数のループも static int y, x; int main(void) { PC pc={"勇者", 10, 100, 50, 10, 0, 1};//名前, Lv, HP, Gold, ATK, Y座標, X座標 MC mc={"スケルトン", 10, 100, 50, 10, 4, 7}; //名前, Lv, HP, Gold, ATK, Y座標, X座標 int key=0,m_there=0; srand((unsigned)time(NULL)); //system("cls"); //dungeon(&pc, &mc); //system("cls")とdungeon(&pc, &mc)を中に入れたけど同じでした。 key=keyput(&pc, &mc, field, m_there); return 0; } int keyput(PC *pc, MC *mc, int field[][10], int m_there) { int key=0; while(key!='q'){ //終了キー 'q' key=_getwch(); if(pc->hp<=0){ printf(" %sは倒されてしまった・・・\n", pc->name); break; } //Keyによって分岐 switch((key == 0x00 || key == 0xe0) ? _getwch(): key) { case 0x48: m_there=m_search(mc->y-1, mc->x); if((pc->y>=1) && (field[pc->y-1][pc->x]!=9) && m_there==0){--pc->y;} break;//上 case 0x50: m_there=m_search(mc->y+1, mc->x); if((pc->y<=8) && (field[pc->y+1][pc->x]!=9) && m_there==0){++pc->y;} break;//下 case 0x4b: m_there=m_search(mc->y, mc->x-1); if((pc->x>=1) && (field[pc->y][pc->x-1]!=9) && m_there==0){--pc->x;} break;//左 case 0x4d: m_there=m_search(mc->y, mc->x+1); if((pc->x<=8) && (field[pc->y][pc->x+1]!=9) && m_there==0){++pc->x;} break;//右 default:break; } //ここに処理を持ってきたのは、失敗?mainにあるほうが良かった? system("cls");//クリア dungeon(pc, mc);//ダンジョンの表示 check_mons(pc, mc);//プレイヤーのチェックと攻撃 ※ここがうまく分けられません・・・ move_monster(mc, pc, field);//チェック後の移動 } return key; } //モンスターのチェック check_mons(&pc, &mc); void check_mons(PC *pc, MC *mc) { if(mc->hp>=0){ if( ((pc->y==mc->y-1) && (pc->x==mc->x)) || ((pc->y==mc->y+1) && (pc->x==mc->x)) || ((pc->y==mc->y) && (pc->x==mc->x-1)) || ((pc->y==mc->y) && (pc->x==mc->x+1)) ){ printf(" %sを見つけた!!\n", pc->name); _getwch(); m_attack(mc, pc);//ここが一番しっくりくるのですがここだと、HPが0ならないし・・・ } } } //モンスターの攻撃 void m_attack(MC *mc, PC *pc) { int damage=0; int atk=0; atk=rand()%100+1; // damage=rand()%mc->atk+1; damage=rand()%50+40; //チェック用 if(atk<=mc->atk){ //_getwch(); pc->hp-=damage; if(pc->hp<=0){ pc->hp=0; }else{ printf(" %sの攻撃がヒット!%sに%dのダメージ\n", mc->name, pc->name, damage); } }else{ printf(" %sの攻撃がはずれた\n", mc->name, mc->atk); } _getwch(); } //モンスターがいたら、1をいなければ0を返す char m_search(int y, int x) { if((mc.y==y) && (mc.x==x) && (mc.hp>=0)){ return 1; }else{ return 0; } } //プレイヤーがいたら、1をいなければ0を返す char p_search(int y, int x) { if((pc.y==y) && (pc.x==x) && (pc.hp>=0)){ return 1; }else{ return 0; } } /* この下は最初に書いたソースコードになります。 ダンジョンの表示とステータスの表示部分です。 残り文字入力数が足りないので継ぎ足してください。 */

すると、全ての回答が全文表示されます。

関連するQ&A