Движение объектов - C#

Узнай цену своей работы

Формулировка задачи:

делаю игру танк. На поле 5 танков, но они движутся у меня асинхронно(одинаково). Кажется все правильно сделал, в чем ошибка, наведите на правильную мысль?
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
 
namespace Tanks
{
    public class Model
    {
        public int sizeField; 
        int  amountTanks, amountApples; 
        public int speedGame;
        public GameStatus gameStatus;//статус игры

      //списк танков  
      List<Tank> tanks;
        
      public List<Tank> Tanks
      { 
          get { return tanks; } 
      }

         public Wall wall;
                      
         public Model(int sizeField, int amountTanks, int amountApples, int speedGame)
         {
            tanks = new List<Tank>();
                                   
            this.sizeField = sizeField;
            this.amountTanks = amountTanks;
            this.amountApples = amountApples;
            this.speedGame = speedGame;
            
            gameStatus = GameStatus.stoping; //первоначальный статус игры
 
            CreateTanks();
            wall = new Wall();
        }
 
      //создание танков  
      static Random r;
      private void CreateTanks()
      {
        int x, y;
        r = new Random();
 
        while (tanks.Count < amountTanks)
        {
            x = r.Next(6) * 40;
            y = r.Next(6) * 40;
            bool flag = true;
 
            foreach (Tank t in tanks)
                if ((t.X == x && t.Y == y))
                {
                    flag = false;
                    break;
                }
 
            if (flag)
                tanks.Add(new Tank(sizeField, x, y));
        }
      }

        //запуск игры
        public void play()
        {
            while (gameStatus==GameStatus.playing)
            {
                Thread.Sleep(speedGame);
                foreach (Tank t in tanks)
                    t.Run();
            }
        }

    }
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
 
namespace Tanks
{
   public class Tank : IRun, ITurn, ITransparent
    {
        //движение танка (координаты)
        int x, y, direct_x, direct_y; //координаты танка, направление танка
        int sizeField;
 
        public int Direct_Y
        {
            get { return direct_y; }
            set
            {
                if (value == -1 || value == 0 || value == 1)
                    direct_y = value;
            } 
                
        }
 
        public int Direct_X
        {
            get { return direct_x; }
            set
            {
                if (value == -1 || value == 0 || value == 1)
                    direct_x = value;
            } 
                
        }
 
        public int X
        {
            get { return x; }
            set { x = value; }
        }

       public int Y
       {
           get { return y; }
           set { y = value; }
       }
 
       static Random r;

        //Изображение танка
        TankImg tankImg = new TankImg();
        
       Image curentImage;
       public Image CurentImage
        {
            get { return curentImage; }
            set { curentImage = value; }
        }
        
       Image[] image;
               
        public Tank(int sizeField, int x, int y)
        {
            this.sizeField = sizeField;
                                    
            r = new Random();
            if (r.Next(5000) < 2500)
            {
                direct_y = 0;
            loop:
                direct_x = r.Next(-1, 2);
                if (direct_x == 0)
                    goto loop;
            }
            else
            {
                direct_x = 0;
            loop1:
                direct_y = r.Next(-1, 2);
                if (direct_y == 0)
                    goto loop1;
            }
 
            this.x = x;
            this.y = y;           
            
            putImage();
            CurentPutImage();
            
        }
                    
        //метод движение танка
        public void Run()
        {
            x += Direct_X;
            y += Direct_Y;
 
            if (Math.IEEERemainder(x, 40) == 0 && Math.IEEERemainder(y, 40) == 0)
                Turn();
 
            //анимация танка
            CurentPutImage();
 
            transparent();
            
        }
 
        public void Turn()
        {
            r = new Random();
 
            {
                if (r.Next(5000) < 2500)//двигаемся по горизонтали
                {
                    if (Direct_X != 0)
                        Direct_X = Direct_X;
                    else
                    {
                        Direct_Y = 0;
                        while (Direct_X == 0)
                            Direct_X = r.Next(-1, 2);
                    }
                }
                else//двигаемся по вертикали
                {
                    if (Direct_Y != 0)
                        Direct_Y = Direct_Y;
                    else
                    {
                        Direct_X = 0;
                        while (Direct_Y == 0)
                            Direct_Y = r.Next(-1, 2);
                    }
                }
            }

            putImage();
  
        }
 
       //метод прозрачности стен 
       public void transparent() 
       {
           if (x == -1)
               x = sizeField - 21;
           if (x == sizeField - 19)
               x = 1;
 
           if (y == -1)
               y = sizeField - 21;
           if (y == sizeField - 19)
               y = 1;
       }
 
       //анимация танка 
       public void putImage()
        {
            if (direct_x == 1)
                image = tankImg.Right;
            if (direct_x == -1)
                image = tankImg.Left;
            if (direct_y == 1)
                image = tankImg.Down;
            if (direct_y == -1)
                image = tankImg.Up;
        }

        //смена изображений танка
       int k; 
       public void CurentPutImage()
        {
             CurentImage=image[k];
             k++;
             if (k == 4)
                 k = 0;
 
        }

    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace Tanks
{
    public partial class View : UserControl
    {
        public Model model;
        
        public View(Model model)
        {
            InitializeComponent();
            this.model = model;
        }

        //вывод танка на экран
        void tankDraw(PaintEventArgs e)
        {
            foreach(Tank t in model.Tanks)
                e.Graphics.DrawImage(t.CurentImage, new Point(t.X, t.Y));
            
        }
 
        //вывод стенок на экран
        void wallDraw(PaintEventArgs e)
        {
            for (int x = 20; x < 260; x += 40)
                for (int y = 20; y < 260; y += 40)
                    e.Graphics.DrawImage(model.wall.Image, new Point(x, y));
            
        }
 
        public void Draw(PaintEventArgs e)
        {
            tankDraw(e);
            wallDraw(e);
 
            if (model.gameStatus != GameStatus.playing)
                return;
 
            Thread.Sleep(model.speedGame);
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            Draw(e);
        }
 
        private void View_Load(object sender, EventArgs e)
        {
 
        }

    }
}

Решение задачи: «Движение объектов»

textual
Листинг программы
 //запуск игры
        public void play()
        {
            while (gameStatus==GameStatus.playing)
            {
                Thread.Sleep(speedGame);
                foreach (Tank t in tanks)
                    t.Run();
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы