Не так работает цикл while c#
Пуля должна долететь до стены и не ломать, а она делает наоборот.
namespace game
{
class Program
{
static void Main(string[] args)
{
Console.CursorVisible = false;//Убирает курсор из консолиъ
Console.ForegroundColor = ConsoleColor.Yellow;
char[,] map =
{
{'░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','░', },
{'░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░','░', },
};
//Координаты персонажа
int UserPositionY = map.GetLength(1) / 2;//0 2
int UserPositionX = map.GetLength(1) / 2;//1 2
int BulletPositionY = map.GetLength(1) / 2;//0 2
int BulletPositionX = map.GetLength(1) / 2;//1 2
//int UserPositionY1 = map.GetLength(0) / 5;
//int UserPositionX1 = map.GetLength(1) / 5;
string mapString = "";
for (int y = 0; y < map.GetLength(0); y++)
{
for (int x = 0; x < map.GetLength(1); x++)
{
Console.Write(map[y, x]);
}
Console.WriteLine();
}
//Начало игры
object locker = new();
char player = '▲';
bool isShoot = false;
while (true)
{//Начало While
//Отрисовка
// lock (locker)
lock (locker)
{
//Ходьба персонажа
Console.SetCursorPosition(UserPositionX, UserPositionY);
//Console.SetCursorPosition(BulletPositionX, BulletPositionY);
Console.Write(player);
}
//Console.SetCursorPosition(UserPositionX1, UserPositionY1);
//Console.Write('1');
//Считываем клавиши
var key = Console.ReadKey(true).Key; //Для считывания клавиши
lock (locker)
{
Console.SetCursorPosition(UserPositionX, UserPositionY);
//Console.SetCursorPosition(BulletPositionX, BulletPositionY);
Console.Write(' ');
}
switch (key)
{
case ConsoleKey.W:
if (map[UserPositionY - 1, UserPositionX] != '░')
{
player = '▲';
UserPositionY--;
}
break;
case ConsoleKey.S:
if (map[UserPositionY + 1, UserPositionX] != '░')
{
player = '▼';
UserPositionY++;
}
break;
case ConsoleKey.A:
if (map[UserPositionY, UserPositionX - 1] != '░')
{
player = '◄';
UserPositionX--;
}
break;
case ConsoleKey.D:
if (map[UserPositionY, UserPositionX + 1] != '░')
{
player = '►';
UserPositionX++;
}
break;
case ConsoleKey.Spacebar:
if (map[UserPositionY - 1, UserPositionX] != '░')
{
if (isShoot) continue;
isShoot = true;
Task.Run(async () =>
{
char bullet = '°';
int currentPosPlayerX = UserPositionX;
int currentPosPlayerY = UserPositionY;
char player1 = player;
if (player1 == '▲')
{
int i = 1;
while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
{
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY - i);
Console.Write(bullet);
}
await Task.Delay(100);
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY - i);
Console.Write(" ");
}
i++;
}
}
if (player1 == '▼')
{
int i = 1;
while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
{
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY + i);
Console.Write(bullet);
}
await Task.Delay(100);
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX, currentPosPlayerY + i);
Console.Write(" ");
}
i++;
}
}
if (player1 == '◄')
{
int i = 1;
while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
{
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX - i, currentPosPlayerY);
Console.Write(bullet);
}
await Task.Delay(100);
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX - i, currentPosPlayerY);
Console.Write(" ");
}
i++;
}
}
if (player1 == '►')
{
int i = 1;
while (map[currentPosPlayerX, currentPosPlayerY + i + 1] != '░')
{
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX + i, currentPosPlayerY);
Console.Write(bullet);
}
await Task.Delay(100);
lock (locker)
{
Console.SetCursorPosition(currentPosPlayerX + i, currentPosPlayerY);
Console.Write(" ");
}
i++;
}
}
isShoot = false;
});
}
break;
}//Конец switch
}//Конец While
}
}
}
Ответы (1 шт):
По-моему x и y перепутаны, в перемещении у Вас:
map[UserPositionY, UserPositionX]
а в движении пули:
map[UserPositionX, UserPositionY]
Насколько я вижу проблема заключается в том какое условие в while везде:
... currentPosPlayer* + i + 1 != '░')
А это не совсем правильно. Т.е. я понял Вашу логику с тем что во всех четырех циклах i + 1 и растет, а Вы его либы прибавляете либо вычитаете, но в условиях Вы это не учитываете, поправьте условия и все должно заработать.
if (player1 == '▲')
{
while (map[currentPosPlayerY - i - 1, currentPosPlayerX] != '░') {
...
}
}
if (player1 == '▼')
{
while (map[currentPosPlayerY + i + 1, currentPosPlayerX] != '░') {
...
}
}
if (player1 == '◄')
{
while (map[currentPosPlayerY, currentPosPlayerX - i - 1] != '░') {
...
}
}
if (player1 == '►')
{
while (map[currentPosPlayerY, currentPosPlayerX + i + 1] != '░') {
...
}
}
Мне кажется тут вполне можно использовать else if так как лишь одно из условий верно в конкретный момент времени.
Подозреваю что всему виной копипаст — зло, чтобы такого не происходило постарайтесь не дублировать код, я имею в виду что вместо четырех while подумайте как написать всего один (без дублирования), это можно сделать, просто возможно Вы об этом не задумывались. А об этом стоит думать всякий раз когда руки тянуться к Ctrl + c и Ctrl + v Ну или по крайней мере при копировании проверяйте все ли Вы заменили в вставленном коде.