Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2011, 17:32   #1
kloffelin
Пользователь
 
Регистрация: 21.02.2010
Сообщений: 27
Восклицание Проверка существования слова. C#

Всем доброго времени суток!
Помогите написать функцию или хотябы разъясните алгоритм... Уже всю голову продумал, но идея так и не пришла... Может просто нужен взгляд со стороны.

Пишу игру "Балда". Думаю все знают такую
Суть функции следующий.

Есть массив из текстбоксов:
Код:
textBoxes=new TextBox[size,size];
			for(i=0;i<size;i++)
			{
				for(j=0;j<size;j++)
				{
					textBoxes[i,j]=new TextBox();
					Controls.Add(textBoxes[i,j]);
					textBoxes[i,j].Font=new Font("Comic Sans MS",16,FontStyle.Bold);
					textBoxes[i,j].Location=new Point(x,y);
					textBoxes[i,j].Size=new Size(40,40);
                                                        textBoxes[i, j].MaxLength = 1;
                                                        textBoxes[i, j].TextAlign =HorizontalAlignment.Center;
                                                        textBoxes[i, j].Text = "";
					x+=48;
				}
				y+=42;
				x=144;
			}
где size - размер массива,
х и у - координаты расположения элементов массива на форме.

нужно написать функцию, которая проверяет можно ли построить введенное слово из букв, записанных в игровом поле. Например:

можно ли построить слово "лом"..

Один из вариантов такой функции был:
Код:
        private bool FindWord(string BoxText)
        {
            
            RefText();  //функция обновления массива текстбоксов(чтобы сохранить туда введенную букву)
            int len = BoxText.Length,  //длина введенного слова
                o=0,
                count = 0;
            string s;
            char[] Word = new char[len];  //дополнительный массив

            for (o = 0; o < len; o++)
                Word[o] = ' ';

            for (i = 0; i < size; i++)
            {
                for (j = 0; j < size; j++)
                {
                    if (textBoxes[i, j].Text != "") //если текстбокс не пуст
                    {
                        s = textBoxes[i, j].Text;
                        for (o = 0; o < len - 1; o++)
                        {
                            if ((s[0] == BoxText[o])&&(s[0]!=Word[o]))
                            {
                                Word[count] = BoxText[o];
                                count++;
                            }
                        }
                    
                    }
                }
            }

            if (count == len) return true;
            else return false;
        }
Тоесть если в текстбоксе есть буква, мы сравниваем ее с каждой буквой введенного слова. Если они совпадают - запоминаем эту букву в дополнительных массив(чтобы уйти от повторяющихся букв) и наращиваем количество совпадений. Если количество совпадений равно длине введенного слова - значит слово построить можно..

НО она не работает

Всем зарание спасибо за то что хотя бы задумались над моим вопросом!

