Чтение онлайн

ЖАНРЫ

Программирование на языке Ruby
Шрифт:

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

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

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

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

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

Ваш ход: 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

print line[(v-1)*DIE_WIDTH, DIE_WIDTH]

print " "

end

puts

 end

end

Поделиться с друзьями: