Jak sprawdzić czy pictureBox dotarł już do końca drugiego pictureBoxa?

0

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.

0

pokaż jak przesuwasz

0

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();
                }
            }
        }
    }
}


0

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

0

Na pewno PictureBox dotrze do drugiego lub innej kontrolki jeżeli metoda IntersectsWith właściwości DisplayRectangle kontrolki zwróci true.

0

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");
        }
    }
 
0

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.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1