ローグライクRPGでの描画処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アキノ

ローグライクRPGでの描画処理

#1

投稿記事 by アキノ » 9年前

お世話になります。プログラミングを学習中の学生です。
学習を始めたばかりなので、C言語の知識は浅いです。
課題でローグライクRPGを作っているのですが、ダンジョンの描画が上手く行かずに困っています。
コンパイルすると、

・11行目:'danjon(int, int, int)' の再宣言で型が一致していない
・11行目:宣言の構文エラー
・61,64,67,70行目:それぞれに'void(int, int, int)'型のサイズは未知あるいはゼロ

というエラーが主に出るのですが、何が原因なのでしょうか。
OSはWindows7、コンパイラはCPad for Borland C++Compilerです。
以下が書いてみたソースコードです。宜しくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h> //system構文のため
#include <conio.h> //kbhit構文のため

void title(void);
char charamake(void);
void danjon(int, int, int);

// 0:移動可能 1:壁 2:ゴール
char danjon[2][10][10] ={{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 0, 1, 0, 1, 1, 1, 1, 0, 1},
						  {1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
						  {1, 0, 1, 1, 1, 0, 1, 0, 0, 1},
						  {1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
						  {1, 1, 2, 1, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 1, 0, 0, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}},
						  
						 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 2, 1},
						  {1, 0, 1, 0, 1, 0, 1, 0, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
						  {1, 0, 1, 0, 0, 0, 1, 1, 0, 1},
						  {1, 0, 1, 0, 0, 0, 0, 1, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}};

struct chara{
	char name[5];
	int stage, x, y;
};

struct chara pc = {"", 0, 1, 0};

int main(void){
	
	char res = 'n';
	char zhjkl;
	int key;
	int i;
	
	title();
	
	while (res ! = 'y'){
		res = charamake();
	}
	
	system("cls");
	
	danjon(pc.stage, pc.x, pc.y);
	
	while (1){ //移動処理とゴール処理
		if (kbhit()){
			key = getch();
			if (key ==119) { //w
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x][pc.y-1] ! = 1)) pc.y --;
			}
			if (key ==120) { //s
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x][pc.y+1] ! = 1)) pc.y ++;
			}
			if (key ==97) { //a
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x-1][pc.y] ! = 1)) pc.x --;
			}
			if (key ==100) { //d
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x+1][pc.y] ! = 1)) pc.x ++;
			}
			
			
			danjon(pc.stage, pc.x, pc.y);
			if((danjon[pc.stage][pc.x][pc.y] == 2) && (pc.stage < 1)){
				printf("%s「ゴール!」\n(次のステージへ進みます【Enter】",pc.name
				while (1){
					if (kbhit()){
						pc.stage++;
						break;
					}
				}
			}
		}
	}
}


void title(void){ //タイトル画面
	system("cls");
	printf("迷路");
}


char charamake(void){ //名前設定
	char yesno;
	
	printf("主人公の名前をいれてね:");
	scanf("%s", pc.name);
	printf("「%s」でよろしいですか?(y/n)", pc.name);
	scanf("%c%c", &yesno);
	return yesno;
}


void danjon(int stage, int x, int y){
	int i, j;
	
	system("cls");
	for(j = 0; j < 10; j++){
		for(1 = 0; i < 10; i++){
			if(i == x && j == y) printf("☆");
			else if (danjon[pc.stage][i][j] == 0) printf("□");
			else if (danjon[pc.stage][i][j] == 2) printf("〓");
			else printf("■");
		}
		printf("\n");
	}
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ローグライクRPGでの描画処理

#2

投稿記事 by みけCAT » 9年前

関数danjonと配列danjonの名前が衝突しているのが原因ですね。
どちらかを別の名前にするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アキノ

Re: ローグライクRPGでの描画処理

#3

投稿記事 by アキノ » 9年前

みけCAT さんが書きました:関数danjonと配列danjonの名前が衝突しているのが原因ですね。
どちらかを別の名前にするといいでしょう。
ありがとうございます!トピックのトップに書いたエラーはおかげさまで解決することが出来ました。
他にもセミコロン打ち忘れや1とiのミスタイプを直した結果、

・49行目: While文に ) がない(関数 main() )
・61,64,67,70行目:If文に ) がない(関数 main() )
というエラーが出てきてしまいました。
構文は間違ってないと思うのですが、何が原因かわかりませんでした。
どちらもエラーコードはE2377でした。何度も頼ってすみません。

