ページ 11

パックマンの敵の動き

Posted: 2017年12月29日(金) 11:44
by ユウ 1年目の中学生
趣味で、パックマンを作っているのですが敵を増やすとバグります。
解決策があれば教えてください。

コード:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <time.h>
int MAP(void);
int  INPUT(void);
void JUDGMENT(int way);
void ENEMY(void);
//void ENEMY_1(void);
//void ENEMY_2(void);
//void ENEMY_3(void);
int  GAME_OVER(void);
int  GAME_CLEAR(void);
#define MAP_X 17
#define MAP_Y 21
#define ENEMY_HOMANY 4
int stop;
int SOCER = 0;
int PLAYER_X,PLAYER_Y;
int ENEMY_X[4] = {},ENEMY_Y[4] = {};
int map[MAP_Y][MAP_X]={
	{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
	{5,7,1,1,1,1,1,1,5,1,1,1,1,1,1,8,5},
	{5,1,5,5,1,5,5,1,5,1,5,5,1,5,5,1,5},
	{5,1,5,5,1,5,5,1,5,1,5,5,1,5,5,1,5},
	{5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5},
	{5,1,5,5,1,5,1,5,5,5,1,5,1,5,5,1,5},
	{5,1,1,1,1,5,1,1,5,1,1,5,1,1,1,1,5},
	{5,5,5,5,1,5,5,1,5,1,5,5,1,5,5,5,5},
	{5,5,5,5,1,5,1,1,1,1,1,5,1,5,5,5,5},
	{5,5,5,5,1,5,1,5,5,5,1,5,1,5,5,5,5},
	{3,1,1,1,1,1,1,5,5,5,1,1,1,1,1,1,3},
	{5,5,5,5,1,5,1,1,4,1,1,5,1,5,5,5,5},
	{5,5,5,5,1,5,1,5,5,5,1,5,1,5,5,5,5},
	{5,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,5},
	{5,1,5,5,1,5,5,1,5,1,5,5,1,5,5,1,5},
	{5,1,1,5,1,1,1,1,2,1,1,1,1,5,1,1,5},
	{5,5,1,5,1,5,1,5,5,5,1,5,1,5,1,5,5},
	{5,1,1,1,1,5,1,1,5,1,1,5,1,1,1,1,5},
	{5,1,5,5,5,5,5,1,5,1,5,5,5,5,5,1,5},
	{5,9,1,1,1,1,1,1,1,1,1,1,1,1,1,10,5},
	{5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5}
};


int main(void){
	int stop;
	int map;
	int GAME = 0;
	while(1){
		map = MAP();
		if(map == 1)	GAME = GAME_CLEAR();
		else if(map == 2)	GAME = GAME_OVER();
		INPUT();
		JUDGMENT(INPUT());
		ENEMY();
		//ENEMY_1();
		//ENEMY_2();
		//ENEMY_3();
		if(GAME == 1)	break;
	}
	stop = _getch();
	return 0;
}
int MAP(){
	int GAME_OVER_flag = 0;
	int GAME_CLEAR_flag = 0;
	system("cls");
	for(int y = 0;y < MAP_Y; y++){
		for(int x = 0;x < MAP_X; x++){
			if(map[y][x] == 5)	printf("■");
			if((map[y][x] == 0)||(map[y][x] == 6))	printf("□");
			if((map[y][x] == 1)||(map[y][x] == 3)){
				printf("・");
				GAME_CLEAR_flag = 1;
			}
			if(map[y][x] == 4)	printf("F");
			if(map[y][x] == 7){
					ENEMY_Y[0] = y;
					ENEMY_X[0] = x;
				printf("▲");
			}
			if(map[y][x] == 8){
					ENEMY_Y[1] = y;
					ENEMY_X[1] = x;
				printf("▲");
			}
			if(map[y][x] == 9){
					ENEMY_Y[2] = y;
					ENEMY_X[2] = x;
				printf("▲");
			}
			if(map[y][x] == 10){
					ENEMY_Y[3] = y;
					ENEMY_X[3] = x;
				printf("▲");
			}
			if(map[y][x] == 2){
				PLAYER_Y = y;
				PLAYER_X = x;
				printf("C");
				GAME_OVER_flag = 1;
			}
		}
		printf("\n");
	}
	if(GAME_CLEAR_flag == 0)	return 1;
	if(GAME_OVER_flag == 0)		return 2;
	printf("YOUR SOCER IS %d",SOCER);
	return 30;
}
int INPUT(){
	int input;
	int INPUT_flag = 1;
	while(INPUT_flag){
		if(_kbhit()){
			input = _getch();
			if(input == 0 || input == 244)	input = _getch();
			INPUT_flag =0;
		}
	}
	return input;
}
void JUDGMENT(int way){
	if(way == 0x48){//上
		if(map[PLAYER_Y-1][PLAYER_X] == 5)	MAP();
		else{
			if(map[PLAYER_Y-1][PLAYER_X] == 1)	SOCER = SOCER+100; 
			map[PLAYER_Y][PLAYER_X] = 0;
			map[PLAYER_Y-1][PLAYER_X] = 2;
		}
	}
	if(way == 0x50){//下
		if(map[PLAYER_Y+1][PLAYER_X] == 5)	MAP();
		else{
			if(map[PLAYER_Y+1][PLAYER_X] == 1)	SOCER = SOCER+100; 
			map[PLAYER_Y][PLAYER_X] = 0;
			map[PLAYER_Y+1][PLAYER_X] = 2;
		}
	}
	if(way == 0x4b){//左
		if((map[PLAYER_Y][PLAYER_X-1] == 3)||(map[PLAYER_Y][PLAYER_X-1] == 6)){
			map[PLAYER_Y][PLAYER_X] = 0;
			if(map[PLAYER_Y][PLAYER_X-1] == 3)	SOCER = SOCER+200;
			PLAYER_X = 15;
			map[PLAYER_Y][0] = 6;
			map[PLAYER_Y][16] = 6;
		}
		if(map[PLAYER_Y][PLAYER_X-1] == 5)	MAP();
		else{
			if(map[PLAYER_Y][PLAYER_X-1] == 1)	SOCER = SOCER+100; 
			map[PLAYER_Y][PLAYER_X] = 0;
			map[PLAYER_Y][PLAYER_X-1] = 2;
		}
	}
	if(way == 0x4d){//右
		if((map[PLAYER_Y][PLAYER_X+1] == 3)||(map[PLAYER_Y][PLAYER_X+1] == 6)){
			map[PLAYER_Y][PLAYER_X] = 0;
			if(map[PLAYER_Y][PLAYER_X+1] == 3)	SOCER = SOCER+200;
			PLAYER_X = 1;
			map[PLAYER_Y][0] = 6;
			map[PLAYER_Y][16] = 6;
		}
		if(map[PLAYER_Y][PLAYER_X+1] == 5)	MAP();
		else{
			if(map[PLAYER_Y][PLAYER_X+1] == 1)	SOCER = SOCER+100; 
			map[PLAYER_Y][PLAYER_X] = 0;
			map[PLAYER_Y][PLAYER_X+1] = 2;
		}
	}
}
void ENEMY(){
	for(int i = 0; i < ENEMY_HOMANY; i++){
		if((PLAYER_Y > ENEMY_Y[i])&&(map[ENEMY_Y[i]+1][ENEMY_X[i]] != 5)){
			if(map[ENEMY_Y[i]+1][ENEMY_X[i]] == 1)	map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			if((map[ENEMY_Y[i]+1][ENEMY_X[i]] == 0)||(map[ENEMY_Y[i]+1][ENEMY_X[i]] == 2))	map[ENEMY_Y[i]][ENEMY_X[i]] = 0;
			//map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			ENEMY_Y[i] = ENEMY_Y[i]+1; 
			map[ENEMY_Y[i]][ENEMY_X[i]] = 7;
		}
		if((PLAYER_Y < ENEMY_Y[i])&&(map[ENEMY_Y[i]-1][ENEMY_X[i]] != 5)){
			if(map[ENEMY_Y[i]-1][ENEMY_X[i]] == 1)	map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			if((map[ENEMY_Y[i]-1][ENEMY_X[i]] == 0)||(map[ENEMY_Y[i]-1][ENEMY_X[i]] == 2))	map[ENEMY_Y[i]][ENEMY_X[i]] = 0;
			//map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			ENEMY_Y[i] = ENEMY_Y[i]-1;
			map[ENEMY_Y[i]][ENEMY_X[i]] = 7;
		}
		if((PLAYER_X > ENEMY_X[i])&&(map[ENEMY_Y[i]][ENEMY_X[i]+1] != 5)){
			if(map[ENEMY_Y[i]][ENEMY_X[i]+1] == 1)	map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			if((map[ENEMY_Y[i]][ENEMY_X[i]+1] == 0)||(map[ENEMY_Y[i]][ENEMY_X[i]+1] == 2))	map[ENEMY_Y[i]][ENEMY_X[i]] = 0;
			//map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			ENEMY_X[i] = ENEMY_X[i]+1; 
			map[ENEMY_Y[i]][ENEMY_X[i]] = 7;
		}
		if((PLAYER_X < ENEMY_X[i])&&(map[ENEMY_Y[i]][ENEMY_X[i]-1] != 5)){
			if(map[ENEMY_Y[i]][ENEMY_X[i]-1] == 1)	map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			if((map[ENEMY_Y[i]][ENEMY_X[i]-1] == 0)||(map[ENEMY_Y[i]][ENEMY_X[i]-1] == 2))	map[ENEMY_Y[i]][ENEMY_X[i]] = 0;
			//map[ENEMY_Y[i]][ENEMY_X[i]] = 1;
			ENEMY_X[i] = ENEMY_X[i]-1; 
			map[ENEMY_Y[i]][ENEMY_X[i]] = 7;
		}
	}
	//stop = _getch();
}
/*void ENEMY_1(){
		if((PLAYER_Y > ENEMY_Y[0])&&(map[ENEMY_Y[0]+1][ENEMY_X[0]] != 5)){
			if(map[ENEMY_Y[0]+1][ENEMY_X[0]] == 1)	map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			if((map[ENEMY_Y[0]+1][ENEMY_X[0]] == 0)||(map[ENEMY_Y[0]+1][ENEMY_X[0]] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			ENEMY_Y[0] = ENEMY_Y[0]+1; 
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
		if((PLAYER_Y < ENEMY_Y[0])&&(map[ENEMY_Y[0]-1][ENEMY_X[0]] != 5)){
			if(map[ENEMY_Y[0]-1][ENEMY_X[0]] == 1)	map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			if((map[ENEMY_Y[0]-1][ENEMY_X[0]] == 0)||(map[ENEMY_Y[0]-1][ENEMY_X[0]] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			ENEMY_Y[0] = ENEMY_Y[0]-1;
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
		if((PLAYER_X > ENEMY_X[0])&&(map[ENEMY_Y[0]][ENEMY_X[0]+1] != 5)){
			if(map[ENEMY_Y[0]][ENEMY_X[0]+1] == 1)	map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			if((map[ENEMY_Y[0]][ENEMY_X[0]+1] == 0)||(map[ENEMY_Y[0]][ENEMY_X[0]+1] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			//map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			ENEMY_X[0] = ENEMY_X[0]+1; 
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
		if((PLAYER_X < ENEMY_X[0])&&(map[ENEMY_Y[0]][ENEMY_X[0]-1] != 5)){
			if(map[ENEMY_Y[0]][ENEMY_X[0]-1] == 1)	map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			if((map[ENEMY_Y[0]][ENEMY_X[0]-1] == 0)||(map[ENEMY_Y[0]][ENEMY_X[0]-1] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			//map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			ENEMY_X[0] = ENEMY_X[0]-1; 
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
	//stop = _getch();
}*/
/*void ENEMY_2(){
		if((PLAYER_Y > ENEMY_Y[2])&&(map[ENEMY_Y[2]+1][ENEMY_X[2]] != 5)){
			if(map[ENEMY_Y[2]+1][ENEMY_X[2]] == 1)	map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			if((map[ENEMY_Y[2]+1][ENEMY_X[2]] == 0)||(map[ENEMY_Y[2]+1][ENEMY_X[2]] == 2))	map[ENEMY_Y[2]][ENEMY_X[2]] = 0;
			//map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			ENEMY_Y[2] = ENEMY_Y[2]+1; 
			map[ENEMY_Y[2]][ENEMY_X[2]] = 7;
		}
		if((PLAYER_Y < ENEMY_Y[2])&&(map[ENEMY_Y[2]-1][ENEMY_X[2]] != 5)){
			if(map[ENEMY_Y[2]-1][ENEMY_X[2]] == 1)	map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			if((map[ENEMY_Y[2]-1][ENEMY_X[2]] == 0)||(map[ENEMY_Y[2]-1][ENEMY_X[2]] == 2))	map[ENEMY_Y[2]][ENEMY_X[2]] = 0;
			//map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			ENEMY_Y[2] = ENEMY_Y[2]-1;
			map[ENEMY_Y[2]][ENEMY_X[2]] = 7;
		}
		if((PLAYER_X > ENEMY_X[2])&&(map[ENEMY_Y[2]][ENEMY_X[2]+1] != 5)){
			if(map[ENEMY_Y[2]][ENEMY_X[2]+1] == 1)	map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			if((map[ENEMY_Y[2]][ENEMY_X[2]+1] == 0)||(map[ENEMY_Y[2]][ENEMY_X[2]+1] == 2))	map[ENEMY_Y[2]][ENEMY_X[2]] = 0;
			//map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			ENEMY_X[2] = ENEMY_X[2]+1; 
			map[ENEMY_Y[2]][ENEMY_X[2]] = 7;
		}
		if((PLAYER_X < ENEMY_X[2])&&(map[ENEMY_Y[2]][ENEMY_X[2]-1] != 5)){
			if(map[ENEMY_Y[2]][ENEMY_X[2]-1] == 1)	map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			if((map[ENEMY_Y[2]][ENEMY_X[2]-1] == 0)||(map[ENEMY_Y[2]][ENEMY_X[2]-1] == 2))	map[ENEMY_Y[2]][ENEMY_X[2]] = 0;
			//map[ENEMY_Y[2]][ENEMY_X[2]] = 1;
			ENEMY_X[2] = ENEMY_X[2]-1; 
			map[ENEMY_Y[2]][ENEMY_X[2]] = 7;
		}
	//stop = _getch();
}
void ENEMY_3(){
		if((PLAYER_Y > ENEMY_Y[3])&&(map[ENEMY_Y[3]+1][ENEMY_X[3]] != 5)){
			if(map[ENEMY_Y[3]+1][ENEMY_X[3]] == 1)	map[ENEMY_Y[3]][ENEMY_X[3]] = 1;
			if((map[ENEMY_Y[0]+1][ENEMY_X[0]] == 0)||(map[ENEMY_Y[0]+1][ENEMY_X[0]] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			//map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			ENEMY_Y[0] = ENEMY_Y[0]+1; 
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
		if((PLAYER_Y < ENEMY_Y[0])&&(map[ENEMY_Y[0]-1][ENEMY_X[0]] != 5)){
			if(map[ENEMY_Y[0]-1][ENEMY_X[0]] == 1)	map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			if((map[ENEMY_Y[0]-1][ENEMY_X[0]] == 0)||(map[ENEMY_Y[0]-1][ENEMY_X[0]] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			//map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			ENEMY_Y[0] = ENEMY_Y[0]-1;
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
		if((PLAYER_X > ENEMY_X[0])&&(map[ENEMY_Y[0]][ENEMY_X[0]+1] != 5)){
			if(map[ENEMY_Y[0]][ENEMY_X[0]+1] == 1)	map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			if((map[ENEMY_Y[0]][ENEMY_X[0]+1] == 0)||(map[ENEMY_Y[0]][ENEMY_X[0]+1] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			//map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			ENEMY_X[0] = ENEMY_X[0]+1; 
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
		if((PLAYER_X < ENEMY_X[0])&&(map[ENEMY_Y[0]][ENEMY_X[0]-1] != 5)){
			if(map[ENEMY_Y[0]][ENEMY_X[0]-1] == 1)	map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			if((map[ENEMY_Y[0]][ENEMY_X[0]-1] == 0)||(map[ENEMY_Y[0]][ENEMY_X[0]-1] == 2))	map[ENEMY_Y[0]][ENEMY_X[0]] = 0;
			//map[ENEMY_Y[0]][ENEMY_X[0]] = 1;
			ENEMY_X[0] = ENEMY_X[0]-1; 
			map[ENEMY_Y[0]][ENEMY_X[0]] = 7;
		}
	//stop = _getch();
}*/
int  GAME_OVER(){	
	printf("GAME_OVER");	
	//stop = _getch();
	return 1;
}
int  GAME_CLEAR(){	
	printf("GAME_CLEAR");
//	stop = _getch();
	return 1;
}

Re: パックマンの敵の動き

Posted: 2017年12月29日(金) 14:09
by uni
具体的に書いてください

コードがあれば読めますが、バグの挙動を言ってもらわないと、挙動から原因を追うのに時間を要します

Re: パックマンの敵の動き

Posted: 2017年12月29日(金) 15:14
by ユウ 1年目の中学生
失礼しました。
バクの挙動ですが、#define ENEMY_HOMANY 4で敵の数を変えているのですが1より大きくすると追尾してこない敵がいたり、敵が分身したりします。
なお、1ではしっかりと動きます。