您好,谢谢您的光临。
我正在努力提高解决问题的能力,并且正在做以下练习: https://www.codingame.com/ide/puzzle/shadows-of-the-knight-episode-1
在每个回合中,您都会得到一个指示,例如:“ U”代表“上”,“ DR”代表“右下”等。
您需要在N转之前将角色移至目标。
我们给定数组的宽度为W,数组的高度为H。
我考虑过要始终计算角色需要移动的方向的中点。
我当前的代码如下:
using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
/**
* Auto-generated code below aims at helping you parse
* the standard input according to the problem statement.
**/
class Player
{
static string lastMoveDirection = "";
static int increasedMoveUnit = 0;
static int W;
static int H;
static int X0;
static int Y0;
static void Main(string[] args)
{
string[] inputs;
inputs = Console.ReadLine().Split(' ');
W = int.Parse(inputs[0]); // width of the building.
H = int.Parse(inputs[1]); // height of the building.
int N = int.Parse(Console.ReadLine()); // maximum number of turns before game over.
inputs = Console.ReadLine().Split(' ');
X0 = int.Parse(inputs[0]);
Y0 = int.Parse(inputs[1]);
// game loop
while (true)
{
N--;
string bombDir = Console.ReadLine(); // the direction of the bombs from batman's current location (U, UR, R, DR, D, DL, L or UL)
// Write an action using Console.WriteLine()
// To debug: Console.Error.WriteLine("Debug messages...");
Console.Error.WriteLine("Batman pos: " + X0 + " " + Y0);
Console.Error.WriteLine("Bomb direction: " + bombDir);
Console.Error.WriteLine("Width of the array: " + W);
Console.Error.WriteLine("Height of the array: " + H);
if(lastMoveDirection == bombDir)
increasedMoveUnit++;
else
increasedMoveUnit = 0;
switch(bombDir)
{
case "DR":
X0=CalcMoveDistance("X");
Y0=CalcMoveDistance("Y");
break;
case "DL":
X0=CalcMoveDistance("X", -1);
Y0=CalcMoveDistance("Y");
break;
case "D":
Y0=CalcMoveDistance("Y");
break;
case "UR":
X0=CalcMoveDistance("X");
Y0=CalcMoveDistance("Y", -1);
break;
case "UL":
X0=CalcMoveDistance("X", -1);
Y0=CalcMoveDistance("Y", -1);
break;
case "U":
Y0=CalcMoveDistance("Y", -1);
break;
case "L":
X0=CalcMoveDistance("X", -1);
break;
case "R":
X0=CalcMoveDistance("X");
break;
}
// the location of the next window Batman should jump to.
Console.WriteLine(X0.ToString() + " " + Y0.ToString());
lastMoveDirection = bombDir;
}
}
private static int CalcMoveDistance(string axis, int direction = 1)
{
int result = 0;
switch(axis)
{
case "X":
result = (W+X0*direction)/2;
break;
case "Y":
result = (H+Y0*direction)/2;
break;
}
if(axis == "Y" && result + increasedMoveUnit >= H)
result = H-1;
else if(axis == "X" && result + increasedMoveUnit >= W)
result = W-1;
else
result += increasedMoveUnit * direction;
return result;
}
}
我面临以下困难:
字符从(6,6)开始 它向下移动到(23,33)
正确。
字符开始于(23,33) 它向下移动到(32,47)
正确。
字符以(32,47)开始 它向上移动到(36,6)
正确。
字符以(36,6)开头 它向下移动到(38,33)
正确。
字符开始于(38,33) 下移至(38,46)
正确(非常接近目标)。
字符的开头为(38,46) 它向上移动到(38,7) 距离目标很远...
字符以(38,7)开头 向下移动到(38,33)
比以前更接近目标...
字符以(38,7)开头 下移至(38,47)
这非常接近目标...
字符起始于(38,47) 上移至(38,6) 在Y轴上距离物镜非常远...
我们继续循环进行: 降至(38,33) 降至(38,47) 最多(38,6)
答案 0 :(得分:0)
我猜是因为你有
while (true)
,而for
循环中没有破坏它的地方。
好像您想要的:
while (N >= 0) // Or just N > 0, depending on your desired use
因为您在循环开始时递减了N