Найти - Пользователи
Полная версия: Учебные проекты
Начало » Флейм » Учебные проекты
1 2 3 4
Zubchick
ну все, давайте ТЗ нам :)
helm2004
Вообще то было бы неплохо настроить контроль версий.
regall
Предлагаю взять проект виртуального мира будущего :D (помните такой?)
Kogrom
Программистов может быть сколько угодно. Даже лучше, если их будет больше одного. При этом, каждый делает свою версию проекта. Но желательно, чтобы он использовал идеи и модули из проектов “конкурентов”.

Главного программиста быть не должно, так как это внесёт зависимость программистов друг от друга и как первый “скиснет”, так весь проект встанет.

Я могу быть автором ТЗ. Предполагаю, что проект с GUI пока не осилить (будет много споров при выборе), хотя было бы интересно. Поэтому для начала проект будет консольный. С ходу могу предложить ТЗ на игру в кости. Есть и другие идеи, но чтобы не было долгих споров пока представлю одну.

————————–
ТЗ на игру в кости:

Разработать программу, реализующую игру в кости человека с компьютером. Правила игры следующие: каждый игрок (компьютер или пользователь) в свою очередь хода бросает кость столько раз, сколько хочет, до выпадения единицы.

Если игрок заканчивает ход до выпадения единицы (по своему желанию), то записывает себе сумму выпавших за эти бросания очков. Если он выбрасывает единицу, то он не записывает на свой счет ничего. То есть в данном случае весь ход будет потрачен впустую. После выпадения единицы ход заканчивается принудительно.

Выигравшим считается тот, кто первый наберет (превысит) 100 очков.

Предусмотреть возможность изменения стратегии игры со стороны компьютера. Например, компьютер может вести более жадную стратегию (больше бросков за ход) если проигрывает и более надежную (меньше бросков за ход), если выигрывает. Или наоборот.

Предусмотреть запись всех шагов игры в лог файл и определение случайным образом игрока делающего первый ход. Запись в лог производится по желанию пользователя, если прошедшая игра покажется ему интересной.

Предполагаемые изменения во второй версии программы: вводится несколько игроков (ботов), за которых играет компьютер, предусматривается режим игры без пользователя, предусматривается загрузка файлов с описанием стратегий ботов.

Так же могут быть изменены правила: например, будет введён бонус за дубль и т.п.
————————–

Если такое ТЗ кому-то понравится, то могу создать отдельную тему для такого проекта. Предполагается, что вначале будет какое-то словесное проектирование, или с помощью UML, если кому-то так удобнее.
sypper-pit
import random
helm2004
задача интересная ввечером возьмусь за гавнакод :)
Zubchick
заливай на битбакет, или как-нибудь так.
Kogrom
lorien
Приходят ли параметры через sys.argv али через raw_input()
В общем, автору ТЗ не важно как приходят параметры. Ему просто нужна игра, в которую удобно играть. Но, насколько я понимаю, данные через sys.argv приходят однократно, а ходов потребуется несколько.

lorien
не описано как выбирать игроков (пользователь или компьютер)
описано. Сказано “Разработать программу, реализующую игру в кости человека с компьютером”. То есть человек играет с компьютером.

lorien
в конце игры лог записывается по желанию пользователя, а если пользователя два - тоже какая-то туманность.
А где сказано, что может быть 2 пользователя?

lorien
Также не указано, может ли мухлевать компьютер.
Компьютер не может мухлевать - всё по честному :)


На счёт система контроля версий, вики и прочего. На начальном этапе наверное лучше код выкладывать прямо в форум. Так будет нагляднее. Если код разрастётся, то да, надо будет искать хостинг. Правда с Mercurial я не работал, только с SVN.
Griffon
Нормальная идея. Только в любом случае должен быть тот кто укажет всем на их ошибки.

Набросал немного после обеда.
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()
Kogrom
На счёт репозитория на Mercurial. Предполагаю, что это отсечёт некоторых желающих. Тут нужна какая-то инструкция по подключению. Хотя, может оно проще, чем я представляю.
Griffon
Только в любом случае должен быть тот кто укажет всем на их ошибки.
Есть такая роль - советчик. Он указывает на ошибки. Советчиком может быть любой желающий, в том числе и автор ТЗ и другие программисты.

Вижу, что код выкладывают уже в эту тему. Так как идея ещё обкатывается, то менять этот подход не вижу смысла пока.
Griffon
Набросал немного после обеда.
Некоторые замечания с ходу:

1. Наследование игроков. Игрок-компьютер наследует функции, которые ему не нужны.
2. Много “магических чисел”.
3. Трудно воспринимаемая логика Игрока-Компьютера в функции whant_throw_again. Нужно какое-то пояснение или переделка функции.
4. Функция __cmp__ должна быть определена в предке, а не в потомке.
5. Игрок-компьютер не учитывает историю ходов соперника при выборе стратегии. То есть он не может менять стратегию как задано в ТЗ.
6. Слишком много объектов имеют доступ к print, raw_input. По хорошему, доступ к таким функциям должен иметь только один объект (Вид в терминологии MVC). Тогда проще будет перевести проект в GUI.

Ну и мелочи типа отсутствия в модуле проверки, что он является главным.

Но в целом, есть уже какая-то заготовка.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB