我决定尝试制作一个基于文本的游戏,此时我正试图找到一种方法,在使用Console.Clear后将屏幕上的角色统计数据保留在屏幕上。
我尝试这样做的方法是创建一个函数:
static void Stats()
我遇到的问题是我必须使用位于代码主要部分的变量:
static void Main(string[] args)
但是我不知道如何做到这一点,我在查找时找到的一种方法是在函数之外创建一个字符串:
public static string Player_Gender;
据我所知,虽然这令人不悦。如果我错误地相信这一点,请告诉我,我可以继续这样做,但是如果这是正确的,那么请你给我一个替代方案吗?
我还没有完成这个功能,因为我想在更改我的代码之前解决这个问题,但这就是添加其他统计信息等大致的结果。
static void Stats()
{
Console.Clear();
Console.WriteLine("| |================================| |");
Console.WriteLine("| | Character description + stats: | |");
Console.WriteLine("| | Gender: {0} | |", Player_Gender);
}
目前,变量存储在此处:
static void Main(string[] args)
{
//Ints:
int correct = 0;
int Player_One_Handed = 0;
int Player_Two_Handed = 0;
int Player_Ranged_Weapon = 0;
int Player_Magic = 0;
int Arraycount = 0;
int Player_Attack_Type = 0;
int Player_One_Weapon_Damage = 2;
int Player_Two_Weapon_Damage = 2;
int Player_Ranged_Weapon_Damage = 2;
int Player_Magic_Damage = 2;
int Player_Health_Points = 20;
int Player_Mana_Points = 12;
int Enemy_Health_Points;
int Enemy_Maximum_Damage;
int Player_Inventory_Money = 0;
int Player_Inventory_Experience = 0;
int Player_Quest_Progress = 0;
int Player_Quest_Goal;
int Player_EXP = 0;
int Player_Checked_For_Item = 0;
int Player_Quest_Objective_Complete = 0;
//Strings:
string Player_Gender_Confirm;
string Player_Race;
string Player_Race_Confirm;
string Player_Class;
string Player_Class_Confirm;
string[] Inventory = new string[20];
string Enemy_Name;
string Player_Quest = " ";
string Quest_Accepted;
string Player_Quest_Enemy;
答案 0 :(得分:5)
最简单的方法是将值作为参数传递:
static void Stats(string gender)
{
Console.Clear();
Console.WriteLine("| |================================| |");
Console.WriteLine("| | Character description + stats: | |");
Console.WriteLine("| | Gender: {0} | |", gender);
}
像这样使用:
Stats(Player_Gender);
但毕竟这不是一个好主意,因为你不想传递25个不同的参数。
相反,写一个包含所有播放器变量的新类。包括描述玩家的每个变量,并且不包括不描述玩家的变量。
public class Player
{
public int OneHanded { get; set; }
public string Name { get; set; }
public string Race { get; set; }
public string Gender { get; set; }
public string Class { get; set; }
// ...etc. etc. -- include EVERYTHING that is a property of a player.
// Now your Stats() method has direct access to all the player's properties
// Print stats for THIS player
public void PrintStats()
{
Console.Clear();
Console.WriteLine("| |================================| |");
Console.WriteLine("| | Character description + stats: | |");
Console.WriteLine("| | Gender: {0} | |", Gender);
Console.WriteLine("| | Race: {0} | |", Race);
}
}
在Console.WriteLine()
次调用中,您将无法进行对齐。 Console.WriteLine()
的工作方式与String.Format()
的工作方式相同,因此您拥有some options to control alignment。
在Main ...
static void Main(string[] args)
{
var player = new Player();
// Whatever
player.Name = "Bob";
player.Gender = "Male";
// print stats for Bob
player.PrintStats();
var otherPlayer = new Player();
otherPlayer.Name = "Fred";
// print stats for Fred
otherPlayer.PrintStats();
我们开始看到写一个类的价值:几乎没有额外的努力和几乎零额外的代码混乱,你可以有两个具有相同属性集的玩家,而不是一个。您可以在一行中重新初始化播放器:
player = new Player();
你可以非常简单地将关于给定玩家的所有内容传递给另一种方法:
player.Assault(otherPlayer);
等等。