为什么我无法与某些图像按钮交互?



每个人。

我正在尝试在Xamarin实现一个纸牌游戏。表格。在一轮比赛开始时,人类玩家和AI玩家各收到三张牌,四张"桌牌"面朝上。玩家可以使用他的一张牌来捕获一张或多张"桌上牌",只要他所玩的牌的"面值"与他从桌上拿走的牌的面值之和为15。

实现得很好,但当卡片图像按钮被丢弃到表中时,如果出现有效的机会,它们将拒绝稍后捕获。从模拟器的行为中,我知道GetCombos方法看到了有效的组合,但AccessTableCards方法中的foreach迭代似乎是无效的。

在某个阶段,人工智能丢弃的牌是可捕获的,但人类玩家丢弃的牌不是。当我试图压缩代码并将其发布在这里时,捕捉人工智能之前丢弃的卡片的能力就丧失了。

using MoreLinq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace Scopa2
{
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
List<ImageButton> tableImgs;
Card card1;
Card card2;
Card card3;
Card card4;
Card card5; 
Card card6;
List<Card> tableCards;
Card humanCard1;
Card humanCard2;
Card humanCard3;
List<Card> humanCards;
Card aiCard1;
Card aiCard2;
Card aiCard3;
List<Card> aiCards;
List<ImageButton> aiImgs;
ImageButton humanImg1 = new ImageButton();
ImageButton humanImg2 = new ImageButton();
ImageButton humanImg3 = new ImageButton();
ImageButton tableCard1 = new ImageButton();
ImageButton tableCard2 = new ImageButton();
ImageButton tableCard3 = new ImageButton();
ImageButton tableCard4 = new ImageButton();
ImageButton tableCard5 = new ImageButton();
ImageButton tableCard6 = new ImageButton();
bool human1Pressed = false;
bool human2Pressed = false;
bool human3Pressed = false;
bool table1Pressed = false;
bool table2Pressed = false;
bool table3Pressed = false;
bool table4Pressed = false;
bool table5Pressed = false;
bool table6Pressed = false;
List<ImageButton> humanImgs;
int captureCount;
public void OnHumanImg1Clicked(object sender, EventArgs e)
{
human1Pressed = true;
humanImg2.IsEnabled = false;
humanImg3.IsEnabled = false;
AccessTableImgs(humanCard1, humanImg1);
}
public void OnHumanImg2Clicked(object sender, EventArgs e)
{
human2Pressed = true;
humanImg1.IsEnabled = false;
humanImg3.IsEnabled = false;
AccessTableImgs(humanCard2, humanImg2);
}
public void OnHumanImg3Clicked(object sender, EventArgs e)
{
human3Pressed = true;
humanImg1.IsEnabled = false;
humanImg2.IsEnabled = false;
AccessTableImgs(humanCard3, humanImg3);
}
public void OnTableImg1Clicked(object sender, EventArgs e)
{
table1Pressed = true;
AdjudicateCapture(tableCard1, card1);
}
public void OnTableImg2Clicked(object sender, EventArgs e)
{
table2Pressed = true;
AdjudicateCapture(tableCard2, card2);
}
public void OnTableImg3Clicked(object sender, EventArgs e)
{
table3Pressed = true;
AdjudicateCapture(tableCard3, card3);
}
public void OnTableImg4Clicked(object sender, EventArgs e)
{
table4Pressed = true;
AdjudicateCapture(tableCard4, card4);
}
public void OnTableImg5Clicked(object sender, EventArgs e)
{
table5Pressed = true;
AdjudicateCapture(tableCard5, card5);
}
public void OnTableImg6Clicked(object sender, EventArgs e)
{
table6Pressed = true;
AdjudicateCapture(tableCard6, card6);
}
async Task AccessTableImgs(Card i, ImageButton j)
{
GetCombos(out int x);
if (x == 0)
{
if (human1Pressed == true)
{
await FinishHumanMove(i, j);
human1Pressed = false;
}
else if (human2Pressed == true)
{
await FinishHumanMove(i, j);
human2Pressed = false;
}
else if (human3Pressed == true)
{
await FinishHumanMove(i, j);
human3Pressed = false;
}
AiTurn();
}
else if (x >= 1)
{
captureCount += (int)i.FaceValue;
j.BorderWidth = 2.5;
j.BorderColor = Color.GreenYellow;
foreach (ImageButton k in tableImgs)
{
k.IsEnabled = true;
}
}
}
public void GetCombos(out int number)
{
List<IList<int>> validCombos = new List<IList<int>>();
List<int> numbers = new List<int>();
for (int i = 0; i < tableCards.Count; i++)
{
numbers.Add((int)tableCards[i].FaceValue);
}
List<IList<int>> validCombos1 = numbers.Subsets().Where(a => a.Sum() == (15 - (int)humanCard1.FaceValue)).ToList();
List<IList<int>> validCombos2 = numbers.Subsets().Where(a => a.Sum() == (15 - (int)humanCard2.FaceValue)).ToList();
List<IList<int>> validCombos3 = numbers.Subsets().Where(a => a.Sum() == (15 - (int)humanCard3.FaceValue)).ToList();
if (humanCards.Contains(humanCard1))
{
validCombos.AddRange(validCombos1);
}
if (humanCards.Contains(humanCard2))
{
validCombos.AddRange(validCombos2);
}
if (humanCards.Contains(humanCard3))
{
validCombos.AddRange(validCombos3);
}
number = validCombos.Count;
}
async Task FinishHumanMove(Card i, ImageButton j)
{
await DiscardCards(i, j);
captureCount = 0;
}
public void AdjudicateCapture(ImageButton i, Card j)
{
captureCount += (int)j.FaceValue;
if (captureCount < 15)
{
i.BorderWidth = 2.5;
i.BorderColor = Color.GreenYellow;
i.IsEnabled = false;
}
if (captureCount > 15)
{
captureCount = 0;
foreach (ImageButton k in tableImgs)
{
k.BorderWidth = 0;
k.IsEnabled = false;
}
foreach (ImageButton l in humanImgs)
{
l.IsEnabled = true;
l.BorderWidth = 0;
}
human1Pressed = false;
human2Pressed = false;
human3Pressed = false;
table1Pressed = false;
table2Pressed = false;
table3Pressed = false;
table4Pressed = false;
table5Pressed = false;
table6Pressed = false;
}
if (captureCount == 15)
{
captureCount = 0;
foreach (ImageButton k in tableImgs)
{
k.IsEnabled = false;
k.BorderWidth = 0;
}
foreach (ImageButton l in humanImgs)
{
l.IsEnabled = false;
l.BorderWidth = 0;
}
if (human1Pressed == true)
{
humanImg1.Opacity = 0;
humanCards.Remove(humanCard1);
human1Pressed = false;
}
else if (human2Pressed == true)
{ 
humanImg2.Opacity = 0;
humanCards.Remove(humanCard2);
human2Pressed = false;
}
else if (human3Pressed == true)
{
humanImg3.Opacity = 0;
humanCards.Remove(humanCard3);
human3Pressed = false;
}
if (table1Pressed == true)
{
tableCard1.Opacity = 0;
tableImgs.Remove(tableCard1);
tableCards.Remove(card1);
table1Pressed = false;
}
if (table2Pressed == true)
{
tableCard2.Opacity = 0;
tableImgs.Remove(tableCard2);
tableCards.Remove(card2);
table2Pressed = false;
}
if (table3Pressed == true)
{
tableCard3.Opacity = 0;
tableImgs.Remove(tableCard3);
tableCards.Remove(card3);
table3Pressed = false;
}
if (table4Pressed == true)
{
tableCard4.Opacity = 0;
tableImgs.Remove(tableCard4);
tableCards.Remove(card4);
table4Pressed = false;
}
if (table5Pressed == true)
{
tableCard5.Opacity = 0;
tableImgs.Remove(tableCard5);
tableCards.Remove(card5);
table5Pressed = false;
}
if (table6Pressed == true)
{
tableCard6.Opacity = 0;
tableImgs.Remove(tableCard6);
tableCards.Remove(card6);
table6Pressed = false;
}
AiTurn();
}
}
async void AiTurn()
{
var rand = new Random();
int num = rand.Next(aiImgs.Count);
GetAiCombos(out int x);
if (x == 0)
{
aiImgs[num].Source = CardID(aiCards[num]);
await DiscardCards(aiCards[num], aiImgs[num]);
}
else if (x >= 1)
{
aiImgs[num].Source = CardID(aiCards[num]);
await DiscardCards(aiCards[num], aiImgs[num]);
}
captureCount = 0;
foreach (ImageButton i in humanImgs)
{
i.IsEnabled = true;
}
}
public void GetAiCombos(out int number)
{
List<IList<int>> aiValidCombos = new List<IList<int>>();
List<int> numbers = new List<int>();
for (int i = 0; i < tableCards.Count; i++)
{
numbers.Add((int)tableCards[i].FaceValue);
}
List<IList<int>> aiValidCombos1 = numbers.Subsets().Where(a => a.Sum() == (15 - (int)aiCard1.FaceValue)).ToList();
List<IList<int>> aiValidCombos2 = numbers.Subsets().Where(a => a.Sum() == (15 - (int)aiCard2.FaceValue)).ToList();
List<IList<int>> aiValidCombos3 = numbers.Subsets().Where(a => a.Sum() == (15 - (int)aiCard3.FaceValue)).ToList();
if (aiCards.Contains(aiCard1))
{
aiValidCombos.AddRange(aiValidCombos1);
}
if (aiCards.Contains(aiCard2))
{
aiValidCombos.AddRange(aiValidCombos2);
}
if (aiCards.Contains(aiCard3))
{
aiValidCombos.AddRange(aiValidCombos3);
}
number = aiValidCombos.Count;
}
private async Task DiscardCards(Card i, ImageButton j)
{
if (!tableImgs.Contains(tableCard5))
{
tableCard5 = j;
tableImgs.Add(tableCard5);
tableCard5.IsEnabled = false;
card5 = new Card(i.FaceValue, i.Suit);
tableCards.Add(card5);
if (aiImgs.Contains(j))
{
aiImgs.Remove(j);
}
else if (humanImgs.Contains(j))
{
humanImgs.Remove(j);
}
if (aiCards.Contains(i))
{
aiCards.Remove(i);
}
else if (humanCards.Contains(i))
{
humanCards.Remove(i);
}
await Task.WhenAll(tableCard5.TranslateTo(-2.2 * tableCard5.Width, 0, 500));
}
else if (tableImgs.Contains(tableCard5))
{
tableCard6 = j;
tableCard6.IsEnabled = false;
tableImgs.Add(tableCard6);
card6 = new Card(i.FaceValue, i.Suit);
tableCards.Add(card6);
if (aiImgs.Contains(j))
{
aiImgs.Remove(j);
}
else if (humanImgs.Contains(j))
{
humanImgs.Remove(j);
}
if (aiCards.Contains(i))
{
aiCards.Remove(i);
}
else if (humanCards.Contains(i))
{
humanCards.Remove(i);
}
await Task.WhenAll(tableCard6.TranslateTo((2.2 * tableCard5.Width), 0, 500));
}
}
private ImageSource CardID(Card card)
{
switch (card.FaceValue)
{
#region Aces
case Card.Rank.Ace:
{
switch (card.Suit)
{
case Card.SuitType.Clubs:
{
return ImageSource.FromResource("Scopa2.images.AC.jpg",
typeof(ImageResourceExtension).GetTypeInfo().Assembly);
}
case Card.SuitType.Diamonds:
{
return ImageSource.FromResource("Scopa2.images.AD.jpg",
typeof(ImageResourceExtension).GetTypeInfo().Assembly);
}}}} //etc

这是我目前使用的修复程序

private async Task DiscardCards(Card i, ImageButton j)
{
if (!tableImgs.Contains(tableCard5))
{
tableCard5 = j;
j.Clicked += OnTableImg5Clicked;
tableImgs.Add(tableCard5);
card5 = new Card(i.FaceValue, i.Suit);
tableCards.Add(card5);
if (aiImgs.Contains(j))
{
aiImgs.Remove(j);
}
else if (humanImgs.Contains(j))
{
humanImgs.Remove(j);
}
if (aiCards.Contains(i))
{
aiCards.Remove(i);
}
else if (humanCards.Contains(i))
{
humanCards.Remove(i);
}
await Task.WhenAll(tableCard5.TranslateTo(-2.2 * tableCard5.Width, 0, 500));
}
else if (tableImgs.Contains(tableCard5))
{
tableCard6 = j;
j.Clicked += OnTableImg6Clicked;
tableImgs.Add(tableCard6);
card6 = new Card(i.FaceValue, i.Suit);
tableCards.Add(card6);
if (aiImgs.Contains(j))
{
aiImgs.Remove(j);
}
else if (humanImgs.Contains(j))
{
humanImgs.Remove(j);
}
if (aiCards.Contains(i))
{
aiCards.Remove(i);
}
else if (humanCards.Contains(i))
{
humanCards.Remove(i);
}
await Task.WhenAll(tableCard6.TranslateTo((2.2 * tableCard5.Width), 0, 500));
}
}