среда, 4 июля 2012 г.

C# игра Крестики-Нолики

Вот хочу вам показать, как создать такую несложную игру на языке C#.
Для начала сделаем саму форму. Нам нужно: игровое поле(9 кнопок), кнопка "Start"(для рестарта игры), 3 текстовых поля( указатель хода, номер игры, счет игры). Вот у меня получилось то, что вы видите на скрине.


Переходим к самому коду. У нас будет 3 функции: Game() - главная, которая отвечает за хода в игре; who_vin() - объявляет победителя; refresch() - очищает игровое поле, начинает новую игру.
Сначала объявляем глобальные переменные в классе:
public partial class Form1 : Form
        {
            int i; //счетчик ходов
            int num_game = 0; // номер игры
            int Ovin = 0; // количество побед О
            int Xvin = 0; // количество побед Х
            string[] arr = new string[10]; // массив, который хранит расположение Х и О на игровом поле
            string t = "X"; // переменная которая показывает чей ход происходит
        }
Дальше переходим к самим функциям:

        public string Game(int j) // принимает номер клетки поля
        {
            string fakeT; // переменная следущего хода
            if (i % 2 == 1) // узнает чей ход сделан (Х - непарный ход)
            {
                t = "X";
                fakeT = "O";
            }
            else {
                t = "O";
                fakeT = "X";
            }
            fakeT = "Ходит " + fakeT;
            arr[j] = t;
            i += 1;

            label1.Text = fakeT;// пишет кто следущий ходит
         
       
            return t; // возвращает отметку на поле Х или О

        }


 public void who_vin()
        {
         
            if ((arr[1] == "X" & arr[2] == "X" & arr[3] == "X") | (arr[1] == "X" & arr[5] == "X" & arr[9] == "X") | (arr[1] == "X" & arr[4] == "X" & arr[7] == "X") | (arr[2] == "X" & arr[5] == "X" & arr[8] == "X") | (arr[3] == "X" & arr[6] == "X" & arr[9] == "X") | (arr[3] == "X" & arr[5] == "X" & arr[7] == "X") | (arr[4] == "X" & arr[5] == "X" & arr[6] == "X") | (arr[7] == "X" & arr[8] == "X" & arr[9] == "X"))
            { // за таких обстоятельств побеждает Х
                Xvin += 1; // начисляем ему победу
             
                label3.Text = "X : O\n" + Xvin.ToString() + " : " + Ovin.ToString(); // обновляем табло побед
                MessageBox.Show(" X VIN!"); // выводим окошечко, которое говорит нам о победе
                refresch();// чистим поле, начинаем новую игру
            }

            if ((arr[1] == "O" & arr[2] == "O" & arr[3] == "O") | (arr[1] == "O" & arr[5] == "O" & arr[9] == "O") | (arr[1] == "O" & arr[4] == "O" & arr[7] == "O") | (arr[2] == "O" & arr[5] == "O" & arr[8] == "O") | (arr[3] == "O" & arr[6] == "O" & arr[9] == "O") | (arr[3] == "O" & arr[5] == "O" & arr[7] == "O") | (arr[4] == "O" & arr[5] == "O" & arr[6] == "O") | (arr[7] == "O" & arr[8] == "O" & arr[9] == "O"))
            {// за таких обстоятельств побеждает О, следущие действия аналогичны
                Ovin += 1;
             
                label3.Text = "X : O\n" + Xvin.ToString() + " : " + Ovin.ToString();
                MessageBox.Show(" O VIN!");
                refresch();
            }
            if ((arr[1] != "") & (arr[2] != "") & (arr[3] != "") & (arr[4] != "") & (arr[5] != "") & (arr[7] != "") & (arr[8] != "") & (arr[9] != ""))
            {// Ничья, тоесть все поле заполнено, а победителя нет
             
             
                MessageBox.Show(" Ничья! :)"); // объявляем ничью
                refresch();// чистим поле
            }         
        }

   public void refresch()
        {
            button1.Text = "";
            button2.Text = "";
            button3.Text = "";
            button4.Text = "";
            button5.Text = "";
            button6.Text = "";
            button7.Text = "";
            button8.Text = "";
            button9.Text = "";// почистили каждую клетку поля
            label1.Text = "";//табло следующего хода
            for (i = 0; i < 10; i += 1) // массив ходов
            {
                arr[i] = "";
            }
            i = 1; // номер хода
            num_game += 1; // добавляем к номеру игры
            label2.Text = num_game + " игра"; // обновляем табло с номером игры
        }

