我正在编程一个控制台游戏,但我得到一个错误,试图使用LinkedList.First.Value,因为它返回null。然而,列表不是空的,因为我设置的第一个条目是55。
LinkedList<int> Pos = new LinkedList<int>();
主:
var p = new Program();
p.Pos.AddFirst(55);
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(Move);
myTimer.Interval = 1000;
myTimer.Start();
错误导致代码(Move):
p.Pos.AddFirst(p.Pos.First.Value + p.dir);
完整代码系统。NullReferenceException: '对象引用未设置为an对象的实例。'
System.Collections.Generic.LinkedList.First。返回null
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Collections;
namespace Snake
{
class Program
{
LinkedList<int> Pos = new LinkedList<int>();
int dir = 1;
bool snakeAlive = true;
static void Main(string[] args)
{
var p = new Program();
p.Pos.AddLast(55);
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(Move);
myTimer.Interval = 1000; // 1000 ms is one second
myTimer.Start();
do
{
switch (Console.ReadKey().Key)
{
case ConsoleKey.UpArrow:
p.dir = -10;
break;
case ConsoleKey.DownArrow:
p.dir = 10;
break;
case ConsoleKey.LeftArrow:
p.dir = -1;
break;
case ConsoleKey.RightArrow:
p.dir = 1;
break;
}
} while (p.snakeAlive == true);
}
void drawGame()
{
Console.Clear();
for (int i = 0; i < 100; i++)
{
if (i % 10 == 9)
{
Console.WriteLine(IsSnake(Pos, i));
}
else
{
Console.Write(IsSnake(Pos, i));
}
}
}
String IsSnake(LinkedList<int> sPos, int position)
{
for (int i = 0; i < sPos.Count; i++)
{
if (position == sPos.ElementAt(i))
{
return "==";
}
}
return "[]";
}
public static void Move(object source, ElapsedEventArgs e) {
var p = new Program();
p.Pos.AddFirst(p.Pos.First.Value + p.dir);
p.Pos.RemoveLast();
p.drawGame();
}
}
}
Move事件处理程序中的var p = new Program();
将创建一个与您之前创建的实例无关的Program类的新实例。它的Pos
列表将为空。
您可以使Move
方法成为实例方法(删除static
)并将事件订阅更改为myTimer.Elapsed += new ElapsedEventHandler(p.Move);
在Move方法中,您可以直接使用Pos
。