#!/usr/bin/python3
# coding: utf-8

"""Лото

Правила игры в лото.

Игра ведется с помощью специальных карточек, на которых отмечены числа, 
и фишек (бочонков) с цифрами.

Количество бочонков — 90 штук (с цифрами от 1 до 90).

Каждая карточка содержит 3 строки по 9 клеток. В каждой строке по 5 случайных цифр, 
расположенных по возрастанию. Все цифры в карточке уникальны. Пример карточки:

--------------------------
    9 43 62          74 90
 2    27    75 78    82
   41 56 63     76      86 
--------------------------

В игре 2 игрока: пользователь и компьютер. Каждому в начале выдается 
случайная карточка. 

Каждый ход выбирается один случайный бочонок и выводится на экран.
Также выводятся карточка игрока и карточка компьютера.

Пользователю предлагается зачеркнуть цифру на карточке или продолжить.
Если игрок выбрал "зачеркнуть":
	Если цифра есть на карточке - она зачеркивается и игра продолжается.
	Если цифры на карточке нет - игрок проигрывает и игра завершается.
Если игрок выбрал "продолжить":
	Если цифра есть на карточке - игрок проигрывает и игра завершается.
	Если цифры на карточке нет - игра продолжается.
	
Побеждает тот, кто первый закроет все числа на своей карточке.

Пример одного хода:

Новый бочонок: 70 (осталось 76)
------ Ваша карточка -----
 6  7          49    57 58
   14 26     -    78    85
23 33    38    48    71   
--------------------------
-- Карточка компьютера ---
 7 87     - 14    11      
      16 49    55 88    77    
   15 20     -       76  -
--------------------------
Зачеркнуть цифру? (y/n)

Подсказка: каждый следующий случайный бочонок из мешка удобно получать 
с помощью функции-генератора.

Подсказка: для работы с псевдослучайными числами удобно использовать 
модуль random: http://docs.python.org/3/library/random.html

"""

import random

user_card = [[], [], []]
comp_card = [[], [], []]
j = [[], [], []]


for i in user_card:	#сначала сделала класс, потом поняла, что нет смысла – разный код (немножко) для всего двух карточек, верно? или все же надо??
                # 2016.04.13_08:55:36 checked. prusanov  -- всё же, с классом будет чуть удобней (особенно, если развивать игру и добавлять разных игроков)
                # и, кстати, код не такой уж разный получится.
                
    while len(i)<5:                 # 2016.04.13_08:56:25 checked. prusanov  -- не забывайте про PEP-8
        number = random.randint(1,90)
        if not any(number in j for j in user_card):	#проверка на уникальность числа
            i.append(number) 
    i.sort() # сортируем по возрастанию
    while len(i)<9:
    	i.insert(random.randint(0,len(i)), ' ') #добавляем пустые клетки на случайные места
        
        
def print_ucard():
	print ('----- Your card ------') #как правильнее сделать здесь? тупо принтами??
    
                                # 2016.04.13_08:57:25 checked. prusanov  -- для универсальности и красоты можно подготовить строки вывода,
                                #    а потом их одним print'ом вывести
	for i in user_card:
		print (' '.join(map(str, i)))
	print ('----------------------')

    
for i in comp_card:
    while len(i)<5:
        number = random.randint(1,90)
        if (not any(number in j for j in comp_card) and (not any(number in k for k in user_card))): #проверяем уникальность, чтобы число не встречалось ни в одной карточке
        # 2016.04.13_09:08:08 checked. prusanov  -- правильно ли я понял, что числа будут уникальны и у компьютера, и у человека?
        # но так не должно быть - числа могут повторяться в карточках разных игроков.
        
            i.append(number)
    i.sort()
    while len(i)<9:
    	i.insert(random.randint(0,len(i)), ' ')
        
        
def print_ccard():
    print ('-- Computer\'s card ---')           # <- обратите внимание на отступы. Здесь табуляция, а в других местах пробелы. Не нужно смешивать разные отступы
	for i in comp_card:
		print (' '.join(map(str, i)))
	print ('----------------------')

    
def new_num(n):
	j = 0
	for i in random.sample(range(1,n+1), n): 
		j += 1
		yield i,j

def  wrong_ans():
	raise RuntimeError('You lost!')
	sys.exit(1)

    
num_q = 5 #количество бочонков
for i,j in new_num(num_q):
	print ("New number is %s (%d left)" % (i, (num_q-j)))
	print_ucard()
	print_ccard()
	for n in range(3): 
		comp_card[n] = ['-' if x == i else x for x in comp_card[n]]
		u_ans = input('Want to cross out the number? y/n \n')
		if u_ans == 'y': 
			for n in range(3): user_card[n] = ['-' if x == i else wrong_ans() for x in user_card[n]]
                        # здесь лучше на две строки написать - плохо читаема однострочка
			break
		elif u_ans == 'n': break
		else: 
			print ("Please answer y/n")
			continue






