W załączniku obrazek, który powinien rozjaśnić co chce uzyskać. To coś co ma przypominać psa, to kontrolka pictureBoxChart1, która umieszczona jest na drugiej kontrolce pictureBox1, teraz po kliknięciu przesuwam pictureBoxChart1, pictureBoxChart2, pictureBoxChart3, pictureBoxChart4 w pętli, pytanie jak sprawdzić czy któraś z kontrolek pictureBoxChart dotarła już na koniec kontrolki pictureBox1 i wtedy przerwać pętle.
pokaż jak przesuwasz
Metoda Run odpowiedzialna za przesuwanie psa.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace DzieńNaWyścigach
{
class Greyhound //opis charta
{
public int StartingPosition; //miejsce gdzie rozpocznie się pictureBox
public int racetrackLength; //długość trasy wyścigu
public int Location = 0; //położenie psa na torze wyścigowym
public PictureBox MyPictureBox = null; //do przechowywania obrazu psa
public Random MyRandom;
public bool Run()
{
int distance;
distance = MyRandom.Next(1,4); //przesunięcie się losowo o 1, 2, 3 lub 4 punkty
Point p = MyPictureBox.Location; //pobranie aktualnej pozycji psa
p.X += distance;
MyPictureBox.Location = p; //aktualicazja pozycji kontrolki pictureBox
if (Location == racetrackLength) //Zwróć true jeżeli wygrałem wyścig
return true;
else
return false;
}
public void TakeStartingPosition()
{
StartingPosition = 0;
}
}
}
Form1.cs
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 DzieńNaWyścigach
{
public partial class Form1 : Form
{
Random Randomizer = new Random();
Guy[] guys = new Guy[3];
Greyhound[] greyhounds = new Greyhound[4];
public Form1()
{
InitializeComponent();
guys[0] = new Guy { Name = "Janek", Cash = 50, MyRadioButton = radioButtonJanek };
guys[1] = new Guy { Name = "Bartek", Cash = 75, MyRadioButton = radioButtonBartek };
guys[2] = new Guy { Name = "Arek", Cash = 45, MyRadioButton = radioButtonArek };
greyhounds[0] = new Greyhound { MyPictureBox = pictureBoxChart1, MyRandom = Randomizer};
greyhounds[1] = new Greyhound { MyPictureBox = pictureBoxChart2, MyRandom = Randomizer };
greyhounds[2] = new Greyhound { MyPictureBox = pictureBoxChart3, MyRandom = Randomizer };
greyhounds[3] = new Greyhound { MyPictureBox = pictureBoxChart4, MyRandom = Randomizer };
for(int i = 0; i < guys.Length; i++)
guys[i].UpdateLabels();
}
private void buttonStart_Click(object sender, EventArgs e)
{
while (/*dopóki żaden pies nie dotrze na koniec pictureBoxa wywołuj Run()*/)
{
for (int i = 0; i < greyhounds.Length; i++)
{
greyhounds[i].Run();
}
}
}
}
}
if (Location == racetrackLength) //Zwróć true jeżeli wygrałem wyścig
location może być zwiększone o np. 4 punkty i może nie trafić w dokładny koniec racetrackLength
== zamień na > i powinno być ok
Na pewno PictureBox dotrze do drugiego lub innej kontrolki jeżeli metoda IntersectsWith
właściwości DisplayRectangle
kontrolki zwróci true
.
Problem z przesunięciem rozwiązałem. Teraz pojawił się kolejny, po prostu chce określić który jest najbardziej wysunięty w prawo, ten wygrywa. Niestety moja metoda nie za każdym razem działa prawidłowo. Pewnie nieładnie to wygląda, ale nie miałem innego pomysłu.
public void checkWinner()
{
if (pictureBoxChart1.Location.X > pictureBoxChart2.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart3.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart4.Location.X)
{
numberOfWinnerDog = 1;
}
else if (pictureBoxChart2.Location.X > pictureBoxChart1.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart3.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart4.Location.X)
{
numberOfWinnerDog = 2;
}
else if (pictureBoxChart3.Location.X > pictureBoxChart1.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart2.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart4.Location.X)
{
numberOfWinnerDog = 3;
}
else if (pictureBoxChart4.Location.X > pictureBoxChart1.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart2.Location.X
&& pictureBoxChart1.Location.X > pictureBoxChart3.Location.X)
{
numberOfWinnerDog = 4;
}
}
private void buttonStart_Click(object sender, EventArgs e)
{
for (int i = 0; i < greyhounds.Length; i++)
{
greyhounds[i].TakeStartingPosition();
}
while (pictureBoxChart1.Location.X < pictureBox1.Size.Width
|| pictureBoxChart2.Location.X < pictureBox1.Size.Width
|| pictureBoxChart3.Location.X < pictureBox1.Size.Width
|| pictureBoxChart4.Location.X < pictureBox1.Size.Width)
{
for (int i = 0; i < greyhounds.Length; i++)
{
greyhounds[i].Run();
}
}
checkWinner();
MessageBox.Show("Wygrał pies numer: " + numberOfWinnerDog + " .", "Zwyciężca");
}
}
Problem, który aktualnie masz rozwiąże sortowanie - jest na ten temat masa informacji.
Twoja gra działać będzie z różną prędkością na różnych komputerach. Zamiast przesuwać te obrazki w pętli lepiej zrób to w wątku dzięki czemu forma będzie odmalowywana na bieżąco.
Pięć minut zastanawiałem się o co chodzi z tym pictureBoxChart1
. Ta sylwetka psa to chyba nie jest wykres, nie? Bo "chart" to nie jest po angielsku nazwa psa.
Przede wszystkim rysuj na Bitmapie i użyj jednego PictureBoxa.