2013-03-01 2 views
1

Я делаю программу Windows Forms Tic-Tac-Toe, которая имеет размер сетки, заданный значением в файле App.config. Таким образом, если значение равно 9, сетка регулярная 3 х 3, если его 25, св 5 х 5 и т.д.Итерация через массив для .Text значений

У меня есть GameBoard класс, который делает реальные кнопки для массива:

public Gameboard(int numberofButtons) //Constructor method that is referencing the App.config for the dimensions value to make the board 
{ 
    buttonArray = new Button[numberofButtons]; //creating an array the size of numberofButtons which is the dimensions value from App.config 
    Font font = new Font("Times New Roman", 36.0f); //creates an instance of the Font class 
    int sqrtY = (int) Math.Sqrt(numberofButtons); 
    int z = 0; //Counter for array 

    //Create the buttons for the form 
    for (int x = 0; x < sqrtY; x++) 
    { 
     for (int y = 0; y < sqrtY; y++) 
     { 
      buttonArray[z] = new Button(); 
      buttonArray[z].Font = font; 
      buttonArray[z].Size = new System.Drawing.Size(100, 100); 
      buttonArray[z].Location = new System.Drawing.Point(100*y, 100*x); 
      buttonArray[z].Click += new EventHandler(button_click); 
      z++; 
     } 
    } 
} 

Если я хочу проверить победители в массиве, просто проверив значение buttonArray.Text для позиций в buttonArray, как я могу повторить это?

, например, в сетке 4х4, то winlines для горизонтальных выигрышей будет

0,1,2,3 
4,5,6,7 
8,9,10,11 
12,13,14,15 

так

x=0, x<sqrt(dimension), x++ 
buttonArray[x].Text == "X" <-- to test 

Я понимаю, что это действительно плохо закодированы и запутанным, но я пытаюсь сделать это с один размерный массив, потому что это то, о чем учил учитель. Я хочу проверить значения buttonArray[] на значение, сначала проверив строки, затем столбцы, затем диагонали.

Форма не имеет кнопок, поэтому при загрузке формы она заполняет ее кнопками, используемыми для сетки. Он предназначен для игры против компьютера, поэтому, когда вы нажимаете кнопку, текст становится «X», а затем компьютер должен указывать «O» и т. Д.

+0

Таким образом, важный вопрос, я, вероятно, должен сначала спросил. Вам нужно знать, как выиграл X/O, или только победил X или O, или все ячейки были поданы/оттянуты. Например, «X Won (строка 1)» или просто «X Won». Если первый пример, как насчет того, если последняя ячейка для победы сделала полную строку и столбец, действительно ли у вас есть все/все пути, которые они выиграли? –

+0

Хорошо, мне бы хотелось узнать, кто выиграл, а затем изменить цвет фона выигрывающего шаблона или сделать WinLine из координат конечных точек выигрышной линии. По крайней мере, измените .BackColor на что-то вроде IndiaRed, чтобы выделить выигрышные кнопки, которые объединяются, чтобы сделать winline. – BackDoorNoBaby

+0

Это должна быть легкая часть, вы должны проверить, выиграл ли кто-то (более сложная часть) после каждого хода, так что тот, кто повернул его, просто выиграл (если игра - победа). Вы не можете поиграть и проиграть! –

ответ

2

Я привожу примеры того, как выделить критерии, которые вы указали. Я более чем готов ответить на конкретные вопросы, но поскольку это вопрос домашней работы, я не хочу предоставлять все. Надеюсь, это поможет.

string[] values = buttonArray.Select(b => b.Text).ToArray(); 


//uses integer divison to separate out rows 
string[][] rows = values 
    .Select((v, i) => new {index = i, value = v}) 
    .GroupBy(anon => anon.index/size) 
    .Select(grp => grp.Select(anon => anon.value).ToArray()) 
    .ToArray(); 

foreach(string[] row in rows) 
{ 
    //Pseudocode 
    var winner = CheckAllValuesArePopulatedAndTheSameAKAWinner(row); 
    if (winner exists) 
     return winner; 
} 