fcd20b22a3224f4b2e66585b35633649917f9048
#!/usr/bin/python3
# coding: utf-8

"""Лото

Правила игры в лото.

Игра ведется с помощью специальных карточек, на которых отмечены числа, 
и фишек (бочонков) с цифрами.

Количество бочонков — 90 штук (с цифрами от 1 до 90).

Каждая карточка содержит 3 строки по 9 клеток. В каждой строке по 5 случайных цифр, 
расположенных по возрастанию. Все цифры в карточке уникальны. Пример карточки:

--------------------------
    9 43 62          74 90
 2    27    75 78    82
   41 56 63     76      86 
--------------------------

В игре 2 игрока: пользователь и компьютер. Каждому в начале выдается 
случайная карточка. 

Каждый ход выбирается один случайный бочонок и выводится на экран.
Также выводятся карточка игрока и карточка компьютера.

Пользователю предлагается зачеркнуть цифру на карточке или продолжить.
Если игрок выбрал "зачеркнуть":
	Если цифра есть на карточке - она зачеркивается и игра продолжается.
	Если цифры на карточке нет - игрок проигрывает и игра завершается.
Если игрок выбрал "продолжить":
	Если цифра есть на карточке - игрок проигрывает и игра завершается.
	Если цифры на карточке нет - игра продолжается.
	
Побеждает тот, кто первый закроет все числа на своей карточке.

Пример одного хода:

Новый бочонок: 70 (осталось 76)
------ Ваша карточка -----
 6  7          49    57 58
   14 26     -    78    85
23 33    38    48    71   
--------------------------
-- Карточка компьютера ---
 7 87     - 14    11      
      16 49    55 88    77    
   15 20     -       76  -
--------------------------
Зачеркнуть цифру? (y/n)

Подсказка: каждый следующий случайный бочонок из мешка удобно получать 
с помощью функции-генератора.

Подсказка: для работы с псевдослучайными числами удобно использовать 
модуль random: http://docs.python.org/3/library/random.html

"""

import random

user_card = [[], [], []]
comp_card = [[], [], []]
j = [[], [], []]


for i in user_card:	#сначала сделала класс, потом поняла, что нет смысла – разный код (немножко) для всего двух карточек, верно? или все же надо??
                # 2016.04.13_08:55:36 checked. prusanov  -- всё же, с классом будет чуть удобней (особенно, если развивать игру и добавлять разных игроков)
                # и, кстати, код не такой уж разный получится.
                
    while len(i)<5:                 # 2016.04.13_08:56:25 checked. prusanov  -- не забывайте про PEP-8
        number = random.randint(1,90)
        if not any(number in j for j in user_card):	#проверка на уникальность числа
            i.append(number) 
    i.sort() # сортируем по возрастанию
    while len(i)<9:
    	i.insert(random.randint(0,len(i)), ' ') #добавляем пустые клетки на случайные места
        
        
def print_ucard():
	print ('----- Your card ------') #как правильнее сделать здесь? тупо принтами??
    
                                # 2016.04.13_08:57:25 checked. prusanov  -- для универсальности и красоты можно подготовить строки вывода,
                                #    а потом их одним print'ом вывести
	for i in user_card:
		print (' '.join(map(str, i)))
	print ('----------------------')

    
for i in comp_card:
    while len(i)<5:
        number = random.randint(1,90)
        if (not any(number in j for j in comp_card) and (not any(number in k for k in user_card))): #проверяем уникальность, чтобы число не встречалось ни в одной карточке
        # 2016.04.13_09:08:08 checked. prusanov  -- правильно ли я понял, что числа будут уникальны и у компьютера, и у человека?
        # но так не должно быть - числа могут повторяться в карточках разных игроков.
        
            i.append(number)
    i.sort()
    while len(i)<9:
    	i.insert(random.randint(0,len(i)), ' ')
        
        
def print_ccard():
    print ('-- Computer\'s card ---')           # <- обратите внимание на отступы. Здесь табуляция, а в других местах пробелы. Не нужно смешивать разные отступы
	for i in comp_card:
		print (' '.join(map(str, i)))
	print ('----------------------')

    
def new_num(n):
	j = 0
	for i in random.sample(range(1,n+1), n): 
		j += 1
		yield i,j

def  wrong_ans():
	raise RuntimeError('You lost!')
	sys.exit(1)

    
num_q = 5 #количество бочонков
for i,j in new_num(num_q):
	print ("New number is %s (%d left)" % (i, (num_q-j)))
	print_ucard()
	print_ccard()
	for n in range(3): 
		comp_card[n] = ['-' if x == i else x for x in comp_card[n]]
		u_ans = input('Want to cross out the number? y/n \n')
		if u_ans == 'y': 
			for n in range(3): user_card[n] = ['-' if x == i else wrong_ans() for x in user_card[n]]
                        # здесь лучше на две строки написать - плохо читаема однострочка
			break
		elif u_ans == 'n': break
		else: 
			print ("Please answer y/n")
			continue





