Могу ли я сделать оператор switch, чтобы спросить, равно ли bool true? - PullRequest
0 голосов
/ 17 февраля 2019

Я пишу игру Tic Tac Toe и хочу проверить, были ли нажаты следующие кнопки.(Что если это правда, значит, вы выиграли.) Я думаю, что заявление о замене более эффективно для этого, но оно подчеркнуто красным, и я не понимаю, почему.

Вот мой текущий код:

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tic_tac_toe2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        bool buttonisclicked = false;
        bool buttonisclicked1 = false;
        bool buttonisclicked2 = false;
        bool buttonisclicked3 = false;

        public void button1_Click(object sender, EventArgs e)
        {
            Button clickedButton1 = (Button)sender;
            clickedButton1.Text = "X";

            if (clickedButton1.Text == "X")
            {

                buttonisclicked1 = true;
            }
        }

        public void button2_Click(object sender, EventArgs e)
        {
            Button clickedButton2 = (Button)sender;
            clickedButton2.Text = "X";

            if (clickedButton2.Text == "X")
            {

                buttonisclicked2 = true;
            }
        }

        public void button3_Click(object sender, EventArgs e)
        {
            Button clickedButton3 = (Button)sender;
            clickedButton3.Text = "X";

            if (clickedButton3.Text == "X")
            {

                buttonisclicked3 = true;
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Button clickedButton = (Button)sender;
            clickedButton.Text = "X";

            if (clickedButton.Text == "X")
            {

                buttonisclicked = true;
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Button clickedButton = (Button)sender;
            clickedButton.Text = "X";

            if (clickedButton.Text == "X")
            {

                buttonisclicked = true;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            Button clickedButton = (Button)sender;
            clickedButton.Text = "X";

            if (clickedButton.Text == "X")
            {

                buttonisclicked = true;
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            Button clickedButton = (Button)sender;
            clickedButton.Text = "X";

            if (clickedButton.Text == "X")
            {

                buttonisclicked = true;
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            Button clickedButton = (Button)sender;
            clickedButton.Text = "X";

            if (clickedButton.Text == "X")
            {

                buttonisclicked = true;
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            Button clickedButton = (Button)sender;
            clickedButton.Text = "X";

            if (clickedButton.Text == "X")
            {

                buttonisclicked = true;
            }

            void Win()
            {
                switch (buttonisclicked)
                {
                    case bool buttonisclicked1 && buttonisclicked2 && buttonisclicked3 = true:

                        Console.WriteLine("Won");
                        break;
                }


            }
        }

Должен ли я избавиться от разрыва;или я не могу использовать оператор &&?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Когда вы играете в тик-так, лучше отделить свою логику подсчета очков от событий.

Вам следует создать эту переменную в своей форме:

    private Button[][] _buttons = null;

Затем вForm_Load сделать это:

        _buttons = new []
        {
            new [] { button1, button2, button3 },
            new [] { button4, button5, button6 },
            new [] { button7, button8, button9 },
        };

Теперь вы можете создать метод, который возвращает список строк, который разрезает сетку по горизонтали, вертикали и диагонали:

    private IEnumerable<string> GetSlices() =>
        Enumerable
            .Range(0, 3)
            .SelectMany(n => new[]
            {
                String.Join("", Enumerable.Range(0, 3).Select(m => _buttons[m][n].Text)),
                String.Join("", Enumerable.Range(0, 3).Select(m => _buttons[n][m].Text))
            })
            .Concat(new[]
            {
                String.Join("", Enumerable.Range(0, 3).Select(x => _buttons[x][x].Text)),
                String.Join("", Enumerable.Range(0, 3).Select(x => _buttons[x][2 - x].Text))
            });

Затем,всякий раз, когда вы обновляете текст на кнопке, вы можете определить, кто выиграл так:

        var slices = GetSlices();

        if (slices.Any(s => s == "XXX"))
        {
            MessageBox.Show("X Won!");
        }

        if (slices.Any(s => s == "OOO"))
        {
            MessageBox.Show("O Won!");
        }
0 голосов
/ 18 февраля 2019

Честно говоря, мне нравится то, что вы пытаетесь сделать, но для чего-то такого простого, как логическое значение (которое может быть только истинным или ложным), , если утверждение - это все, что вам нужно:

if (buttonisclicked1 && buttonisclicked2 && buttonisclicked3) {
    Console.WriteLine("Won");
}

и если вы хотите, чтобы что-то произошло, если оно возвращает false, просто добавьте к предыдущему коду:

else {
    Console.WriteLine("Lost"); // <-- Replace this with whatever you want
}

Удачи в вашем проекте!Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...