A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
> どこが悪いのか、見ていただけないでしょうか?
どこを見ればいいのでしょうか?
補足に記載してください。
この回答への補足
プログラムを貼り付けたいのですが、文字数のせいで貼り付けられません。どのあたりを貼り付ければいいのかもわからないのです。
一応、このあたりがおかしいかなと思うところを貼り付けさせてもらいます。
while(result != 'y'){
result = make_character();
}
system("cls");
show_dungeon();
while(1){
if(kbhit()){
key=getch();//マップの配列要素が1なら移動できない。
switch(key){
case 119://Wキー
if((PC.y >= 1) && (dungeon[PC.Level][PC.x][PC.y-1] != 1)){
PC.y--;
break;
}
case 120://xキー
if((PC.y <= 18) && (dungeon[PC.Level][PC.x][PC.y+1] != 1)){
PC.y++;
break;
}
case 97://aキー
if((PC.x >= 1) && (dungeon[PC.Level][PC.x-1][PC.y] != 1)){
PC.x--;
break;
}
case 100://dキー
if((PC.x <= 18) && (dungeon[PC.Level][PC.x+1][PC.y] != 1)){
PC.x++;
break;
}
default:
printf("W,X A D以外のキーが入力されました。!:%d",key);
continue;
break;
}
No.2
- 回答日時:
「デバッグではじめるCプログラミング」を読んだことは無いですが、どうやらわざとバグのあるプログラムプログラムが本に載っているみたいですね。
なのでうまく動かなくて当然と言うか当たり前だと思います。最初から順番に進めていけば、問題なくバグは取れるんだと思いますが。
少なくとも本を読んだことがある人を期待するのは無理だと思いますので、最初から順番どおりやっているのかと理解して進んでいるのか聞きたいですね。
この回答への補足
プログラムをテストするつもりで短くしたのですが、こちらはキャラクターの'@’が動かないです。
本の通りにやっていて途中までは動いていたのですが、理由がわかりません。
どのようなプログラムか載せるのが遅くなってもうしわけないです。
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i,j;
int xpc=0,ypc=0;
int key;
char dungeon[5][5]={{0,0,0,1,1},
{1,1,0,1,1},
{1,0,0,0,1},
{1,1,0,1,1},
{1,1,0,0,0}};
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(j==xpc && i==ypc)printf("@");
else if(dungeon[i][j]==0)printf("+");
else printf("#");
}
printf("\n");
}
while(1){
if(_kbhit()){
key=_getch();
if(key==119)
ypc--;
if(key==120)
ypc++;
if(key==97)
xpc--;
if(key==100)
xpc++;
}
}
//system("cls");
return 0;
}
No.3
- 回答日時:
No.1の補足にかかれたソースだけでは、アドバイスは難しいので、No.2の方のみ。
こちらは、マップを表示するのが最初だけしか行っていないので、@が動かないのです。
マップが崩れるのは、ひょっとして改行がずれているだけでしょうか?
この回答への補足
いろいろ、やり直してみました。ご指摘の部分を考えて本見直しながら、変数の位置と関数の位置をmain()の外や中に入れたり出したりしてみました。
おかげでようやく動くようになりました。
プログラムって動くと面白いですね^^
また、トラぶったときにはよろしくお願いします。
No.4
- 回答日時:
>プログラムをテストするつもりで短くしたのですが、こちらはキャラクターの'@’が動かないです。
>本の通りにやっていて途中までは動いていたのですが、理由がわかりません。
プログラムを身に付ける&デバッグの基本として、
(1)試したい機能だけを取り出して別プログラムにしてみる。
(2)途中までは動いていたであれば、動いてたものとの違いを比べてみる。
(3)1行毎に何をしているかコメントを付ける。分らない機能が有れば徹底的に調べる。
(4)本を最初から見直して、見落としがないか調べてみる。分らなくなったら基本に返りましょう。
を実践すればやがて分ってくると思います。
>どのあたりを貼り付ければいいのかもわからないのです。
これもどの部分がどんな役目をしているか分らない事から来ています。1行ごとの動作、そして数行から数十行の機能単位分けてごとにコメントしてみましょう。今の部分で難しいのであれば、理解していたと思っているTrainingの前の章から始めてみます。本当に全てを理解してましたか?
この回答への補足
ご指摘ありがとうございます。
最初に遡って学習しなおしてみます。(そういう本でした)
あと、ZWiさんの4か条をしっかりと身に付けるように努力してみます。
また、わからなくなったら、その時は皆さんよろしくお願いします。
ちなみに、動くようになりました。
まだ、壁とか素通りしちゃいますけど(^^ゞ
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
void show_title(void);//タイトル表示関数
char make_character(void);//今の所名前入力とYes/Noだけの関数
void show_dungeon(int,int,int);//ダンジョン&キャラ表示関数
char name[20];//名前の変数をグローバルにしました
int level=0,xpc=1,ypc=0;//キャラクターの位置情報をグローバルにしました
char dungeon[2][20][20]={ここ省略}//ダンジョンマップをグローバルにしました
int main(void)
{
char result='n';
int key;
int directiion;
show_title();
while(result!='y'){
result=make_character();
}
system("cls");
show_dungeon(level,xpc,ypc);
while(1){
if(kbhit()){
key=getch();
//printf("%d\n",key); キーコード確認用
if(key==119){
ypc--;
}
if(key==115){
ypc++;
}
if(key==100){
xpc++;
}
if(key==97){
xpc--;
}
show_dungeon(level,xpc,ypc);
if((dungeon[level][xpc][ypc]==2)&&(level<1)){
printf("%s:おっ、こんな所に下り階段がある…",name);
while(1){
if(kbhit()){
level++;
break;
}
}
}
}
}
scanf("%*c%c",&directiion);
return 0;
}
void show_dungeon(int z,int x,int y)
{
int i,j;
system("cls");
for(i=0;i<20;i++){
for(j=0;j<20;j++){
if((j==x) && (i==y))printf("@");
else if(dungeon[z][i][j]==0)printf("+");
else if(dungeon[z][i][j]==2)printf(">");
else printf("#");
}
printf("\n");
}
}
void show_title(void)
{
system("cls");
printf("見習い魔道師の受難\n\n\n");
}
char make_character(void)
{
char confirmation;
printf("見習い魔道師の最初の受難\n\n");
printf("名前の入力をしてください:");
scanf("%s",name);
printf("%sでよろしいですか?Y/N :",name);
scanf("%*c%c",&confirmation);
if(confirmation=='y')printf("確定しました");
return confirmation;
}
No.5
- 回答日時:
結局、switch~caseは使用しなくなってしまったようですが…念のため。
# if文を列挙するよりはswitchの方が効率的なのですが……。
# 今時のコンパイラなら最適化してくれるとは思いますが。
>case 119: //Wキー
> if((PC.y >= 1) && (dungeon[PC.Level][PC.x][PC.y-1] != 1)){
> PC.y--;
> break;
> }
>case 120: //xキー
> if((PC.y <= 18) && (dungeon[PC.Level][PC.x][PC.y+1] != 1)){
> PC.y++;
> break;
> }
> :
ちゃんとbreak入れましょう。
wキーを押したとき、(PC.y >= 1) && (dungeon[PC.Level][PC.x][PC.y-1] != 1)の条件が成立せずに、
(PC.y <= 18) && (dungeon[PC.Level][PC.x][PC.y+1] != 1)の条件が成立した場合にどうなるでしょうか?
さらに、case 119とかcase 120とかのマジックナンバーを使用するのではなく、case 'w'とかcase 'x'などの文字定数を使用して可読性をあげるようにしましょう。
# こういうところも「デバッグ」では必要です。
この回答への補足
がんばって、switch文に直しました。
あと、ランダムで動くようなモンスターも入れてみました。
スライム一匹だけですけど^_^;
プログラムは面白いですけど、奥が深いです。
ここの部分直すだけで、朝になってしまいました><
これでどうでしょうか?
while(1){
if(kbhit()){
PC.key=getch();
switch(PC.key){
case 'w'://Wキー ↑
if((PC.x>=1)&&(dungeon[PC.level][PC.x-1][PC.y]!=1))
PC.x--;
break;
case 's'://sキー ↓
if((PC.x<=18)&&(dungeon[PC.level][PC.x+1][PC.y]!=1))
PC.x++;
break;
case 'd'://dキー →
if((PC.y<=18)&&(dungeon[PC.level][PC.x][PC.y+1]!=1))
PC.y++;
break;
case 'a'://aキー ←
if((PC.y>=1)&&(dungeon[PC.level][PC.x][PC.y-1]!=1))
PC.y--;
break;
default:
printf("想定外の値です: %d",PC.key);
break;
}
dMonster=rand()%4;
switch(dMonster){
case 0:
if((slime.x>=1)&&(dungeon[slime.level][slime.x-1][slime.y]!=1))
slime.x--;//↑
break;
case 2:
if((slime.x<=18)&&(dungeon[slime.level][slime.x+1][slime.y]!=1))
slime.x++;//↓
break;
case 3:
if((slime.x<=18)&&(dungeon[slime.level][slime.x][slime.y+1]!=1))
slime.y++;//→
break;
case 1:
if((slime.x>=1)&&(dungeon[slime.level][slime.x][slime.y-1]!=1))
slime.y--;//←
break;
default:
printf("想定外の値です: %d",dMonster);
break;
}
show_dungeon();
}
switch(dungeon[PC.level][PC.x][PC.y]){
case 2:
if((dungeon[PC.level][PC.x][PC.y]==2)&&(PC.level<1))
printf("%s:おっ、こんな所に下り階段がある…\n",PC.name);
PC.level++;
break;
case 3:
if((dungeon[PC.level][PC.x][PC.y]==3)&&(PC.level>0))
printf("%s:おっ、こんな所に上がり階段がある…\n",PC.name);
PC.level--;
break;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(スマホアプリ・スマホゲーム) Yahooマップについて使い方 前までGoogleマップを使っていたのですが、電車移動はYahooマ 1 2022/11/05 11:06
- その他(アニメ・マンガ・特撮) 作画が綺麗でキャラの表情が魅力的なおすすめ漫画を教えてください。 絵を描く人間です。男性キャラの表情 1 2023/04/18 00:49
- カップル・彼氏・彼女 彼氏が風俗を検索していました。 同棲をしています。レスではなく、行く気は本当にないが周囲の人の話から 5 2023/03/22 11:00
- Chrome(クローム) Chromeでgooglemap検索等結果が他国になってしまう 1 2022/10/05 12:18
- 地図・道路 カーナビタイムのルート検索結果について 枚方ー能登のルート 2 2022/08/07 13:03
- その他(悩み相談・人生相談) 妹が本当に気持ち悪いです。 私には、中学一年の妹がいるのですが、彼女のことが本当に嫌いですし、とこと 1 2022/05/20 20:42
- オンラインゲーム Wi-Fi、プレイヤー、勝手に侵入。 1 2022/09/20 01:45
- アニメ アニメや漫画に女キャラっていらなくないですか? 9 2023/07/17 17:40
- Gmail gメールについて教えてください。僕はgメールを使っているのですが今Googleアカウントがアニメのキ 1 2022/03/28 21:20
- Android(アンドロイド) AQUOS ZEROの使い方教えて下さい 2 2022/03/27 17:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
このプログラミング誰か教えて...
-
PICの逆アセンブル?について
-
サイクロイドの軌跡
-
初心者にEXCELのVBAを教えると...
-
Ryzen 3700(無印)はWin11に対応...
-
VBプログラムをEXCEL VBAに移植...
-
論理回路や全加算機の仕組み
-
オフラインの掲示板
-
サーバーサイドのプログラム言...
-
プログラム初心者でござる。PHP...
-
DLLってなに?
-
自動で施設の空きを通知するプ...
-
API、OCX、DLLって何でしょう?
-
VBS:コンピュータ名を取得し、...
-
プログラミング言語について御...
-
コンソールアプリでファイル選...
-
win版とmac版などがあるのはなぜ?
-
1年無職の彼氏 別れるべきですか?
-
iframe の代用で objectタグを...
-
今職業訓練のパソコン教室行っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
API、OCX、DLLって何でしょう?
-
VBプログラムをEXCEL VBAに移植...
-
UNIX環境でのCプログラム上でC...
-
このプログラミング誰か教えて...
-
C言語のHP-UXからLinuxへのポ...
-
Ryzen 3700(無印)はWin11に対応...
-
VB.net エラーメッセージを英文...
-
SNMPトラップ情報をC#.netで作...
-
プログラムとは理系ですか文系...
-
現在プログラミングの研修中な...
-
VBS:コンピュータ名を取得し、...
-
C言語でSMTPを使ったプログ...
-
C/C++でチャットソフトを作りた...
-
OSとCPUの関係について
-
DLLってなに?
-
自動で施設の空きを通知するプ...
-
PHP+MySQLで家計簿を作りたい
-
どんなプログラムを自作しまし...
-
コンソールアプリでファイル選...
-
If … then の中の条件式と型に...
おすすめ情報