我想创建一个小型测试程序,程序会要求您选择"参赛者"的数量,输入他们的名字,他们最喜欢的歌手,每个人都选择了其他人选出的歌手并制定排名
我在开始时还有很多工作要做...但我开始编写一些代码。这是:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Ciao,Benvenuto/a a 'Vota Cantante', il nuovo gioco in cui puoi votare il tuo cantante preferito.");
Console.Write("Premi INVIO sulla tastiera per continuare..");
Console.ReadLine();
Console.Write("(NOTA BENE: Sono necessari almeno due giocatori per poter giocare) Indica il numero dei giocatori: ");
int GiocatoriN = int.Parse(Console.ReadLine());
string[] ArrayGiocatori = new string[GiocatoriN];
for (int i = 0; i < GiocatoriN; i++)
{
Giocatori Gio = new Giocatori();
Gio.NomeECantante();
}
}
class Giocatori
{
public void NomeECantante()
{
Console.WriteLine("Inserisci il tuo nome: ");
string Giocatore =Console.ReadLine();
Console.WriteLine(Giocatore + " inserisci il tuo cantante preferito: ");
string CantantePreferito = Console.ReadLine();
CantantePreferito.ToArray();
Console.WriteLine("Dai un voto da 1 a 10 a " + CantantePreferito + ": ");
int Voto = int.Parse(Console.ReadLine());
}
}
}
目前我有两个问题。
该程序有效,但我想要实例化你需要构造函数的类,但我设法创建它没有。构造者是强制性的吗?
我可以将这段代码放在构造函数中,而不是放在方法中。但变化不大:
(即使可以将它放在构造函数中)
Console.WriteLine("Inserisci il tuo nome: ");
string Giocatore = Console.ReadLine();
第二个问题是:我希望程序为GiocatoriN的数量创建一个新玩家,所以如果你让玩家为3,我想创建3个对象。
我在for循环中给了Gio这个名字,并且在我写完之初,它给了我一个错误:
for (int i= 0; i<GiocatoriN; i++)
{
Giocatori Gio[i] = new Giocatori();
Gio.NomeECantante();
我曾尝试使用Gio [GiocatoriN],但错误仍然存在。
实际上,我重复NomeECantante()的方法来选择玩家的数量,但是我每次都会覆盖Gio,只存储最后一个玩家,不是吗? (我的意思是没有错误的代码)。
那我接下来要做什么呢?
答案 0 :(得分:2)
您的代码中存在许多问题,我会尝试逐一解释它们:
首先,您需要重写您的Giocatore类:
class Giocatore
{
public string Nome {get;set;}
public string CantantePreferito {get;set;}
public int Voto {get;set;}
public Giocatore(string nome, string cantante, int voto)
{
this.Nome = nome;
this.CantantePreferito = cantante;
this.Voto = voto;
}
}
这里我删除了获取输入的方法。我添加了一些公共属性,让Giocatore类的实例保留其内部值,并添加了一个获取三个值的构造函数。您当前的代码将变量声明为NomeECantante
方法的本地变量,因此当您退出该方法时它们会丢失。
(构造函数也可以省略,但是当你构建Giocatore
的实例时,它会让生活更轻松)
现在在主代码中,您将逻辑更改为类似
static void Main(string[] args)
{
....
int GiocatoriN;
if(!Int32.TryParse(Console.ReadLine(), out GiocatoriN))
{
Console.WriteLine("Write a number please");
return;
}
List<Giocatore> giocatori = new List<Giocatore>();
for (int i = 0; i < GiocatoriN; i++)
{
Giocatore g = LoadGiocatoreData();
if(g == null)
return;
giocatori.Add(g);
}
}
这里我添加了对输入输入的一些检查,并删除了无用的字符串数组以使用允许添加任意数量元素的List<Giocatore>
。
最后,新Giocatore的数据输入位于类
public Giocatore LoadGiocatoreData()
{
string nome;
string cantante;
int voto;
Console.WriteLine("Inserisci il tuo nome: ");
nome = Console.ReadLine();
Console.WriteLine(nome + " inserisci il tuo cantante preferito: ");
string cantante = Console.ReadLine();
Console.WriteLine("Dai un voto da 1 a 10 a " + cantante + ": ");
if(!Int32.TryParse(Console.ReadLine(), out voto))
{
Console.WriteLine("Please insert a number");
return null;
}
Giocatore g = new Giocatore(nome, cantante, voto);
return g;
}
此时,main方法中的List包含用户在代码开头请求的Giocatore类型的元素。您可以通过像这样的简单循环来检查这个
foreach(Giocatore g in giocatori)
{
Console.WriteLine("Giocatore:" + g.Nome);
Console.WriteLine("Cantante:" + g.CantantePreferito);
Console.WriteLine("Voto:" + g.Voto.ToString());
Console.WriteLine("----------------------------------);
}
答案 1 :(得分:1)
如果没有给出构造函数,编译器会添加一个默认构造函数
class Foo
{
}
与
相同class Foo
{
public Foo()
{
}
}
对于另一个问题,请尝试
Giocatori Gio = new Giocatori(); //create new instance of Giocatori
Gio.NomeECantante(); //invoke method NomeECantante
ArrayGiocatori[i] = Gio; //save instance inside array at index i
同样Giocatori
是错误的(想想是Giocatore,一个包含播放器所有信息的类),并为要存储的每个属性添加一个字段。
class Giocatori
{
public string Name;
public string CantantePreferito;
public int Voto;
public void NomeECantante()
{
Console.WriteLine("Inserisci il tuo nome: ");
Nome =Console.ReadLine();
Console.WriteLine(Giocatore + " inserisci il tuo cantante preferito: ");
CantantePreferito = Console.ReadLine();
// not
//string CantantePreferito = Console.ReadLine();
// otherwise you create a local variable with same name instead of set field Cantante
Console.WriteLine("Dai un voto da 1 a 10 a " + CantantePreferito + ": ");
Voto = int.Parse(Console.ReadLine());
}
}
之后可以打印这样的所有玩家:
for (int i = 0; i < GiocatoriN; i++)
{
Giocatori Gio = ArrayGiocatori[i];
Console.WriteLine("a {0} piace sentir cantare {1} (voto {2}, Gio.Nome, Gio.CantantePreferito, Gio.Voto);
}
答案 2 :(得分:0)
关于构造函数的第一个问题,如果你不写一个,程序会为每个类提供一个默认的构造函数。所以它只存在于你看到它。 对于第二个问题,您需要首先定义对象数组,然后您可以为其分配单个元素。
Giocatori[] array = new Giocatori[3];
foreach(Giocatori g in array)
{
g = new Giocatori();
}
应该做的伎俩。