C# 每当我的函数试图在表单构造函数中执行时,它只会循环到前面的语句

C# 每当我的函数试图在表单构造函数中执行时,它只会循环到前面的语句,c#,forms,C#,Forms,我是C#的新手,我正在开发一个表单应用程序。。。这有点像一场游戏。每当构造函数执行函数时,它只会导致构造函数再次运行!以下是构造函数: public Form1() { InitializeComponent(); MessageBox.Show("You get 1 cookie for logging in!"); setScore(); score = Convert.ToInt32(setScr) + 1;

我是C#的新手,我正在开发一个表单应用程序。。。这有点像一场游戏。每当构造函数执行函数时,它只会导致构造函数再次运行!以下是构造函数:

 public Form1()
    {
        InitializeComponent();

        MessageBox.Show("You get 1 cookie for logging in!");
        setScore();
        score = Convert.ToInt32(setScr) + 1;
        label2.Text = score.ToString();
        setProgressBar(CheckMP());
        timer1.Interval = 1500;
        timer1.Start();

        readAndSetAchievements(); // THIS IS THE FUNCTION THAT 
                                  //CAUSES THE CONSTRUCTOR TO LOOP!!!
    }
以下是函数:

        public void readAndSetAchievements()
    {
        Achievements ach1 = new Achievements(); // ACHIEVEMENTS IS ANOTHER FORM THAT I       
                                                // AM CREATING AN INSTANCE OF BECAUSE I
                                                // WANT TO USE VARIABLES AND FUNCTIONS 
                                                // FROM IT 

        using (StreamReader ar = new StreamReader("achievements.txt"))
        {
            achCheckStr[0] = ar.ReadLine();
            achCheckStr[1] = ar.ReadLine();

            if (achCheckStr[0] == ach1.ach1_StillBurning)
            {
                ach1.setAchievements(1);
            }
            else if (achCheckStr[1] == ach1.ach2_Faster)
            {
                ach1.setAchievements(2);
            }
        }
    }
请有人帮忙。。。告诉我我错在哪里(我想这是因为我试图利用课堂上的成绩,但我不知道如何做,否则)。。。提前感谢!:)

以下是课堂上的全部成绩:

public partial class Achievements : Form
{
    Form1 cha = new Form1();

    public string ach1_StillBurning = "ach1_StillBurning.jpg";
    public string ach2_Faster = "ach2_Faster.jpg";

    public Achievements()
    {
        InitializeComponent();
    }

    public void setAchievements(int a)
    {
        using (StreamWriter aw = new StreamWriter("achievements.txt"))
        {
            switch (a)
            { 
                case 1:
                    aw.WriteLine(ach1_StillBurning);
                    pictureBox1.Image = Image.FromFile(ach1_StillBurning);
                    break;
                case 2:
                    aw.WriteLine(ach2_Faster);
                    pictureBox1.Image = Image.FromFile(ach2_Faster);
                    break;
            }
        }
    } 

    private void Achievements_Load(object sender, EventArgs e)
    {
        cha.readAndSetAchievements();
    }
}

给你们!:)

好吧,这就是我想到的。我不得不做一些假设,因为在阅读代码时,有些东西没有意义。我注意到了这些

编辑:请记住,我没有实际测试这段代码,因为我没有创建
Timer1
对象。您应该只需要进行最小的更改(如果有)

以下是Form1的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        MessageBox.Show("You get 1 cookie for logging in!");
        setScore();
        score = Convert.ToInt32(setScr) + 1;
        label2.Text = score.ToString();
        setProgressBar(CheckMP());
        timer1.Interval = 1500;
        timer1.Start();

        //Assuming this is the first use of the Achievements object.
        Achievements.AchievementsFile = "achievements.txt";

    }


}
在另一个文件中,这是成就表

    private partial class AchievementsForm : Form
    {

        public AchievementsForm()
        {
            InitializeComponent();
        }

        private void Achievements_Load(object sender, EventArgs e)
        {
            IEnumerable<string> allAchievements = Achievements.ReadAchievements();
            //Do stuff with the achievements
        }
    }
私有部分类实现表单:表单
{
公共成就表格()
{
初始化组件();
}
私有void\u加载(对象发送方、事件参数e)
{
IEnumerable AllAchievents=成就。readAchievents();
//用成绩做事
}
}
在另一个单独的文件中,这是新的成就类。这就是我所说的将功能移出表单的意思

public static class Achievements
    {
        private static string _stillBurning = "ach1_StillBurning.jpg";
        private static string _faster = "ach2_Faster.jpg";

        public static string AchievementsFile { get; set; }

        public static Image SetAchievementFromAchievementCode(int a)
        {
            Image answer;
            using (StreamWriter aw = new StreamWriter(Achievements.AchievementsFile))
            {

                switch (a)
                {
                    case 1:
                        aw.WriteLine(_stillBurning);
                        answer = Image.FromFile(ach1_StillBurning);
                        break;
                    case 2:
                        aw.WriteLine(_faster);
                        answer = Image.FromFile(ach2_Faster);
                        break;
                }
            }

            return answer;
        }

        public static IEnumerable<string> ReadAchievements()
        {
            List<string> answer = new List<string>();

            using (StreamReader ar = new StreamReader(Achievements.AchievementsFile))
            {
                while (!ar.EndOfStream)
                    answer.Add(ar.ReadLine());                    

            }

            return answer;
        }

    }
公共静态课堂成绩
{
私有静态字符串\u stillBurning=“ach1\u stillBurning.jpg”;
私有静态字符串\u faster=“ach2\u faster.jpg”;
公共静态字符串实现文件{get;set;}
公共静态映像设置实现格式实现代码(INTA)
{
图像应答;
使用(StreamWriter aw=新的StreamWriter(aclements.aclementsfile))
{
开关(a)
{
案例1:
aw.WriteLine(_stillBurning);
答案=Image.FromFile(ach1\u StillBurning);
打破
案例2:
aw.WriteLine(更快);
答案=Image.FromFile(ach2\u更快);
打破
}
}
返回答案;
}
公共静态IEnumerable可读成就()
{
列表答案=新列表();
使用(StreamReader ar=新的StreamReader(acgressions.AchievementsFile))
{
而(!ar.EndOfStream)
答案。添加(ar.ReadLine());
}
返回答案;
}
}
我在阅读代码时注意到,您基本上具有这种逻辑(或类似逻辑)

调用一个函数来读取和设置成就,它调用了一个函数 阅读成就,然后循环调用相同的函数 再说一遍

我已经分为一个阅读和一组。
setAcreacementFromachieveCode
函数获取您以前使用的同一个整数,将其写入同一个文件,然后返回一个
图像
,您可以随意使用该图像。
readAcgressions()
方法将为您提供文件中所有成就的完整列表


我知道这有点过分了,但希望能有所帮助。还有,你知道什么。。。现在是午餐时间。

显示
成就的构造函数
。显示
计时器。勾选
计时器1的事件
这里是
成就的第一行:
Form1 cha=new Form1()计时器与此无关。它正在跟踪一个picturebox:)是的,我看到我正在创建Form1的一个实例。。。但是我需要使用其中的项,我可以在不引起构造函数的情况下以某种方式进行吗?