首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC基础设施

MVC基础设施
EN

Stack Overflow用户
提问于 2015-12-10 13:53:42
回答 1查看 62关注 0票数 0
代码语言:javascript
复制
import random

class Spinner(object):

@staticmethod
def getSpin():
    newSpin = random.randint(1,6)
    return newSpin

class Player(object):

def __init__(self,name):
    self.position = 1
    self.name = name

def setName(self,name):
    self.name = name

def changePosition(self,number):
    self.position = self.position + number

def setPosition(self,pos):
    self.position = pos
    return self.position

def getPosition(self):
    return self.position

def getName(self):
    return self.name

def spin(self):
    newSpin = Spinner.getSpin()
    self.position = self.position + newSpin
    print(str(self.name) + "'s spin was: " + str(newSpin))

class Display():
def buildLadders():
    ladders = [[0 for x in range(2)] for x in range(2)]
    ladders[0][0] = 2
    ladders[0][1] = 7
    ladders[1][0] = 4
    ladders[1][1] = 5
    return ladders

def buildChutes():
    chutes = [[0 for x in range(2)] for x in range(2)]
    chutes[0][0] = 9
    chutes[0][1] = 2
    chutes[1][0] = 6
    chutes[1][1] = 3
    return chutes

 class Check(Player):
def checkLadders(self):
    ladders = Display.buildLadders()
    for i in range(0,len(ladders),1):
        if self.getPosition() == ladders[i][0]:
            self.position = self.setPosition(ladders[i][1])
            print(str(self.name) + " Landed on a Ladder! from " + \
                  str(ladders[i][0]) +" to " + str(ladders[i][1]))

def checkChutes(self):
    chutes = Display.buildChutes()
    for i in range(0,len(chutes),1):
        if self.getPosition() == chutes[i][0]:
            self.position = self.setPosition(chutes[i][1])
            print(str(self.name) + " Landed on a Chutes! from " + \
                  str(chutes[i][0]) + " to " + str(chutes[i][1]))

def checkQuestions(num):
    one = random.randint(num,num*10)
    two = random.randint(num,num*10)
    listqq = [one,two]
    return listqq

class Controller(object):
def __init__(self,names):
    self.winner = ''
    self.players = []
    for n in names:
        p = Player(n)
        self.players.append(p)

def move(self):
    players = self.players
    winner = self.winner
    click = ''
    count = 1
    while True:
        for i in range(0,len(players)):
            if winner == '' and click != 'e':
                print("----" + str(players[i].getName()) + "'s TURN----")
                click = input("Press r to roll or e to exit: ")
                while click != 'r' and click != 'e':
                    click = input("Press r to roll or e to exit: ")
                if click == 'r' and click != 'e':
                    count = count + 1
                    listqq = Check.checkQuestions(count)
                    answer = input(str(listqq[0]) + ' + ' + str(listqq[1]) +' is:')
                    if answer == str(listqq[0]+listqq[1]):
                        print(str(players[i].getName()) + "'s initial position is " \
                                + str(players[i].getPosition()))
                        View(players).display()
                        players[i].spin()
                        Check.checkLadders(players[i])
                        Check.checkChutes(players[i])
                    else:
                        pass
                    if players[i].getPosition() >= 12:
                        players[i].position = players[i].setPosition(12 - (players[i].getPosition() - 12))
                    print(str(players[i].getName()) + "'s new position is " \
                            + str(players[i].getPosition()))
                    View(players).display()
            if players[i].getPosition() == 12:
                winner = players[i].getName()
        if click == 'e' and click != 'r':
            print('Bye')
            break
        if winner != '':
            print(str(winner) + " is the winner!!!")
            break

class View(Player):
def __init__(self,player):
    self.players = player

