C# 控制台在数组中移动
C# console move in array
我正在创建一个小型主机游戏,玩家可以在其中移动一系列对象,并且他必须到达公主那里。我希望数组的元素是地方,所以我有 类 例如沙漠、森林、洞穴和湖泊,所以数组必须由这些对象组成。每个地方都会随机伤害或治疗玩家。任何想法如何让玩家从数组的起始位置移动到公主
我希望数组看起来像这样:
PLAYER lake forest lake
desert forest lake desert
cave PRINCESS lake forest
我正在处理带有控制台键的键。钥匙和我正在为此使用开关盒
while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.X)
{
switch (keyinfo.Key)
{
case Console.Key.W
break;
case Console.Key.A
break;
case Console.Key.S
break;
case Console.Key.D
break;
}
}
这是我的界面:
interface IPlace
{
string PlaceName { get; }
int randomPdamage();
int randomPgiveHp();
}
我有四个地方:湖泊、森林、洞穴、沙漠,每个地方都实现了IPlace
接口:
class Forest : IPlace
{
public string PlaceName
{
get
{
return "Forest";
}
}
Random DmgAndHeal = new Random();
public int randomPdamage()
{
int PlaceDamage = DmgAndHeal.Next(5, 20);
return PlaceDamage;
}
public int randomPgiveHp()
{
int PlaceHeal = DmgAndHeal.Next(5, 20);
return PlaceHeal;
}
}
这是我的主要代码:
static void Main(string[] args)
{
IPlace desert = new Desert();
IPlace lake = new Lake();
IPlace cave = new Cave();
IPlace forest = new Forest();
ConsoleKeyInfo keyInfo;
String[,] values = new string[3, 5] { { "lake", "lake" , "cave" , "forest" , "lake" },
{ "desert" , "forest" , "cave ", "lake" , "desert" },
{ "cave" , "desert", "forest", "lake" , "desert" }};
for (int i = 0; i < values.GetLength(0); i++)
{
for (int k = 0; k < values.GetLength(1); k++)
{
Console.Write(values[i, k]);
}
Console.WriteLine();
}
while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.X)
{
switch (keyInfo.Key)
{
case ConsoleKey.W:
break;
case ConsoleKey.D:
break;
case ConsoleKey.S:
break;
case ConsoleKey.A:
break;
}
}
}
我认为让玩家与地图保持在同一个数组中不是个好主意,因为在这种情况下,玩家离开某个单元格后,您不知道该单元格中应该包含什么(湖泊、洞穴、沙漠)等等)
我的建议是:
在数组中存储不能移动的对象如:
森林湖森林湖
沙漠森林湖泊沙漠
洞穴湖泊湖泊森林
存储移动物体的坐标,比如玩家,例如:
int playerX = 0;
int playerY = 0;
或者让它成为玩家对象的属性。
当您绘制屏幕时,检查玩家是否与当前单元格坐标匹配,以及它是否绘制玩家
for (int i = 0; i < map.GetLength(0); i++)
{
for (int k = 0; k < map.GetLength(1); k++)
{
if (playerX == k && playerY == i)
DrawPlayer();
else
DrawCell(map[i,k]);
}
}
通过这种方式移动播放器,您只需更改它的 X 或 Y 位置。
编辑: 将此应用到您的代码后,您应该得到如下内容:
int playerX = 0; //horizontal coordinate
int playerY = 0; //vertical coordinate
ConsoleKey key = ConsoleKey.Separator; //filled with meanless value by default
do
{
switch (key)
{
case ConsoleKey.W:
if (playerY > 0) //check that player will't leave field
playerY--; //change player position
break;
case ConsoleKey.D:
if (playerX < values.GetLength(1) - 1)
playerX++;
break;
case ConsoleKey.S:
if (playerY < values.GetLength(0) - 1)
playerY++;
break;
case ConsoleKey.A:
if (playerX > 0)
playerX--;
break;
}
Console.Clear(); //clear console to redraw field
for (int i = 0; i < values.GetLength(0); i++)
{
for (int k = 0; k < values.GetLength(1); k++)
{
if (i == playerY && k == playerX) //check if player in cell [i,k]
Console.Write("Player\t"); //draw player
else
Console.Write(values[i, k] + "\t"); //draw place
}
Console.WriteLine();
}
key = Console.ReadKey(true).Key; //read new key
}
while (key != ConsoleKey.X); //exit condition
P。 S. 你可以在这里测试这段代码:tutorialspoint
我猜你问的是如何在控制台中操作已经写入的文本 window。比基本技术如下:
- 使用控制台将光标放在您需要的位置
属性:Console.CursorTop 和 Console.CursorLeft 这只是意味着
控制台中放置光标的行和列。
- 使用 Console.Write
写入控制台
- 如果您想移动播放器 - 只需使用 Console.MoveBufferArea 即可将控制台中的文本块从指定位置移动到目标位置。
- 之后你需要回到之前的玩家位置并恢复现有的位置值(森林、河流等)。
我正在创建一个小型主机游戏,玩家可以在其中移动一系列对象,并且他必须到达公主那里。我希望数组的元素是地方,所以我有 类 例如沙漠、森林、洞穴和湖泊,所以数组必须由这些对象组成。每个地方都会随机伤害或治疗玩家。任何想法如何让玩家从数组的起始位置移动到公主
我希望数组看起来像这样:
PLAYER lake forest lake
desert forest lake desert
cave PRINCESS lake forest
我正在处理带有控制台键的键。钥匙和我正在为此使用开关盒
while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.X)
{
switch (keyinfo.Key)
{
case Console.Key.W
break;
case Console.Key.A
break;
case Console.Key.S
break;
case Console.Key.D
break;
}
}
这是我的界面:
interface IPlace
{
string PlaceName { get; }
int randomPdamage();
int randomPgiveHp();
}
我有四个地方:湖泊、森林、洞穴、沙漠,每个地方都实现了IPlace
接口:
class Forest : IPlace
{
public string PlaceName
{
get
{
return "Forest";
}
}
Random DmgAndHeal = new Random();
public int randomPdamage()
{
int PlaceDamage = DmgAndHeal.Next(5, 20);
return PlaceDamage;
}
public int randomPgiveHp()
{
int PlaceHeal = DmgAndHeal.Next(5, 20);
return PlaceHeal;
}
}
这是我的主要代码:
static void Main(string[] args)
{
IPlace desert = new Desert();
IPlace lake = new Lake();
IPlace cave = new Cave();
IPlace forest = new Forest();
ConsoleKeyInfo keyInfo;
String[,] values = new string[3, 5] { { "lake", "lake" , "cave" , "forest" , "lake" },
{ "desert" , "forest" , "cave ", "lake" , "desert" },
{ "cave" , "desert", "forest", "lake" , "desert" }};
for (int i = 0; i < values.GetLength(0); i++)
{
for (int k = 0; k < values.GetLength(1); k++)
{
Console.Write(values[i, k]);
}
Console.WriteLine();
}
while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.X)
{
switch (keyInfo.Key)
{
case ConsoleKey.W:
break;
case ConsoleKey.D:
break;
case ConsoleKey.S:
break;
case ConsoleKey.A:
break;
}
}
}
我认为让玩家与地图保持在同一个数组中不是个好主意,因为在这种情况下,玩家离开某个单元格后,您不知道该单元格中应该包含什么(湖泊、洞穴、沙漠)等等)
我的建议是:
在数组中存储不能移动的对象如:
森林湖森林湖 沙漠森林湖泊沙漠 洞穴湖泊湖泊森林
存储移动物体的坐标,比如玩家,例如:
int playerX = 0; int playerY = 0;
或者让它成为玩家对象的属性。
当您绘制屏幕时,检查玩家是否与当前单元格坐标匹配,以及它是否绘制玩家
for (int i = 0; i < map.GetLength(0); i++) { for (int k = 0; k < map.GetLength(1); k++) { if (playerX == k && playerY == i) DrawPlayer(); else DrawCell(map[i,k]); } }
通过这种方式移动播放器,您只需更改它的 X 或 Y 位置。
编辑: 将此应用到您的代码后,您应该得到如下内容:
int playerX = 0; //horizontal coordinate
int playerY = 0; //vertical coordinate
ConsoleKey key = ConsoleKey.Separator; //filled with meanless value by default
do
{
switch (key)
{
case ConsoleKey.W:
if (playerY > 0) //check that player will't leave field
playerY--; //change player position
break;
case ConsoleKey.D:
if (playerX < values.GetLength(1) - 1)
playerX++;
break;
case ConsoleKey.S:
if (playerY < values.GetLength(0) - 1)
playerY++;
break;
case ConsoleKey.A:
if (playerX > 0)
playerX--;
break;
}
Console.Clear(); //clear console to redraw field
for (int i = 0; i < values.GetLength(0); i++)
{
for (int k = 0; k < values.GetLength(1); k++)
{
if (i == playerY && k == playerX) //check if player in cell [i,k]
Console.Write("Player\t"); //draw player
else
Console.Write(values[i, k] + "\t"); //draw place
}
Console.WriteLine();
}
key = Console.ReadKey(true).Key; //read new key
}
while (key != ConsoleKey.X); //exit condition
P。 S. 你可以在这里测试这段代码:tutorialspoint
我猜你问的是如何在控制台中操作已经写入的文本 window。比基本技术如下:
- 使用控制台将光标放在您需要的位置 属性:Console.CursorTop 和 Console.CursorLeft 这只是意味着 控制台中放置光标的行和列。
- 使用 Console.Write 写入控制台
- 如果您想移动播放器 - 只需使用 Console.MoveBufferArea 即可将控制台中的文本块从指定位置移动到目标位置。
- 之后你需要回到之前的玩家位置并恢复现有的位置值(森林、河流等)。