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

на главную

Жанры

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

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

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

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

Противник: 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

Поделиться:
Популярные книги

Кровь Севера

Мазин Александр Владимирович
3. Викинг
Фантастика:
альтернативная история
9.14
рейтинг книги
Кровь Севера

Корона мечей

Джордан Роберт
7. Колесо Времени
Фантастика:
фэнтези
8.62
рейтинг книги
Корона мечей

Будущее разума

Каку Митио
Научно-образовательная:
прочая научная литература
физика
8.00
рейтинг книги
Будущее разума

Бремя власти

Балашов Дмитрий Михайлович
3. Государи московские
Научно-образовательная:
история
7.25
рейтинг книги
Бремя власти

Дьявольская секта (Сборник)

Саган Франсуаза
Бестселлер
Детективы:
криминальные детективы
боевики
5.00
рейтинг книги
Дьявольская секта (Сборник)

Директива Джэнсона

Ладлэм Роберт
Детективы:
шпионские детективы
7.00
рейтинг книги
Директива Джэнсона

Ключник

Зайцев Сергей Григорьевич
2. Викс
Фантастика:
фэнтези
рпг
попаданцы
9.25
рейтинг книги
Ключник

Архимаг. Пробуждение. Трилогия

Рудазов Александр
56. В одном томе
Фантастика:
научная фантастика
9.32
рейтинг книги
Архимаг. Пробуждение. Трилогия

Самодержец пустыни

Юзефович Леонид Абрамович
Проза:
историческая проза
6.25
рейтинг книги
Самодержец пустыни

Шайтан Иван 5

Тен Эдуард
5. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
5.50
рейтинг книги
Шайтан Иван 5

Санкт-Петербург. Автобиография

Королев Кирилл Михайлович
Научно-образовательная:
история
5.00
рейтинг книги
Санкт-Петербург. Автобиография

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Том 2. Рассказы и пьесы 1904-1907

Андреев Леонид Николаевич
2. Собрание сочинений в шести томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 2. Рассказы и пьесы 1904-1907

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога