Форум сайта python.su
ну все, давайте ТЗ нам :)
Офлайн
Вообще то было бы неплохо настроить контроль версий.
Офлайн
Предлагаю взять проект виртуального мира будущего :D (помните такой?)
Офлайн
Программистов может быть сколько угодно. Даже лучше, если их будет больше одного. При этом, каждый делает свою версию проекта. Но желательно, чтобы он использовал идеи и модули из проектов “конкурентов”.
Главного программиста быть не должно, так как это внесёт зависимость программистов друг от друга и как первый “скиснет”, так весь проект встанет.
Я могу быть автором ТЗ. Предполагаю, что проект с GUI пока не осилить (будет много споров при выборе), хотя было бы интересно. Поэтому для начала проект будет консольный. С ходу могу предложить ТЗ на игру в кости. Есть и другие идеи, но чтобы не было долгих споров пока представлю одну.
————————–
ТЗ на игру в кости:
Разработать программу, реализующую игру в кости человека с компьютером. Правила игры следующие: каждый игрок (компьютер или пользователь) в свою очередь хода бросает кость столько раз, сколько хочет, до выпадения единицы.
Если игрок заканчивает ход до выпадения единицы (по своему желанию), то записывает себе сумму выпавших за эти бросания очков. Если он выбрасывает единицу, то он не записывает на свой счет ничего. То есть в данном случае весь ход будет потрачен впустую. После выпадения единицы ход заканчивается принудительно.
Выигравшим считается тот, кто первый наберет (превысит) 100 очков.
Предусмотреть возможность изменения стратегии игры со стороны компьютера. Например, компьютер может вести более жадную стратегию (больше бросков за ход) если проигрывает и более надежную (меньше бросков за ход), если выигрывает. Или наоборот.
Предусмотреть запись всех шагов игры в лог файл и определение случайным образом игрока делающего первый ход. Запись в лог производится по желанию пользователя, если прошедшая игра покажется ему интересной.
Предполагаемые изменения во второй версии программы: вводится несколько игроков (ботов), за которых играет компьютер, предусматривается режим игры без пользователя, предусматривается загрузка файлов с описанием стратегий ботов.
Так же могут быть изменены правила: например, будет введён бонус за дубль и т.п.
————————–
Если такое ТЗ кому-то понравится, то могу создать отдельную тему для такого проекта. Предполагается, что вначале будет какое-то словесное проектирование, или с помощью UML, если кому-то так удобнее.
Офлайн
import random
Офлайн
задача интересная ввечером возьмусь за гавнакод :)
Офлайн
заливай на битбакет, или как-нибудь так.
Офлайн
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()
Отредактировано (Апрель 21, 2010 17:06:32)
Офлайн
На счёт репозитория на Mercurial. Предполагаю, что это отсечёт некоторых желающих. Тут нужна какая-то инструкция по подключению. Хотя, может оно проще, чем я представляю.
GriffonЕсть такая роль - советчик. Он указывает на ошибки. Советчиком может быть любой желающий, в том числе и автор ТЗ и другие программисты.
Только в любом случае должен быть тот кто укажет всем на их ошибки.
GriffonНекоторые замечания с ходу:
Набросал немного после обеда.
Отредактировано (Апрель 21, 2010 18:03:47)
Офлайн