Выполнение функции по таймеру

182
14 ноября 2021, 15:20

Как можно сделать выполнение функции по таймеру? При этом нужно передавать в функцию несколько аргументов.

using System;
using System.Collections.Generic;
using System.Timers;
using System.Threading.Tasks;
namespace Snake
{
    class Snake
    {
        int X;
        int Y;
        int Direction;
        List<Body> body;
        public void SetStartPos(int Y,int X)
        {
            this.X = X;
            this.Y = Y;
        }
        public void SetDirection(int Direction)
        {
            this.Direction = Direction;
        }
        public int GetPosX()
        {
            return this.X;
        }
        public int GetPosY()
        {
            return this.Y;
        }
        public List<Body> GetBody()
        {
            return this.body;
        }
        public void Move()
        {
            switch(Direction)
            {
                case 2:
                    this.X += 1; //->
                    break;
                case 1:
                    this.Y -= 1; // Up
                    break;
                case -1:
                    this.Y += 1; // Down
                    break;
                case -2:
                    this.X -= 1; //<-
                    break;
            }
        }
    }
    class Body
    {
        int X;
        int Y;
        public void SetPos(int Y, int X)
        {
            this.X = X;
            this.Y = Y;
        }
        public int GetPosX()
        {
            return this.X;
        }
        public int GetPosY()
        {
            return this.Y;
        }
    }
    class Fruit
    {
        int X;
        int Y;
        public void SetPos(int Y, int X)
        {
            this.X = X;
            this.Y = Y;
        }
        public int GetPosX()
        {
            return this.X;
        }
        public int GetPosY()
        {
            return this.Y;
        }
    }
    class Program
    {
        private static Timer aTimer;
        public static void update(Snake snake,List<Fruit> fruits,char[,] field, ConsoleKeyInfo key)
        {
            if (key.KeyChar == 'd')
            {
                snake.SetDirection(2);
            }
            if (key.KeyChar == 'w')
            {
                snake.SetDirection(1);
            }
            if (key.KeyChar == 's')
            {
                snake.SetDirection(-1);
            }
            if (key.KeyChar == 'a')
            {
                snake.SetDirection(-2);
            }
            Console.Clear();
            field[snake.GetPosY(), snake.GetPosX()] = ' ';
            snake.Move();
            field[snake.GetPosY(), snake.GetPosX()] = 'O';
            field[fruits[0].GetPosY(), fruits[0].GetPosX()] = '?';
            List<Body> body = snake.GetBody();
            for (int i =0;i<27;i++)
            {
                string test="";
                for(int l=0;l<38;l++)
                {
                    test += field[i, l];
                }
                Console.WriteLine(test);
            }
        }
        static void Main(string[] args)
        {

        char[,] field = { 
                {'/','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
                {'|','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','/'},};

            List<Fruit> fruits = new List<Fruit>();
            Fruit fruit = new Fruit();
            Snake s = new Snake();
            fruit.SetPos(12,10);
            s.SetStartPos(10, 10);
            fruits.Add(fruit);
            ConsoleKeyInfo key;
          //  do
          //  {
          //      key = Console.ReadKey();
          //      update(s, fruits, field, key);
          //      //Console.WriteLine(key.Key + " клавиша была нажата");
          //      
          //  }
          //  while (key.Key != ConsoleKey.Escape); // по нажатию на Escape завершаем цикл


            aTimer = new System.Timers.Timer();
            aTimer.Interval = 2000;
            // Hook up the Elapsed event for the timer. 
            aTimer.Elapsed += OnTimedEvent;
            // Have the timer fire repeated events (true is the default)
            aTimer.AutoReset = true;
            // Start the timer
            aTimer.Enabled = true;
            Console.WriteLine("Press the Enter key to exit the program at any time... ");
            Console.ReadLine();
            void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
            {
                update(s, fruits, field, key);  // ТУТ ПРОБЛЕМА!<-------------
            }
        }
    }
}
Answer 1

Проблема заключается в том, что key не определен изначально.

Замени кусок кода в методе Main на следующий:

        ConsoleKeyInfo key = new ConsoleKeyInfo();
        aTimer = new System.Timers.Timer();
        aTimer.Interval = 500;
        aTimer.Elapsed += (ss, e) =>
        {
            update(s, fruits, field, key);
        };
        aTimer.AutoReset = true;
        aTimer.Enabled = true;

        Console.WriteLine("Press the Enter key to exit the program at any time... ");
        while(true)
        {
            // передаем FALSE что бы не отображать клавиши в консоли
            key = Console.ReadKey(false);
            if (key.Key == ConsoleKey.Enter) break;
            update(s, fruits, field, key);
        }
        aTimer.Enabled = false;
        Console.Clear();
        Console.WriteLine("bay!");
        Console.ReadLine();
READ ALSO
Не обновляется свойство класса

Не обновляется свойство класса

Только сейчас заметил, что C# не обновляет свойства классов, в реальном времениЕсть свойство в классе Str:

148
Не работает выбор контролов с DockStyle.Top

Не работает выбор контролов с DockStyle.Top

У меня есть панель с контролами, у некоторых Dock = DockStyleTop, у некоторых Bottom

167
не срабатывает Picturebox_DragEnter

не срабатывает Picturebox_DragEnter

вроде все правильно написал, но Drag enter не работаетallowdrop где находится я не нашел что можно сделать?

222
Сайт вордпресс в подпапке /rus/

Сайт вордпресс в подпапке /rus/

Существует сайт на вордпресс sitenameru , мне требуется создать отдельную версию, только для одной страны, которую будет перенаправлять на sitename

78