Browse Source

PyGame

pull/52/head
Jure Šorn 5 years ago
parent
commit
02ab6be03f
2 changed files with 16 additions and 8 deletions
  1. 12
      README.md
  2. 12
      index.html

12
README.md

@ -2914,7 +2914,8 @@ Pygame
#### Runs a simple Mario game:
```python
import collections, dataclasses, enum, itertools, math, pygame, random
import collections, dataclasses, enum, io, itertools, math, pygame, random, urllib
from urllib.request import urlopen
D = enum.Enum('D', 'n e s w')
P = collections.namedtuple('P', 'x y')
@ -2923,9 +2924,11 @@ RECT_SIDE, SCR_SIDE, MAX_SPEED = 16, 25, P(x=5, y=10)
COORDS = [p for p in itertools.product(range(SCR_SIDE), repeat=2) if {*p} & {0, SCR_SIDE-1}] +\
[(random.randint(1, SCR_SIDE-2), random.randint(2, SCR_SIDE-2)) for _ in range(62)]
FLOORS = [pygame.Rect(x*RECT_SIDE, y*RECT_SIDE, RECT_SIDE, RECT_SIDE) for x, y in COORDS]
IMAGE = pygame.image.load('mario_bros.png')
URL = 'https://raw.githubusercontent.com/gto76/python-cheatsheet/master/web/mario_bros.png'
IMAGE = pygame.image.load(io.BytesIO(urlopen(URL).read()))
FRAMES = [IMAGE.subsurface(pygame.Rect(x*16, 0, 16, 16)) for x in range(7)]
FRAMES += [pygame.transform.flip(f, True, False) for f in FRAMES]
TILES = [IMAGE.subsurface(pygame.Rect(x*16, 0, 16, 16)) for x in range(9, 14)]
def main():
pygame.init()
@ -2965,11 +2968,12 @@ def stop_on_collision(spd, bounds):
y=0 if (D.n in bounds and spd.y < 0) or (D.s in bounds and spd.y > 0) else spd.y)
def draw(screen, mario, pressed):
screen.fill((0, 0, 0))
screen.fill((85, 168, 255))
mario.facing_left = mario.spd.x < 0 if mario.spd.x else mario.facing_left
screen.blit(FRAMES[get_frame_index(mario, pressed) + mario.facing_left*7], mario.rect)
for rect in FLOORS:
pygame.draw.rect(screen, (255, 100, 0), rect)
tile_index = 1 if {*rect.topleft} & {0, (SCR_SIDE-1)*RECT_SIDE} else 0
screen.blit(TILES[tile_index], rect)
pygame.display.flip()
def get_frame_index(mario, pressed):

12
index.html

@ -2475,7 +2475,8 @@ simpleaudio.play_buffer(samples_b, <span class="hljs-number">1</span>, <span cla
</code></pre></div></div>
<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
<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
<span class="hljs-keyword">from</span> urllib.request <span class="hljs-keyword">import</span> urlopen
D = enum.Enum(<span class="hljs-string">'D'</span>, <span class="hljs-string">'n e s w'</span>)
P = collections.namedtuple(<span class="hljs-string">'P'</span>, <span class="hljs-string">'x y'</span>)
@ -2484,9 +2485,11 @@ RECT_SIDE, SCR_SIDE, MAX_SPEED = <span class="hljs-number">16</span>, <span clas
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} &amp; {<span class="hljs-number">0</span>, SCR_SIDE<span class="hljs-number">-1</span>}] +\
[(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>)]
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]
IMAGE = pygame.image.load(<span class="hljs-string">'mario_bros.png'</span>)
URL = <span class="hljs-string">'https://raw.githubusercontent.com/gto76/python-cheatsheet/master/web/mario_bros.png'</span>
IMAGE = pygame.image.load(io.BytesIO(urlopen(URL).read()))
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>)]
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]
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>)]
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
pygame.init()
@ -2526,11 +2529,12 @@ FRAMES += [pygame.transform.flip(f, <span class="hljs-keyword">True</span>, <spa
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 &lt; <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 &gt; <span class="hljs-number">0</span>) <span class="hljs-keyword">else</span> spd.y)
<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>
screen.fill((<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))
screen.fill((<span class="hljs-number">85</span>, <span class="hljs-number">168</span>, <span class="hljs-number">255</span>))
mario.facing_left = mario.spd.x &lt; <span class="hljs-number">0</span> <span class="hljs-keyword">if</span> mario.spd.x <span class="hljs-keyword">else</span> mario.facing_left
screen.blit(FRAMES[get_frame_index(mario, pressed) + mario.facing_left*<span class="hljs-number">7</span>], mario.rect)
<span class="hljs-keyword">for</span> rect <span class="hljs-keyword">in</span> FLOORS:
pygame.draw.rect(screen, (<span class="hljs-number">255</span>, <span class="hljs-number">100</span>, <span class="hljs-number">0</span>), rect)
tile_index = <span class="hljs-number">1</span> <span class="hljs-keyword">if</span> {*rect.topleft} &amp; {<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>
screen.blit(TILES[tile_index], rect)
pygame.display.flip()
<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>

Loading…
Cancel
Save