Последний раз редактировалось kloffelin; 17.03.2011 в 00:58.
kloffelin вне форума Ответить с цитированием
Старый 18.03.2011, 10:49   #2
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Вот программа, правда она просто с текстовым масивом работает, но я думаю проблемм с изменением не будет.
Смысл такой: Программа ищет по всему массиву первую букву требуемого слова, а потом передаем ее в функцию которая ищет следующую букву в окресностях заданной. Функция рекурсивная. В результате работы в списке Ansver будут содержаться все найденные слова, если их несколько. В словах можно посмотреть координаты букв из которых они состоят, например для того чтобы определить используется ли в нем вновь веденая буква или нет.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 18.03.2011, 10:50   #3
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {

        static string[,] textBoxes = {{"","","","",""},//Массив текстбоксов
                                   {"","","","","М"},
                                   {"М","А","С","Л","О"},
                                   {"","","","",""},
                                   {"","","","",""}};
        static int Size;
        static string UserWord = "ЛОМ";// Искомое слово

        static List<Words> Ansver = new List<Words>();//Массив найденных слов

        static void Main(string[] args)
        {

            Size = textBoxes.GetLength(0);
            Words CurrentWord = new Words();

            for (int i = 0; i < Size; i++)//перебераем все буквы массива
                for (int j = 0; j < Size; j++)
                    if (textBoxes[i, j] == UserWord[0].ToString())//Ищем в массиве первую букву введеного слова
                    {
                        CurrentWord.FindedLetter.Add(new Bukva(textBoxes[i, j], i, j, 0));//Записываем в текущее слово
                        FinNextChar(CurrentWord);//ищем след букву в слове
                        CurrentWord.FindedLetter.Clear();
                    }
        }

        static void FinNextChar(Words Slovo)
        {
            int Pos = Slovo.FindedLetter[Slovo.FindedLetter.Count - 1].PosInWord;
            if (Pos == UserWord.Length - 1)//Если найдены все буквыы слова то сохраняем это слово в массив ответов
            {
                Ansver.Add(Slovo);
                return;
            }
            int Xpos = Slovo.FindedLetter[Slovo.FindedLetter.Count - 1].Xpos;
            int Ypos = Slovo.FindedLetter[Slovo.FindedLetter.Count - 1].Ypos;
            string Nextchar = UserWord[Pos + 1].ToString();

            //Ищем в окресностях ( снизу, сверху, слева , справа) поледней буквы следующую букву
            if (Xpos + 1<Size)//проверка на границу поля 
            if (textBoxes[Xpos + 1, Ypos] == Nextchar)// Провереям есть ли рядом искомая буква
            {
                foreach (Bukva Buk in Slovo.FindedLetter)
                    if ((Buk.Xpos==Xpos + 1)&&(Buk.Ypos==Ypos))//Проверяем не использовалась ли буква ранне в этом слове.
                        return;
                Words Tmp = new Words(Slovo);//Создаем копию текущего слова
                Tmp.FindedLetter.Add(new Bukva(textBoxes[Xpos + 1, Ypos], Xpos + 1, Ypos, Pos + 1));//Записываем в слово следующую букву
                FinNextChar(Tmp);//ищем след букву в слове
            }

            if (Xpos - 1 < Size)
            if (textBoxes[Xpos - 1, Ypos] == Nextchar)
            {
                foreach (Bukva Buk in Slovo.FindedLetter)
                    if ((Buk.Xpos == Xpos - 1) && (Buk.Ypos == Ypos))
                        return;
                Words Tmp = new Words(Slovo);
                Tmp.FindedLetter.Add(new Bukva(textBoxes[Xpos - 1, Ypos], Xpos - 1, Ypos, Pos + 1));
                FinNextChar(Tmp);
            }

            if (Ypos + 1 < Size)
            if (textBoxes[Xpos, Ypos+1] == Nextchar)
            {
                foreach (Bukva Buk in Slovo.FindedLetter)
                    if ((Buk.Xpos == Xpos) && (Buk.Ypos == Ypos+1))
                        return;
                Words Tmp = new Words(Slovo);
                Tmp.FindedLetter.Add(new Bukva(textBoxes[Xpos, Ypos + 1], Xpos, Ypos + 1, Pos + 1));
                FinNextChar(Tmp);
            }

            if (Ypos - 1 < Size)
            if (textBoxes[Xpos, Ypos - 1] == Nextchar)
            {
                foreach (Bukva Buk in Slovo.FindedLetter)
                    if ((Buk.Xpos == Xpos) && (Buk.Ypos == Ypos - 1))
                        return;
                Words Tmp = new Words(Slovo);
                Tmp.FindedLetter.Add(new Bukva(textBoxes[Xpos, Ypos - 1], Xpos, Ypos - 1, Pos + 1));
                FinNextChar(Tmp);
            }

        }

        class Bukva
        {
            public string Symbol;//Это свойство не обязательное, заполняется просто для удобства
            public int Xpos;//Координата букв в текстбоксе
            public int Ypos;
            public int PosInWord;//Номер буквы в заданном (искомом) слове

            public Bukva(string symb, int X, int Y, int posword)
            {
                Symbol = symb;
                Xpos = X;
                Ypos = Y;
                PosInWord = posword;
            }
        }

        class Words
        {
            public List<Bukva> FindedLetter = new List<Bukva>();//Собираем слово из букв
            public Words() { }
            public Words(Words W)//Метод для создания копии класса
            {
                foreach (Bukva Buk in W.FindedLetter)
                    FindedLetter.Add(Buk);
            }
        }

    }
}
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка существования компонента _-Re@l-_ Общие вопросы Delphi 3 29.12.2010 18:59
Проверка существования файла на сервере puKo PHP 10 09.08.2010 15:01
Проверка существования TEdit John_chek Общие вопросы Delphi 9 18.04.2008 14:56
Проверка существования директории Gorin Общие вопросы Delphi 7 25.11.2007 19:47
проверка существования окна Shade Win Api 3 22.07.2007 17:56