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

[复制链接]
uqgtvoqjar 发表于 2018-3-1 10:21:47 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
% N' _6 f; e/ q% k7 x" a
制作游戏的难度是很高的8 P! S# v# t& J% u7 S
所以每个想要学习制作的游戏的学生0 E& V" }. ~6 g6 h; [6 M* C
一定要打好代码基础、理解代码内容和逻辑
2 ?8 l1 G2 [" Q7 m+ l% W2 L& p才能在以后做出让人惊叹的游戏噢!
. J* f' H4 n9 ?话不多说,来看之后的代码吧。
3 m) y0 e+ i& d: }  A- K7 a# _代码部分7 e9 ?, \- Z' O
. B# c* k1 i' O
73.
% Z9 p7 Z6 w  a" S7 |) s1 x8 O74. # 字典里的值都是全局值,
2 N3 Y! a( T1 s6 ]2 N- }* |75. # 并规划字符在关卡文件中所代表的表层对象# x3 _0 n) C. v
76. TILEMAPPING = {'x': IMAGESDICT['corner'],' D1 k( W# _3 D2 S, j9 X  z" u2 X( M; K
77. '#': IMAGESDICT['wall'],  F4 N  W5 u8 s! }  O# l9 A3 @$ T; Z
78. 'o': IMAGESDICT['inside floor'],1 }  q  s" c! g$ H6 n: u% v
79. ' ': IMAGESDICT['outside floor']}
. Q; l- B) Q+ ]- M* \地图的数据结构只是一系列的2D字符串。TILEMAPPING字典将地图数据结构中使用的字符与他们所代表的图片链接起来。(在drawMap()函数的解释里将显得更直观易懂)) t1 A7 h. b& u  ?  v6 D2 Q
80. OUTSIDEDECOMAPPING = {'1': IMAGESDICT['rock'],+ _3 H) y  h9 V; `% B9 @
81. '2': IMAGESDICT['short tree'],: r6 o! g- K+ g, j! i( Q7 e
82. '3': IMAGESDICT['tall tree'],1 L" ^2 h0 N; v2 k  x; b' r  n
83. '4': IMAGESDICT['ugly tree']}
- ]7 h  x! E- L5 {/ M: GOUTSIDEDECOMAPPING也是一个将地图数据结构中使用的字符与读取图片链接起来的字典。$ H0 Z2 _: m3 r( G% x. D2 U9 u
“外部装饰”图将绘制在草地方块上方。
& v: @7 `0 B% v7 Y85. # PLAYERIMAGES是一个列表包括所有玩家可以变成的字符- Q" d) Q1 I( @) Z2 \
86. # currentImage 是玩家当前使用的角色图片的索引
! Z* r3 u' H7 e87. currentImage = 0
. ~" [! i7 r& O6 n7 m4 @/ h. |88. PLAYERIMAGES = [IMAGESDICT['princess'],6 W& [( N  C7 O% |
89. IMAGESDICT['boy'],4 I0 N/ ~6 W: o. I2 R$ g
90. IMAGESDICT['catgirl'],7 `7 e, Y2 l7 Q$ A
91. IMAGESDICT['horngirl'],1 ~& n# X& J. ]
92. IMAGESDICT['pinkgirl']]
& ]( ]0 N0 F. p! ]4 @( x1 `PLAYERIMAGES列表储存用来改变控制角色形象的图片。
/ G/ l. }. h: pcurrentImage变量跟随当前使用的角色图片的序号。举个例子,当currentImage设置为0那么PLAYERIMAGES也为[0],而角色就会显示”“公主”这一形象的图片8 b6 E% x& I4 A2 J4 t( D
+ F$ g+ Z1 m& q! z+ X
* T* n6 L" r5 s+ V
" d) i; I* ]: N. Y2 n

$ k5 I: x# Y8 z) o% S. M  o% w/ p1 n
94. startScreen() # 显示标题画面直到玩家按下任意一个键
8 D2 N$ E# }: {8 v+ ^3 r95.
$ V7 |$ m$ X. i! X' t96. # 读取关卡文件里的关卡
6 D" s: Y. x% E  j9 i( q97. # 通过readLevelsFile()来获取关卡文件格式的细节并了解如何编写自己的关卡
2 i3 u9 i- u$ A% D' e& ?$ D, e98. levels = readLevelsFile('starPusherLevels.txt')
' j9 n% a1 B! b& g4 n' V( @99. currentLevelIndex = 0; Z  o4 b3 N- }# v- f
startScreen()函数将会持续显示初始画面(这个画面带有游戏教程)直到玩家按下任意一个键。当玩家按下任意键后,startScreen()函数将返回并通过关卡文件读取关卡。玩家将从第一关开始,而这第一关就是在列表中序号为0的关卡。
' Z; N3 S2 |" |$ [& U3 ~# l
3 m0 S% N" O: a" x  R(开始界面)
8 Q7 L( d( |' x; D' d0 G101. # 主要的游戏循环,这个循环在单个关卡运行6 f7 \+ N" W7 P2 Z6 X$ D
102. # 当玩家完成这个关卡,循环将读取上/下一关
( W2 h9 M) q: g$ p103. while True: # 主要游戏循环
  R/ ]7 l3 @  a7 D; E% R: V) Z104. # 运行关卡至开始游戏阶段:' i. b: \1 j5 n3 f$ v
105. result = runLevel(levels, currentLevelIndex)2 ^! [% s, y2 N! Z2 o/ e1 |
runLevel()函数为游戏处理所有行为。这个函数通过一系列关卡对象并决定运行哪个整数序号关卡。
( Q- v! |: X0 B& M1 h9 m& T- m当玩家完成关卡,runLevel()将反馈以下字符串:’solved’意味着玩家达成关卡目标,’next’意味着玩家想要跳关,’back’意味着玩家想返回上一关,’reset’意味着玩家想重启关卡。- R% ?9 c+ ]7 M4 n/ e# [
107. if result in ('solved', 'next'):
& M( w3 ~- c( n! p4 N# W" ?' C108. # 进入下一关
: ?0 ~- r3 r, q109. currentLevelIndex += 1
; U( [8 S5 c6 r. V2 d4 b* m110. if currentLevelIndex >= len(levels):+ S3 B9 |8 L/ _) o7 v0 f
111. # 如果之后没有关卡则返回第一关2 g9 E+ P8 b( A2 A  v
112. currentLevelIndex = 02 x; T: V0 }) q1 B9 W- k+ I& M) y
113. elif result == 'back':
8 G& U5 h/ M7 ^4 g; }/ g0 q' k: \1 \114. # 返回上一关) E( I: R: o# ]+ w% O
115. currentLevelIndex -= 1& T: N) J' }; {" n# b- \
116. if currentLevelIndex < 0:
0 B; J. L, }- ]1 N. z0 @. q- {117. # 如果没有上一关可以返回了则回到最后一关6 Q/ x5 c% Z& r% @* n
118. currentLevelIndex = len(levels)-17 C' {+ K6 S: u& k  n7 V, a, x9 \, S
如果runLevel()反馈的字符串为’solved’或者’next’,那么我们需要给增长量levelNum增加1。如果levelNum超过了关卡总数,那么levelNum设定回0。% n& U" Y: T9 a7 q: A) j- j
反过来同理,如果反馈的是’back’,levelNum就减1。如果减到低于0,那么就会设定回最后一关( O# m" l- W$ x6 X. R4 m
: ~3 q% E  h3 O( ], N* V
119. elif result == 'reset':
. p& ~/ \! d& U+ D120. pass # 用来重新调用runLevel()重启关卡9 c# U8 F# S4 L8 y: q  h! h$ o, o
如果返回值为’reset’,代码不会起任何作用。
& \+ L+ J( b5 g% ?( Xpass语句在这里不起任何作用(更像一个评论),然而在Python编译器里是需要的,因为在elif语句后规定需要一行代码。3 e" i3 `% ^+ M2 M% z3 y# I/ N. K
我们完全可以移除119和120行,而程序不会受到影响。而没有删除的原因是为了程序的可读性,因为这样我们就不会忘记runLevel()同样能反馈字符串’reset’。" b6 [) T, }  `7 W( z2 p7 k% n
(未完待续)

本帖子中包含更多资源

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

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.|网站地图