このプログラムに関数を一つ増やしたいのですが、うまくできません。どこを、どうすればいいでしょう?
迷路の内容は未完成です。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int KEY(int *Kn,int *Y,int *X);
int main(void)
{
//数値格納
int kn; //入力キー
int sty,stx; //座標
int fy,fx; //マップ範囲
int jm[25][40]; //移動可不判定
char mapc[3]={0};//複写されたマップ構成情報
//カウント
int y,x; //判定生成、座標生成・描写用
//マップチップ
char mc[2][3]={
/*mc[0] 移動可能*/" ",
/*mc[1] 移動不可*/"■"};
//マップ構成 (最大値 25行x40列)
char map[][81]={
/*00*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■",
/*01*/"■ ■ ■",
/*02*/"■ ■■■■ ■ ■",
/*03*/"■ ■■ ■ ■",
/*04*/"■ ■ ■■■ ■",
/*05*/"■■ ■ ■ ■",
/*06*/"■ ■ ■ ■",
/*07*/"■ ■■ ■ ■",
/*08*/"■ ■ ■ ■",
/*09*/"■ ■",
/*10*/"■ ■",
/*11*/"■ ■",
/*12*/"■ ■",
/*13*/"■ ■",
/*14*/"■ ■",
/*15*/"■ ■",
/*16*/"■ ■",
/*17*/"■ ■",
/*18*/"■ ■",
/*19*/"■ ■",
/*20*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"};
//マップ範囲算出
fy=sizeof(map)/81; //行
fx=strlen(map[0])/2; //列
//キャラクター初期座標指定
sty=8,stx=8;
/* 判定生成 */
for(y=0;y<fy;y++){
for(x=0;x<fx;x++){
strncpy(mapc ,&map[y][(x)*2] ,2 );
if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定
else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定
}
}
/* 画面出力 */
while(1){
system("cls"); //画面消去
/* 座標生成、描写 */
for(y=0;y<fy;y++){
for(x=0;x<fx;x++){
strncpy(mapc ,&map[y][(x)*2] ,2);
if(jm[y][x]==0){
if(y==sty&&x==stx)
{printf("%s","○");} //キャラ表示
else if(strncmp(mc[0],mapc,2)==0)
{printf("%s",mapc );} //移動可能表示
}
else if (strncmp(mc[1],mapc,2)==0)
{printf("%s",mapc );} //移動不可表示
}
if(fx<40){printf("\n");} //fxが40未満の場合、改行
}
if(sty==1&&stx==1){
printf("ゴールしました\n");
}
/* 入力キー、移動座標出力 */
KEY(&kn,&sty,&stx);
/* 壁、マップ外への侵入防止 */
for(y=0;y<sty+1;y++){
for(x=0;x<fx;x++){
if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){
if(kn==0x4b){stx++;}
else if(kn==0x4d){stx--;}
else if(kn==0x48){sty++;}
else if(kn==0x50){sty--;}
break;
}
}
}
/* 終了操作 */
if(kn==0x1b){printf("▼終了します。\n") ;break;}
}
}
/* 入力キー、移動座標出力 */
int KEY(int *Kn,int *Y,int *X){
while(1){
*Kn=getch( ); //1:通常キー
if (*Kn==0){
*Kn=getch( ); //2:特殊キー
if (*Kn==0x4b){(*X)--;}// ←
else if (*Kn==0x4d){(*X)++;}// →
else if (*Kn==0x48){(*Y)--;}// ↑
else if (*Kn==0x50){(*Y)++;}// ↓
else if (*Kn==0x80){ }//特殊キー追加場所
else {continue;}
break;
}
else if (*Kn==0x1b){}// Esc
//else if (*Kn== ){} 通常キー追加場所
else {continue;}
break;
}
return 0;
}
No.1ベストアンサー
- 回答日時:
目的もなく、ただ「関数を一つ増やしたい」と言われても困ります。
目的を決まらなければ、どんな関数にしたらよいかがわかりません。
どんな関数にしたらよいかがわからなければ、プログラミングのしようがありません。
以下、余談にはなりますが。
> char map[][81]={
■が2バイトだと決めつけていますが、UTF-8だと3バイトです。
プログラム中この2バイトであると決めつけた「2」という数値が出てきます。
これは「よくないプログラミング手法」です。
//マップチップ
char mc[2][3]={
と用意しているのですから、マップデータを表示と同じにする必要はありません。
char map[][81]={
/*00*/"********************",
/*01*/"* * * * *",
...
などとすれば、2を掛けたり割ったりする必要がなくなります。
strncpy,strcmp関数もほとんど不要です。
あるいは
int jm[25][40]; //移動可不判定
にマップ情報をいれるのですから、最初から
int jm[][41]={
{1,1,1,1,1,1,1,1,1,1,....,1,2},
{1,0,1,0,0,1,1,1,1,1,0,....,1,2},
...
{2}
}
等とjmに直接マップデータを記述して、 char map[][81] をまったく使用しない、という方法もあります。
// 列の終端、行の終端に 2 を使用しました。
// sizeofによる計算や、strlen関数の代りに、終端までの数を数えるようにします。
// 現行のmapでも、終端行の目印(空文字列とか)を入れて、そこまでの行数を数えるようにする方が、sizeofを使うものに比べて汎用性がよいです。
/* 壁、マップ外への侵入防止 */
for(y=0;y<sty+1;y++){
for(x=0;x<fx;x++){
if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){
条件をよく見てください。
この条件が成立するのは、次のどちらかが成立している場合です。
1. (fy<=sty||fx<=stx)
2. (y==sty&&x==stx&&jm[y][x]==1)
1.には、変数 x,y が使われていないので、ループの影響は受けません。
2. では、 少なくとも、y==sty&&x==stx が成立している必要があります。これ以外のx,yでは不成立です。
つまり、 このforループでは、y==sty&&x==stxの1回以外は無駄なループです。
sty,stxが範囲外だと、jm[sty][stx]==1 で動作に不具合が出ます。
ですが、
(sty,stxが範囲外である) || (jm[sty][stx]==1)
とすると、 || 演算子の特性( 左が真なら、右は計算しない) によって、 jm[sty][stx]==1 を評価するのは sty,stxが が範囲内の場合のみ、となります。
もっとも、私なら次のように作ります
newX=stx ;
newY=sty ;
/* 入力キー、移動座標出力 */
KEY(&kn,&newY,&newX);
/* 壁、マップ外への侵入防止 */
if ( newX,newYがマップの範囲内 && jm[newY][newX]==0 ) {
stx=newX;
sty=newY;
}
キーコードで判定して移動したものを、またキーコードで判定して元に戻す、なんて、面倒ではなかったですか?
「移動」に必要なのは、次の座標と、そこへ移動できるかどうかの判断だけで、キーコードは不要です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
材料力学のSFDとBMDは一般的に...
-
pMOSFETとnMOSFETを用いたHブリ...
-
浮動充電回路の電気の流れについて
-
金属や物体を焼き切る高出力レ...
-
0-100mVの電圧出力を4-20mAに変...
-
y,u,k,iのアルファベット四文字...
-
6ストロークエンジンの動作・行...
-
pMOSFETとnMOSFETを用いてHブリ...
-
オーディオアンプについてのご...
-
【真空計、圧力計、連成計】連...
-
膨張弁は圧力を下げる働きをす...
-
アクリルの強度についてについて
-
金属は内部で割れることはあり...
-
冷蔵庫の動作とは何を説明すれ...
-
これを動かすためにバッテリー...
-
論理回路のカルノー図の問題で...
-
球状化焼きなましってどんな熱...
-
ボルトとナットを用いた締結に...
-
SUS420J2とは?
-
歯車と噛み合う方のラックにSR...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
斜めに移動
-
Flashパブリッシュエラー
-
角度を
-
2点間を結ぶ線
-
障害物に対する衝突判定
-
duplicateMovieClip
-
【急ぎ】setIntervalを使って各...
-
2つの異なる階層のMCを操作す...
-
フラッシュ内の特定の座標内に...
-
ムービークリップの初期座標
-
HSP あたり判定
-
_x,_y指定の移動の方法(Flash l...
-
photoshopで書いた四角の枠の中...
-
VBAで改行の入ったデータの正規...
-
VBScriptでMsgBoxのYesNoボック...
-
python ボタンを押すと複数の関...
-
テキストボックスの中身をリセ...
-
テキストボックスにセルの値を...
-
else if文の順序を変えることに...
-
別のアプリケーションのテキス...
おすすめ情報