def display(self):
    players = self.players
    listof = [9,10,11,12,8,7,6,5,1,2,3,4]
    ladders = Display.buildLadders()
    chutes = Display.buildChutes()
    board = [[]] * 3
    for i in range(len(players)):
        for j in range(len(listof)):
            if self.players[i].position == listof[j]:
                listof[j] = 'X'
    for j in range(len(listof)):
        for i in range(len(ladders)):
            if ladders[i][0] == listof[j]:
                listof[j] = 'L'
    for j in range(len(listof)):
        for i in range(len(chutes)):
            if chutes[i][0] == listof[j]:
                listof[j] = 'C'
    for i in range(0,4):
        board[0] = board[0] + [listof[i]]
    for i in range(4,8):
        board[1] = board[1] + [listof[i]]
    for i in range(8,12):
        board[2] = board[2] + [listof[i]]
    for row in board:
        for num in row:
            if num == 'X':
                print(" X", end=" ")
            if num == 'L':
                print(" L", end= " ")
            if num == 'C':
                print(" C", end= " ")
            if num != 'X' and num != 'L' and num != 'C':
                if 10 <= num <= 20:
                    print(num,end=" ")
            if num != 'X' and num != 'L' and num!= 'C':
                if 1 <= num <= 9:
                    print(str(num).rjust(2), end= " ")
        print()


def main():
n = input("Please enter number of players: ")
names  = []
for i in range (0,int(n)):
    name = input("Please input your name: ")
    names.append(name)
game = Controller(names)
game.move()
while True:
    ask = input("Do you want to play again? (y/n)")
    if ask == 'y':
        game = Controller(names)
        game.move()
    if ask == 'n':
        print("Bye, see you again!")
        break
 main()

固定版本:

代码语言:javascript
复制
import random

 class Player(object):

def __init__(self,name):
    self.position = 1
    self.name = name

def setName(self,name):
    self.name = name

def changePosition(self,number):
    self.position = self.position + number

def setPosition(self,pos):
    self.position = pos
    return self.position

def spin(self):
    newSpin = self.getSpin()
    self.position = self.position + newSpin
    print(str(self.name) + "'s spin was: " + str(newSpin))

def checkLadders(self):
    ladders = self.buildLadders()
    for i in range(0,len(ladders),1):
        if self.position == ladders[i][0]:
            self.position = self.setPosition(ladders[i][1])
            print(str(self.name) + " Landed on a Ladder! from " + \
                  str(ladders[i][0]) +" to " + str(ladders[i][1]))

def checkChutes(self):
    chutes = self.buildChutes()
    for i in range(0,len(chutes),1):
        if self.position == chutes[i][0]:
            self.position = self.setPosition(chutes[i][1])
            print(str(self.name) + " Landed on a Chutes! from " + \
                  str(chutes[i][0]) + " to " + str(chutes[i][1]))
@staticmethod
def checkQuestions(num):
    one = random.randint(num,num*10)
    two = random.randint(num,num*10)
    listqq = [one,two]
    return listqq

@staticmethod
def getSpin():
    newSpin = random.randint(1,6)
    return newSpin

@staticmethod
def buildLadders():
    ladders = [[0 for x in range(2)] for x in range(2)]
    ladders[0][0] = 2
    ladders[0][1] = 7
    ladders[1][0] = 4
    ladders[1][1] = 5
    return ladders

@staticmethod
def buildChutes():
    chutes = [[0 for x in range(2)] for x in range(2)]
    chutes[0][0] = 9
    chutes[0][1] = 2
    chutes[1][0] = 6
    chutes[1][1] = 3
    return chutes


class Controller(object):
def __init__(self,names):
    self.winner = ''
    self.players = []
    for n in names:
        p = Player(n)
        self.players.append(p)

