fork download
  1. # Запускать так: irb1.8 -Ku -r PLife.0.3.rb
  2. require 'rubygems'
  3. gem 'facets', '2.8.4'
  4. require 'facets'
  5. require 'jcode'
  6. require 'singleton'
  7. require 'irb/completion'
  8. require 'mathn'
  9.  
  10. # Читать лучше с конца. ;)
  11.  
  12.  
  13. def справка
  14. puts <<HELP
  15.  
  16. Пример:
  17.  
  18. x = Фурь["Вася", Тигр, Самец]
  19. y = Фурь["Настя", Лев, Самка]
  20. x.предложи_пойиффаться y
  21. x.тебе_понравилось?
  22. y.тебе_понравилось?
  23.  
  24. А еще есть команды "справка", "игра1" и "игра2".
  25.  
  26. HELP
  27. end
  28.  
  29.  
  30. class Range
  31.  
  32. def случайное_число()
  33. return self.begin + (self.end - self.begin) * rand
  34. end
  35.  
  36. end
  37.  
  38.  
  39. class Object
  40.  
  41. alias есть is_a?
  42.  
  43. def не_есть(x)
  44. not есть(x)
  45. end
  46.  
  47. end
  48.  
  49.  
  50. class Array
  51.  
  52. alias случайный_выбор choice
  53.  
  54. end
  55.  
  56.  
  57. module Male
  58.  
  59. def предлагает_пойиффаться(самке)
  60. самка = самке
  61. if самка.не_есть Самка then сказать "Что!? Я что, по-твоему, похож на гея!?"; return; end
  62. сказать "Как тебя зовут?"
  63. имя_самки = самка.как_тебя_зовут?
  64. сказать "А меня #{имя}."
  65. сказать "#{имя_самки}, давай пойиффаемся?"
  66. согласна_пойиффаться = самка.давай_пойиффаемся? со_мной
  67. if согласна_пойиффаться then [самка, я].йиффаются; end
  68. end
  69.  
  70. alias предложи_пойиффаться предлагает_пойиффаться
  71.  
  72. end
  73.  
  74. def Самец
  75. Male
  76. end
  77.  
  78.  
  79. class Module
  80.  
  81. alias это is
  82.  
  83. end
  84.  
  85.  
  86. module Female
  87.  
  88. def предлагает_пойиффаться(самцу)
  89. самец = самцу
  90. if самец.не_есть Самец then сказать "ЧТО!? Да пошел ты, извращенец! Я что, похожа на лесбиянку!?"; return; end
  91. сказать "Что!? Еще чего! Я приличная самушка!"
  92. end
  93.  
  94. alias предложи_пойиффаться предлагает_пойиффаться
  95.  
  96. end
  97.  
  98. def Самка
  99. Female
  100. end
  101.  
  102.  
  103. module Species
  104.  
  105. abstract :женское_название_вида
  106.  
  107. abstract :мужское_название_вида
  108.  
  109. end
  110.  
  111. def Вид
  112. Species
  113. end
  114.  
  115.  
  116. module Tiger
  117.  
  118. это Вид
  119.  
  120. def женское_название_вида
  121. "Тигрица"
  122. end
  123.  
  124. def мужское_название_вида
  125. "Тигр"
  126. end
  127.  
  128. end
  129.  
  130. def Тигр
  131. Tiger
  132. end
  133.  
  134.  
  135. module Lion
  136.  
  137. это Вид
  138.  
  139. def женское_название_вида
  140. "Львица"
  141. end
  142.  
  143. def мужское_название_вида
  144. "Лев"
  145. end
  146.  
  147. end
  148.  
  149. def Лев
  150. Lion
  151. end
  152.  
  153.  
  154. module Horse
  155.  
  156. это Вид
  157.  
  158. def женское_название_вида
  159. "Кобылица"
  160. end
  161.  
  162. def мужское_название_вида
  163. "Жеребец"
  164. end
  165.  
  166. end
  167.  
  168. def Лошадь
  169. Horse
  170. end
  171.  
  172.  
  173. module Wolf
  174.  
  175. это Вид
  176.  
  177. def женское_название_вида
  178. "Волчица"
  179. end
  180.  
  181. def мужское_название_вида
  182. "Волк"
  183. end
  184.  
  185. end
  186.  
  187. def Волк
  188. Wolf
  189. end
  190.  
  191.  
  192. module Angel
  193.  
  194. это Вид
  195.  
  196. def женское_название_вида
  197. "Ангелесса"
  198. end
  199.  
  200. def мужское_название_вида
  201. "Ангел"
  202. end
  203.  
  204. end
  205.  
  206. def Ангел
  207. return Angel
  208. end
  209.  
  210.  
  211. class Furry
  212.  
  213. def initialize(имя, вид, пол)
  214. self.extend пол
  215. self.extend вид
  216. @имя = имя
  217. @качество_последнего_йиффа = nil # По 10-бальной шкале.
  218. end
  219.  
  220. def self.[](*args)
  221. return Фурь.new(*args)
  222. end
  223.  
  224. def как_тебя_зовут?
  225. сказать "#{имя}."
  226. return имя
  227. end
  228.  
  229. def говорит(что)
  230. puts "#{имя}: #{что}"
  231. end
  232.  
  233. def давай_пойиффаемся?(с_кем)
  234. if maybe(0.5) then
  235. сказать "Хм-хм, давай! :)"
  236. согласен
  237. else
  238. сказать "Нет!!! >:o"
  239. не согласен
  240. end
  241. end
  242.  
  243. def пойиффался_с(фурь, качество_йиффа)
  244. @качество_последнего_йиффа = качество_йиффа
  245. end
  246.  
  247. alias пойиффалась_с пойиффался_с
  248.  
  249. def тебе_понравилось?
  250. case @качество_последнего_йиффа
  251. when nil then сказать "Что понравилось?"
  252. when 0...3 then сказать "Нет, это было ужасно... v_v"
  253. when 3...5 then сказать "Нет, не очень... :("
  254. when 5...7 then сказать "Ну, как сказать..."
  255. when 7...9 then сказать "Да, это было чудесно! ^_^"
  256. when 9..10 then сказать "Да-а-а-а! Это было просто великолепно! Я #{(я.есть Самка) ? ("влюбилась в него") : ("влюбился в неё")}!"
  257. end
  258. return @качество_последнего_йиффа
  259. end
  260.  
  261. def to_s
  262. "#{(я.есть Самка) ? (женское_название_вида) : (мужское_название_вида)} #{имя}"
  263. end
  264.  
  265. attr_reader :имя
  266.  
  267. private
  268.  
  269. alias сказать говорит
  270.  
  271. def я
  272. self
  273. end
  274.  
  275. alias есть is_a?
  276.  
  277. alias меня я
  278.  
  279. alias со_мной я
  280.  
  281. def согласен
  282. true
  283. end
  284.  
  285. alias согласна согласен
  286.  
  287. def не(x)
  288. not x
  289. end
  290.  
  291. end
  292.  
  293. def Фурь; Furry; end
  294.  
  295.  
  296. class Array
  297.  
  298. def йиффаются()
  299. puts "*** #{самец} и #{самка} занимаются йиффом."
  300. качество_йиффа = (1 - (0..1).случайное_число ** 4) * 10
  301. самец.пойиффался_с(самка, качество_йиффа)
  302. самка.пойиффалась_с(самец, качество_йиффа)
  303. end
  304.  
  305. def самец
  306. self.find { |x| x.is_a? Самец }
  307. end
  308.  
  309. def самка
  310. self.find { |x| x.is_a? Самка }
  311. end
  312.  
  313. def гетеро?
  314. самец.not_nil? and самка.not_nil?
  315. end
  316.  
  317. end
  318.  
  319.  
  320. def самочьи_имена
  321. %W{Лиза Лина Лена Юля Кристина Ольга Настя Наталья}
  322. end
  323.  
  324.  
  325. def имя_самки
  326. самочьи_имена.случайный_выбор
  327. end
  328.  
  329.  
  330. def самцовые_имена
  331. %W{Лёша Саша Гена Гриша Юра Миша Павел Борис Лев Андрей Антон}
  332. end
  333.  
  334.  
  335. def имя_самца
  336. самцовые_имена.случайный_выбор
  337. end
  338.  
  339.  
  340. class RandomFurries
  341.  
  342. is Enumerable
  343.  
  344. def each
  345. loop do
  346. пол = (maybe 0.5) ? (Самец) : (Самка)
  347. вид = [Лошадь, Волк, Лев, Тигр].случайный_выбор
  348. имя = (пол == Самец) ? (имя_самца) : (имя_самки)
  349. yield Фурь[имя, вид, пол]
  350. end
  351. end
  352.  
  353. end
  354.  
  355. def разные_фури
  356. RandomFurries.new
  357. end
  358.  
  359.  
  360. class Array
  361.  
  362. alias комбинации_по combination
  363.  
  364. end
  365.  
  366.  
  367. class Integer
  368.  
  369. def случайных_фурей
  370. фури = разные_фури.take n
  371. end
  372.  
  373. def n
  374. return self
  375. end
  376.  
  377. end
  378.  
  379.  
  380. def конец_игры
  381. end
  382.  
  383.  
  384. def игра1
  385. Арчи = Фурь["Арчи", Ангел, Самец]
  386. Арчи.говорит "Со сколькими фурями вы хотите играть?"
  387. n = gets.to_i
  388. фури = n.случайных_фурей
  389. пары = фури.комбинации_по 2
  390. пары.each do |пара|
  391. фурь1 = пара[0]; фурь2 = фурю2 = пара[1]
  392. Арчи.говорит "#{фурь1}, спроси, не хочет ли #{фурь2} заняться с тобой йиффом?"
  393. фурь1.предлагает_пойиффаться фурю2
  394. end
  395. фури.each do |фурь|
  396. Арчи.говорит "#{фурь}, тебе понравилось?"
  397. фурь.тебе_понравилось?
  398. end
  399. конец_игры
  400. end
  401.  
  402.  
  403. def игра2
  404. Джон = Джону = Фурь["Джон", Лев, Самец]
  405. Лиза = Лизе = Фурь["Лиза", Лев, Самка]
  406. Джон.предложи_пойиффаться Лизе
  407. Джон.тебе_понравилось?
  408. конец_игры
  409. end
  410.  
  411.  
  412. справка
Runtime error #stdin #stdout 0.02s 7404KB
stdin
Standard input is empty
stdout
Standard output is empty