|
2475 | 2475 | </code></pre></div></div>
|
2476 | 2476 |
|
2477 | 2477 |
|
2478 |
| -<div><h2 id="pygame"><a href="#pygame" name="pygame">#</a>Pygame</h2><div><h3 id="example-3">Example</h3><div><h4 id="runsasimplemariogame">Runs a simple Mario game:</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">import</span> collections, dataclasses, enum, itertools, math, pygame, random |
| 2478 | +<div><h2 id="pygame"><a href="#pygame" name="pygame">#</a>Pygame</h2><div><h3 id="example-3">Example</h3><div><h4 id="runsasimplemariogame">Runs a simple Mario game:</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">import</span> collections, dataclasses, enum, io, itertools, math, pygame, random, urllib |
| 2479 | +<span class="hljs-keyword">from</span> urllib.request <span class="hljs-keyword">import</span> urlopen |
2479 | 2480 |
|
2480 | 2481 | D = enum.Enum(<span class="hljs-string">'D'</span>, <span class="hljs-string">'n e s w'</span>)
|
2481 | 2482 | P = collections.namedtuple(<span class="hljs-string">'P'</span>, <span class="hljs-string">'x y'</span>)
|
|
2484 | 2485 | COORDS = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> itertools.product(range(SCR_SIDE), repeat=<span class="hljs-number">2</span>) <span class="hljs-keyword">if</span> {*p} & {<span class="hljs-number">0</span>, SCR_SIDE<span class="hljs-number">-1</span>}] +\
|
2485 | 2486 | [(random.randint(<span class="hljs-number">1</span>, SCR_SIDE<span class="hljs-number">-2</span>), random.randint(<span class="hljs-number">2</span>, SCR_SIDE<span class="hljs-number">-2</span>)) <span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> range(<span class="hljs-number">62</span>)]
|
2486 | 2487 | FLOORS = [pygame.Rect(x*RECT_SIDE, y*RECT_SIDE, RECT_SIDE, RECT_SIDE) <span class="hljs-keyword">for</span> x, y <span class="hljs-keyword">in</span> COORDS]
|
2487 |
| -IMAGE = pygame.image.load(<span class="hljs-string">'mario_bros.png'</span>) |
| 2488 | +URL = <span class="hljs-string">'https://raw.githubusercontent.com/gto76/python-cheatsheet/master/web/mario_bros.png'</span> |
| 2489 | +IMAGE = pygame.image.load(io.BytesIO(urlopen(URL).read())) |
2488 | 2490 | FRAMES = [IMAGE.subsurface(pygame.Rect(x*<span class="hljs-number">16</span>, <span class="hljs-number">0</span>, <span class="hljs-number">16</span>, <span class="hljs-number">16</span>)) <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> range(<span class="hljs-number">7</span>)]
|
2489 | 2491 | FRAMES += [pygame.transform.flip(f, <span class="hljs-keyword">True</span>, <span class="hljs-keyword">False</span>) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> FRAMES]
|
| 2492 | +TILES = [IMAGE.subsurface(pygame.Rect(x*<span class="hljs-number">16</span>, <span class="hljs-number">0</span>, <span class="hljs-number">16</span>, <span class="hljs-number">16</span>)) <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> range(<span class="hljs-number">9</span>, <span class="hljs-number">14</span>)] |
2490 | 2493 |
|
2491 | 2494 | <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
|
2492 | 2495 | pygame.init()
|
|
2526 | 2529 | y=<span class="hljs-number">0</span> <span class="hljs-keyword">if</span> (D.n <span class="hljs-keyword">in</span> bounds <span class="hljs-keyword">and</span> spd.y < <span class="hljs-number">0</span>) <span class="hljs-keyword">or</span> (D.s <span class="hljs-keyword">in</span> bounds <span class="hljs-keyword">and</span> spd.y > <span class="hljs-number">0</span>) <span class="hljs-keyword">else</span> spd.y)
|
2527 | 2530 |
|
2528 | 2531 | <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">draw</span><span class="hljs-params">(screen, mario, pressed)</span>:</span>
|
2529 |
| - screen.fill((<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>)) |
| 2532 | + screen.fill((<span class="hljs-number">85</span>, <span class="hljs-number">168</span>, <span class="hljs-number">255</span>)) |
2530 | 2533 | mario.facing_left = mario.spd.x < <span class="hljs-number">0</span> <span class="hljs-keyword">if</span> mario.spd.x <span class="hljs-keyword">else</span> mario.facing_left
|
2531 | 2534 | screen.blit(FRAMES[get_frame_index(mario, pressed) + mario.facing_left*<span class="hljs-number">7</span>], mario.rect)
|
2532 | 2535 | <span class="hljs-keyword">for</span> rect <span class="hljs-keyword">in</span> FLOORS:
|
2533 |
| - pygame.draw.rect(screen, (<span class="hljs-number">255</span>, <span class="hljs-number">100</span>, <span class="hljs-number">0</span>), rect) |
| 2536 | + tile_index = <span class="hljs-number">1</span> <span class="hljs-keyword">if</span> {*rect.topleft} & {<span class="hljs-number">0</span>, (SCR_SIDE<span class="hljs-number">-1</span>)*RECT_SIDE} <span class="hljs-keyword">else</span> <span class="hljs-number">0</span> |
| 2537 | + screen.blit(TILES[tile_index], rect) |
2534 | 2538 | pygame.display.flip()
|
2535 | 2539 |
|
2536 | 2540 | <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_frame_index</span><span class="hljs-params">(mario, pressed)</span>:</span>
|
|
0 commit comments