Simon Game в C # - PullRequest
       54

Simon Game в C #

0 голосов
/ 30 сентября 2018

Я создавал игру Simon в форме Windows, используя C #.У меня проблема с метками, которые мигают, показывая шаблон.Когда одна метка требуется мигать дважды (потому что она появляется в шаблоне дважды), она будет мигать только один раз.Кроме того, в общем случае метки иногда не будут мигать в правильном порядке, для которого они предназначены (т.е. вторая в шаблоне мигает перед первой).Любая помощь в том, как это исправить или вообще как улучшить мой код, была бы полезна.Я использую C # только последние несколько недель, и это часть университетского проекта.Прикрепите код и изображение того, как выглядит форма окна. Форма Windows

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq; 
using System.Text;
using System.Windows.Forms;

namespace Simon2
{
    public partial class Form1 : Form
    {
        List<int> sequence = new List<int>();
        Random rnd = new Random();
        int number = 0;

        public Form1()
        {
            InitializeComponent();

            sequence.Add(rnd.Next(0, 4));
            hey();
        }

        void hey() 
        {
            foreach (int colour in sequence)
            {
                switch (colour)
                {
                    case 0: {
                        timer1.Enabled = true;
                        break;
                    }
                    case 1: {
                        timer2.Enabled = true;
                        break;
                    }
                    case 2: {
                        timer3.Enabled = true;
                        break;
                    }
                    case 3: {
                        timer4.Enabled = true;
                        break;
                    }
                }
            }
        }

        void pattern(int colour)
        {
            if (sequence[number] == colour)
            {                   
                label1.Text = ("Score: " + sequence.Count);
                sequence.Add(rnd.Next(0, 4));
                number = 0;
                hey();
            }
            else
            {
                MessageBox.Show("Fail!");
                Application.Exit();
            }                 
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (Red1.BackColor == Color.Transparent)
            {
                Red1.BackColor = Color.Red;
                timer1.Interval = 300;
            }
            else
            {
                Red1.BackColor = Color.Transparent;
                timer1.Interval = 300;
                timer1.Stop();                  
            }
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            if (Blue1.BackColor == Color.Transparent)
            {
                Blue1.BackColor = Color.Blue;
                timer2.Interval = 300;
            }
            else
            {
                Blue1.BackColor = Color.Transparent;
                timer2.Interval = 300;
                timer2.Stop();                  
            }
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            if (Yellow1.BackColor == Color.Transparent)
            {
                Yellow1.BackColor = Color.Yellow;
                timer3.Interval = 300;
            }
            else
            {
                Yellow1.BackColor = Color.Transparent;
                timer3.Interval = 300;
                timer3.Stop();                 
            }
        }

        private void timer4_Tick(object sender, EventArgs e)
        {
            if (Green1.BackColor == Color.Transparent)
            {
                Green1.BackColor = Color.Lime;
                timer4.Interval = 300;
            }
            else
            {
                Green1.BackColor = Color.Transparent;
                timer4.Interval = 300;
                timer4.Stop();                  
            }
        }

        private void Red_Click(object sender, EventArgs e)
        {
            pattern(0);             
        }

        private void Blue_Click(object sender, EventArgs e)
        {
            pattern(1);
        }

        private void Yellow_Click(object sender, EventArgs e)
        {
            pattern(2);
        }

        private void Green_Click(object sender, EventArgs e)
        {
            pattern(3);
        }
    }
}

1 Ответ

0 голосов
/ 30 сентября 2018

Я не знаком с самой игрой, я понимаю, что один свет за другим должен загореться.Мое предложение: используйте Thread.sleep (пользовательский интерфейс не будет реагировать, пока он это делает) вместо таймеров непосредственно в переключателе:

switch (colour){
            case 0: {
                Red1.BackColor = Color.Red;
                Thread.Sleep(500);
                Red1.BackColor = Color.Transparent;
                break;
            }

edit: лучшим способом было бы использовать цикл whileкоторый проверяет, истекло ли определенное количество мс, и помещает Application.DoEvents ();там

...