Движение объектов - 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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д