コード:

#include <stdio.h>
#include <stdlib.h> //system構文のため
#include <conio.h> //kbhit構文のため

void title(void);
char charamake(void);
void danjonmap(int, int, int);

// 0:移動可能 1:壁 2:ゴール
char danjon[2][10][10] ={{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 0, 1, 0, 1, 1, 1, 1, 0, 1},
						  {1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
						  {1, 0, 1, 1, 1, 0, 1, 0, 0, 1},
						  {1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
						  {1, 1, 2, 1, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 1, 0, 0, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}},
						  
						 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 2, 1},
						  {1, 0, 1, 0, 1, 0, 1, 0, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
						  {1, 0, 1, 0, 0, 0, 1, 1, 0, 1},
						  {1, 0, 1, 0, 0, 0, 0, 1, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}};

struct chara{
	char name[5];
	int stage, x, y;
};

struct chara pc = {"", 0, 1, 0};

int main(void){
	
	char res = 'n';
	char zhjkl;
	int key;
	int i;
	
	title();
	
	while (res ! = 'y'){
		res = charamake();
	}
	
	system("cls");
	
	danjonmap(pc.stage, pc.x, pc.y);
	
	while (1){ //移動処理とゴール処理
		if (kbhit()){
			key = getch();
			if (key ==119) { //w
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x][pc.y-1] ! = 1)) pc.y --;
			}
			if (key ==120) { //s
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x][pc.y+1] ! = 1)) pc.y ++;
			}
			if (key ==97) { //a
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x-1][pc.y] ! = 1)) pc.x --;
			}
			if (key ==100) { //d
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x+1][pc.y] ! = 1)) pc.x ++;
			}
			
			
			danjonmap(pc.stage, pc.x, pc.y);
			if((danjon[pc.stage][pc.x][pc.y] == 2) && (pc.stage < 1)){
				printf("%s「ゴール!」\n(次のステージへ進みます【Enter】",pc.name);
				while (1){
					if (kbhit()){
						pc.stage++;
						break;
					}
				}
			}
		}
	}
}


void title(void){ //タイトル画面
	system("cls");
	printf("迷路");
}


char charamake(void){ //名前設定
	char yesno;
	
	printf("主人公の名前をいれてね:");
	scanf("%s", pc.name);
	printf("「%s」でよろしいですか?(y/n)", pc.name);
	scanf("%c%c", &yesno);
	return yesno;
}


void danjonmap(int stage, int x, int y){
	int i, j;
	
	system("cls");
	for(j = 0; j < 10; j++){
		for(i = 0; i < 10; i++){
			if(i == x && j == y) printf("☆");
			else if (danjon[pc.stage][i][j] == 0) printf("□");
			else if (danjon[pc.stage][i][j] == 2) printf("〓");
			else printf("■");
		}
		printf("\n");
	}
}


アキノ

Re: ローグライクRPGでの描画処理

#5

投稿記事 by アキノ » 9年前

usao さんが書きました:○ !=
× ! =

かな
ありがとうございまず。おかげさまでプログラムが無事に動くようになりました。
動くのですが、名前の入力処理の後、プログラムが「動作を停止しました」と停止してしまいます。

関数の順番がおかしいのでしょうか。

コード:

#include <stdio.h>
#include <stdlib.h> //system構文のため
#include <conio.h> //kbhit構文のため


void title(void);
char charamake(void);
void danjonmap(int, int, int);

