Движение объектов - 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();
}
}