Функции готовы. Далее перейдем к командам, то есть нашему полю(кнопкам):

  private void button10_Click(object sender, EventArgs e) // Кнопка "Start" чистит поле
        {
            refresch();
        }

        private void button1_Click(object sender, EventArgs e) // первая клетка поля
        {
            if (button1.Text == "X" | button1.Text == "O") // если клетка уже заполненая
            {
                MessageBox.Show(" Нельзя! :нуну:");// предупреждаем, что нельзя
            }
            else { button1.Text = Game(1); who_vin(); }// если все хорошо, запускаем 2 функции. задаем клетке отметку Х или О
        }

        private void button2_Click(object sender, EventArgs e) // вторая клетка поля. действия аналогичны, и со следующими
        {
            if (button2.Text == "X" | button2.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button2.Text = Game(2); who_vin(); }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (button3.Text == "X" | button3.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button3.Text = Game(3); who_vin(); }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (button4.Text == "X" | button4.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button4.Text = Game(4); who_vin(); }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (button5.Text == "X" | button5.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button5.Text = Game(5); who_vin(); }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (button6.Text == "X" | button6.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button6.Text = Game(6); who_vin(); }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (button7.Text == "X" | button7.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button7.Text = Game(7); who_vin(); }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if (button8.Text == "X" | button8.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button8.Text = Game(8); who_vin(); }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if (button9.Text == "X" | button9.Text == "O")
            {
                MessageBox.Show(" Нельзя! :нуну:");
            }
            else { button9.Text = Game(9); who_vin(); }
        }

Ну и на последок функция которая работает сразу при старте программы:
 private void Form1_Load(object sender, EventArgs e)
        {
            refresch();// чистим поле перед игрой
            label3.Text = "X : O\n" + Xvin.ToString() + " : " + Ovin.ToString(); // задаем счетчик
        }
Вот и все. :)

Вот сам исходник:
Скачать

C# vk api Загрузка списка друзей

Выкладываю готовый исходник. Это может послужить примером работы библиотеки apicore, которая непосредственно взаимодействует с сайтом vk.com.

Первая часть статьи уже есть на этом блоге, где частично рассматривается работа с сервисом api контакта. ССЫЛКа

Здесь вы увидите пример работы именно с классом FriendsFactory.

Для работы необходимо делать импорт библиотек ApiCore и HttpDownloader.

Скачать их можно тут:
ApiCore.dll   54.0 KB
HttpDownloader.dll   11.5 KB


Исходники проекта лежат здесь:
GetFriends_VKAPI.rar   87.0 KB