def move(self):
    players = self.players
    winner = self.winner
    click = ''
    count = 1
    while True:
        for i in range(0,len(players)):
            if winner == '' and click != 'e':
                print("----" + str(players[i].name) + "'s TURN----")
                click = input("Press r to roll or e to exit: ")
                while click != 'r' and click != 'e':
                    click = input("Press r to roll or e to exit: ")
                if click == 'r' and click != 'e':
                    count = count + 1
                    listqq = Player.checkQuestions(count)
                    answer = input(str(listqq[0]) + ' + ' + str(listqq[1]) +' is:')
                    if answer == str(listqq[0]+listqq[1]):
                        print(str(players[i].name) + "'s initial position is " \
                                + str(players[i].position))
                        View(players).display()
                        players[i].spin()
                        Player.checkLadders(players[i])
                        Player.checkChutes(players[i])
                    else:
                        pass
                    if players[i].position >= 12:
                        players[i].position = players[i].setPosition(12 - (players[i].getPosition() - 12))
                    print(str(players[i].name) + "'s new position is " \
                            + str(players[i].position))
                    View(players).display()
            if players[i].position == 12:
                winner = players[i].name
        if click == 'e' and click != 'r':
            print('Bye')
            break
        if winner != '':
            print(str(winner) + " is the winner!!!")
            break

class View():
def __init__(self,player):
    self.players = player

def display(self):
    players = self.players
    listof = [9,10,11,12,8,7,6,5,1,2,3,4]
    ladders = Player.buildLadders()
    chutes = Player.buildChutes()
    board = [[]] * 3
    for i in range(len(players)):
        for j in range(len(listof)):
            if self.players[i].position == listof[j]:
                listof[j] = 'X'
    for j in range(len(listof)):
        for i in range(len(ladders)):
            if ladders[i][0] == listof[j]:
                listof[j] = 'L'
    for j in range(len(listof)):
        for i in range(len(chutes)):
            if chutes[i][0] == listof[j]:
                listof[j] = 'C'
    for i in range(0,4):
        board[0] = board[0] + [listof[i]]
    for i in range(4,8):
        board[1] = board[1] + [listof[i]]
    for i in range(8,12):
        board[2] = board[2] + [listof[i]]
    for row in board:
        for num in row:
            if num == 'X':
                print(" X", end=" ")
            if num == 'L':
                print(" L", end= " ")
            if num == 'C':
                print(" C", end= " ")
            if num != 'X' and num != 'L' and num != 'C':
                if 10 <= num <= 20:
                    print(num,end=" ")
            if num != 'X' and num != 'L' and num!= 'C':
                if 1 <= num <= 9:
                    print(str(num).rjust(2), end= " ")
        print()


def main():
n = input("Please enter number of players: ")
names  = []
for i in range (0,int(n)):
    name = input("Please input your name: ")
    names.append(name)
game = Controller(names)
game.move()
while True:
    ask = input("Do you want to play again? (y/n)")
    if ask == 'y':
        game = Controller(names)
        game.move()
    if ask == 'n':
        print("Bye, see you again!")
        break

main()

这是否遵循MVC基础架构?如何知道它是否适合MVC结构?谢谢。我们是否必须将每个模型、视图和控制器放在不同的模块中才能描述为遵循MVC结构?

EN

回答 1

Stack Overflow用户

发布于 2015-12-11 07:22:10

首先,程序并不是真正面向对象的。每次必须显示游戏状态以调用one且唯一的方法时,都会实例化View。只有__init__()和另一个方法的类是一种代码味道,因为,就像本例中一样,它只是一个无缘无故地塞进类中的函数。同样的道理也适用于Control --也就是__init__()和一个额外的方法,get在实例化对象之后只调用一次,而在调用之后对象就不再使用了。

使用这些“假”类,并考虑到你印象中的静态方法的数量,类会自动产生面向对象的程序--它们不会。使用函数而不是人为地引入不必要的复杂性并没有错,因为类只是语法上的类。在Python中,函数也是对象,所以当您有一个display函数时,可以将其作为MVC模式的“view”部分传递。它是一个可调用的对象。

这就引出了MVC的问题:假设Player是模型,那么它就不应该通过打印内容来与用户交互。显示和输入由视图处理。因此,Control不是一个控制器,因为伪装后的函数还通过print()input()与用户进行大量交互。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34194682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档