【问题标题】:Why can't I interact with some of my Image Buttons?为什么我不能与我的某些图像按钮交互?
【发布时间】:2020-11-15 03:18:36
【问题描述】:

每个人。

我正在尝试在 Xamarin.Forms 中实现纸牌游戏。在一轮开始时,人类玩家和 AI 玩家每人收到三张牌,四张“桌面牌”面朝上放置。玩家可以使用他的一张牌来捕获一张或多张“牌桌牌”,只要他打出的牌的“面值”与他从牌桌上取出的牌的“面值”之和为 15。

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

在某个阶段,AI 丢弃的卡牌是可以捕获的,但人类玩家丢弃的卡牌却不能。当我尝试将代码压缩到此处发布时,捕获 AI 先前丢弃的卡片的功能丢失了。

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

【问题讨论】:

  • 这里的代码太多,无法真正说明发生了什么。而且我不确定您所说的“交互”是什么意思-您是说选择“丢弃”卡时UI没有响应吗?还是别的什么?
  • 是的,完全正确。尝试“点击”已丢弃的卡片时,UI 没有响应。
  • 因此,如果累积的选择总共有 15 个点,则没有彩色边框或消失。

标签: c# xamarin.forms imagebutton


【解决方案1】:

这是我现在正在使用的修复程序

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

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2021-10-09
    • 2017-11-27
    • 2023-03-18
    • 2012-02-09
    • 2020-05-26
    • 2012-10-30
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多