Итерация по существующим значениям списка при создании его с пониманием списка - PullRequest
0 голосов
/ 30 декабря 2018

, хотя это совершенно не нужно, я все еще хочу попытаться поместить все, что я могу, в как можно меньшие строки кода при использовании ООП

Я сделал код без ООП, но кто-то спросил, может ли онПо завершении ООП проблему можно решить с помощью большего количества строк кода, но я хочу поместить как можно больше в 1

class Player:
    def __init__(self,x,y,z,a):
        self.id = x
        self.prompt = y
        self.score = z
        self.overall_scores = a

players = [Player(x,y,random.randint(1,6),{z.id:z.score for z in players} 
if x == 3 else None) for x,y in zip(range(0,4),["First", "Second", "Third", 
"Fourth"])]

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

Что должна делать программа: каждому игроку присваивается случайный балл, а затем ранжируется на основе самого высокого балла

Редактировать: поскольку был запрошен код без ООП, вот он:

import operator,random

players = {x:0 for x in range(0,4)}
prompts = ["First", "Second", "Third", "Fourth"]

for a in players:
    players[a] = random.randint(1,6)
    print("%s:\nDice: %s" % (prompts[a],players[a]))
sorted_players = sorted(players.items(),key=operator.itemgetter(1))

draw = True
previous = 0
draw_between = []
first = True
for a in sorted_players[::-1]:
    if first:
        previous = a[1]
        first = False
    elif previous != a[1]:
        draw = False
    if draw:
        draw_between.append(a[0])

if draw:
    print("The chances of this were astronomically low but it happened anyway!")
    print("It's a draw!")
elif len(draw_between) <= 1:
    print("%s Player Wins!" % (prompts[sorted_players[-1][0]]))
else:
    out = "First place is a draw between Players:\n"
    draw_between.sort()
    for b,a in enumerate(draw_between):
        out += str(prompts[a])
        if b < len(draw_between)-1:
            out += ", "
    print(out)

1 Ответ

0 голосов
/ 30 декабря 2018

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

import random


class Player:
    def __init__(self, x, y, z):
        self.id = x
        self.prompt = y
        self.score = z


players = [Player(x,
                  y,
                  random.randint(1, 6))
           for x, y in zip(range(0, 4), ["First", "Second", "Third", "Fourth"])]

sorted_players = sorted([Player(x,
                                y,
                                random.randint(1, 6))
                         for x, y in zip(range(0, 4), ["First", "Second", "Third", "Fourth"])], 
                        key=lambda dude: dude.score, reverse=True)
...