游戏规则:
有一个筛子游戏:
1.已知:有2个玩家,每个玩家有3个骰子(dice)
2.问:猜测这6个骰子的点数的类型及每一类的个数
(比如1点出现3次,6点出现3次)
类的设计
UNL之类图:
中文描述类的结构
1.骰子游戏本身是个class,名称为DiceGame
2.玩家是一个class,名称为Player
3.骰子本身也是个class,名称为Dice
DiceGame的结构:
- 属性:player(两个User)
- 方法: start_ganme, get_win
Player的结构:
- 属性:
- 方法:cast(投掷,逻辑上的),guess_dice(猜测点数)
Dice的结构:
- 属性:点数(num)
- 方法:get_num(获取点数), move(真正实施cast的物理操作)
调用关系:
代码:
import random
class Game:
def __init__(self,player1,player2):
self.player1=player1
self.player2=player2
print("游戏初始化成功,可以开始")
def start_game(self):
self.player1.cast()
self.player2.cast()
print(self.player1)
print(self.player2)
del get_win():
self.player1.guess_dice()
self.player2.guess_dice()
#判断谁赢了
class Player:
def __init__(self,name,sex,*dice):
self.name=name
self.sex=sex
self.dices=dice#表示该玩家拥有的骰子列表(元组)
#玩家抛骰子
def cast(self):
for dice in self.dices:
dice.move()
def guess_dice(self):
return (4,2)
def __str__(self):
play_dice_count_list=[self.dices[0].count,self.dices[1].count,self.dices[2].count]
return "姓名为:%s,投掷的骰子点数信息为:%s"%(self.name,str(play_dice_count_list))
class Dice:
def __init__(self):
self.count=0
#骰子滚动的方法,滚动之后该骰子的点数确定了
def move(self):
self.count=random.randint(1,6)
#游戏开始之前准备六颗骰子
d1=Dice()
d2=Dice()
d3=Dice()
d4=Dice()
d5=Dice()
d6=Dice()
#每次游戏需要两个玩家对象
p1=Player("player1","男",d1,d2,d3)
p2=Player("player2","女",d4,d5,d6)
#一共要玩五次游戏
for i in range(1,6):
print("第%d次游戏的情况----------"%i)
game=Game(p1,p2)
game.start_game()
个人心得:
- 根据业务逻辑,抽象出几个类
- 根据每个类的特点,抽象出他们最基本的属性和方法
- 根据各个类,画出调用关系图
- 自底向上的编码:
- 先搭建整个模块的框架:思考自上层向底层的调用关系,自上而下地思考
- 先写底层,并测试底层,直到成功为止。再写上层,自下而上的编码
参考文献:
[1] 基于尚学堂python基础视频的自己整理