我有一个显示数组的控制台应用程序根据用户的输入将数字移动到'0'的左,右,上或下
这是我的代码:
int[,] myNos = new int[3, 3] { { 3, 0, 7 }, { 9, 4, 8 }, { 2, 1, 5 } };
public void WriteData()
{
Console.SetCursorPosition(0, 4);
for (int col = 0; col < 3; col++)
{
for (int row = 0; row < 3; row++)
{
Console.Write("{0}\t", myNos[col, row]);
}
Console.WriteLine();
}
}
public void Level1()
{
Console.Clear();
Console.SetCursorPosition(0, 0);
Console.Write("Score : {0}", score);
Console.SetCursorPosition(30, 0);
Console.Write("Moves : {0}", moves);
WriteData();
string move = "a";
while (move != "E")
{
Console.SetCursorPosition(0, 8);
Console.Write("\nEnter your Move [L,R,T,B,E] : ");
move = Console.ReadLine();
move = move.ToUpper();
while (move == "L")
{
if (myNos[0, 0] == 0)
{
WriteData();
}
else if (myNos[0, 1] == 0)
{
myNos[0, 1] = myNos[0, 0];
myNos[0, 0] = 0;
WriteData();
}
else if (myNos[0, 2] == 0)
{
myNos[0, 2] = myNos[0, 1];
myNos[0, 1] = 0;
WriteData();
}
else
{
WriteData();
}
}
}
}
一切都按我的意愿工作,但唯一的问题是在更新并重新显示数组后,光标不会返回到它将读取输入的位置。我尝试过使用:
Console.SetCursorPosition(0, 8);
和
Console.ReadKey();
但似乎都不起作用。
答案 0 :(得分:3)
我想到了一些事实证明是答案,我宣布将Move变为全局,然后修改了我的WriteData()方法和
public void WriteData()
{
Console.SetCursorPosition(0, 4);
for (int col = 0; col < 3; col++)
{
for (int row = 0; row < 3; row++)
{
Console.Write("{0}\t", myNos[col, row]);
}
Console.WriteLine();
}
//This was the modification
menu = "a";
}
答案 1 :(得分:1)
好吧,做完作业闻起来有问题。
从概念的角度来看,光标显示位置与输入流无关,也与数组更新无关。
代码分为部分类。虽然我没有,但我相信它也可以在MVC模式中实现,即使它是一个控制台应用程序。
需要[puzzle solver]?
p.s。:我不知道你如何计算得分,因此总是为零。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program {
static void Main(String[] args) {
(new SlidingPuzzle(new[,] {
{ 3, 0, 8 },
{ 6, 4, 7 },
{ 2, 1, 5 },
})).Run();
}
}
public partial struct Position {
public Position(int left, int top) {
Left=left;
Top=top;
}
public int Left, Top;
}
对于这部分,是控制者的候选人:
public partial class SlidingPuzzle {
public void Run() {
for(bool initialized=false, quit=false; ; ) {
if(!initialized) {
Reset();
Console.Clear();
ShowPrompt();
initialized=true;
}
ShowStatics();
ShowMatrix();
if(quit||IsGameOver||IsFinished) {
SetCursorToBottom();
if(!quit)
ShowOnEnd();
if(!(quit=IsExit)) {
initialized=false;
continue;
}
break;
}
var keyInput=Console.ReadKey(true).Key;
if(ConsoleKey.Escape==keyInput)
quit=true;
else if(ConsoleKey.LeftArrow==keyInput)
Move(new[] { +0, +1 });
else if(ConsoleKey.UpArrow==keyInput)
Move(new[] { +1, +0 });
else if(ConsoleKey.RightArrow==keyInput)
Move(new[] { +0, -1 });
else if(ConsoleKey.DownArrow==keyInput)
Move(new[] { -1, +0 });
}
}
void ReadOnExit() {
Console.WriteLine("Press any key to exit ... ");
Console.ReadKey(true);
}
bool IsExit {
get {
Console.WriteLine("Try again? (Y/N)");
var quit=ConsoleKey.Y!=Console.ReadKey(true).Key;
if(quit)
ReadOnExit();
return quit;
}
}
}
而且,这是观点的候选人:
partial class SlidingPuzzle {
void SetCursorToBottom() {
var pos=posBottom;
Console.SetCursorPosition(pos.Left, pos.Top);
}
void ShowOnEnd() {
if(IsGameOver) {
Console.WriteLine("- Game Over -");
Console.WriteLine("You've reached the limitation of movement. ");
}
else {
Console.WriteLine("- Game Completed -");
Console.WriteLine("Congratulations! You've solved the puzzle. ");
}
}
void ShowStatics() {
var pos=posStatics;
Console.SetCursorPosition(pos.Left, pos.Top);
Console.Write("Score: {0}", score);
Console.Write(SlidingPuzzle.indentation);
Console.WriteLine("Moves: {0}", moves);
}
void ShowPrompt() {
var pos=posPrompt;
Console.SetCursorPosition(pos.Left, pos.Top);
Console.WriteLine("Enter your move [←, ↑, →, ↓, Esc] ");
}
void ShowMatrix() {
var pos=posMatrix;
Console.SetCursorPosition(pos.Left, pos.Top);
for(int m=lengths[0], i=0, n, j; m-->0; ++i)
for(n=lengths[1], j=0; n-->0; ++j) {
var value=this[i, j].ToString();
if("0"==value) {
value="\x20";
var left=indentation.Length+Console.CursorLeft;
pos=new Position(left, Console.CursorTop);
}
if(SlidingPuzzle.linesPerRow>0)
Console.Write(SlidingPuzzle.indentation+value);
if(0==n)
for(var count=SlidingPuzzle.linesPerRow; count-->0; )
Console.WriteLine("");
}
Console.SetCursorPosition(pos.Left, pos.Top);
}
void SetLayoutPosition() {
posMatrix=new Position(0, 2);
posPrompt=new Position(0, posMatrix.Top+lengths[0]*linesPerRow);
posBottom=new Position(0, 1+posPrompt.Top);
posStatics=new Position(0, 0);
}
Position posBottom, posMatrix, posStatics, posPrompt;
static readonly int linesPerRow=2;
static readonly String indentation=new String('\x20', 4);
}
模特的候选人:
partial class SlidingPuzzle {
void Reset() {
Array.Copy(initial, mutable, initial.Length);
current=IndexOf(0);
moves=0;
score=0;
}
void Move(int[] offset) {
var indices=new int[lengths.Length];
var i=0;
for(i=indices.Length; i-->0; indices[i]=current[i]+offset[i])
;
for(i=indices.Length; i-->0; )
if(0>indices[i]||indices[i]>lengths[i]-1)
break;
if(i<0) {
var value=this[current];
this[current]=this[indices];
this[indices]=value;
current=indices;
++moves;
}
}
int[] IndexOf(object value) {
for(int m=lengths[0], i=0, n, j; m-->0; ++i)
for(n=lengths[1], j=0; n-->0; ++j)
if(this[i, j].ToString()==value.ToString())
return new[] { i, j };
return SlidingPuzzle.emptyArray;
}
object this[params int[] indices] {
set {
mutable.SetValue(value, indices);
}
get {
return mutable.GetValue(indices);
}
}
bool IsFinished {
get {
for(int m=lengths[0], i=0, n, j; m-->0; ++i)
for(n=lengths[1], j=0; n-->0; ++j)
if(this[i, j].ToString()!=(1+i*lengths[1]+j).ToString())
if(0!=m||0!=n)
return false;
return true;
}
}
bool IsGameOver {
get {
return !(maxMoves!=moves||IsFinished);
}
}
public SlidingPuzzle(Array original) {
var elementType=original.GetType().GetElementType();
lengths=new int[original.Rank];
for(var i=original.Rank; i-->0; lengths[i]=original.GetLength(i))
;
initial=Array.CreateInstance(elementType, lengths);
mutable=Array.CreateInstance(elementType, lengths);
Array.Copy(original, initial, original.Length);
SetLayoutPosition();
}
int[] current;
Array mutable;
readonly int[] lengths;
readonly Array initial;
int score, moves, maxMoves=25;
static readonly int[] emptyArray=new int[] { };
}