Untitled
unknown
c_cpp
2 years ago
6.7 kB
7
Indexable
#include <stdio.h>
#include <stdlib.h>
void initializeArray(char **array, int width, int height)
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
array[i][j] = '.';
}
}
// 隨機在地圖上放置 3 個 M 並且不重複
int count = 0;
while (count < 3)
{
int x = rand() % width;
int y = rand() % height;
if (array[y][x] == '.')
{
array[y][x] = 'M';
count++;
}
}
count = 0;
while (count < 2)
{
int x = rand() % width;
int y = rand() % height;
if (array[y][x] == '.')
{
array[y][x] = 'B';
count++;
}
}
// 隨機放置 1 個 P 且上下左右都不會有 M
int x = rand() % width;
int y = rand() % height;
while (array[y][x] != '.')
{
x = rand() % width;
y = rand() % height;
}
array[y][x] = 'P';
// 隨機放置 1 個 S 並確保 上下左右都不會有 P
x = rand() % width;
y = rand() % height;
while (array[y][x] != '.' || (y > 0 && array[y - 1][x] == 'P') || (y < height - 1 && array[y + 1][x] == 'P') || (x > 0 && array[y][x - 1] == 'P') || (x < width - 1 && array[y][x + 1] == 'P'))
{
x = rand() % width;
y = rand() % height;
}
array[y][x] = 'S';
}
void printArray(char **array, int width, int height)
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
printf("%c ", array[i][j]);
}
printf("\n");
}
}
int move(char **array, int width, int height, char direction)
{
int px = -1, py = -1;
// 找玩家的位置
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (array[i][j] == 'P')
{
px = j;
py = i;
break;
}
}
if (px != -1)
break;
}
switch (direction)
{
case 'w':
if (py > 0 && array[py - 1][px] != 'M' && array[py - 1][px] != 'S')
if (py > 0 && array[py - 1][px] != 'M')
{
array[py][px] = '.';
array[py - 1][px] = 'P';
}else if (array[py - 1][px] == 'M')
{
return 1;
}else
{
return 0;
}
break;
case 's':
if (py < height - 1 && array[py + 1][px] != 'M' && array[py + 1][px] != 'S')
{
array[py][px] = '.';
array[py + 1][px] = 'P';
}
else if (array[py+1][px] == 'M')
{
return 1;
}else
{
return 2;
}
break;
case 'a':
if (px > 0 && array[py][px - 1] != 'M' && array[py][px-1] != 'S')
{
array[py][px] = '.';
array[py][px - 1] = 'P';
}
else if (array[py][px - 1] == 'M')
{
return 1;
}else
{
return 2;
}
break;
case 'd':
if (px < width - 1 && array[py][px + 1] != 'M' && array[py][px +1] != 'S')
{
array[py][px] = '.';
array[py][px + 1] = 'P';
}
else if (array[py][px + 1] == 'M')
{
return 1;
}else
{
return 2;
}
break;
default:
printf("Invaild Input\n");
return 0;
}
return 0;
}
// map中的所有 M 會向 上下左右 隨機移動一格
void moveMonster(char **array, int width, int height)
{
// 找怪物的位置並回機移動一格
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (array[i][j] == 'M')
{
array[i][j] = '.';
int direction;
do
{
direction = rand() % 4;
// 檢查移動後是否會超出地圖範圍
switch (direction)
{
case 0:
if (i > 0 && array[i - 1][j] != 'P')
{
i--;
}
break;
case 1:
if (i < height - 1 && array[i + 1][j] != 'P')
{
i++;
}
break;
case 2:
if (j > 0 && array[i][j - 1] != 'P')
{
j--;
}
break;
case 3:
if (j < width - 1 && array[i][j + 1] != 'P')
{
j++;
}
break;
}
} while (i < 0 || i >= height || j < 0 || j >= width);
array[i ][j] = '!';
}
}
}
//搜尋map並把所有!換成M
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (array[i][j] == '!')
{
array[i][j] = 'M';
}
}
}
}
int main()
{
int width, height;
scanf("%d", &width);
scanf("%d", &height);
char **array = (char **)malloc(height * sizeof(char *));
for (int i = 0; i < height; i++)
{
array[i] = (char *)malloc(width * sizeof(char));
}
initializeArray(array, width, height);
printArray(array, width, height);
int isGameOver = 0;
while (isGameOver == 0)
{
// let user input direction
char direction;
scanf(" %c", &direction);
switch (move(array, width, height, direction))
{
case 1:
isGameOver = 1;
printf("Game over!\n");
break;
case 2:
isGameOver = 1;
printf("You win!\n");
break;
default:
break;
}
if (isGameOver == 1)
{
break;
}
moveMonster(array, width, height);
printArray(array, width, height);
}
for (int i = 0; i < height; i++)
{
free(array[i]);
}
free(array);
return 0;
}
Editor is loading...
Leave a Comment