// 0:移動可能 1:壁 2:ゴール
char danjon[2][10][10] ={{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 0, 1, 0, 1, 1, 1, 1, 0, 1},
						  {1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
						  {1, 0, 1, 1, 1, 0, 1, 0, 0, 1},
						  {1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
						  {1, 1, 2, 1, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 1, 0, 0, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}},
						  
						 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 2, 1},
						  {1, 0, 1, 0, 1, 0, 1, 0, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
						  {1, 0, 1, 0, 0, 0, 1, 1, 0, 1},
						  {1, 0, 1, 0, 0, 0, 0, 1, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}};

struct chara{
	char name[5];
	int stage, x, y;
};

struct chara pc = {"", 0, 1, 0};

int main(void){
	
	char res = 'n';
	char zhjkl;
	int key;
	int i;
	
	title();
	
	while (res != 'y'){
		res = charamake();
	}
	
	system("cls");
	
	danjonmap(pc.stage, pc.x, pc.y);
	
	while (1){ //移動処理とゴール処理
		if (kbhit()){
			key = getch();
			if (key ==119) { //w
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x][pc.y-1] != 1)) pc.y --;
			}
			if (key ==120) { //s
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x][pc.y+1] != 1)) pc.y ++;
			}
			if (key ==97) { //a
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x-1][pc.y] != 1)) pc.x --;
			}
			if (key ==100) { //d
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x+1][pc.y] != 1)) pc.x ++;
			}
			
			
			danjonmap(pc.stage, pc.x, pc.y);
			if((danjon[pc.stage][pc.x][pc.y] == 2) && (pc.stage < 1)){
				printf("%s「ゴール!」\n(次のステージへ進みます【Enter】",pc.name);
				while (1){
					if (kbhit()){
						pc.stage++;
						break;
					}
				}
			}
		}
	}
}


void title(void){ //タイトル画面
	system("cls");
	printf("迷路");
}


char charamake(void){ //名前設定
	char yesno;
	
	printf("主人公の名前をいれてね:");
	scanf("%s", pc.name);
	printf("「%s」でよろしいですか?(y/n)", pc.name);
	scanf("%c%c", &yesno);
	return yesno;
}


void danjonmap(int stage, int x, int y){
	int i, j;
	
	system("cls");
	for(j = 0; j < 10; j++){
		for(i = 0; i < 10; i++){
			if(i == x && j == y) printf("☆");
			else if (danjon[pc.stage][i][j] == 0) printf("□");
			else if (danjon[pc.stage][i][j] == 2) printf("〓");
			else printf("■");
		}
		printf("\n");
	}
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ローグライクRPGでの描画処理

#6

投稿記事 by みけCAT » 9年前

101行目
アキノ さんが書きました:

コード:

	scanf("%c%c", &yesno);
フォーマット指定文字列に対しデータの保存先を表す引数が足りないので、未定義動作になります。
%*cのように書式に*を入れると、読み込んで保存しないことができます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アキノ

Re: ローグライクRPGでの描画処理

#7

投稿記事 by アキノ » 9年前

返事が遅れて申し訳ありません。
無事プログラムも起動し、キャラクターを動かし遊べるようになりました!
本当に有難うございます。
あと1つだけ問題が発生してしまいました。動作には直接問題は無いようなのですが、マップを描画する時なぜか書いたソースコードの物から右に90度回転してその状態から左右が反転した物が描画されてしまいます。
これは何が原因なのでしょうか…?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ローグライクRPGでの描画処理

#8

投稿記事 by みけCAT » 9年前

アキノ さんが書きました:あと1つだけ問題が発生してしまいました。動作には直接問題は無いようなのですが、マップを描画する時なぜか書いたソースコードの物から右に90度回転してその状態から左右が反転した物が描画されてしまいます。
これは何が原因なのでしょうか…?
どう修正したかがわからないし、「書いたソースコードの物」の定義もわからないので断定はできませんが、
そういう順番でループを回して描画していることではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アキノ

Re: ローグライクRPGでの描画処理

#9

投稿記事 by アキノ » 9年前

説明不足でごめんなさい。
ソースコードはこちらです。

コード:

#include <stdio.h>
#include <stdlib.h> //system構文のため
#include <conio.h> //kbhit構文のため

void title(void);
char charamake(void);
void danjonmap(int, int, int);

// 0:移動可能 1:壁 2:ゴール
char danjon[2][10][10] ={{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 0, 1, 0, 1, 1, 1, 1, 0, 1},
						  {1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
						  {1, 0, 1, 1, 1, 0, 1, 0, 0, 1},
						  {1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
						  {1, 1, 2, 1, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 1, 0, 0, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}},
						  
						 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 2, 1},
						  {1, 0, 1, 0, 1, 0, 1, 0, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
						  {1, 0, 1, 0, 0, 0, 1, 1, 0, 1},
						  {1, 0, 1, 0, 0, 0, 0, 1, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}};

struct chara{
	char name[5];
	int stage, x, y;
};

struct chara pc = {"", 0, 1, 0};

int main(void){
	
	char res = 'n';
	char zhjkl;
	int key;
	int i;
	
	title();
	
	while (res != 'y'){
		res = charamake();
	}
	
	system("cls");
	
	danjonmap(pc.stage, pc.x, pc.y);
	
	while (1){ //移動処理とゴール処理
		if (kbhit()){
			key = getch();
			if (key ==119) { //w
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x][pc.y-1] != 1)) pc.y --;
			}
			if (key ==120) { //s
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x][pc.y+1] != 1)) pc.y ++;
			}
			if (key ==97) { //a
				if((pc.y >= 1) &&(danjon[pc.stage][pc.x-1][pc.y] != 1)) pc.x --;
			}
			if (key ==100) { //d
				if((pc.y <= 8) &&(danjon[pc.stage][pc.x+1][pc.y] != 1)) pc.x ++;
			}
			
			
			danjonmap(pc.stage, pc.x, pc.y);
			if((danjon[pc.stage][pc.x][pc.y] == 2) && (pc.stage < 1)){
				printf("%s「ゴール!」\n(次のステージへ進みます【Enter】",pc.name);
				while (1){
					if (kbhit()){
						pc.stage++;
						break;
					}
				}
			}
		}
	}
}


