+------------------------------+         +------------------------------+

Ваш ход: P-K4                            Противник: P-K4

+------------------------------+         +------------------------------+

| Заглушка! Шахматная доска... |         | Заглушка! Шахматная доска... |

+------------------------------+         +------------------------------+

Противник: B-QB4                         Ваш ход: B-QB4

+------------------------------+         +------------------------------+

| Заглушка! Шахматная доска... |         | Заглушка! Шахматная доска... |

+------------------------------+         +------------------------------+

Ваш ход: B-QB4                           Противник: B-QB4

+------------------------------+         +------------------------------+

| Заглушка! Шахматная доска... |         | Заглушка! Шахматная доска... +

+------------------------------+         +------------------------------+

Противник: Q-KR5                         Ваш ход: Q-KR5

+------------------------------+         +------------------------------+

| Заглушка! Шахматная доска... |         | Заглушка! Шахматная доска... |

+------------------------------+         +------------------------------+

Ваш ход: N-KB3                           Противник: N-KB3

+------------------------------+         +------------------------------+

| Заглушка! Шахматная доска... |         | Заглушка! Шахматная доска... |

+------------------------------+         +------------------------------+

Противник: QxP Checkmate!                Ваш ход: QxP

+------------------------------+         +------------------------------+

| Заглушка! Шахматная доска... |         | Заглушка! Шахматная доска... |

+------------------------------+         +------------------------------+

Capablanca поставил вам мат.             Вы поставили мат Hal!

18.2. Сетевые клиенты

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

В разделе 18.1 мы видели, что это можно сделать с помощью протоколов TCP или UDP. Но чаще применяются протоколы более высокого уровня, например HTTP или SNMP. Рассмотрим несколько примеров.

18.2.1. Получение истинно случайных чисел из Web

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

Джон фон Нейман

В модуле Kernel есть функция rand, которая возвращает случайное число, но вот беда — число-то не является истинно случайным. Если вы математик, криптограф или еще какой-нибудь педант, то назовете эту функцию генератором псевдослучайных чисел, поскольку она пользуется алгебраическими методами для детерминированного порождения последовательности чисел. Стороннему наблюдателю эти числа представляются случайными и даже обладают необходимыми статистическими свойствами, но рано или поздно последовательность начнет повторяться. Мы можем даже намеренно (или случайно) повторить ее, задав ту же самую затравку.

Но природные процессы считаются истинно случайными. Поэтому при розыгрыше призов в лотерее счастливчики определяются лототроном, который хаотично выбрасывает шары. Другие источники случайности — радиоактивный распад или атмосферный шум.

Есть источники случайных чисел и в Web. Один из них — сайт www.random.org, который мы задействуем в следующем примере.

Программа в листинге 18.4 имитирует подбрасывание пяти обычных (шестигранных) костей. Конечно, игровые фанаты могли бы увеличить число граней до 10 или 20, но тогда стало бы сложно рисовать ASCII-картинки.

Листинг 18.4. Случайное бросание костей

require 'net/http'

HOST = 'www.random.org'

RAND_URL = '/cgi-bin/randnum?col=5&'

def get_random_numbers(count=1, min=0, max=99)

 path = RAND_URL + 'num=#{count}&min=#{min}&max=#{max}'

 connection = Net::HTTP.new(HOST)

 response, data = connection.get(path)

 if response.code == '200'

  data.split.collect { |num| num.to_i }

 else

  []

 end

end

DICE_LINES = [

 '+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ ',

 '|     | |  *  | |  *  | | * * | | * * | | * * | ',

 '|  *  | |     | |  *  | |     | |  *  | | * * | ',

 '|     | |  *  | |  *  | | * * | | * * | | * * | ',

 '+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ '

DIE_WIDTH = DICE_LINES[0].length/6

def draw_dice(values)

 DICE_LINES.each do | line |

  for v in values

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату