Advertisement
Guest User

grumpealer 0.0.2

a guest
Apr 23rd, 2013
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.62 KB | None | 0 0
  1. # grumpealer 0.0.2
  2. # this file is public domain
  3.  
  4. import random
  5. import math
  6. import time
  7. import sys
  8. import socket
  9. import string
  10. from optparse import OptionParser
  11.  
  12. class class_dict(object):
  13. pass
  14.  
  15. parser = OptionParser()
  16. parser.add_option("--server", dest="server")
  17. parser.add_option("--port", dest="port")
  18. parser.add_option("--nick", dest="nick")
  19. (options, g_channels) = parser.parse_args()
  20.  
  21. g_irc_server = options.server
  22. g_irc_port = int(options.port)
  23. g_bot_nick = options.nick
  24.  
  25. g_socket = socket.socket()
  26. g_socket.connect((g_irc_server, g_irc_port))
  27.  
  28. def send(to_send):
  29. g_socket.send(bytes(to_send + '\r\n', 'UTF-8'))
  30.  
  31. def say(channel, to_say):
  32. send('PRIVMSG ' + channel + ' :' + to_say)
  33.  
  34. def notice(nick, to_notice):
  35. send('NOTICE ' + nick + ' :' + to_notice)
  36.  
  37. g_game_states = {}
  38. g_game_state = None
  39.  
  40. def provide_state(channel):
  41. global g_game_states
  42. global g_game_state
  43.  
  44. if channel not in g_game_states:
  45. g_game_states[channel] = class_dict()
  46. g_game_state = g_game_states[channel]
  47.  
  48. g_game_state.active = None
  49. g_game_state.pot = None
  50. g_game_state.einsatz = None
  51. g_game_state.cards = None
  52.  
  53. g_game_state.round = None
  54. g_game_state.whos_turn = None
  55.  
  56. g_game_state.players = None
  57. g_game_state.chips = None
  58. g_game_state.folded = None
  59.  
  60. g_game_state.flop = None
  61. g_game_state.gesetzt = None
  62. g_game_state.last_time = None
  63. g_game_state.round_3_showed = None
  64. else:
  65. g_game_state = g_game_states[channel]
  66.  
  67. # picture_idx 0..8 => '2'..'10'; picture_idx 9..12 => 'B' 'D' 'K' 'A'
  68. # color_idx 0..3 => Pik Kreuz Herz Karo
  69. # das deck ist picture-major geschachtelt, d.h. deck mit indizes 0..51 startet 'Pik 2', 'Kreuz 2' etc
  70.  
  71. pic_2 = 0
  72. pic_3 = 1
  73. pic_4 = 2
  74. pic_5 = 3
  75. pic_6 = 4
  76. pic_7 = 5
  77. pic_8 = 6
  78. pic_9 = 7
  79. pic_10 = 8
  80. pic_B = 9
  81. pic_D = 10
  82. pic_K = 11
  83. pic_A = 12
  84.  
  85. def card_picture(card_idx):
  86. return math.floor(card_idx / 4)
  87.  
  88. def card_color(card_idx):
  89. return card_idx - card_picture(card_idx) * 4
  90.  
  91. def ueber(a,b):
  92. x = 1
  93. y = 1
  94. for i in range(b):
  95. x *= a - i
  96. y *= i + 1
  97. return x / y
  98.  
  99. # regeln siehe wikipedia
  100.  
  101. kombi_royal_flush = ueber(1,1) * 4
  102. kombi_straight_flush = ueber(9,1) * 4
  103. kombi_vierling = ueber(13,1) * ueber(48,1)
  104. kombi_full_house = ueber(13,1) * ueber(4,3) * ueber(12,1) * ueber(4,2)
  105. kombi_flush = ueber(13,5) * ueber(4,1) - 36 - 4
  106. kombi_straight = ueber(10,1) * pow(ueber(4,1), 5) - 36 - 4
  107. kombi_drilling = ueber(13,1) * ueber(4,3) * ueber(12,2) * pow(ueber(4,1), 2)
  108. kombi_zwei_paare = ueber(13,2) * pow(ueber(4,2), 2) * ueber(11,1) * ueber(4,1)
  109. kombi_ein_paar = ueber(13,1) * ueber(4,2) * ueber(12,3) * pow(ueber(4,1), 3)
  110. kombi_alle = ueber(52,5)
  111.  
  112. temp = kombi_alle
  113.  
  114. temp -= kombi_royal_flush ; hand_royal_flush = temp
  115. temp -= kombi_straight_flush; hand_straight_flush = temp
  116. temp -= kombi_vierling ; hand_vierling = temp
  117. temp -= kombi_full_house ; hand_full_house = temp
  118. temp -= kombi_flush ; hand_flush = temp
  119. temp -= kombi_straight ; hand_straight = temp
  120. temp -= kombi_drilling ; hand_drilling = temp
  121. temp -= kombi_zwei_paare ; hand_zwei_paare = temp
  122. temp -= kombi_ein_paar ; hand_ein_paar = temp
  123.  
  124. hand_high_card = 0
  125.  
  126. g_hand_names = {
  127. hand_royal_flush : 'Royal Flush',
  128. hand_straight_flush: 'Straight Flush',
  129. hand_vierling : 'Vierling',
  130. hand_full_house : 'Full House',
  131. hand_flush : 'Flush',
  132. hand_straight : 'Straight',
  133. hand_drilling : 'Drilling',
  134. hand_zwei_paare : 'Zwei Paare',
  135. hand_ein_paar : 'Ein Paar',
  136. hand_high_card : 'High Card' }
  137.  
  138. def reset_colors():
  139. return ''
  140.  
  141. def underline():
  142. return '' + '10' # underline code ist in notepad unsichtbar
  143.  
  144. def esc_nick(nick):
  145. return nick[:1] + '' + nick[1:]
  146.  
  147. def rank_hand_names():
  148. rank_colors = [
  149. '7,8',
  150. '1,9',
  151. '0,13',
  152. '0,4',
  153. '0,14',
  154. '0,3',
  155. '0,12',
  156. '0,7',
  157. '0,14',
  158. '1,15' ]
  159. rank = 1
  160. for k, v in sorted(g_hand_names.items(), reverse=True):
  161. g_hand_names[k] = '15,2' + str(rank) + rank_colors[rank-1] + ' ' + g_hand_names[k] + ' 15,2' + str(rank) + reset_colors()
  162. rank += 1
  163. rank_hand_names()
  164.  
  165. def plural(card):
  166. if card_picture(card) <= pic_10:
  167. return 'ern'
  168. elif card_picture(card) == pic_B:
  169. return 'uben'
  170. elif card_picture(card) == pic_D:
  171. return 'amen'
  172. elif card_picture(card) == pic_K:
  173. return 'önigen'
  174. elif card_picture(card) == pic_A:
  175. return 'ssen'
  176.  
  177. def hand_name(hand):
  178. for k, v in sorted(g_hand_names.items(), reverse=True):
  179. if hand >= k:
  180. return g_hand_names[k]
  181.  
  182. def colors_same(hand):
  183. return card_color(hand[0]) == card_color(hand[1])\
  184. and card_color(hand[0]) == card_color(hand[2])\
  185. and card_color(hand[0]) == card_color(hand[3])\
  186. and card_color(hand[0]) == card_color(hand[4])
  187.  
  188. def pictures_same(hand):
  189. return card_picture(hand[0]) == card_picture(hand[1])\
  190. and card_picture(hand[0]) == card_picture(hand[2])\
  191. and card_picture(hand[0]) == card_picture(hand[3])\
  192. and card_picture(hand[0]) == card_picture(hand[4])
  193.  
  194. def pictures_straight(hand): # todo: ace can play low (etvl auch übrige around-corner möglichkeiten)
  195. return card_picture(hand[0]) == card_picture(hand[1]) - 1\
  196. and card_picture(hand[1]) == card_picture(hand[2]) - 1\
  197. and card_picture(hand[2]) == card_picture(hand[3]) - 1\
  198. and card_picture(hand[3]) == card_picture(hand[4]) - 1
  199.  
  200. g_pictures = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'B', 'D', 'K', 'A']
  201.  
  202. for i in range(9):
  203. g_pictures[i] = '0' + g_pictures[i]
  204.  
  205. # pik kreuz herz karo => mirc farben 3 4 7 12
  206. g_colors = ['3,3', '4,4', '7,7', '12,12']
  207.  
  208. def card_name(card_idx):
  209. name = g_colors[card_color(card_idx)]
  210. if card_picture(card_idx) != pic_10: name += '.'
  211. name += '0' + g_pictures[card_picture(card_idx)]
  212. return '' + name + '' + reset_colors()
  213.  
  214. def picture_name(card_idx):
  215. return g_pictures[card_picture(card_idx)]
  216.  
  217. # gibt möglichst homogenen rang von 0 wie mieseste Hand bis 2598959 wie beste (Royal Flush) zurück
  218.  
  219. def get_hand(cards):
  220. cards = sorted(cards)
  221.  
  222. # ROYAL FLUSH
  223.  
  224. if colors_same(cards)\
  225. and pictures_straight(cards)\
  226. and card_picture(cards[0]) == pic_10:
  227. return hand_royal_flush + 3, 'Höchste Hand'
  228.  
  229. # STRAIGHT FLUSH
  230.  
  231. if colors_same(cards)\
  232. and pictures_straight(cards):
  233. return hand_straight_flush + card_picture(cards[0]) * ueber(4,1), 'mit ' + picture_name(cards[4]) + ' als höchster Karte'
  234. # todo: ace can play low, diesen wertebereich vor die anderen
  235.  
  236. # VIERLING
  237.  
  238. kicker = None
  239.  
  240. # ungleiche karte ist drüber
  241. if card_picture(cards[0]) == card_picture(cards[1])\
  242. and card_picture(cards[0]) == card_picture(cards[2])\
  243. and card_picture(cards[0]) == card_picture(cards[3]):
  244. kicker = cards[4]
  245.  
  246. # ungleiche karte ist drunter
  247. if card_picture(cards[1]) == card_picture(cards[2])\
  248. and card_picture(cards[1]) == card_picture(cards[3])\
  249. and card_picture(cards[1]) == card_picture(cards[4]):
  250. kicker = cards[0]
  251.  
  252. if kicker != None:
  253. vierling = cards[1]
  254. return hand_vierling + card_picture(vierling) * ueber(48,1) + kicker\
  255. , 'aus ' + picture_name(vierling) + plural(vierling) + ' mit Kicker ' + picture_name(kicker)
  256.  
  257. # FULL HOUSE
  258.  
  259. if card_picture(cards[0]) == card_picture(cards[1])\
  260. and card_picture(cards[2]) == card_picture(cards[3])\
  261. and card_picture(cards[2]) == card_picture(cards[4])\
  262. \
  263. or card_picture(cards[0]) == card_picture(cards[1])\
  264. and card_picture(cards[0]) == card_picture(cards[2])\
  265. and card_picture(cards[3]) == card_picture(cards[4]):
  266.  
  267. drilling = cards[2]
  268.  
  269. if card_picture(cards[0]) == card_picture(cards[2]):
  270. paar = cards[3] # rechts
  271. else:
  272. paar = cards[0] # links
  273.  
  274. # drilling-major, da höherer drilling vor höherem paar gewinnt
  275.  
  276. return hand_full_house + card_picture(drilling) * ueber(4,3) * ueber(12,1) * ueber(4,2)\
  277. + card_picture(paar) * ueber(4,2),\
  278. 'mit ' + picture_name(drilling) + plural(drilling) + ' als Drilling und '\
  279. + picture_name(paar) + plural(paar) + ' als Paar'
  280.  
  281. # FLUSH
  282.  
  283. if colors_same(cards):
  284. temp = 0
  285. text = 'aus den Karten'
  286. for i in range(5):
  287. # schliesst flushes mit ein, deshalb danach korrektur
  288. temp += card_picture(cards[4-i]) / (5-i) * ueber(12-i, 4-i)
  289. text += ' ' + picture_name(cards[4-i])
  290. alle = ueber(13, 5)
  291. temp *= (alle - kombi_royal_flush - kombi_straight_flush) / alle
  292. return hand_flush + temp, text
  293.  
  294. # STRAIGHT
  295.  
  296. if pictures_straight(cards):
  297. # schliesst flushes mit ein, deshalb danach korrektur
  298. kombi = pow(ueber(4,1), 5)
  299. temp = card_picture(cards[0]) * kombi
  300. alle = ueber(10,1) * kombi
  301. temp *= (alle - kombi_royal_flush - kombi_straight_flush) / alle
  302. return hand_straight + temp, 'mit ' + picture_name(cards[4]) + ' als höchster Karte'
  303. # todo: ace can play low
  304.  
  305. # DRILLING
  306.  
  307. drilling_idx = None
  308.  
  309. for i in range(3):
  310. if card_picture(cards[i]) == card_picture(cards[i+1])\
  311. and card_picture(cards[i]) == card_picture(cards[i+2]):
  312. drilling_idx = i
  313. break
  314.  
  315. if drilling_idx != None:
  316. drilling = cards[2]
  317.  
  318. kickers = []
  319. for i in range(5):
  320. if i != drilling_idx\
  321. and i != drilling_idx + 1\
  322. and i != drilling_idx + 2:
  323. kickers.append(cards[i])
  324.  
  325. ret = hand_drilling + card_picture(drilling) * ueber(4,3) * ueber(12,2) * pow(ueber(4,1), 2)
  326.  
  327. karten_rest = 48
  328. plaetze_rest = 1
  329. text = 'aus ' + picture_name(drilling) + plural(drilling) + ' mit den Kickern'
  330. for kicker in reversed(kickers):
  331. ret += card_picture(kicker) * ueber(karten_rest, plaetze_rest)
  332. karten_rest -= 1
  333. plaetze_rest -= 1
  334. text += ' ' + picture_name(kicker)
  335.  
  336. return ret, text
  337.  
  338. # ZWEI PAARE
  339. # da sortiert, kann restkarte c nur vor a, nach a oder nach b sein
  340.  
  341. kicker = None
  342.  
  343. # caabb
  344. if card_picture(cards[1]) == card_picture(cards[2])\
  345. and card_picture(cards[3]) == card_picture(cards[4]):
  346. kicker = cards[0]
  347.  
  348. # aacbb
  349. if card_picture(cards[0]) == card_picture(cards[1])\
  350. and card_picture(cards[3]) == card_picture(cards[4]):
  351. kicker = cards[2]
  352.  
  353. # aabbc
  354. if card_picture(cards[0]) == card_picture(cards[1])\
  355. and card_picture(cards[2]) == card_picture(cards[3]):
  356. kicker = cards[4]
  357.  
  358. if kicker != None:
  359. low_pair = cards[1]
  360. high_pair = cards[3]
  361.  
  362. kicker_kombis = ueber(11,1) * ueber(4,1)
  363.  
  364. # high_pair-major, weil höheres paar gewinnt
  365. return hand_zwei_paare\
  366. + card_picture(high_pair) / 2 * ueber(12,1) * pow(ueber(4,2), 2) * kicker_kombis\
  367. + card_picture(low_pair) / 2 * ueber(4,2) * kicker_kombis\
  368. + kicker\
  369. , 'mit ' + picture_name(high_pair) + plural(high_pair) + ' als hohes Paar und '\
  370. + picture_name(low_pair) + plural(low_pair) + ' als niedriges Paar und Kicker ' + picture_name(kicker)
  371.  
  372. # EIN PAAR
  373.  
  374. paar_idx = None
  375. for i in range(4):
  376. if card_picture(cards[i]) == card_picture(cards[i+1]):
  377. paar_idx = i
  378. break
  379.  
  380. if paar_idx != None:
  381. paar = cards[paar_idx]
  382.  
  383. kickers = []
  384. # gone_kickers = 1
  385. # wegen einem paar ist eine kickermöglichkeit weg?
  386. # der kicker muss ja ungleich dem paar sein, sonst wärs nen drilling oder mehr
  387. for i in range(5):
  388. if i != paar_idx\
  389. and i != paar_idx + 1:
  390. # kickers.append(card_picture(cards[i]) * (13-gone_kickers)/13)
  391. kickers.append(cards[i])
  392. # gone_kickers += 1
  393. # und/oder muss man eigtl für die kicker auch durch ne anzahl von permutationen teilen?
  394.  
  395. karten_rest = 11
  396. plaetze_rest = 2
  397. temp = 0
  398. text = 'aus ' + picture_name(paar) + plural(paar) + ' mit den Kickern'
  399. for kicker in reversed(kickers):
  400. temp += card_picture(kicker) * ueber(karten_rest, plaetze_rest)
  401. karten_rest -= 1
  402. plaetze_rest -= 1
  403. text += ' ' + picture_name(kicker)
  404.  
  405. farben = pow(ueber(4,1), 3)
  406. return hand_ein_paar + card_picture(paar) * ueber(4,2) * ueber(12,3) * farben + temp * farben, text
  407.  
  408. # HIGH CARD
  409.  
  410. ret = hand_high_card
  411. text = 'mit den Karten'
  412. for i in range(5):
  413. card = cards[4-i]
  414.  
  415. # billiger trick, resultat funzt damit für comparison, endet aber natürlich nicht bei hand_ein_paar wie gewünscht
  416. # richtiger wäre sowas wie: / (5 - i) * ueber(4,1) * ueber(51-i, 4-i), aber das hat nen denkfehler drin
  417. ret += card_picture(card) * (5-i)
  418.  
  419. text += ' ' + picture_name(card)
  420.  
  421. # ret *= hand_ein_paar / kombi_alle, wäre evtl für mathematisch korrekten algo
  422. return ret, text
  423.  
  424. # die rang algos sind wahrscheinlich/leider mathematisch inkorrekt,
  425. # lassen aber die notwendigen hand/kicker-vergleiche zu
  426.  
  427. def mk(a,b):
  428. return a*4+b
  429.  
  430. assert hand_royal_flush <= get_hand( [ mk(pic_10, 3), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ] )[0]
  431. assert hand_straight_flush <= get_hand( [ mk(pic_9 , 3), mk(pic_10, 3), mk(pic_B, 3), mk(pic_D, 3), mk(pic_K, 3) ] )[0]
  432. assert hand_vierling <= get_hand( [ mk(pic_A , 0), mk(pic_A , 1), mk(pic_A, 2), mk(pic_A, 3), mk(pic_K, 3) ] )[0]
  433. assert hand_full_house <= get_hand( [ mk(pic_K , 2), mk(pic_K , 3), mk(pic_A, 1), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  434. assert hand_flush <= get_hand( [ mk(pic_9 , 3), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ] )[0]
  435. assert hand_straight <= get_hand( [ mk(pic_10, 2), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ] )[0]
  436. assert hand_drilling <= get_hand( [ mk(pic_D , 3), mk(pic_K , 3), mk(pic_A, 1), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  437. assert hand_zwei_paare <= get_hand( [ mk(pic_D , 3), mk(pic_K , 2), mk(pic_K, 3), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  438. assert hand_ein_paar <= get_hand( [ mk(pic_B , 3), mk(pic_D , 3), mk(pic_K, 3), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  439. assert hand_high_card <= get_hand( [ mk(pic_9 , 2), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ] )[0]
  440.  
  441. assert hand_royal_flush > get_hand( [ mk(pic_9 , 3), mk(pic_10, 3), mk(pic_B, 3), mk(pic_D, 3), mk(pic_K, 3) ] )[0]
  442. assert hand_straight_flush > get_hand( [ mk(pic_A , 0), mk(pic_A , 1), mk(pic_A, 2), mk(pic_A, 3), mk(pic_K, 3) ] )[0]
  443. assert hand_vierling > get_hand( [ mk(pic_K , 2), mk(pic_K , 3), mk(pic_A, 1), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  444. assert hand_full_house > get_hand( [ mk(pic_9 , 3), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ] )[0]
  445. assert hand_flush > get_hand( [ mk(pic_10, 2), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ] )[0]
  446. assert hand_straight > get_hand( [ mk(pic_D , 3), mk(pic_K , 3), mk(pic_A, 1), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  447. assert hand_drilling > get_hand( [ mk(pic_D , 3), mk(pic_K , 2), mk(pic_K, 3), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  448. assert hand_zwei_paare > get_hand( [ mk(pic_B , 3), mk(pic_D , 3), mk(pic_K, 3), mk(pic_A, 2), mk(pic_A, 3) ] )[0]
  449. assert hand_ein_paar > get_hand( [ mk(pic_9 , 2), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ] )[0]
  450.  
  451. def reset_deck():
  452. global g_game_state
  453. g_game_state.deck = []
  454. for i in range(52):
  455. g_game_state.deck.append(i)
  456. random.seed()
  457. for i in range(300):
  458. pos1 = random.randint(0, 51)
  459. pos2 = random.randint(0, 51)
  460. temp = g_game_state.deck[pos1]
  461. g_game_state.deck[pos1] = g_game_state.deck[pos2]
  462. g_game_state.deck[pos2] = temp
  463.  
  464. def take_card():
  465. global g_game_state
  466. card = g_game_state.deck[-1]
  467. g_game_state.deck = g_game_state.deck[:-1]
  468. return card
  469.  
  470. def group(number):
  471. s = '%d' % number
  472. groups = []
  473. while s and s[-1].isdigit():
  474. groups.append(s[-3:])
  475. s = s[:-3]
  476. return s + '.'.join(reversed(groups))
  477.  
  478. def cards_desc(cards):
  479. if cards == None: return ''
  480. cards = sorted(cards)
  481. text = ''
  482. for card in cards:
  483. if text != '': text += ' '
  484. text += card_name(card)
  485. #if len(cards) == 5:
  486. # hand, high_cards = get_hand(cards)
  487. # text += ' => ' + hand_name(hand) + ' ' + high_cards + ' => Rang ' + group(kombi_alle - hand)
  488. return text
  489.  
  490. # cards = [ mk(pic_10, 3), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ]
  491. # cards = [ mk(pic_9 , 3), mk(pic_10, 3), mk(pic_B, 3), mk(pic_D, 3), mk(pic_K, 3) ]
  492. # cards = [ mk(pic_A , 0), mk(pic_A , 1), mk(pic_A, 2), mk(pic_A, 3), mk(pic_K, 3) ]
  493. # cards = [ mk(pic_K , 2), mk(pic_K , 3), mk(pic_A, 1), mk(pic_A, 2), mk(pic_A, 3) ]
  494. # cards = [ mk(pic_9 , 3), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ]
  495. # cards = [ mk(pic_10, 2), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ]
  496. # cards = [ mk(pic_D , 3), mk(pic_K , 3), mk(pic_A, 1), mk(pic_A, 2), mk(pic_A, 3) ]
  497. # cards = [ mk(pic_D , 3), mk(pic_K , 2), mk(pic_K, 3), mk(pic_A, 2), mk(pic_A, 3) ]
  498. # cards = [ mk(pic_B , 3), mk(pic_D , 3), mk(pic_K, 3), mk(pic_A, 2), mk(pic_A, 3) ]
  499. # cards = [ mk(pic_9 , 2), mk(pic_B , 3), mk(pic_D, 3), mk(pic_K, 3), mk(pic_A, 3) ]
  500.  
  501. def colored(text):
  502. return '13' + text + reset_colors()
  503.  
  504. '''
  505. kombis = {}
  506.  
  507. for a1 in range(7):
  508. for a2 in range(7):
  509. for a3 in range(7):
  510. for a4 in range(7):
  511. for a5 in range(7):
  512. c = [0,0,0,0,0,0,0]
  513. c[a1] += 1
  514. c[a2] += 1
  515. c[a3] += 1
  516. c[a4] += 1
  517. c[a5] += 1
  518. if c[a1] <= 1\
  519. and c[a2] <= 1\
  520. and c[a3] <= 1\
  521. and c[a4] <= 1\
  522. and c[a5] <= 1:
  523. q = [a1,a2,a3,a4,a5]
  524. q = sorted(q)
  525. s = '['
  526. for i in range(5):
  527. s += str(q[i])
  528. if i < 4: s += ','
  529. s += ']'
  530. kombis[s] = True
  531.  
  532. for k, v in sorted(kombis.items()):
  533. print(k + ',')
  534.  
  535. assert len(kombis) == ueber(7,5)
  536. '''
  537.  
  538. g_seven_kombis = [
  539. [0,1,2,3,4],
  540. [0,1,2,3,5],
  541. [0,1,2,3,6],
  542. [0,1,2,4,5],
  543. [0,1,2,4,6],
  544. [0,1,2,5,6],
  545. [0,1,3,4,5],
  546. [0,1,3,4,6],
  547. [0,1,3,5,6],
  548. [0,1,4,5,6],
  549. [0,2,3,4,5],
  550. [0,2,3,4,6],
  551. [0,2,3,5,6],
  552. [0,2,4,5,6],
  553. [0,3,4,5,6],
  554. [1,2,3,4,5],
  555. [1,2,3,4,6],
  556. [1,2,3,5,6],
  557. [1,2,4,5,6],
  558. [1,3,4,5,6],
  559. [2,3,4,5,6] ]
  560.  
  561. def check_seven(seven_cards):
  562. highest = -1
  563. highest_desc = None
  564. for kombi in g_seven_kombis:
  565. cards = []
  566. for i in range(5):
  567. cards.append(seven_cards[kombi[i]])
  568. hand, desc = get_hand(cards)
  569. if hand > highest:
  570. highest = hand
  571. highest_desc = desc
  572. return highest, highest_desc
  573.  
  574. g_x_users_log = {}
  575. g_x_users_log_time = {}
  576.  
  577. def on_text(nick, user, channel, irc_text):
  578. print('nick == [' + nick + ']')
  579. print('user == [' + user + ']')
  580. print('channel == [' + channel + ']')
  581. print('irc_text == [' + irc_text + ']')
  582.  
  583. user = nick # zweites poker kommando von gleichem user zulassen
  584.  
  585. global g_game_state
  586. if provide_state(channel): return
  587.  
  588. help = {
  589. 'poker': 'Abbrechen und neues Poker-Match starten',
  590. 'join': 'Mitspielen',
  591. 'ask': 'Runde beginnen oder weitermachen',
  592. 'part': 'Nicht mehr mitspielen',
  593. 'take': 'Idler zum call zwingen',
  594. 'check': 'Nichts setzen',
  595. 'call': 'Mitgehen',
  596. 'raise': 'Erhöhen (100% = All in)',
  597. 'fold': 'Aus Runde aussteigen',
  598. 'rank': 'Rangliste anzeigen' }
  599.  
  600. def x_users_say(channel, x, command):
  601. global g_x_users_log
  602. global g_x_users_log_time
  603.  
  604. g_x_users_log [user] = irc_text
  605. g_x_users_log_time[user] = time.time()
  606.  
  607. wanters = []
  608. wanters_duration = 30
  609.  
  610. for k, v in g_x_users_log.items():
  611. if g_x_users_log [k] == command\
  612. and g_x_users_log_time[k] > time.time() - wanters_duration:
  613. wanters.append(k)
  614.  
  615. if irc_text == command:
  616. if len(wanters) < x:
  617. say(channel, 'Für "' + help[command] + '" müssen noch ' + str(x - len(wanters)) + ' andere User in den nächsten '\
  618. + str(wanters_duration) + ' Sekunden "' + command + '" schreiben')
  619. return False
  620. else:
  621. for wanter in wanters:
  622. del(g_x_users_log [wanter])
  623. del(g_x_users_log_time[wanter])
  624. return True
  625.  
  626. return False
  627.  
  628. def pot_desc():
  629. return 'Im Pot sind ' + str(g_game_state.pot) + ' Chips.'
  630.  
  631. def skip_foldeds():
  632. while g_game_state.whos_turn < len(g_game_state.players):
  633. if g_game_state.players[g_game_state.whos_turn] not in g_game_state.folded: break
  634. g_game_state.whos_turn += 1
  635.  
  636. def rank():
  637. if len(g_game_state.players) == 0:
  638. say(channel, 'Es spielt niemand')
  639. return
  640.  
  641. text = ''
  642. more_leaders = False
  643. iter = 0
  644. for player in sorted(g_game_state.chips, key=g_game_state.chips.get, reverse=True):
  645. if iter > 0 and g_game_state.chips[player] == first_score:
  646. text += ' und '
  647. more_leaders = True
  648. elif iter > 0:
  649. text += ' | '
  650.  
  651. if g_game_state.chips[player] > 0:
  652. chips = str(g_game_state.chips[player])
  653. else:
  654. chips = 'out'
  655. text += player + ' (' + chips + ')'
  656. if iter == 0: first_score = g_game_state.chips[player]
  657. iter += 1
  658.  
  659. if more_leaders:
  660. text = 'Es führen ' + text
  661. else:
  662. text = 'Es führt ' + text
  663.  
  664. say(channel, text)
  665.  
  666. def reset_round():
  667. g_game_state.round = None
  668. g_game_state.whos_turn = None
  669.  
  670. to_remove = []
  671. for player in g_game_state.players:
  672. if g_game_state.chips[player] <= 0:
  673. to_remove.append(player)
  674.  
  675. for player in to_remove:
  676. g_game_state.players.remove(player)
  677. g_game_state.cards[player] = None
  678.  
  679. g_game_state.players = g_game_state.players[1:] + g_game_state.players[:1]
  680.  
  681. rank()
  682.  
  683. def show_flop(ask_for_action):
  684. for player in g_game_state.players:
  685.  
  686. if ask_for_action:
  687. text = colored(esc_nick(g_game_state.players[g_game_state.whos_turn])) + reset_colors() + '1 ist dran | '
  688. else:
  689. text = ''
  690.  
  691. if player in g_game_state.folded:
  692. folded_desc = '14,15folded' + reset_colors()
  693. else:
  694. folded_desc = cards_desc(g_game_state.cards[player])
  695.  
  696. text += 'Runde ' + str(1 + g_game_state.round) + ' | ' + player + ' ' + str(g_game_state.chips[player])\
  697. + ' ' + folded_desc + ' 1| Pot ' + str(g_game_state.pot)\
  698. + ' <- ' + str(g_game_state.einsatz)
  699.  
  700. if g_game_state.flop != None: text += ' ' + cards_desc(g_game_state.flop)
  701.  
  702. notice(player, text)
  703.  
  704. if g_game_state.round == 3: g_game_state.round_3_showed
  705.  
  706. def give_cards(player):
  707. g_game_state.cards[player] = []
  708. cards = g_game_state.cards[player]
  709. cards.append(take_card())
  710. cards.append(take_card())
  711.  
  712. def iter_ask():
  713. g_game_state.last_time = time.time()
  714.  
  715. if g_game_state.round == None:
  716. g_game_state.pot = 0
  717. g_game_state.einsatz = 10
  718. g_game_state.cards = {}
  719. g_game_state.folded = {}
  720. g_game_state.round = 0
  721. g_game_state.whos_turn = None
  722. g_game_state.flop = None
  723. g_game_state.round_3_showed = False
  724.  
  725. if g_game_state.round == 0:
  726. if g_game_state.whos_turn == None:
  727. reset_deck()
  728. for player in g_game_state.players:
  729. give_cards(player)
  730.  
  731. g_game_state.gesetzt = False
  732. g_game_state.whos_turn = 0
  733. skip_foldeds()
  734.  
  735. elif g_game_state.round == 1:
  736. if g_game_state.whos_turn == None:
  737. g_game_state.flop = []
  738. for i in range(3):
  739. g_game_state.flop.append(take_card())
  740.  
  741. g_game_state.gesetzt = False
  742. g_game_state.whos_turn = 0
  743. skip_foldeds()
  744.  
  745. elif g_game_state.round == 2:
  746. if g_game_state.whos_turn == None:
  747. g_game_state.flop.append(take_card())
  748.  
  749. g_game_state.gesetzt = False
  750. g_game_state.whos_turn = 0
  751. skip_foldeds()
  752.  
  753. elif g_game_state.round == 3:
  754. if g_game_state.whos_turn == None:
  755. g_game_state.flop.append(take_card())
  756.  
  757. g_game_state.gesetzt = False
  758. g_game_state.whos_turn = 0
  759. skip_foldeds()
  760.  
  761. elif g_game_state.round == 4:
  762. highest = -1
  763. highest_desc = None
  764. winners = []
  765. for player in g_game_state.players:
  766. if player not in g_game_state.folded:
  767. hand, desc = check_seven(g_game_state.cards[player] + g_game_state.flop)
  768. if hand > highest:
  769. highest = hand
  770. highest_desc = desc
  771. winners = [player]
  772. elif hand == highest:
  773. winners.append(player)
  774.  
  775. split = int(g_game_state.pot / len(winners))
  776.  
  777. for winner in winners:
  778. g_game_state.chips[winner] += split
  779.  
  780. text = str(g_game_state.pot) + ' Chips '
  781.  
  782. if len(winners) > 1:
  783. text += 'gewinnen '
  784. else:
  785. text += 'gewinnt '
  786.  
  787. farbig = '8,4'
  788. text += farbig
  789.  
  790. iter = 0
  791. for winner in winners:
  792. text += esc_nick(winner) + reset_colors() + ' mit ' + cards_desc(g_game_state.cards[winner])
  793. if iter < len(winners) - 1:
  794. text += ' und ' + farbig
  795. iter += 1
  796.  
  797. text += reset_colors() + ' also '
  798. if len(winners) > 1: text += 'jeweils '
  799.  
  800. text += hand_name(highest) + ' ' + highest_desc
  801.  
  802. if len(winners) > 1:
  803. text += '. Jeder bekommt ' + str(split) + ' Chips'
  804.  
  805. say(channel, text)
  806. reset_round()
  807. return
  808.  
  809. if g_game_state.round < 4:
  810. player = g_game_state.players[g_game_state.whos_turn]
  811.  
  812. if g_game_state.chips[player] <= 0:
  813. next_turn()
  814. if g_game_state.round == 4 and not g_game_state.round_3_showed:
  815. show_flop(False)
  816. return True
  817. else:
  818. show_flop(True)
  819.  
  820. def loop_ask():
  821. while iter_ask(): None
  822.  
  823. def join():
  824. if nick in g_game_state.players:
  825. say(channel, esc_nick(nick) + ': Du spielst bereits mit')
  826. return False
  827.  
  828. #if g_game_state.round != None:
  829. # say(channel, esc_nick(nick) + ': Bitte zu Beginn der nächsten Runde einsteigen.')
  830. # return False
  831.  
  832. lowest_chips = None
  833. for player in g_game_state.players:
  834. if lowest_chips == None or g_game_state.chips[player] < lowest_chips:
  835. lowest_chips = g_game_state.chips[player]
  836. if lowest_chips == None or lowest_chips < 500: lowest_chips = 500
  837.  
  838. pos = len(g_game_state.players)
  839. g_game_state.players.append(nick)
  840.  
  841. g_game_state.chips[nick] = lowest_chips
  842.  
  843. if g_game_state.round != None:
  844. give_cards(nick)
  845.  
  846. say(channel, esc_nick(nick) + ' spielt ab jetzt auf Platz 0,1' + str(1+pos) + reset_colors())
  847. return True
  848.  
  849. if(x_users_say(channel, 2, 'poker')):
  850. text = 'Neues Poker-Match gestartet. Befehle sind:'
  851. for befehl, erklaerung in sorted(help.items()):
  852. text += ' [' + befehl + '] = ' + erklaerung
  853. say(channel, text)
  854.  
  855. g_game_state.active = True
  856. g_game_state.players = []
  857. g_game_state.chips = {}
  858. g_game_state.cards = {}
  859. g_game_state.round = None
  860. g_game_state.whos_turn = None
  861.  
  862. return
  863.  
  864. if not g_game_state.active:
  865. return
  866.  
  867. if(irc_text == 'join'):
  868. join()
  869. return
  870.  
  871. if(irc_text == 'rank'):
  872. rank()
  873. return
  874.  
  875. if irc_text.split()[0] in help.keys() and not nick in g_game_state.players:
  876. say(channel, esc_nick(nick) + ': Um mitzuspielen schreibe join :)')
  877. return
  878.  
  879. def check_turn(quiet=False):
  880. if g_game_state.cards and not nick in g_game_state.cards:
  881. if not quiet: say(channel, esc_nick(nick) + ': Du spielst noch nicht mit')
  882. return False
  883.  
  884. if g_game_state.whos_turn != None and g_game_state.players[g_game_state.whos_turn] == nick:
  885. return True
  886. else:
  887. if not quiet: say(channel, esc_nick(nick) + ': Du kommst später dran')
  888. return False
  889.  
  890. def next_turn():
  891. g_game_state.whos_turn += 1
  892. skip_foldeds()
  893.  
  894. if g_game_state.whos_turn >= len(g_game_state.players):
  895. g_game_state.whos_turn = None
  896. g_game_state.round += 1
  897.  
  898. def fold(parts):
  899. g_game_state.folded[nick] = True
  900. g_game_state.cards[nick] = None
  901.  
  902. num_folded = 0
  903. not_folded = None
  904. for player in g_game_state.players:
  905. if player in g_game_state.folded:
  906. num_folded += 1
  907. else:
  908. not_folded = player
  909.  
  910. if num_folded == len(g_game_state.players) - 1:
  911.  
  912. g_game_state.chips[not_folded] += g_game_state.pot
  913. say(channel, underline() + not_folded + ' bekommt die ' + str(g_game_state.pot) + ' Chips')
  914. reset_round()
  915.  
  916. elif num_folded == len(g_game_state.players):
  917. reset_round()
  918. else:
  919. text = underline() + esc_nick(nick)
  920.  
  921. if parts:
  922. text += ' spielt nicht mehr mit'
  923. else:
  924. text += ' schaut in dieser Runde zu'
  925.  
  926. say(channel, text)
  927.  
  928. if not check_turn(True): return
  929. next_turn()
  930. loop_ask()
  931.  
  932. if(irc_text == 'part'):
  933. if g_game_state.round != None:
  934. fold(True)
  935. else:
  936. say(channel, nick + ' spielt nicht mehr mit')
  937. g_game_state.players.remove(nick)
  938. if nick in g_game_state.chips: del(g_game_state.chips[nick])
  939. if nick in g_game_state.cards: del(g_game_state.cards[nick])
  940. return
  941.  
  942. if(irc_text == 'ask'):
  943. loop_ask()
  944. return
  945.  
  946. if irc_text.split()[0] in help.keys() and g_game_state.round == None:
  947. say(channel, esc_nick(nick) + ': Die Runde hat noch nicht begonnen')
  948. return
  949.  
  950. def invest(player):
  951. einsatz = g_game_state.einsatz
  952. all_in = False
  953. if einsatz >= g_game_state.chips[player]:
  954. einsatz = g_game_state.chips[player]
  955. all_in = True
  956.  
  957. g_game_state.chips[player] -= einsatz
  958. g_game_state.pot += einsatz
  959. g_game_state.gesetzt = True
  960.  
  961. text = underline() + esc_nick(player) + ' setzt '
  962. text += str(einsatz) + ' Chips'
  963.  
  964. if all_in:
  965. text += ' und geht damit All in'
  966.  
  967. say(channel, text)
  968.  
  969. def call(player):
  970. invest(player)
  971. next_turn()
  972. loop_ask()
  973.  
  974. if(irc_text == 'call'):
  975. if not check_turn(): return
  976. call(nick)
  977. return
  978.  
  979. if g_game_state.round != None:
  980. if(x_users_say(channel, 2, 'take')):
  981. call(g_game_state.players[g_game_state.whos_turn])
  982. return
  983.  
  984. if(irc_text[:5] == 'raise'):
  985. if not check_turn(): return
  986.  
  987. max_raise = g_game_state.chips[nick] - g_game_state.einsatz
  988.  
  989. if irc_text[-1:] == '%':
  990. percent = 10
  991.  
  992. try:
  993. percent = int(float(irc_text[5:][:-1]))
  994. except Exception as e:
  995. pass
  996.  
  997. if percent < 0: percent = 0
  998. if percent > 100: percent = 100
  999. percent = int(percent)
  1000.  
  1001. _raise = percent / 100 * max_raise
  1002. else:
  1003. _raise = g_game_state.einsatz * 0.2
  1004.  
  1005. try:
  1006. _raise = int(float(irc_text[5:]))
  1007. except Exception as e:
  1008. pass
  1009.  
  1010. if _raise < 0: _raise = 0
  1011. if _raise > max_raise: _raise = max_raise
  1012.  
  1013. _raise = int(_raise)
  1014.  
  1015. g_game_state.einsatz += _raise
  1016. invest(nick)
  1017.  
  1018. next_turn()
  1019. loop_ask()
  1020. return
  1021.  
  1022. if(irc_text == 'fold'):
  1023. fold(False)
  1024. return
  1025.  
  1026. if(irc_text == 'check'):
  1027. if not check_turn(): return
  1028.  
  1029. if g_game_state.round == 0:
  1030. say(channel, esc_nick(nick) + ': In der ersten Runde musst du Chips setzen oder folden')
  1031. elif g_game_state.gesetzt:
  1032. say(channel, esc_nick(nick) + ': Wenn vor dir jemand Chips gesetzt hat, musst du setzen oder folden')
  1033. else:
  1034. say(channel, underline() + esc_nick(nick) + ' setzt nichts')
  1035. next_turn()
  1036. loop_ask()
  1037. return
  1038.  
  1039. send('USER blah ' + g_irc_server + ' blah :blah')
  1040. send('NICK ' + g_bot_nick)
  1041. g_bot_nick_number = 1
  1042.  
  1043. def proc_line(line):
  1044. print('line == [' + line + ']')
  1045.  
  1046. if line[:5] == 'PING ':
  1047. send('PONG ' + line[5:])
  1048.  
  1049. irc_message = line[1:].split(':', 1)
  1050. message_header = irc_message[0].split(' ')
  1051.  
  1052. if message_header[1] == '433':
  1053. global g_bot_nick_number
  1054. g_bot_nick_number += 1
  1055. send('NICK ' + g_bot_nick + str(g_bot_nick_number))
  1056.  
  1057. if message_header[1] == '376':
  1058. for channel in g_channels:
  1059. send('JOIN ' + channel)
  1060.  
  1061. if message_header[1] == 'PRIVMSG':
  1062. sender = message_header[0].split('!')
  1063. on_text(sender[0], sender[1], message_header[2], irc_message[1])
  1064.  
  1065. buffer = ''
  1066. while True:
  1067. buffer = buffer + g_socket.recv(512).decode('iso-8859-1')
  1068.  
  1069. while True:
  1070. line_end = buffer.find('\r\n')
  1071. if line_end != -1:
  1072. proc_line(buffer[:line_end])
  1073. buffer = buffer[line_end + 2:]
  1074. else:
  1075. break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement