Python创意游戏《王的使命》

设置中文字体

实现效果:在游戏窗口中,正确显示中文文本。

py

screen.draw.text('你好', (10, 10), fontname='puhuiti.ttf', fontsize=40, color='blue')

参数说明:

fontname 设置字体的类型,字体文件存在fonts文件夹中
fontsize 设置字体大小,默认大小是24
color 设置字体颜色,默认颜色是白色

注意:不同参数之间用逗号隔开

切换介绍信息

效果

每点击一次鼠标,介绍信息就切换一句

思路

1. 鼠标点击次数与列表中句子的索引相同
2. 定义变量n记录鼠标的点击次数,每点击鼠标1次,n增大1
3. 利用全局变量n关联draw()函数on_mouse_down()函数

每句话的索引和鼠标点击次数

py

info = ['你是一位雄心勃勃的国王', '你的使命是:提升国民的幸福感、
\n提升军s实力、维持国家安定统一', '大臣们会为你提供各种治g建议, 
n\你需要对这些建议作出抉择', '每一项决策都会影响到\n你自己的声望值和财富值', 
'声望和财富上升,会得到国民拥戴;\n反之,
也会引起民众的不满', '点击任意位置开始游戏,\n履行你作为国王的使命吧......']
列表索引 0 1 2 3 4 5
点击次数 0 1 2 3 4 5
第几句话 1 2 3 4 5 6

逐句显示游戏介绍
王的使命

button参数

on_mouse_down(button)中的button参数可以判断 鼠标操作。
button常用的值有4个:

mouse.LEFT 点击鼠标左键
mouse.RIGHT 点击鼠标右键
mouse.WHEEL_UP 向上滑动滚轮
mouse.WHEEL_DOWN 向下滑动滚轮
py

def on_mouse_down(button):
    if button == mouse.LEFT:
        print('按下鼠标左键')
    if button == mouse.RIGHT:
        print('按下鼠标右键')
    if button == mouse.WHEEL_UP:
        print('向上滑动滚轮')
    if button == mouse.WHEEL_DOWN:
        print('向下滑动滚轮')

通过设置button参数,限制只有点击鼠标左键,才显示下一句话
王的使命

切换游戏背景

效果

最后一句介绍信息显示完,再次点击鼠标,切换窗口显 示内容,进入玩家决策阶段

思路

1. 定义全局变量state记录游戏的不同阶段
2. on_mouse_down()中,根据鼠标点击次数改变state的值
3. draw()中,根据state的值绘制决策背景
王的使命

游戏的四个阶段

《王的使命》游戏有4个阶段
王的使命

游戏阶段 表示
游戏介绍 begin
玩家决策 choice
结果展示 show
游戏结束 end

鼠标点击角色

pygame中判断鼠标是否点击到某个角色,需要两步:
1. 定义on_mouse_down()函数。

py

def on_mouse_down():
    print('鼠标被按下了')

按下鼠标按键时,被自动调用一次,会执行下级代码。
2. 使用角色.collidepoint(pos)检测鼠标指针是否碰到了角色。

py

def on_mouse_down(pos):
    if yes.collidepoint(pos):
        print('点击了同意按钮')
    elif no.collidepoint(pos):
        print('点击了驳回按钮')

运行程序,每次点击同意按钮,都会输出“点击了同意按钮”,点击驳回按钮,都会输出“点击了驳回按钮”。

不同选择展示不同结果

游戏中,要根据不同的选择,展示不同的决策结果。

思路

1. 把决策问题及对应的结果作为一个子列表,存储在二维列表中。其中,子列表的第二位存储同意结果,第三位存储驳回结果。

py

question=[
['要建立军队吗?', '攻打邻国...', '国家灭亡...'],
['要攻打邻国吗?', '战争胜利...', '忌惮邻国...'],
['要加税收...吗?', '怨声载道...', '发展农业...'],
['要花金钱...吗?', '国库亏空...', '战败亡国...'],
['要将民众...吗?', '连年征战...', '民众起义...'],
['要将财产...吗?', '国家繁荣...', '人民困苦...'],
]

同意结果在子列表中的索引为1,驳回结果在子列表中的索引为2。
2. 使用变量ci存储决策结果的索引,初始值设为0, 点击同意按钮后,把ci设为1,点击驳回按钮后,把ci设为2。

py

ci = 0

def on_mouse_down(button, pos):
    global ci   #global声明
    if yes.collidepoint(pos):
        ci = 1  #同意结果索引
    elif no.collidepoint(pos):
        ci = 2  #驳回结果索引   

3. 根据索引绘制决策结果:ci为1 绘制同意结果; ci为2 绘制驳回结果。

py

def draw():
    screen.blit('展示背景',(0,0))
    screen.draw.text(qustion[qi][ci], (100,150), fontname='puhuiti.ttf', fontsize=40, color='black')

运行程序,点击 同意/驳回按钮,游戏就会根据玩家的选择展示出二维列表question中对应索引的决策结果。

不同选择触发不同问题

当游戏从展示阶段切换到决策阶段时,需要显示新的决策问题。

思路

1. 在子列表的第四位存储选择同意时,下一条决策信息的索引。在子列表的第五位存储选择驳回时,下一条决策信息的索引。

py

question=[
['要建立军队吗?', '攻打邻国...', '国家灭亡...', 1,100],
['要攻打邻国吗?', '战争胜利...', '忌惮邻国...',2,3],
['要加税收...吗?', '怨声载道...', '发展农业...',4,5],
['要花金钱...吗?', '国库亏空...', '战败亡国...',2,100],
['要将民众...吗?', '连年征战...', '民众起义...',100,100],
['要将财产...吗?', '国家繁荣...', '人民困苦...',100,100],
]

只需要查看二维列表question,就可以看出来每一个问题及问题之间的关系。
2. 因为决策的总是是根据qi的值绘制出来的,所以要显示新的决策问题,就需要在决策以后,修改qi的值。

py

def draw():
    global qi
    ...
    screen.draw.text(question[qi][0]), (280,140),fontname='puhuiti.ttf', fontsize=40, color='royablue2')