//uses modulus to separate out columns, basically a transpose 
string[][] columns = values 
    .Select((v, i) => new { index = i, value = v }) 
    .GroupBy(anon => anon.index % size) 
    .Select(grp => grp.Select(anon => anon.value).ToArray()) 
    .ToArray(); 

string[] diagonal1 = values 
    .Select((v, i) => new {index = i, value = v}) 
    .Where(anon => anon.index%(size + 1) == 0) 
    .Select(anon => anon.value) //take just the string value, drop the index 
    .ToArray(); 

string[] diagonal2 = values 
    .Select((v, i) => new { index = i, value = v }) 
    .Where(anon => anon.index % (size - 1) == 0) 
    .Skip(1) //skip 0 index 
    .Take(size) //skip last index 
    .Select(anon => anon.value) //take just the string value, drop the index 
    .ToArray(); 

Индексы Пример:

//given size and dimension 

//run this code once per different size, not on each check (probably move variable to some outer scope) 
Dictionary<string, int[]> winningSets = new Dictionary<string, int[]>(); 
int[] indices = Enumerable.Range(0, dimension).ToArray(); //make array of 0 to (dimension - 1) 


for (int rowNum = 0; rowNum < size; ++rowNum) //0 based row index/num 
{ 
    int[] rowIndices = indices 
     .Where(i => i/size == rowNum) 
     .ToArray(); 
    winningSets.Add(String.Format("Row Number {0}", rowNum + 1), rowIndices); //use 1 based row index/num for display 
} 

for (int colNum = 0; colNum < size; ++colNum) //0 based row index/num 
{ 
    int[] colIndices = indices 
     .Where(i => i % size == colNum) 
     .ToArray(); 
    winningSets.Add(String.Format("Column Number {0}", colNum + 1), colIndices); //use 1 based column index/num for display 
} 

int[] diag1 = indices 
    .Where(i => i % (size + 1) == 0) 
    .ToArray(); 
winningSets.Add("Diag TR to BL", diag1); 

int[] diag2 = indices 
    .Where(i => i % (size - 1) == 0) 
    .Skip(1) //skip 0 index 
    .Take(size) //skip last index 
    .ToArray(); 
winningSets.Add("Diag TL to Br", diag2); 

//run this for each check 
foreach(KeyValuePair<string, int[]> winningSet in winningSets) 
{ 
    //Pseudo 
    if (all of winningSet.Value indices are populated and same) 
     return winningSet.Name; //Name of winning set, ex will not return multiple winning set which is possible in this game 
    //this example does not show who won, but whoever had the last turn is the winner if one is found. 
} 

Добавление пример того, как проверить массив значений (представляющий строку/столбец/по диагонали)

string CheckWinner(string[] setOfValues) 
    { 
     if (setOfValues.Any(individualValueFromSetOfValues => String.IsNullOrEmpty(individualValueFromSetOfValues))) // some values/cells are not filled in so no winner here 
      return null; 
     if (setOfValues.Distinct().Count() == 1) //all data is the same 
      return setOfValues.First(); //any value would work, we just checked that they're all the same 
     return null; // all values/cells are full but they are not all the same 
    } 
+0

Имеет ли массив столбцы и строки, если это всего лишь одномерный массив? Я смотрел на это больше на основе формулы на основе массива чисел, а затем пытался проверить свойство .Text элемента buttonArray, связанное с различными позициями выигрышных чисел. – BackDoorNoBaby

+0

Код основан на одномерном массиве. Два первых вернут группу, нижние две возвращают IEnumerable из I, anon. Я немного настрою его, чтобы вернуть IEnumerable из типа значения –

+0

Хорошо, я изменил код. Одномерный массив имеет индекс, он не имеет столбцов или строк; его можно воспринимать как одну строку со столбцами. Если вы объясните идею «основанной на формуле», я могу расширить ее. –

Смежные вопросы