Method to move picturebox in an array

Asked

Viewed 56 times

2

I am creating a method in the game of Checkers that allows the pieces to move, then in a textbox I insert the position of the piece that I want to move and then stores the variable aux, and the user in the same textbox (textboxposition) inserts the position where he wants to move the piece 

But the method giving me error on a line says 'The object reference was not defined as an instance of an object ' 

I can’t seem to solve the problem Someone can help me?

This is the way the line that gives me error is the marked 

private void buttonAdicionarPedra_Click(object sender, EventArgs e)
    {
        Point peça_selecionada = new Point(-1,-1);//criamos uma variavel do tipo Point para guardar a posiçao da peça que vamos mexer
        //inicializamos-a na posiçao (-1,-1) porque estas posiçoes nao existem no tabuleiro
        char[] aux;
        Pedras pedra_aux;
        if (!this.seleçao)//se a peça nao tiver sido selecionada
        {
            aux = textBoxposicao.Text.ToCharArray(); //a variavel aux é um auxiliar para converter a textbox para vetor de carateres


            peça_selecionada = new Point(Convert.ToInt32(aux[0]), Convert.ToInt32(aux[1]));
            this.seleçao = true;//a peça foi selecionada
            buttonAdicionarPedra.Text = "Adicionar Pedra";//o botao muda de nome para AdicionarPedra
            textBoxposicao.Text = "";//coloca a textbox a branco novamente
            label1.Text = "Escolha para onde mover a peça";//muda o texto da label por cima da textbox posicao
        }
        else
        {//e a pedra foi selecionada 
           pedra_aux = play.ProcurarPedras(peça_selecionada);
            aux = textBoxposicao.Text.ToCharArray();
            pedra_aux.inserirposicao(Convert.ToInt32(aux[0]), Convert.ToInt32(aux[1]));//---------- da erro aqui 
            DesenhaPedras(play.Tabuleiro);
            buttonAdicionarPedra.Text = "Selecionar Peça";
            label1.Text = "Escolha a posição da peça que quer mover";
        }

    }

This is the other method I use in this method :

public void inserirposicao(int x, int y)//metodo criado para ajudar a guardar a posicao da peça q vamos mexer
    {
        Posiçao.X = x;
        Posiçao.Y = y;
    }
  • See if play.ProcurarPedras is not returning null or if Pedras.Posiçao has been initialized or aux.

  • There the question is related to the logic of your program, only with a fragment not to know what is intention. But one thing I realized, the this.seleçao must return true if a piece selected otherwise returns false. So I guess this one this.seleçao is returning true even when a piece is not selected.

1 answer

2

The problem with error is that the peça_selecionada is always -1, -1 when you enter the else of if, because it is always creating the instance in the event, it should be created in the scope of the class such as the variable seleçao.

I made an example where we use an object like Pedra to replace this variable seleçao and peça_selecionada:

public partial class Form1 : Form
{
    private Pedra pedra;
    private Pedra[,] tabuleiro = new Pedra[8, 8];

    public Form1()
    {
        InitializeComponent();

        // Criando algumas pedras
        tabuleiro[0, 0] = new Pedra(0, 0, "Brancas");
        tabuleiro[1, 1] = new Pedra { Posiçao = new Point(1, 1), Lado = "Brancas" };
    }

    private void buttonAdicionarPedra_Click(object sender, EventArgs e)
    {
        // Fazer uma validação do input
        string input = textBoxposicao.Text;

        if (pedra is null)
        {
            Point origem = new Point(input[0] - 48, input[1] - 48);

            // Trás a 'pedra' caso exista uma pedra na posição da 'origem', senão trás 'null'
            // pedra = tabuleiro.Cast<Pedra>().FirstOrDefault(p => p != null && p.Posiçao == origem); // pela propriedade 'Posiçao' da pedra
            pedra = tabuleiro[origem.X, origem.Y];
        }
        else
        {
            Point destino = new Point(input[0] - 48, input[1] - 48);

            // Verifica se a posição 'destino' tem uma pedra
            // if (tabuleiro.Cast<Pedra>().FirstOrDefault(p => p != null && p.Posiçao == destino) is null) // pela propriedade 'Posiçao' da pedra          
            if (tabuleiro[destino.X, destino.Y] is null)
            {
                tabuleiro[pedra.Posiçao.X, pedra.Posiçao.Y] = null;
                // Cria uma nova instacia da 'pedra' com a nova posição 'destino' e com os outros valores da pedra
                // Não podemos atribuir a 'pedra' porque depois a iremos setar a 'null' (ficaria como 'null' tambem no 'tabuleiro')
                tabuleiro[destino.X, destino.Y] = new Pedra { Posiçao = destino, Lado = pedra.Lado };
            }
            pedra = null;
        }
        ActualizarRotulos();
    }

    private void ActualizarRotulos()
    {
        if (pedra is null)
        {
            buttonAdicionarPedra.Text = "Selecionar Peça";
            label1.Text = "Escolha a posição da peça que quer mover";
        }
        else
        {
            buttonAdicionarPedra.Text = "Adicionar Pedra";
            label1.Text = "Escolha para onde mover a peça";
        }
        textBoxposicao.Text = "";
    }
}

public class Pedra
{
    public Point Posiçao { get; set; }
    public string Lado { get; set; }
    public bool Dama = false;

    public Pedra() { }

    public Pedra(int x, int y, string lado)
    {
        this.Posiçao = new Point(x, y);
        this.Lado = lado;
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.