#根据不同的选择,把qi设为下一条决策信息的索引

def on_mouse_down(pos):
    global qi
    ...
    if ci == 1:
        qi = question[qi][3]
    elif ci == 2:
        qi = question[qi][4]

运行程序,每次鼠标点击同意按钮或者驳回后,qi的值就会变二维列表中对应的索引,能绘制出新的决策问题。

声望和财富系统

玩家在进行决策后,声望值和财富值应该根据选项发生变化。

步骤1:完善列表

将每个决策选择同意或驳回时,对应的声望值和财富值变化量存储在列表中。

选择同意时:
声望和财富值的变化量存储在列表中第6、7项。

选择驳回时:
声望和财富值的变化量存储在列表中第8、9项。

步骤2:修改声望值和财富值

当同意、驳回按钮被点击后,从列表question中取出声望值和财富值的变化量,增加到变量score1和score2上。

py

def on_mouse_down(button,pos):
    global n, state, qi, ci
    global score1, score2
    if button == mouse.LEFT:
        if state == 'begin':
            ...
        elif state == 'choice':
            if yes.collidepoint(pos):
                score1 += question[qi][6]
                score2 += question[qi][7]
                state='show'
                ci=1
            elif no.collidepoint(pos):
                score1 += question[qi][8]
                socre2 += question[qi][9]
                state='show'
                ci=2

游戏结束界面

当剧情走向结局时,我们切换游戏状态并绘制出结束界面。
不同的结局对应不同的结束界面背景。
修改每个子列表中的结束索引,将它改为对应的背景图名称。

py

question=[
['要建立军队吗?', '大臣建议攻打邻g,n\以获得更多土地', '邻g攻打,国j灭亡', 1,100,3,-3,-5,-5],
['要攻打邻g吗?', '战z胜利,获得大片土地,\n但战z也消耗了大量财产,\n国ku亏空', '本国没有发动战z,\n但也十分忌惮邻国',2,3,3,-2,-2,3],
['要加民众shui收\n填补国ku的亏k吗?', '民众被shui收压得怨声载道,\n为了平民f,\n大臣提出一个办法', '大力发展农业来填补国ku亏空,\n经济复苏',4,5,-5,4,5,8],
['要花费大量金钱\n购买wu器吗?', '国ku亏空...', '战败亡g...',2,100,3,-5,-5,-3],
['要将民众...吗?', '连年征战...', '民众起义...',300,400,-5,-3,-7,-5],
['要将财产...吗?', '国家繁荣...', '人民困k...',500,600,5,5,-6,-2],
]

绘制结束背景

在draw()函数中进行判断,当游戏状态变量state的值为’end’时,绘制剧情对应的结束背景图。
全局变量qi为结束索引值

py

def draw():
    global n, state, score1, score2, qi, ci
    if state == 'begin':
        ...
    elif state == 'choice':
        ...
    elif state == 'show':
        ...
    elif state == 'end':
        screen.blit(str(qi), (0,0))

最终评价系统

游戏结束后,需要根据声望值和财富值计算出最终评价。

最终评价

最终评价由声望称号和财富称号组成,声望称号由声望值计算得出,财富称号由财富值计算得出。
声望值和财富值与称号对应表

声望值 声望称号 财富值 财富称号
15分以上 受人爱戴 15分以上 富甲一方
5分以上15分以下 平平无奇 5分以上15分以下 囊中羞涩
5分以下 声名狼藉 5分以下 穷困潦倒

将声望称号和财富称号拼接起来,并绘制在结束界面上。

Code Source

def draw():
    global n, state, score1, score2, qi, ci, fame, money
    if state == 'begin':
        ...
    elif state == 'choice':
        ...
    elif state == 'show':
        ...
    elif state == 'end':
        screen.blit(str(qi), (0,0))
        s='你是一位'+ fame + '并且' + money + '的国王'
        screen.draw.text(s,
        (60, 150),
        fontname='puhuiti.ttf',
        fontsize=40,
        color='white'
        )
那年 • 今日
写于2022年10月31日
没有伞的孩子,必须学会努力奔跑。

赞助 点赞 1

暂无评论,抢沙发?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注