old/sokosold2.c
author viric@llimona
Fri, 05 May 2006 23:20:33 +0200
changeset 3 29cc57a9678e
parent 0 sokosold2.c@be33ecaa3619
permissions -rw-r--r--
Moving the files to appropiate locations.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     1
#include <stdio.h>
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     2
#include <string.h>
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     3
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     4
#define BOX '$'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     5
#define WALL '#'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     6
#define MAN '@'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     7
#define PLATFORM '.'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     8
#define BOXINPLATFORM '*'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     9
#define MANINPLATFORM 'E'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    10
#define BLANK ' '
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    11
#define CANTO '-'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    12
#define MANCANMOVE '+'
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    13
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    14
#define NBOX(n) ((n)<<2)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    15
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    16
#define DIR_LEFT 0
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    17
#define DIR_RIGHT 1
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    18
#define DIR_UP 2
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    19
#define DIR_DOWN 3
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    20
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    21
#define MAX_X 50
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    22
#define MAX_Y 50
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    23
#define MAX_MOVES 50
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    24
#define MAX_MANMOVES 50
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    25
#define MAX_BOXES 15
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    26
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    27
#define MOVE_OK		1
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    28
#define MOVE_BOX	2
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    29
#define MOVE_ILLEGAL	0
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    30
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    31
/* SOKOBAN Solution Finder
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    32
 *
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    33
 * Cerca totes les possibilitats de tots els nombres de combinacions possibles,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    34
 * menys la que tots els moviments són a l'esquerra del número de combinacions
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    35
 * incials triat.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    36
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    37
 * 13/01/2002
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    38
 * Comentari afegit el 4/01/2003:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    39
 * Cerca la solució segons el moviment de caixes, i no el de l'home.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    40
 * Falta optimitzar: Llocs on no posar caixes segons les caixes (són dinàmics
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    41
 * segons cada element de l'array de mapes!)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    42
 *
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    43
 * Diria que el programa no es deixa cap branca de l'arbre de backtracking
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    44
 */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    45
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    46
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    47
struct Map
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    48
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    49
	char Cells[MAX_Y][MAX_X];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    50
	char ManMoves[MAX_Y][MAX_X];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    51
	int SizeX, SizeY;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    52
	int ManX, ManY;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    53
	int NumPlatforms;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    54
	int NumBoxesInPlatform;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    55
	int BoxX[MAX_BOXES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    56
	int BoxY[MAX_BOXES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    57
	int NumBoxes;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    58
};
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    59
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    60
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    61
void CopyMap (struct Map *Mdest, struct Map *Morig)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    62
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    63
	memcpy((void *) Mdest, (void *) Morig, sizeof (struct Map));
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    64
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    65
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    66
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    67
void ReadMap(struct Map *M, char *FileName)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    68
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    69
	FILE *Fitxer;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    70
	int i,j;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    71
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    72
	if(!(Fitxer = fopen(FileName, "r")))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    73
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    74
		printf("Error opening %s!", FileName);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    75
		exit(1);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    76
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    77
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    78
	M->SizeX=0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    79
	M->SizeY=0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    80
	while (!feof(Fitxer))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    81
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    82
		fgets(M->Cells[M->SizeY], MAX_X, Fitxer);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    83
		M->SizeY++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    84
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    85
	M->SizeY--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    86
	M->SizeX = strlen(M->Cells[0]) - 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    87
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    88
	M->NumPlatforms = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    89
	M->NumBoxesInPlatform = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    90
	M->NumBoxes = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    91
	for (j = 0; j<M->SizeY; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    92
		for (i=0; i<M->SizeX; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    93
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    94
			if (M->Cells[j][i] == MAN)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    95
			{ 
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    96
				M->ManX = i; M->ManY = j; 
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    97
				M->Cells[M->ManY][M->ManX] = BLANK;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    98
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    99
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   100
			if (M->Cells[j][i] == PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   101
				M->NumPlatforms++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   102
			else if (M->Cells[j][i] == BOXINPLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   103
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   104
				M->Cells[j][i] = PLATFORM;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   105
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   106
				M->NumPlatforms++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   107
				M->NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   108
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   109
				M->BoxX[M->NumBoxes] = i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   110
				M->BoxY[M->NumBoxes] = j;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   111
				M->NumBoxes++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   112
			} else if (M->Cells[j][i] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   113
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   114
				M->Cells[j][i] = BLANK;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   115
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   116
				M->BoxX[M->NumBoxes] = i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   117
				M->BoxY[M->NumBoxes] = j;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   118
				M->NumBoxes++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   119
			} else if (M->Cells[j][i] != WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   120
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   121
				if (    (M->Cells[j][i-1] == WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   122
					 M->Cells[j-1][i] == WALL) ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   123
					(M->Cells[j][i-1] == WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   124
					 M->Cells[j+1][i] == WALL) ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   125
					(M->Cells[j][i+1] == WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   126
					 M->Cells[j-1][i] == WALL) ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   127
					(M->Cells[j][i+1] == WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   128
					 M->Cells[j+1][i] == WALL))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   129
				M->Cells[j][i] = CANTO;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   130
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   131
				
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   132
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   133
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   134
	if(M->NumBoxes > M->NumPlatforms)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   135
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   136
		printf("More boxes than platforms!\n");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   137
		exit(2);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   138
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   139
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   140
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   141
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   142
void ShowMap (struct Map *M)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   143
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   144
	struct Map Temp;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   145
	int i,j;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   146
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   147
	CopyMap(&Temp, M);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   148
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   149
	Temp.Cells[Temp.ManY][Temp.ManX] = MAN;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   150
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   151
	for (i = 0; i < Temp.NumBoxes; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   152
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   153
		if (Temp.Cells[Temp.BoxY[i]][Temp.BoxX[i]] == BLANK)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   154
			Temp.Cells[Temp.BoxY[i]][Temp.BoxX[i]] = BOX;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   155
		else if (Temp.Cells[Temp.BoxY[i]][Temp.BoxX[i]] == PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   156
			Temp.Cells[Temp.BoxY[i]][Temp.BoxX[i]] = BOXINPLATFORM;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   157
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   158
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   159
	for (j = 0; j<Temp.SizeY; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   160
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   161
		for (i=0; i<Temp.SizeX; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   162
			printf("%c", Temp.Cells[j][i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   163
		printf("\n");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   164
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   165
	// Print Where the man can move
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   166
	for (j = 0; j<Temp.SizeY; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   167
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   168
		for (i=0; i<Temp.SizeX; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   169
			printf("%c", Temp.ManMoves[j][i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   170
		printf("\n");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   171
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   172
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   173
	printf("Man is at (%i,%i)\n", Temp.ManX, Temp.ManY);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   174
	printf("Platforms: %i, BoxesInPlatform: %i\n", Temp.NumPlatforms,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   175
			Temp.NumBoxesInPlatform);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   176
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   177
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   178
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   179
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   180
int InverseMove(char Dir1, char Dir2)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   181
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   182
	if ((Dir1 + Dir2 == DIR_LEFT + DIR_RIGHT) ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   183
		(Dir1 + Dir2 == DIR_UP + DIR_DOWN))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   184
		return 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   185
	return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   186
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   187
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   188
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   189
void GetManMoves(struct Map *M)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   190
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   191
	int X[MAX_MANMOVES], Y[MAX_MANMOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   192
	int NewX[MAX_MANMOVES], NewY[MAX_MANMOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   193
	int NumMoves, NewMoves;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   194
	int j, i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   195
	
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   196
	NumMoves = 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   197
	for (j = 0; j<M->SizeY; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   198
		for (i=0; i<M->SizeX; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   199
			M->ManMoves[j][i] = (M->Cells[j][i] == WALL)?WALL:BLANK;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   200
	for (i = 0; i<M->NumBoxes; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   201
		M->ManMoves[M->BoxY[i]][M->BoxX[i]] = WALL;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   202
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   203
	NewMoves = 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   204
	NewX[0] = M->ManX;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   205
	NewY[0] = M->ManY;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   206
	M->ManMoves[M->ManY][M->ManX] = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   207
	while (NewMoves)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   208
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   209
		NumMoves = NewMoves;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   210
		for (i=0; i<NewMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   211
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   212
			X[i] = NewX[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   213
			Y[i] = NewY[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   214
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   215
		NewMoves = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   216
		for (i=0; i<NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   217
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   218
			if(M->ManMoves[Y[i]][X[i]-1] == BLANK)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   219
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   220
				NewX[NewMoves] = X[i]-1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   221
				NewY[NewMoves] = Y[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   222
				M->ManMoves[Y[i]][X[i]-1] = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   223
				NewMoves++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   224
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   225
			if(M->ManMoves[Y[i]][X[i]+1] == BLANK)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   226
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   227
				NewX[NewMoves] = X[i]+1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   228
				NewY[NewMoves] = Y[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   229
				M->ManMoves[Y[i]][X[i]+1] = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   230
				NewMoves++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   231
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   232
			if(M->ManMoves[Y[i]-1][X[i]] == BLANK)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   233
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   234
				NewX[NewMoves] = X[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   235
				NewY[NewMoves] = Y[i]-1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   236
				M->ManMoves[Y[i]-1][X[i]] = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   237
				NewMoves++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   238
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   239
			if(M->ManMoves[Y[i]+1][X[i]] == BLANK)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   240
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   241
				NewX[NewMoves] = X[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   242
				NewY[NewMoves] = Y[i]+1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   243
				M->ManMoves[Y[i]+1][X[i]] = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   244
				NewMoves++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   245
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   246
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   247
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   248
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   249
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   250
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   251
/* Returns bool */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   252
char IsStupidPos(struct Map *M, int X, int Y)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   253
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   254
	struct Map MTemp;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   255
	int NumBoxes, NumWalls, NumBoxesInPlatform;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   256
	int j, i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   257
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   258
	CopyMap(&MTemp, M);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   259
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   260
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   261
	for (i = 0; i<MTemp.NumBoxes; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   262
		if (MTemp.Cells[MTemp.BoxY[i]][MTemp.BoxX[i]] == PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   263
			MTemp.Cells[MTemp.BoxY[i]][MTemp.BoxX[i]] =
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   264
			BOXINPLATFORM;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   265
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   266
			MTemp.Cells[MTemp.BoxY[i]][MTemp.BoxX[i]] = BOX;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   267
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   268
//	ShowMap(&MTemp);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   269
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   270
	/* We don't verify if j<=Y or i<=X is outside the map. It shouldn't
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   271
	 * be, as it will be called with X,Y pair beeing the coordinates of a
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   272
	 * Box!
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   273
	 */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   274
	for (j = Y-1; j<=Y; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   275
		for (i=X-1; i<=X; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   276
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   277
			NumBoxes = NumWalls = NumBoxesInPlatform = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   278
			/* Up-Left Cell */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   279
			if (MTemp.Cells[j][i] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   280
				NumWalls++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   281
			else if (MTemp.Cells[j][i] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   282
				NumBoxes++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   283
			else if (MTemp.Cells[j][i] == BOXINPLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   284
				NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   285
			/* Up-Right Cell */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   286
			if (MTemp.Cells[j][i+1] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   287
				NumWalls++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   288
			else if (MTemp.Cells[j][i+1] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   289
				NumBoxes++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   290
			else if (MTemp.Cells[j][i+1] == BOXINPLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   291
				NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   292
			/* Down-Right Cell */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   293
			if (MTemp.Cells[j+1][i+1] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   294
				NumWalls++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   295
			else if (MTemp.Cells[j+1][i+1] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   296
				NumBoxes++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   297
			else if (MTemp.Cells[j+1][i+1] == BOXINPLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   298
				NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   299
			/* Down-Left Cell */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   300
			if (MTemp.Cells[j+1][i] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   301
				NumWalls++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   302
			else if (MTemp.Cells[j+1][i] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   303
				NumBoxes++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   304
			else if (MTemp.Cells[j+1][i] == BOXINPLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   305
				NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   306
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   307
			if ((NumBoxesInPlatform + NumBoxes + NumWalls == 4) &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   308
				(NumBoxes >= 1)) 
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   309
				return MOVE_ILLEGAL;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   310
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   311
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   312
	return MOVE_OK;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   313
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   314
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   315
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   316
int MoveBox(struct Map *M, int NumBox, int Direction)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   317
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   318
	char InPlatform;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   319
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   320
	InPlatform = (M->Cells[M->BoxY[NumBox]][M->BoxX[NumBox]] == PLATFORM);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   321
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   322
	switch(Direction)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   323
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   324
		case DIR_LEFT:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   325
			if(M->ManMoves[M->BoxY[NumBox]][M->BoxX[NumBox]+1] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   326
				MANCANMOVE &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   327
				(M->ManMoves[M->BoxY[NumBox]][M->BoxX[NumBox]-1]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   328
				!= WALL) &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   329
				(M->Cells[M->BoxY[NumBox]][M->BoxX[NumBox]-1]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   330
				!= CANTO) )
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   331
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   332
				if(InPlatform)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   333
					M->NumBoxesInPlatform--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   334
				M->BoxX[NumBox]--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   335
				if(M->Cells[M->BoxY[NumBox]][M->BoxX[NumBox]] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   336
					PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   337
					M->NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   338
				return IsStupidPos(M,M->BoxX[NumBox], M->BoxY[NumBox]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   339
			}else return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   340
			break;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   341
		case DIR_RIGHT:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   342
			if(M->ManMoves[M->BoxY[NumBox]][M->BoxX[NumBox]-1] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   343
				MANCANMOVE &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   344
				(M->ManMoves[M->BoxY[NumBox]][M->BoxX[NumBox]+1]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   345
				!= WALL) &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   346
				(M->Cells[M->BoxY[NumBox]][M->BoxX[NumBox]+1]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   347
				!= CANTO) )
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   348
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   349
				if(InPlatform)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   350
					M->NumBoxesInPlatform--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   351
				M->BoxX[NumBox]++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   352
				if(M->Cells[M->BoxY[NumBox]][M->BoxX[NumBox]] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   353
					PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   354
					M->NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   355
				return IsStupidPos(M,M->BoxX[NumBox], M->BoxY[NumBox]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   356
			}else return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   357
			break;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   358
		case DIR_UP:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   359
			if(M->ManMoves[M->BoxY[NumBox]+1][M->BoxX[NumBox]] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   360
				MANCANMOVE &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   361
				(M->ManMoves[M->BoxY[NumBox]-1][M->BoxX[NumBox]]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   362
				!= WALL) &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   363
				(M->Cells[M->BoxY[NumBox]-1][M->BoxX[NumBox]]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   364
				!= CANTO) )
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   365
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   366
				if(InPlatform)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   367
					M->NumBoxesInPlatform--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   368
				M->BoxY[NumBox]--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   369
				if(M->Cells[M->BoxY[NumBox]][M->BoxX[NumBox]] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   370
					PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   371
					M->NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   372
				return IsStupidPos(M,M->BoxX[NumBox], M->BoxY[NumBox]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   373
			}else return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   374
			break;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   375
		case DIR_DOWN:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   376
			if(M->ManMoves[M->BoxY[NumBox]-1][M->BoxX[NumBox]] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   377
				MANCANMOVE &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   378
				(M->ManMoves[M->BoxY[NumBox]+1][M->BoxX[NumBox]]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   379
				!= WALL) &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   380
				(M->Cells[M->BoxY[NumBox]+1][M->BoxX[NumBox]]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   381
				!= CANTO) )
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   382
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   383
				if(InPlatform)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   384
					M->NumBoxesInPlatform--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   385
				M->BoxY[NumBox]++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   386
				if(M->Cells[M->BoxY[NumBox]][M->BoxX[NumBox]] ==
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   387
					PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   388
					M->NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   389
				return IsStupidPos(M,M->BoxX[NumBox], M->BoxY[NumBox]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   390
			}else return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   391
			break;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   392
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   393
	/* Check for stupid movement */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   394
	return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   395
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   396
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   397
void PrintCombination(int Moves[], int NumMoves)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   398
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   399
	int i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   400
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   401
	for (i=0; i < NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   402
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   403
		printf("%i", Moves[i] >> 2);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   404
		if ((Moves[i] & 0x03) == DIR_LEFT)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   405
			printf("L");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   406
		else if ((Moves[i] & 0x03) == DIR_RIGHT)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   407
			printf("R");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   408
		else if ((Moves[i] & 0x03) == DIR_UP)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   409
			printf("U");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   410
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   411
			printf("D");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   412
		printf(",");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   413
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   414
	printf("\n");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   415
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   416
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   417
int main(int argn, char **argv)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   418
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   419
	struct Map Morigin;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   420
	struct Map M[MAX_MOVES+1];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   421
	int Moves[MAX_MOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   422
	int NumMoves;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   423
	int OldMaps;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   424
	int IllegalMove;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   425
	int Carry;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   426
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   427
	int i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   428
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   429
	if (argn != 3)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   430
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   431
		printf("Usage: %s <mapfile> <initial NumMoves>\n", argv[0]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   432
		exit(3);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   433
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   434
	ReadMap(&Morigin, argv[1]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   435
	sscanf(argv[2], "%i", &NumMoves);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   436
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   437
	//ShowMap(&Morigin);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   438
	
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   439
	for (i = 0; i < NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   440
		Moves[i] = NBOX(0) + DIR_LEFT;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   441
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   442
	// Reget the original map
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   443
	CopyMap(&M[0], &Morigin);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   444
	CopyMap(&M[NumMoves], &Morigin);	// For the first while cond.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   445
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   446
	GetManMoves(&M[0]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   447
	ShowMap(&M[0]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   448
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   449
	IllegalMove = NumMoves - 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   450
	// Process the combination
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   451
	for (i = 0; i < NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   452
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   453
		CopyMap(&M[i+1], &M[i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   454
		if (!MoveBox(&M[i+1], Moves[i]>>2, Moves[i] & 0x03))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   455
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   456
			IllegalMove = i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   457
			break;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   458
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   459
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   460
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   461
	// Main solution finder loop
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   462
	while (!(M[NumMoves].NumPlatforms == M[NumMoves].NumBoxesInPlatform && 
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   463
	IllegalMove == -1))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   464
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   465
		// Increase the Counter
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   466
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   467
			Carry = 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   468
			// If last combination was legal
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   469
			if (IllegalMove == -1)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   470
				IllegalMove = NumMoves -1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   471
			// Reset the direction of sure-invalid moves
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   472
			for (i = IllegalMove + 1; i < NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   473
				Moves[i] = NBOX(0) + DIR_LEFT;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   474
			// Increase Counter for a new try of moves
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   475
			for (i = IllegalMove; i >= 0 && Carry; i--)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   476
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   477
				Moves[i]++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   478
				Carry = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   479
				if (Moves[i] ==NBOX(M[0].NumBoxes-1)+DIR_DOWN+1)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   480
				{ Moves[i] = NBOX(0) + DIR_LEFT; Carry = 1; }
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   481
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   482
			OldMaps = i+1;	// Sure? I think it's i+1
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   483
			// If we change the number of movements for solution
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   484
			if (Carry)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   485
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   486
				if (NumMoves > MAX_MOVES)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   487
					break;	// MAX MOVES EXCEEDED!!!
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   488
				NumMoves++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   489
				for (i = 0; i < NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   490
					Moves[i] = NBOX(0) + DIR_LEFT;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   491
				OldMaps=0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   492
				CopyMap(&M[NumMoves], &Morigin);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   493
					// For the first while cond.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   494
				printf("Provant %i moviments...\n", NumMoves);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   495
				fflush(stdout);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   496
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   497
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   498
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   499
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   500
		// First assume combination is legal
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   501
		IllegalMove = -1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   502
		// Process the combination
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   503
		for (i = OldMaps; i < NumMoves - 1; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   504
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   505
			CopyMap(&M[i+1], &M[i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   506
			if (!MoveBox(&M[i+1], Moves[i]>>2, Moves[i] & 0x03))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   507
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   508
				IllegalMove = i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   509
				break;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   510
			} /*else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   511
			if (((Moves[i] + Moves[i-1] == DIR_LEFT + DIR_RIGHT) ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   512
				(Moves[i] + Moves[i-1] == DIR_UP + DIR_DOWN)) &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   513
				!M[i].BoxMoved)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   514
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   515
				IllegalMove = i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   516
				break;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   517
			}*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   518
			// For next map:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   519
			GetManMoves(&M[i+1]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   520
				
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   521
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   522
		// Here i = NumMoves - 1
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   523
		CopyMap(&M[i+1], &M[i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   524
		if (!MoveBox(&M[i+1], Moves[i]>>2, Moves[i] & 0x03))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   525
			IllegalMove = i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   526
		//ShowMap(&M[i+1]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   527
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   528
		//printf("IM: %i\n", IllegalMove);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   529
					
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   530
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   531
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   532
	// Print the combination
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   533
	PrintCombination(Moves, NumMoves);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   534
/*
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   535
	// Print The Steps
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   536
	for (i=0; i < NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   537
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   538
		ShowMap(&M[i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   539
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   540
*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   541
	return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   542
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   543
}