void title(void){ //タイトル画面
	system("cls");
	printf("迷路\n\n");
}


char charamake(void){ //名前設定
	char yesno;
	
	printf("主人公の名前をいれてね:");
	scanf("%s", pc.name);
	printf("「%s」でよろしいですか?(y/n)", pc.name);
	scanf("%*c%c", &yesno);
	return yesno;
}


void danjonmap(int stage, int x, int y){
	int i, j;
	
	system("cls");
	for(j = 0; j < 10; j++){
		for(i = 0; i < 10; i++){
			if(i == x && j == y) printf("☆");
			else if (danjon[pc.stage][i][j] == 0) printf("□");
			else if (danjon[pc.stage][i][j] == 2) printf("〓");
			else printf("■");
		}
		printf("\n");
	}
}
コードの0(□)が移動可能マス、1が壁(■)、2がゴール(〓)なのですが、
1番目のマップが以下のように描画されてしまいます。
☆は主人公です。
■☆■■■■■■■■
■□□□□□■□□■
■□■□■□〓■□■
■□□□■■■■□■
■□■■■□□□□■
■□■□□□■□□■
■□■□■□□□□■
■□■□□□□■□■
■□□□□□□□□■
■■■■■■■■■■

char danjonで描画の順番を手動入力しているので、原因がわからなかったです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ローグライクRPGでの描画処理

#10

投稿記事 by みけCAT » 9年前

アキノ さんが書きました:

コード:

void danjonmap(int stage, int x, int y){
	int i, j;
	
	system("cls");
	for(j = 0; j < 10; j++){
		for(i = 0; i < 10; i++){
			if(i == x && j == y) printf("☆");
			else if (danjon[pc.stage][i][j] == 0) printf("□");
			else if (danjon[pc.stage][i][j] == 2) printf("〓");
			else printf("■");
		}
		printf("\n");
	}
}
コードの0(□)が移動可能マス、1が壁(■)、2がゴール(〓)なのですが、
1番目のマップが以下のように描画されてしまいます。
☆は主人公です。
■☆■■■■■■■■
■□□□□□■□□■
■□■□■□〓■□■
■□□□■■■■□■
■□■■■□□□□■
■□■□□□■□□■
■□■□■□□□□■
■□■□□□□■□■
■□□□□□□□□■
■■■■■■■■■■
仕様通りですね。
rooguraikurpgdenobyougasyori-20160715.png
添字との関係
rooguraikurpgdenobyougasyori-20160715.png (8.82 KiB) 閲覧数: 3706 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アキノ

Re: ローグライクRPGでの描画処理

#11

投稿記事 by アキノ » 9年前

ごめんなさい勘違いしてたみたいです。
お手数かけてすみませんでした…。
こんな質問にも丁寧に答えてくださってありがとうございました!
また分からないことがあったら聞いてみようと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る