Исходники функций:

        //Объявляем переменные
        private SessionInfo sessionInfo;
        private ApiManager manager;
        private bool isLoggedIn = false;
        private List<Friend> friendList;
        private FriendsFactory friendFactory;
        private Regex userIdCheck;

        public Form1()
        {
            InitializeComponent();
        }

        //Авторизация
        private void Reauth()
        {
            if (!this.isLoggedIn)
            {
                SessionManager sm = new SessionManager(1928531, Convert.ToInt32(ApiPerms.Audio | ApiPerms.ExtendedMessages | ApiPerms.ExtendedWall | ApiPerms.Friends | ApiPerms.Offers | ApiPerms.Photos | ApiPerms.Questions | ApiPerms.SendNotify | ApiPerms.SidebarLink | ApiPerms.UserNotes | ApiPerms.UserStatus | ApiPerms.Video | ApiPerms.WallPublisher | ApiPerms.Wiki));
                this.sessionInfo = sm.GetSession(SessionAuthType.WithBrowser);
                if (this.sessionInfo != null)
                {
                    this.isLoggedIn = true;
                }
            }

            if (this.isLoggedIn)
            {
                manager = new ApiManager(this.sessionInfo);
                manager.Timeout = 10000;
                this.listBox1.Enabled = true;
                this.friendFactory = new FriendsFactory(this.manager);
                this.userIdCheck = new Regex("([\\d])+$");
                this.GetFriendList();
            }
        }

        //Загрузка списка друзей и запись данных в виджет listBox
        private void GetFriendList()
        {
            try
            {
                this.listBox1.Items.Clear();
                this.friendList = this.friendFactory.Get(FriendNameCase.Nominative, null, null, null, new string[] { "uid", "first_name", "nickname", "last_name" });
                for (int i = 0; i < this.friendList.Count; i++)
                {
                    this.listBox1.Items.Add(this.friendList[i]);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error loading friend list:\n" + e.Message);
            }
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            //Вызов функций
            this.Reauth();
            this.GetFriendList();
        }

C# webbrowser удаление Cookies IE

Стоит сразу отметить, что виждет webbrowser использует оболочку IE, что парой и объясняет кривизну работы яваскрипта в нём. Это означает, что если нам нужно проделать какую либо обработку данных кеша, куков или истории, то мы будем работать исключительно с IE и только с ним, к сожалению.

Искал в интернете долгое время, как сделать полное удаление cookies вижета webbrowser, из всего что было проверено, рабочим вариантом оказалась только эта строка:


Process.Start("cmd.exe", "/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255");

Для использования необходимо делать импорт библиотеки System.Diagnostics, она стандартная и есть в системе.
Минусом является то, что постоянно будет при работе всплывать окно командной строки и если делать в первый раз эту операцию, то мы ещё и будем долго наблюдать этот процесс.

Если у вас есть другое рабочее решение, то прошу написать в коммент. 

вторник, 3 июля 2012 г.

Использование хостинга проектов CodeGoogle для хранения файлов

Речь идёт про этот ресурс: http://code.google.com
Ранее уже рассматривался этот хостинг в одной из статей этого блога, но сейчас все моменты коснёмся подробно. Уже было много вопросов на тему того, как пользоваться этим хостингом и как вообще начать с ним работать.

В видео, которое расположено ниже показано как и что нужно делать, чтобы закачивать туда файлы.

Если вы впервые узнали про этот хостинг, то сразу скажу, какие преимущества у него над другими:

  1. Виртуальное пространство для использования на один проект: 4ГБ
  2. Лимит закачки одного файла: 200 МБ
  3. Ограничения на скорость скачивания нет
  4. Количество созданных проектов не ограничено

Реализация алгоритма шифрования RSA

Сегодня мы рассмотрим алгоритм шифрования RSA (буквенная аббревиатура от фамилий Rivest, Shamir и Adleman).  Данный алгоритм обладает высокой криптостойкостью, а так же очень прост в реализации.
В основу криптографической системы с открытым ключом RSA положена сложность задачи факторизации произведения двух больших простых чисел. Для шифрования используется операция возведения в степень по модулю большого числа. Для дешифрования за разумное время (обратной операции) необходимо уметь вычислять функцию Эйлера от данного большого числа, для чего необходимо знать разложения числа на простые множители.
Взлом данного алгоритма займёт много времени и потребует больших вычислительных мощностей. Рассмотрим пример. Был объявлен конкурс на расшифровку строки, зашифрованной данным алгоритмом. Строка была расшифрована за 6 месяцев с применением 1600 компьютеров. Очень впечатляющие результаты надёжности алгоритма. Конечно, когда наконец-то разработают хорошие квантовые компьютеры, то подобные алгоритмы будут взламываться очень быстро, но пока мы можем спокойно использовать RSA.
Алгоритм RSA является алгоритмом ассиметричного шифрования. Любое ассиметричное шифрование предполагает наличие пары ключей, а именно открытого и закрытого. С помощью открытого ключа мы кодируем строку, с помощью закрытого производим декодирование.
Теперь рассмотрим как создаются данные ключи:
1.      Сначала мы выбираем два простых числа p и q.
2.      Затем вычисляем произведение p и q, которое называется модулем. N = p*q.
3.      Вычисляется значение функции Эйлера от числа n: 
4.      Выбирается целое число , взаимно простое со значением функции и .
5.      Выбирается число d удовлетворяющее условию e*d mod f(p,q)=1
Получаем {e,n} – открытый ключ шифрования, {d, n} – закрытый.
Рассмотрим пример реализации алгоритма на python.
Сначала определим начальные данные:
p = 3557

q = 2579

N = p*q

f = (p-1)*(q-1)

d = 6111579

e = 3
Теперь перейдём к шифрованию и дешифровке. Формула шифрования выглядит следующим образом:
y = x^e mod n, где х – цифровой код символа.
Для дешифровки применим другую формулу:
х = y^d mod n.
Для каждого символа будем брать его код из таблицы юникодов. Как это сделать, можно прочитать в моей статье.
Напишем функцию шифрования:
def encode_RSA(word,e,N):

    ret = []

    for v in word:

        n = ord(v)

        ret.append(int(n**e%N))
И функцию декодирования:
def decode_RSA(word,d,N):

    ret = []

    for v in word:

        sim = v**d%N

        ret.append(unichr(sim))

    return ret
Применяется это так:
l = encode_RSA(u'cat',e,n)

print l

print decode_RSA(l ,d,n)
Результат:
[970299, 912673, 1560896]

 [u'c', u'a', u't']
В данной статье мы рассмотрели алгоритм шифрования RSA. На данный момент он обладает высокой криптоскойстью и, если вы будете обновлять ключи хотя бы раз в месяц, то можете не волноваться, что его взломают. Не стоит шифровать этим алгоритмом большие тексты, потому что время шифрования велико (особенно на python). Надеюсь, материалы этой статьи будут вам полезны.
Оригинал статьи читаем тут, а так же другие интересные и полезные статьи на моём блоге. 

понедельник, 2 июля 2012 г.

C# Авторизация ВКонтакте через http без API, Часть 2, Пошаговая инструкция

Проще всего показать это в видео, желательно смотреть в полном качестве и со звуком.
Подробно рассмотрены все моменты как создавать алгоритм авторизации с нуля.

C# Реализация Get/Post запросов

Это относится к работе с сетью, без отправки и получения запросов у нас ничего через интернет работать не может.

Есть уже готовые классы в стандартных библиотеках .NET, но всё равно писать приходится много. Рассмотрим на примере как делать Get запрос (получение данных по url):

public string GET_http(string url){
            System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            System.Net.WebRequest reqGET = System.Net.WebRequest.Create(url);
            System.Net.WebResponse resp = reqGET.GetResponse();
            System.IO.Stream stream = resp.GetResponseStream();
            System.IO.StreamReader sr = new System.IO.StreamReader(stream);
            string html = sr.ReadToEnd();
            return html;
        }

Это была простая функция, которая требует для вызова url и в результате работы отдаёт нам html загруженной страницы.

Рассмотрим POST запрос. Для начала следует сказать, что этот запрос подразумевает отправку каких либо данных сначала, а потом только получение ответа. Самым частым случаем является авторизация на сайтах через http и дальнейшая работа в этом направлении.

Пример функции, которая отправляет POST запрос (отправка данных):
public string http_post(string url, string data)
        {
            var cookies = new CookieContainer();
            ServicePointManager.Expect100Continue = false;

            var request = (HttpWebRequest)WebRequest.Create(url);
            request.CookieContainer = cookies;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            using (var requestStream = request.GetRequestStream())
            using (var writer = new StreamWriter(requestStream))
            {
                writer.Write(data);
            }

            using (var responseStream = request.GetResponse().GetResponseStream())
            using (var reader = new StreamReader(responseStream))
            {
                var result = reader.ReadToEnd();
                return result;
            }
        }

В нашем случае переменная data это то, что передаётся в post запросе. Точно также как и с get, мы получаем ответ в виде html страницы. 
Чтобы лучше разобраться что это такое, покажу на примере как правильно делать вызов данной функции:
private void button1_Click(object sender, EventArgs e)
        {         
            http_post("http://m.vk.com/","email=goga@mail.ru&pass=123");  
        }

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

TROCKII БЛОГ Copyright © 2012 | Template created by Lev Trockii |