Zajmuję się tworzeniem gier karcianych, ale muszę mieć funkcję, która zatrzymuje program, dopóki gracz nie kliknie w PictureBox swojej karty, aby ją odrzucić. Algorytm mojej grze jest taka:Poczekaj, aż zostanie uruchomione zdarzenie kliknięcia C#
int nextDrawer = 0; // the players which will discard a card are determinated in counterclockwise starting from the human player
for (int i = 0; i < players; i++) // untill all the players hasn't drawed a card
{
if (i == 0) .... // the human player has to click on a picture box to discard a card
else .... // an AI player will discard a card which is selected randomly from the 3 cards which AI has got in its hand
}
Problem polega na tym, że gdy kończy Mance, pierwszy, który będzie odrzucić karty może się zmienić. Jeśli gracze są liczeni z 0 (gracz ludzki), 1 (pierwszy gracz AI), 2 (drugi gracz AI) i 3 (trzeci gracz AI), przy pierwszej mance pierwszym, który odrzucił kartę, jest gracz ludzki, ale przy Druga mania, którą jako pierwszy odrzuci, może być graczem 2 AI, a gracz ludzki musi poczekać, aż wszyscy gracze AI przed nim odłożą kartę (w tym przypadku runda wynosiłaby 2-3-0-1).
Jak mogę anulować zdarzenie click, jeśli gracze AI nie wyrzucili jeszcze karty?
UPDATE
Nie zawsze trzeba czekać tak wszystkie gracze AI miał drawed kartę: jeśli zwycięzca Mance jest numerem 2, runda byłaby 2-3-0 -1: oznacza to, że gracz musi czekać na losowanie 2 i 3 graczy AI, a następnie gracz musi kliknąć jeden PictureBox, a pętla wróci do graczy AI, a następnie gracz AI 1 może odrzucić swoją kartę.
UPDATE 2
Myślałem coś takiego:
int leader = 0; // who is going to discard first
int nextDiscarder = leader; // next player who's going to discard
for (int i = 0; i < nPlayers; i++) // until all the players hasn't discarded
{
if (nextDiscarder == 0) // the human has to discard
{
enablePictureBoxClickEvent;
// now before the loop continue the program has to wait the event click on a picture box
}
else
{
AI[nextDiscarder].discard(); // the ai player will discard
}
if (nextDiscarder == players - 1) // if nextDiscarder has reached the end of the table
nextDiscarder = 0; // return to the begin until all player has discarded a card
else
++nextDiscarder; // continue to discard with the next player
}
iw moim przypadku kliknij zrobiłbym coś takiego:
private myEventClick(object sender, EventArgs e)
{
.... // do the instructions needed to discard a card
disableMyEventClick;
returnToLoop;
}
ale głównym Problem polega na tym, że nie wiem jak napisać w kodzie moją instrukcję returnToLoop
.
Czy próbowałeś ustawić flagę 'bool', by ci pomóc? Przykład: Ustaw flagę jako fałszywą, gdy człowiek gra, a następnie ustaw ją ponownie na true, tylko jeśli 3 kolejne odrzuciły karty (prawdopodobnie za pomocą licznika). Następnie upewnij się, że człowiek może odrzucić swoją kartę tylko wtedy, gdy flaga jest prawdziwa.Mam nadzieję że to pomogło! – andeart
Próbowałem tego? https://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs.cancel(v=vs.110).aspx – Zuzlx
Myślę, że "returnToLoop" nie jest potrzebny, ponieważ wydarzenie nie zakończyło pętli, więc powrót do pętli jest automatyczny, ponieważ zdarzenie nie usunęło Cię z wątku. – gridtrak