自キャラ移動について

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

自キャラ移動について

#1

投稿記事 by sain7 » 15年前

ここからのプログラムでマップ上、自キャラ「@」の周りを見て例えばaをリアルタイムキー入力をしたときに右に,cなら右下に1歩gやdは周りではないので進まないようにするにはどうしたらいいのでしょうか?
試行錯誤しつつ2,3時間粘ってみたのですが全くわかりませんでした・・・。
コンパイラーはVisual Studio2008で OSはwindows7です。
■■■■■
■@ag■
■bcd■
■■■■■

コード:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//グローバル変数にしてください。
HANDLE hCout;//コンソールのハンドル
CONSOLE_SCREEN_BUFFER_INFO csbi; // コンソール画面の情報

/*構造体定義*/
typedef struct
{
char type;/*種類*/
int atari;/*当りフラグ*/
}KEY;


typedef struct{
char jiki_img;//主人公描写
int jiki_x;//主人公のX座標
int jiki_y;//主人公のY座標
int jiki_stop;//主人公止まる
int jiki_moves;//主人公動く
int atari;//当たり判定

}PLAYER;//主人公
PLAYER jiki_ch;

//マップデータ
#define MAXWIDTH 17
#define MAXHEIGHT 11
int g_mapdata[MAXHEIGHT][MAXWIDTH] = {
	// 0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16
	{  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //0
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //1
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //2
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //3
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //4
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //5
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //6
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //7
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //8
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //9
	{  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  //10
};
KEY dt[MAXHEIGHT][MAXWIDTH];
//プロトタイプ宣言
void shuffle(KEY *);//現在使ってない 一応シャッフル
void init(KEY *);//初期化関数
void mapdeta(void);//マップ作成関数
void jiki_main(PLAYER *);//主人公表示関数
void keybord(PLAYER *);//キーボード入力・移動関数

/****************************/
//メイン関数
/****************************/
void main(void)
{
	// ここからはmainの先頭に。
    hCout = GetStdHandle(STD_OUTPUT_HANDLE); // 標準出力のハンドルを取得する。
    GetConsoleScreenBufferInfo(hCout, &csbi); // 画面の情報を取得する
	srand((unsigned int)time(NULL));
	system("cls");	
	jiki_ch.jiki_img='@';//主人公
	int i;//for用変数宣言
	jiki_main(&jiki_ch);//主人公の位置決定表示関数
	mapdeta();
	keybord(&jiki_ch);		

}



	/*while(1){
	int test;
	scanf("%d",&test);
	//clrscr();
	switch(test) 
	{
	case 1:
	gotoxy(1,1);
	mapdeta();
	break;
	case 2:
	printf("2です。\n");
	break;
	default:
	printf("エラーです。\n");
	break;
	}*/


void init(KEY *pt){
char c[1][26]={'a','b','c','d',
	     	'e','f','g','h',
     		'i','j','k','l',
			'm','n','o','p',
		    'q','r','s','t',
		    'u','v','w','x',
		    'y','z'};/*種類*/
/*c[26]={'A','B','C','D',
	     	'E','F','G','H',
     		'I','J','K','L',
			'M','N','O','P',
		    'Q','R','S','T',
		    'U','V','W','X',
		    'Y','Z'};/*種類*/
	
	int i,j;
	for(i=0;i<MAXHEIGHT;++i){
		for(j=0;j<MAXWIDTH;j++){
			pt->type=c[0][rand()%26];	
			pt++;
		}
	}
}
void jiki_main(PLAYER *pt){//主人公表示関数
	g_mapdata[pt->jiki_x=rand()%9+1][pt->jiki_y=rand()%15+1]=2;
}
void shuffle(KEY *pt)
{
KEY wk;/*入れ替え用のワークエリア*/
int i,rnd;/*要素番号用、乱数用*/
i=26;
while(i>1)
	{
		rnd=rand()%i;/*乱数セット*/
		wk=*(pt+rnd);
		*(pt+rnd)=*(pt+i-1);
		*(pt+i-1)=wk;
		i--;
	}
}

void mapdeta(void){
int i,j;
	for(i=0;i<MAXHEIGHT;i++)
	{
		for(j=0;j<MAXWIDTH;j++)
		{
			switch(g_mapdata[i][j])
			{
			case 0:
			printf("■");
			break;
			case 1:
			init(&dt[0][0]);
			shuffle(&dt[0][0]);
			printf("%c ",dt[i][j].type);
			break;	
			case 2:
//		textcolor(4);
			printf("%c ",jiki_ch.jiki_img);                                                                                                          		//printf("@ ");
//		textcolor(7);
			break;
			default:
			printf("XXX");
			break;
			}
		}
	printf("\n");
	}
}

void keybord(PLAYER *pt){

char key;//文字保存変数
int map;
//for専用変数
int i;
/*for(i=0;i<(MAXHEIGHT*MAXWIDTH);i++){
	map=dt[i].type;
}*/
while(1){
key = getchar();//キーボードから一文字入力
if(g_mapdata[pt->jiki_x-1][pt->jiki_y-1]==key){
	pt->jiki_x-=1;
	pt->jiki_y-=1;

	}	
      }	
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 自キャラ移動について

#2

投稿記事 by softya(ソフト屋) » 15年前

プログラム全体は見てませんが、自分の周りを調べるには擬似コードで書くと

コード:

for( x=-1 ; x<2 ; x++ ) {
for( y=-1 ; y<2 ; y++ ) {
 if( x!=0 && y!=0 ) {
  if( dt[jiki_x+x][jiki_y+y].type = 入力されたキー ) {
   //その方向に移動。
  } 
 }
}
って感じでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sain7

Re: 自キャラ移動について

#3

投稿記事 by sain7 » 15年前

返答ありがとうございましす。
いい感じにプログラムを組むことができたのですが、一歩動いたあと元にいた場所に自キャラが残ってしまって、そこから動けません。初期化するにはどうしたらいいのでしょうか...。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 自キャラ移動について

#4

投稿記事 by softya(ソフト屋) » 15年前

jiki_xとjiki_yを動いた位置に更新すれば良いだけではないでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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