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

[复制链接]
uqgtvoqjar 发表于 2018-3-1 10:21:47 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

. a. I. f# V# {! X2 a+ Q( H制作游戏的难度是很高的2 n" [  {( L, j7 ^8 f
所以每个想要学习制作的游戏的学生
/ u; \, P* _# T" C" v一定要打好代码基础、理解代码内容和逻辑
3 ]. m. ^5 J% m( O( R% C才能在以后做出让人惊叹的游戏噢!( J3 y6 i. w1 R+ C6 g
话不多说,来看之后的代码吧。5 ~6 p$ }; _+ O9 O' p( y$ s
代码部分
0 L+ s  Z3 h5 c. v$ c, W; Q8 o2 B7 [- ^" W2 e& I( f: u
73.
* }5 K0 `6 w, B. ?0 q  c74. # 字典里的值都是全局值,
# }4 N7 E- g, C) H75. # 并规划字符在关卡文件中所代表的表层对象2 ^' ~6 G# Y& X
76. TILEMAPPING = {'x': IMAGESDICT['corner'],
7 h3 K" U2 ?  c% c- F+ j. j* r77. '#': IMAGESDICT['wall'],
5 O/ l$ E0 [4 W% X$ M* i78. 'o': IMAGESDICT['inside floor']," x' l  ~+ f7 ?. D1 e
79. ' ': IMAGESDICT['outside floor']}; _7 K/ j9 C& {3 ]0 }; K
地图的数据结构只是一系列的2D字符串。TILEMAPPING字典将地图数据结构中使用的字符与他们所代表的图片链接起来。(在drawMap()函数的解释里将显得更直观易懂)
3 h/ l* `8 R& G/ q+ d1 {. e80. OUTSIDEDECOMAPPING = {'1': IMAGESDICT['rock'],  d$ ?2 \  |5 ?0 S5 X" R
81. '2': IMAGESDICT['short tree']," ?+ h- x1 y6 i3 N8 @
82. '3': IMAGESDICT['tall tree'],
* A% p3 ~: H6 Q/ Y( l1 ~& A83. '4': IMAGESDICT['ugly tree']}
! a. `+ h! {4 n6 jOUTSIDEDECOMAPPING也是一个将地图数据结构中使用的字符与读取图片链接起来的字典。
7 `. w5 @' E. s9 `) P" p# R“外部装饰”图将绘制在草地方块上方。7 s/ e' r( {1 n. m/ [, ^! K  R
85. # PLAYERIMAGES是一个列表包括所有玩家可以变成的字符
3 _, s* s% R  @3 q: u# Q; _% w86. # currentImage 是玩家当前使用的角色图片的索引' D2 a. ?5 A. i: I7 Y) _. z" P
87. currentImage = 0
/ u* @6 Z( p( r* O, o88. PLAYERIMAGES = [IMAGESDICT['princess'],/ W7 }. M3 y( n) b+ w
89. IMAGESDICT['boy'],
0 `* U0 U/ z. s. c" K. H90. IMAGESDICT['catgirl'],( n- o, R. q7 J  m' D& ?
91. IMAGESDICT['horngirl']," t/ M$ B0 s9 L5 f% ~. F
92. IMAGESDICT['pinkgirl']]
) A3 S% z& \+ ]$ D$ p  h* `6 t* \PLAYERIMAGES列表储存用来改变控制角色形象的图片。2 L, X: l; n. F
currentImage变量跟随当前使用的角色图片的序号。举个例子,当currentImage设置为0那么PLAYERIMAGES也为[0],而角色就会显示”“公主”这一形象的图片0 z6 i" q, X2 g  [5 A* h4 }
$ {% O& X# Y! J: g( V4 R$ }3 j
% R' P4 v* W- V$ H0 {
0 h2 u8 y* j8 }3 r* k+ C+ c/ B. Y
0 d8 G- j" q& h, U2 _( ?
, @' e& {7 ?2 x& e& \- v5 B% E
94. startScreen() # 显示标题画面直到玩家按下任意一个键
$ z2 j& J# i# R4 `* f95. " ?$ ]/ I9 s3 Q/ p4 @
96. # 读取关卡文件里的关卡
- c( I6 n9 x9 ?4 A97. # 通过readLevelsFile()来获取关卡文件格式的细节并了解如何编写自己的关卡& ]8 H* U) B$ ?# K7 R. z
98. levels = readLevelsFile('starPusherLevels.txt')2 J. ~# b0 B$ K8 t+ y( ^5 G
99. currentLevelIndex = 0% W3 J8 r: U! K# Z/ b2 X
startScreen()函数将会持续显示初始画面(这个画面带有游戏教程)直到玩家按下任意一个键。当玩家按下任意键后,startScreen()函数将返回并通过关卡文件读取关卡。玩家将从第一关开始,而这第一关就是在列表中序号为0的关卡。
7 g9 g+ R' w& X  w4 f7 K" m9 k# [  P0 E
(开始界面)
# j" A: p' ~7 U101. # 主要的游戏循环,这个循环在单个关卡运行
" B* B& {5 a: o3 j& g% t* P102. # 当玩家完成这个关卡,循环将读取上/下一关
6 w# F0 V' C6 A103. while True: # 主要游戏循环
. l- s6 L$ P+ v* G9 n! `  q; U0 E104. # 运行关卡至开始游戏阶段:
0 S% N$ X8 S) Y/ q, g& |: U. S' ]( B105. result = runLevel(levels, currentLevelIndex)
- \4 R) Z* h7 h- H9 c4 _) xrunLevel()函数为游戏处理所有行为。这个函数通过一系列关卡对象并决定运行哪个整数序号关卡。
8 U+ n, t9 h/ c2 z+ H当玩家完成关卡,runLevel()将反馈以下字符串:’solved’意味着玩家达成关卡目标,’next’意味着玩家想要跳关,’back’意味着玩家想返回上一关,’reset’意味着玩家想重启关卡。
* t: A5 N0 V5 D0 _7 f" L( }107. if result in ('solved', 'next'):
$ z, W4 S1 e) w" N7 a' R108. # 进入下一关
3 R5 S  @6 X. K0 E109. currentLevelIndex += 1
4 I- A* O# P# n  w8 O0 C. `110. if currentLevelIndex >= len(levels):; P% u( }" P' T  A) `9 \! I
111. # 如果之后没有关卡则返回第一关
% t; {( W9 w& L; c/ P" |, t112. currentLevelIndex = 0
5 L6 |# {4 w0 p5 c, a' X0 L3 `4 ?8 }+ U$ o113. elif result == 'back':
( D, O5 N) d5 [114. # 返回上一关
% ?4 _! a$ D: t* F9 {115. currentLevelIndex -= 1
9 p: L/ q, m( \% w, k+ _; k1 B' J116. if currentLevelIndex < 0:
6 t' u+ _3 _. N0 e! @4 k117. # 如果没有上一关可以返回了则回到最后一关
% v, A  ~( d0 I0 V118. currentLevelIndex = len(levels)-1" b9 t) z! K3 Z7 I& F0 u% i
如果runLevel()反馈的字符串为’solved’或者’next’,那么我们需要给增长量levelNum增加1。如果levelNum超过了关卡总数,那么levelNum设定回0。4 h7 D* x; k& ^. M" T2 x
反过来同理,如果反馈的是’back’,levelNum就减1。如果减到低于0,那么就会设定回最后一关
. D" H! }- b) X& x/ Y" U. q5 D) T- I' l8 T
119. elif result == 'reset':
- P. v4 ?7 P+ Y" w" D- w9 s120. pass # 用来重新调用runLevel()重启关卡7 \" S0 C+ J$ y2 u7 n+ L
如果返回值为’reset’,代码不会起任何作用。
/ p, B' d& _1 p) N8 s- f6 d6 p6 _pass语句在这里不起任何作用(更像一个评论),然而在Python编译器里是需要的,因为在elif语句后规定需要一行代码。$ f% [0 T3 y! _; \6 N
我们完全可以移除119和120行,而程序不会受到影响。而没有删除的原因是为了程序的可读性,因为这样我们就不会忘记runLevel()同样能反馈字符串’reset’。
% ?8 a, ]( V8 u7 E% r(未完待续)

本帖子中包含更多资源

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

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