龙空技术网

少儿编程分享:码趣君教你用Python编写推星星游戏(五)

码趣少儿编程 87

前言:

眼前我们对“python370怎么换行”大致比较关切,兄弟们都需要知道一些“python370怎么换行”的相关知识。那么小编同时在网摘上网罗了一些关于“python370怎么换行””的相关文章,希望我们能喜欢,你们快快来了解一下吧!

Hi!今天我们继续昨天的进程

代码部分

297. # 将邻近的方块墙转换为角落方块

298. for x in range(len(mapObjCopy)):

299. for y in range(len(mapObjCopy[0])):

300.

301. if mapObjCopy[x][y] == '#':

302. if (isWall(mapObjCopy, x, y-1) and isWall(mapObjCopy, x+1, y)) or \

303. (isWall(mapObjCopy, x+1, y) and isWall(mapObjCopy, x, y+1)) or \

304. (isWall(mapObjCopy, x, y+1) and isWall(mapObjCopy, x-1, y)) or \

305. (isWall(mapObjCopy, x-1, y) and isWall(mapObjCopy, x, y-1)):

306. mapObjCopy[x][y] = 'x'

307.

308. elif mapObjCopy[x][y] == ' ' and random.randint(0, 99) < OUTSIDE_DECORATION_PCT:

309. mapObjCopy[x][y] = random.choice(list(OUTSIDEDECOMAPPING.keys()))

310.

311. return mapObjCopy

301行开始的大块if语句是通过检查相邻的方块墙是否为形成角落的角度来判断这个方块墙当前的XY坐标是不是角落位置。如果是角落,那么在对象映射中代表一个普通墙的’#’字符串,将替换为代表角落方块墙的’x’字符串。

(推星星游戏第三关)

314. def isBlocked(mapObj, gameStateObj, x, y):

315. """反馈True如果当前XY坐标被阻挡

316. 其他情况下反馈为False."""

317.

318. if isWall(mapObj, x, y):

319. return True

320.

321. elif x < 0 or x >= len(mapObj) or y < 0 or y >= len(mapObj[x]):

322. return True # XY不在地图上.

323.

324. elif (x, y) in gameStateObj['stars']:

325. return True # 星星被挡住了

326.

327. return False

以下有三种情况被阻挡住:星星,墙或者坐标超过地图的边缘

isBlocked()函数将监测这三种情况的发生,并在被阻挡时反馈True,反之则反馈False。

330. def makeMove(mapObj, gameStateObj, playerMoveTo):

331. """考虑到地图和游戏状态,观测是否完成玩家指定的移动

332. 如果是则移动玩家的位置

333. 反之,不移动

334.

335. 反馈True如果玩家移动了,反之False"""

336.

337. # 确保玩家能在当前方向移动

338. playerx, playery = gameStateObj['player']

339.

340. # 这个变量是“语法糖”

341. # 输入“星星”比输入"gameStateObj['stars']"读起来舒服多了

342. stars = gameStateObj['stars']

343.

344. # 处理各方向的代码非常相似

345. # 只和加减xy坐标稍有不同

346. # 我们可以通过xOffset和yOffset来简化代码

347. if playerMoveTo == UP:

348. xOffset = 0

349. yOffset = -1

350. elif playerMoveTo == RIGHT:

351. xOffset = 1

352. yOffset = 0

353. elif playerMoveTo == DOWN:

354. xOffset = 0

355. yOffset = 1

356. elif playerMoveTo == LEFT:

357. xOffset = -1

358. yOffset = 0

359.

360. # 监测玩家是否能在此方向移动

361. if isWall(mapObj, playerx + xOffset, playery + yOffset):

362. return False

363. else:

364. if (playerx + xOffset, playery + yOffset) in stars:

365. # 路径上有一个星星,监测玩家是否能推动它

366. if not isBlocked(mapObj, gameStateObj, playerx + (xOffset*2), playery + (yOffset*2)):

367. # 移动星星

368. ind = stars.index((playerx + xOffset, playery + yOffset))

369. stars[ind] = (stars[ind][0] + xOffset, stars[ind][1] + yOffset)

370. else:

371. return False

372. # 移动玩家

373. gameStateObj['player'] = (playerx + xOffset, playery + yOffset)

374. return True

函数makeMove()用来确认玩家移动的方向是否有效。只要没有星星重叠或者墙的阻挡,玩家就可以向前移动。而这个值将上传至gameStateObj变量用来反映这个行为,而反馈值True将告诉函数调用者玩家所控制的角色移动了。

如果玩家想要移动的地方有个星星,那么星星的位置也将改变而这个信息也将上传至gameStateObj变量。这就是“推星星”是实现的原理。

如果玩家想要移动的方向被阻挡,那么变量gameStateObj不会更改并且函数将反馈False。

377. def startScreen():

378. """ 显示初始画面(包括标题和教程)

379. 直到玩家按下任意键."""

380.

381. # 定位初始画面.

382. titleRect = IMAGESDICT['title'].get_rect()

383. topCoord = 50 # topCoord 监测文字行的顶部

384. titleRect.top = topCoord

385. titleRect.centerx = HALF_WINWIDTH

386. topCoord += titleRect.height

387.

388. # 字体和文本系统一次只能显示一行

389. # 所以我们不能换行字符串

390. # 我们使用列表来显示行

391. instructionText = ['Push the stars over the marks.',

392. 'Arrow keys to move, WASD for camera control, P to change character.',

393. 'Backspace to reset level, Esc to quit.',

394. 'N for next level, B to go back a level.']

startScreen()函数需要一些文本显示在窗口中心下方。

我们将每一行字符串储存在instructionText列表里。标题图片(储存在IMAGESDICT[‘title’] 最初从thestar_title.png文件读取)将放置在窗口顶部下方50像素处。这是因为在383行,topCoord变量储存的是50

topCoord变量将追踪标题图片和教程文本的Y坐标。而它的X坐标再385行有提到,将始终居中。

在386行,topCoord变量会随着图片的高度改变。这样我们可以在不调整代码的情况下调整图片的高度。

(未完待续)

标签: #python370怎么换行