少儿编程教学:码趣君教你用Python编写推星星游戏(二) ...

[复制链接]
uqgtvoqjar 发表于 2018-3-1 10:21:47 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
) L3 f2 b/ C! h" g  @) v- m
制作游戏的难度是很高的, H: }" p  p0 Y- v5 [! y, D" X
所以每个想要学习制作的游戏的学生
& m* E# Y4 m, M2 z1 q. \一定要打好代码基础、理解代码内容和逻辑
. r* Z+ J$ p% T4 b5 T! B3 J才能在以后做出让人惊叹的游戏噢!& ]: l2 K$ p! B5 E) M9 L  r# w9 r$ v
话不多说,来看之后的代码吧。
4 Z) A$ f& n5 S7 t  I4 a" p1 Q! }# t代码部分/ v4 o$ X1 Q; N0 b8 @8 u. z

: p) Y9 V8 P7 n; B! J& ~* M  B% N73.! d; T4 q) U& V5 e9 O/ J
74. # 字典里的值都是全局值,
6 X+ v5 q  G* p# [' m9 @& ?75. # 并规划字符在关卡文件中所代表的表层对象
4 m' Z0 Z3 b+ e- X: u* Y% {% a76. TILEMAPPING = {'x': IMAGESDICT['corner'],9 |( z0 A2 @- }+ n7 k) S- `
77. '#': IMAGESDICT['wall'],
& n$ ]5 D& H9 S/ Y- N% o78. 'o': IMAGESDICT['inside floor'],  L9 R4 b$ \( g+ x* a  `; t
79. ' ': IMAGESDICT['outside floor']}
% n( K, y5 {- o7 _  j地图的数据结构只是一系列的2D字符串。TILEMAPPING字典将地图数据结构中使用的字符与他们所代表的图片链接起来。(在drawMap()函数的解释里将显得更直观易懂)
8 `& }) `" z7 s6 b& x: a80. OUTSIDEDECOMAPPING = {'1': IMAGESDICT['rock'],6 I- `8 I2 t7 J# o" h3 S7 g
81. '2': IMAGESDICT['short tree'],
0 `5 p$ A. `5 d2 u  w( |/ }82. '3': IMAGESDICT['tall tree'],
5 U. y: _" a6 s6 E% n6 T- @, L83. '4': IMAGESDICT['ugly tree']}3 j0 [- ~( m+ N9 \! S
OUTSIDEDECOMAPPING也是一个将地图数据结构中使用的字符与读取图片链接起来的字典。
( m$ A: p  i1 N% w! L“外部装饰”图将绘制在草地方块上方。6 A3 V1 y8 G' r/ s3 @0 L
85. # PLAYERIMAGES是一个列表包括所有玩家可以变成的字符
& s3 n& L, r, ^7 r86. # currentImage 是玩家当前使用的角色图片的索引
1 n; v0 g$ R6 R) ?% W87. currentImage = 09 P9 K$ x7 P1 O: d
88. PLAYERIMAGES = [IMAGESDICT['princess'],
  A, H# a, P# U) \) a89. IMAGESDICT['boy'],
0 h' v' j( `& |90. IMAGESDICT['catgirl'],
) i, M; D4 }* v6 L& q) i! j91. IMAGESDICT['horngirl'],5 H' A3 N2 E3 F: @7 g8 T8 \
92. IMAGESDICT['pinkgirl']]
9 ]* s/ j( S" S3 R$ E+ G- ePLAYERIMAGES列表储存用来改变控制角色形象的图片。9 X- U( ~7 [. p4 X
currentImage变量跟随当前使用的角色图片的序号。举个例子,当currentImage设置为0那么PLAYERIMAGES也为[0],而角色就会显示”“公主”这一形象的图片: r! w$ f% D& _# }; [& `$ {- r
) v) F0 D( ?6 e% T6 o# f
% w# G) S  \9 l" S3 Y+ n$ T

* F1 d! V3 i5 i7 G3 o3 u% U' u) u7 N, g) S- P; }" f. p

; Q6 W4 S& j! {9 T4 o3 a$ u9 G. i94. startScreen() # 显示标题画面直到玩家按下任意一个键* l7 L" t& e0 {$ |4 W
95.
/ ?$ J# V* t4 ~" O3 M5 D96. # 读取关卡文件里的关卡& G3 O, g8 z6 n5 O; N) M: h
97. # 通过readLevelsFile()来获取关卡文件格式的细节并了解如何编写自己的关卡1 u7 }, H4 T! [. ]  H
98. levels = readLevelsFile('starPusherLevels.txt')* V5 r1 R7 A, C1 P; K* \( p0 @
99. currentLevelIndex = 0
$ y0 O8 W" A6 EstartScreen()函数将会持续显示初始画面(这个画面带有游戏教程)直到玩家按下任意一个键。当玩家按下任意键后,startScreen()函数将返回并通过关卡文件读取关卡。玩家将从第一关开始,而这第一关就是在列表中序号为0的关卡。( G& c: T% i5 I( ~) j5 Q9 y! `

! ^0 {, T& v. P2 N" i7 A+ U2 N5 Y(开始界面)/ W7 F1 O# F; ~+ e- j& b* H
101. # 主要的游戏循环,这个循环在单个关卡运行
( E6 {6 \6 E) E102. # 当玩家完成这个关卡,循环将读取上/下一关
9 I" f9 `# X, ?9 K. |103. while True: # 主要游戏循环
' s. `+ u" B  x: a( s0 c: d( w104. # 运行关卡至开始游戏阶段:) ~" n1 y) ~, N0 Z. L
105. result = runLevel(levels, currentLevelIndex)
% ?9 [7 L5 U# X2 b& M+ nrunLevel()函数为游戏处理所有行为。这个函数通过一系列关卡对象并决定运行哪个整数序号关卡。. v6 U! d3 b- \" S7 H
当玩家完成关卡,runLevel()将反馈以下字符串:’solved’意味着玩家达成关卡目标,’next’意味着玩家想要跳关,’back’意味着玩家想返回上一关,’reset’意味着玩家想重启关卡。1 U# t1 h9 h3 ?
107. if result in ('solved', 'next'):- P1 y0 y( a( L% C- V* T+ \3 K
108. # 进入下一关
! c  Y( n2 y- U! n* o109. currentLevelIndex += 17 ?: k5 P" n! y3 r
110. if currentLevelIndex >= len(levels):( u) s5 y  ^7 {' k8 f  }
111. # 如果之后没有关卡则返回第一关. V3 j$ z$ V! t5 d4 {2 F
112. currentLevelIndex = 06 f- U- A& y$ ]4 B' |
113. elif result == 'back':
* q$ S) r. u+ `. N  p114. # 返回上一关
' V- F( w: E# d1 b. V$ C" T# ~! K115. currentLevelIndex -= 1, j  n6 z7 C0 Y1 `& }
116. if currentLevelIndex < 0:
7 R! V2 X7 |0 ^, _# w5 l117. # 如果没有上一关可以返回了则回到最后一关
4 x" `5 p' y' [# T% q' w118. currentLevelIndex = len(levels)-1
% {$ M. l  A! O, R0 c6 u如果runLevel()反馈的字符串为’solved’或者’next’,那么我们需要给增长量levelNum增加1。如果levelNum超过了关卡总数,那么levelNum设定回0。: B- A  p8 N; b" U! B; i
反过来同理,如果反馈的是’back’,levelNum就减1。如果减到低于0,那么就会设定回最后一关
2 l. |5 @4 p3 S& e- V
: ^. Q7 L* i  r7 L119. elif result == 'reset':
% k7 }& f8 l6 Z, ~+ |# Y8 E120. pass # 用来重新调用runLevel()重启关卡3 d# c5 Z+ f$ L& V; v( F/ ?$ Y" q
如果返回值为’reset’,代码不会起任何作用。
/ ^& F0 h" V4 [: z1 ppass语句在这里不起任何作用(更像一个评论),然而在Python编译器里是需要的,因为在elif语句后规定需要一行代码。- y3 W- A/ i1 l2 d2 {
我们完全可以移除119和120行,而程序不会受到影响。而没有删除的原因是为了程序的可读性,因为这样我们就不会忘记runLevel()同样能反馈字符串’reset’。  A# Y" q' w! i1 \; v. B" t
(未完待续)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

精彩评论2

lgy_103 发表于 2018-3-1 10:22:42 | 显示全部楼层
这幼稚的画面让我想起了迷你世界
回复

使用道具 举报

璀璨星辰 发表于 2018-3-1 11:21:49 | 显示全部楼层
可以,我试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
推荐阅读更多+
阅读排行更多+
用心服务创业者
0851-88611148
周一至周五 9:00-18:00
意见反馈:admin@0851life.com

扫一扫关注我们

Powered by 童码少儿编程 X3.4© 2001-2013 0851life Inc.|网站地图