lorienВ общем, автору ТЗ не важно как приходят параметры. Ему просто нужна игра, в которую удобно играть. Но, насколько я понимаю, данные через sys.argv приходят однократно, а ходов потребуется несколько.
Приходят ли параметры через sys.argv али через raw_input()
lorienописано. Сказано “Разработать программу, реализующую игру в кости человека с компьютером”. То есть человек играет с компьютером.
не описано как выбирать игроков (пользователь или компьютер)
lorienА где сказано, что может быть 2 пользователя?
в конце игры лог записывается по желанию пользователя, а если пользователя два - тоже какая-то туманность.
lorienКомпьютер не может мухлевать - всё по честному :)
Также не указано, может ли мухлевать компьютер.
import random
import time
class ExitException(Exception):
pass
class Gamer:
def __init__(self, name="noname"):
self.name = name
self.try_count = 0
self.game_points = 0
self.try_points = 0
def throw_bone(self):
#random value here
curr_val = random.randrange(1, 7)
self.try_count += 1
print "Bone stops at %s." % curr_val
if curr_val == 1:
self.try_points = 0
self.stop()
return False
self.try_points += curr_val
return True
def stop(self):
self.game_points += self.try_points
self.try_count = 0
self.try_points = 0
print self.name, "have %s points." % self.game_points
def whant_throw_again(self):
ask = 0
while not (ask in ("Y", "N", "E")):
ask = raw_input("Are you want to throw the bone again? (Y/N ir E to end the game): ").upper()
if ask == "E":
raise ExitException()
return True if ask == "Y" else False
class Computer(Gamer):
def __init__(self, name, difficulty=1):
Gamer.__init__(self, name)
self.veriety = 0
# veriety of next throw = 100 - (a * try_count + try_points * b)
difficulty_level = {0: {"max": 10, "a": 5, "b": 1},
1: {"max": 20, "a": 10, "b": 2},
2: {"max": 25, "a": 5, "b": 3}}
self.dif = difficulty_level[difficulty]
def whant_throw_again(self):
veriety = 100 - self.dif["a"] * self.try_count - self.dif["b"] * self.try_points
if self.try_points > self.dif["max"]:
veriety = min(25, veriety)
self.veriety = veriety
# Pretending that we think.
time.sleep(0.5)
return random.randrange(1, 101) <= veriety
def __cmp__(self, user):
return 1 if self.game_points > user.game_points else -1
class Game:
def __init__(self, players, max_points=100):
self.max = 100
self.players = players
self.p_count = len(players)
self.curr_gamer = random.randrange(self.p_count)
def next_user(self):
self.curr_gamer += 1
if self.curr_gamer == self.p_count:
self.curr_gamer = 0
return self.players[self.curr_gamer]
def start(self):
user = self.next_user()
try:
while user.game_points < 100:
user = self.next_user()
print ""
print user.name, "turn:"
while True:
if not user.throw_bone():
break
if not user.whant_throw_again():
user.stop()
break
self.stop()
except ExitException:
self.stop()
def stop(self):
print "\n"
for user in self.players:
print "%s have %s points." % (user.name, user.game_points)
print "And the winer is %s!" % max(self.players).name
def comp_test():
print "---> Coputer throws bone..."
u = Computer("Josh", 1)
for i in range(10):
u.throw_bone()
print "[",u.veriety, u.whant_throw_again(), u.try_points, "]"
print "... and hits his friend :)"
def user_test():
print "---> Your turn..."
u = Gamer("Griffon")
for i in range(3):
u.throw_bone()
try:
u.whant_throw_again()
except ExitException:
print "Exit"
print "... its all right?"
def test():
comp_test()
user_test()
#test()
u1 = Gamer(raw_input("Enter your name:\n"))
x = None
while not (x in ("1", "2", "3")):
print "Chose your opponent:\n1 - Josh\n2 - Ben\n3 - Stupid"
x = raw_input()
comps = {0: "Josh", 1: "Ben", 2: "Stupid"}
u2 = Computer(comps[int(x)-1], int(x)-1)
game = Game((u1, u2))
game.start()
GriffonЕсть такая роль - советчик. Он указывает на ошибки. Советчиком может быть любой желающий, в том числе и автор ТЗ и другие программисты.
Только в любом случае должен быть тот кто укажет всем на их ошибки.
GriffonНекоторые замечания с ходу:
Набросал немного после обеда.