Форум сайта python.su
Здравствуйте, у меня есть задача. На плоскости нарисованы 2002 вектора. Два игрока по очереди выбирают по одному вектору до тех пор, пока они не кончатся. Проигрывает тот, у кого сумма выбранных им векторов имеет меньшую длину. Может ли начинающий так построить свою игру, чтобы не проиграть?
вот как задала векторы, на выходе получаю массив массивов с двумя координатами векторов(пока до 20 взяла):*
Как можно найти максимальную координату x, то есть первую (не просто max от всего массива)
*
from random import *
from math import *
class vector(object):
def __init__(self,x,y):
self.x = x
self.y = y
mas_x =
mas_y =
for i in range(20):
a = randint (1, 10)
mas_x.append(a)
for i in range(20):
a = randint (1, 10)
mas_y.append(a)
print mas_x
print mas_y
mas_x_y =
mas_vector =
j = 0
while j!=20:
vector.x = mas_x
vector.y = mas_y
mas_x_y= mas_x_y + +
mas_vector = mas_vector +
mas_x_y =
j = j + 1
print
print('Вот наши векторы!!!')
print
print mas_vector
Офлайн
Здравствуйте, у меня есть задача. На плоскости нарисованы 2002 вектора. Два игрока по очереди выбирают по одному вектору до тех пор, пока они не кончатся. Проигрывает тот, у кого сумма выбранных им векторов имеет меньшую длину. Может ли начинающий так построить свою игру, чтобы не проиграть?Звучит как неудачная пародия. Первому игроку надо просто каждый раз брать максимальный вектор из существующих. Ознакомьтесь с тегом code, довольно сложно читать это.
from functools import total_ordering from math import sqrt from random import randint class Point(object): def __init__(self, x, y): self._x = x self._y = y @property def x(self): return self._x @property def y(self): return self._y @total_ordering class Vector(object): def __init__(self, start, end): self.start = start self.end = end self._length = sqrt( (self.end.x - self.start.x) ** 2 + (self.end.y - self.start.y) ** 2 ) @property def length(self): return self._length def __gt__(self, other): return self.length > other.length def __eq__(self, other): return self.length == other.length def generate_pairs(minx=0, maxx=100, miny=0, maxy=100, count=100): for _ in xrange(count): yield ( Point(randint(minx, maxx), randint(miny, maxy)), Point(randint(minx, maxx), randint(miny, maxy)) ) def generate_vectors(gen_pairs, count=20): return [ Vector(*pair) for pair in gen_pairs(count=count) ] def choosing_game(vectors): first_player_vectors = [] second_player_vectors = [] while vectors: first_choice = max(vectors) first_player_vectors.append(first_choice) vectors.remove(first_choice) second_choice = max(vectors) second_player_vectors.append(second_choice) vectors.remove(second_choice) first_sum = sum([ vector.length for vector in first_player_vectors ]) second_sum = sum([ vector.length for vector in second_player_vectors ]) if first_sum == second_sum: return 'draw' elif first_sum > second_sum: return 'first' else: return 'second' def monte_carlo(trials=1000): results = { 'draw': 0, 'first': 0, 'second': 0 } for trial in xrange(trials): vectors = generate_vectors(generate_pairs, 10) results[choosing_game(vectors)] += 1 return results print monte_carlo()
[22:52] home:~/dev python help.py
{'draw': 0, 'second': 0, 'first': 1000}
Отредактировано fata1ex (Май 30, 2012 00:37:41)
Офлайн
спасибо, только этот код почему то не идет у меня…
Офлайн
Что значит “не идет”? Во-первых, у вас другая версия питона, поэтому могут быть нестыковки. Разбирайтесь, пишите, что не получается.
Ага. Bидимо, всё-таки надо суммировать выбранные игроками векторы, а не суммировать их длины. В таком случае логика выбора должна поменяться. С этим уж как-нибудь самостоятельно.
Отредактировано fata1ex (Май 30, 2012 00:38:22)
Офлайн
Я пока пытаюсь поработать со своим кривым кодом, у меня появился другой вопрос…
Если я с клавиатуры ввожу какой либо элемент(массив) своего массива векторов и при нахождении таково же удаляю его, длина массива у меня меняется соответственно и вылетает ошибка, как можно это реализовать?
while len(mas_vector) >= 1:
print mas_vector
a = input ('Выберите вектор: ')
user_score += 1
j = 0
len_mas = len(mas_vector)
while j!=len_mas:
if a == mas_vector:
mas_vector.pop(j)
j = j + 1
else:
j = j + 1
Офлайн
Еще раз вам говорю: оформляйте ваши примеры в тегах code.
>>> arrays = [[1,2],[3,4],[5,6]] >>> needle = map(int, raw_input('Enter array to remove: ').split()) Enter array to remove: 1 2 >>> needle [1, 2] >>> arrays.remove(needle) >>> arrays [[3, 4], [5, 6]]
Офлайн
спасибо, помогло
Офлайн
OksanaOksanaсумма векторов - это вектор
Проигрывает тот, у кого сумма выбранных им векторов имеет меньшую длину.
Офлайн