C# - 2d matrix - is guess left/right/up/down of point

时间:2018-10-19 22:35:59

标签: c# winforms linq matrix multidimensional-array

Using a 2d array of buttons implemented and placed on a form.

Button[,] tmpButton = new Button[x, y];
private void DrawGrid()
{
     int ButtonWidth = 48;
     int ButtonHeight = 48;
     int start_x = 88;
     int start_y = 200;

     for (int i = 0; i < x; i++)
     {
         for (int j = 0; j < y; j++)
         {
             tmpButton[i, j] = new Button();
             tmpButton[i, j].Top = start_x + (i * ButtonHeight);
             tmpButton[i, j].Left = start_y + (j * ButtonWidth);
             tmpButton[i, j].Width = ButtonWidth;
             tmpButton[i, j].Height = ButtonHeight;
             tmpButton[i, j].Click += new EventHandler(BTN_Grid_Click);
             this.Controls.Add(tmpButton[i, j]);
         }
     }
}

If a random location (x,y) is set true within the grid with the intention of guessing (by clicking on the surrounding grid buttons) it's location. If the location is !true it should return left right up down pointing to the random location we set earlier. If the true location is up and left, it should return whichever it is closest too.

What would be the best way to implement something like this?

This is getting close, but something I can't see is off a bit ...

public String GetDirection()
{
    int xd = Guess.X - Clue.X;
    int yd = Guess.Y - Clue.Y;

    if(Math.Abs(xd) <= Math.Abs(yd))
        return (xd <= 0) ? "Left" : "Right";
    else
        return (yd <= 0) ? "Down" : "Up";
}

Here is a visual representation of what is happening ...

1 个答案:

答案 0 :(得分:0)

好的,所以您大部分都对了,但是您犯了一个简单的错误。创建按钮时,您要从左到右然后从上到下进行渲染,这将创建高度作为x位置,然后将宽度作为y位置。因此,当您将猜测与正确的位置相关联时,您会忘记执行此操作并假定x为宽度。

这是解决此问题的我的实现:

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 UpDownLeftRight {

    public partial class Form1 : Form {

        public Form1() {
            InitializeComponent();
            this.Load += new System.EventHandler(this.Form1_Load);
        }

        public int[] winner = new int[2];
        public Button[,] tmpButton = new Button[10, 10];
        private void Form1_Load(object sender, EventArgs e) {
            Random r = new Random();
            int ButtonWidth = 48;
            int ButtonHeight = 48;
            int start_x = 0;
            int start_y = 0;
            winner = new int[] { r.Next(0, 10), r.Next(0, 10) };
            this.Size = new Size((ButtonWidth * 11), (ButtonHeight * 11));
            for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 10; j++) {
                    tmpButton[i, j] = new Button();
                    tmpButton[i, j].Left = start_x + (i * ButtonWidth);
                    tmpButton[i, j].Top = start_y + (j * ButtonHeight);
                    tmpButton[i, j].Width = ButtonWidth;
                    tmpButton[i, j].Height = ButtonHeight;
                    tmpButton[i, j].Font = new Font(FontFamily.GenericMonospace, 17);
                    tmpButton[i, j].Click += new EventHandler(BTN_Grid_Click);
                    this.Controls.Add(tmpButton[i, j]);
                }
            }
        }

        public void BTN_Grid_Click(object o, EventArgs e) {
            int[] guess = new int[2];
            for (int i = 0; i != tmpButton.GetLength(1); i++) {
                for (int j = 0; j != tmpButton.GetLength(0); j++) {
                    if (tmpButton[i, j] == o) {
                        guess = new int[] { i, j };
                    }
                }
            }
            int xDist = guess[0] - winner[0];
            int yDist = guess[1] - winner[1];
            string possible = "˂˃˄˅";
            if (xDist > 0) { possible = possible.Replace("˃", ""); }
            if (xDist < 0) { possible = possible.Replace("˂", ""); }
            if (xDist == 0) { possible = possible.Replace("˂", ""); possible = possible.Replace("˃", ""); }
            if (yDist > 0) { possible = possible.Replace("˅", ""); }
            if (yDist < 0) { possible = possible.Replace("˄", ""); }
            if (yDist == 0) { possible = possible.Replace("˄", ""); possible = possible.Replace("˅", ""); }
            ((Button)o).Text = possible;
        }
    }
}