Skip to content

Commit ad7b26d

Browse files
committed
redis rewriting - teacher version before deriving a student version
1 parent 064df13 commit ad7b26d

File tree

6 files changed

+101
-41
lines changed

6 files changed

+101
-41
lines changed

notebooks/tps/redis/.teacher/README-redis-corrige-nb.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,27 @@ lance le jeu en lui indiquant sur quel ordinateur se trouve le serveur redis
162162
### trouver son addresse IP
163163

164164
selon les systèmes, lancez dans un terminal la commande suivante
165+
165166
* Windows `ipconfig`
166167
* MacOS `ifconfig`
167168
* LInux `ip address show`
168169

169-
et cherchez une adresse parmi les intervalles réservés aux adresses privées
170+
et cherchez une adresse parmi les intervalles réservés aux adresses privées:
170171

171172
+++
172173

173-
```{image} media/private-ranges.png
174-
:align: center
174+
| plage | taille |
175+
|-:|:-|
176+
| `192.168.0.0/16` | $2^{16} = 65,536$ adresses
177+
| `172.16.0.0/12` | $2^{20} = 1,048,576$ adresses
178+
| `10.0.0.0/8` | $2^{24} = 16,777,216$ adresses
179+
180+
+++
181+
182+
```{admonition} plus de détails
183+
plus de détails ici
184+
* <https://ipstack.com/classes-of-private-ip-address>
185+
* le RFC: <https://datatracker.ietf.org/doc/html/rfc1918>
175186
```
176187

177188
+++
@@ -182,7 +193,7 @@ dans notre configuration, si Pierre est sur l'adresse disons `192.168.200.20`,
182193
il suffit aux autres joueurs qui veulent le rejoindre de lancer par exemple
183194

184195
```
185-
game.py --server 192.168.200.20 Jacques
196+
python game.py --server 192.168.200.20 Jacques
186197
```
187198

188199
+++

notebooks/tps/redis/README-redis-nb.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,27 @@ lance le jeu en lui indiquant sur quel ordinateur se trouve le serveur redis
162162
### trouver son addresse IP
163163

164164
selon les systèmes, lancez dans un terminal la commande suivante
165+
165166
* Windows `ipconfig`
166167
* MacOS `ifconfig`
167168
* LInux `ip address show`
168169

169-
et cherchez une adresse parmi les intervalles réservés aux adresses privées
170+
et cherchez une adresse parmi les intervalles réservés aux adresses privées:
170171

171172
+++
172173

173-
```{image} media/private-ranges.png
174-
:align: center
174+
| plage | taille |
175+
|-:|:-|
176+
| `192.168.0.0/16` | $2^{16} = 65,536$ adresses
177+
| `172.16.0.0/12` | $2^{20} = 1,048,576$ adresses
178+
| `10.0.0.0/8` | $2^{24} = 16,777,216$ adresses
179+
180+
+++
181+
182+
```{admonition} plus de détails
183+
plus de détails ici
184+
* <https://ipstack.com/classes-of-private-ip-address>
185+
* le RFC: <https://datatracker.ietf.org/doc/html/rfc1918>
175186
```
176187

177188
+++
@@ -182,7 +193,7 @@ dans notre configuration, si Pierre est sur l'adresse disons `192.168.200.20`,
182193
il suffit aux autres joueurs qui veulent le rejoindre de lancer par exemple
183194

184195
```
185-
game.py --server 192.168.200.20 Jacques
196+
python game.py --server 192.168.200.20 Jacques
186197
```
187198

188199
+++

notebooks/tps/redis/game.py

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,39 @@
11
#!/usr/bin/env python
2+
23
from argparse import ArgumentParser
34

45
import pygame as pg
56
from pygame.locals import QUIT
67

7-
import redis
8+
from redis import Redis
89

910
from screen import Screen
1011
from player import Player
1112
from others import Others
1213

14+
# 2 differents speeds
15+
#
16+
# if we do too few frames per second,
17+
# after another player moves, we may see it very late
18+
# (worst case: if FRAME_RATE is 4, then the delay may reach 250ms)
19+
#
20+
# so, we set our frame rate higher; BUT on the other hand
21+
# this also results in the player moving too fast
22+
# so FRAMES_PER_MOVE is defined so we move our player only once every n frames
23+
24+
# how often we redisplay the screen
25+
FRAME_RATE = 10
26+
# we move our player that many times slower
27+
FRAMES_PER_MOVE = 3
1328

14-
# xxx need to separate player speed and frame rate
15-
FRAME_RATE = 4
1629

1730
def main():
1831

1932
parser = ArgumentParser()
2033
parser.add_argument("-s", "--server", default=None,
2134
help="IP adddress for the redis server")
35+
parser.add_argument("-a", "--auto-move", action="store_true",
36+
help="auto move")
2237
parser.add_argument("name")
2338
args = parser.parse_args()
2439

@@ -32,43 +47,46 @@ def main():
3247

3348
clock = pg.time.Clock()
3449

35-
redis_server = redis.Redis(args.server)
50+
redis_server = Redis(args.server, decode_responses=True)
3651

3752
player = Player(local_player_name, H, W, redis_server)
3853
player.join()
3954

4055
others = Others(redis_server)
4156

4257
# ask the redis server where the other players are
43-
players = others.all_players()
58+
players = others.fetch_all_players()
4459
screen.display(players)
4560

4661
# type 'a' to toggle auto move
47-
auto_move = False
62+
auto_move = args.auto_move
4863

64+
counter = 0
4965
while True:
66+
# sync with the frame rate
5067
clock.tick(FRAME_RATE)
51-
if auto_move:
52-
player.random_move()
53-
for event in pg.event.get():
54-
if (event.type == QUIT or
55-
(event.type == pg.KEYDOWN and event.key == pg.K_q)):
56-
player.leave()
57-
return
58-
if event.type == pg.KEYDOWN:
59-
if event.key == pg.K_UP:
60-
player.move(0, -1)
61-
elif event.key == pg.K_DOWN:
62-
player.move(0, 1)
63-
elif event.key == pg.K_RIGHT:
64-
player.move(1, 0)
65-
elif event.key == pg.K_LEFT:
66-
player.move(-1, 0)
67-
elif event.key == pg.K_a:
68+
# get the position of other players
69+
players = others.fetch_all_players()
70+
71+
# move the local player
72+
# actually do all this only once every FRAMES_PER_MOVE frames
73+
counter += 1
74+
if counter % FRAMES_PER_MOVE == 0:
75+
counter = 0
76+
if auto_move:
77+
player.random_move()
78+
79+
for event in pg.event.get():
80+
if (event.type == QUIT or
81+
(event.type == pg.KEYDOWN and event.key == pg.K_q)):
82+
player.leave()
83+
return
84+
elif event.type == pg.KEYDOWN and event.key == pg.K_a:
6885
auto_move = not auto_move
69-
# again, refresh the position of other players
70-
players = others.all_players()
71-
# and redisplay accordingly
86+
else:
87+
player.handle_event(event)
88+
89+
# redisplay accordingly every frame
7290
screen.display(players)
7391

7492

notebooks/tps/redis/others.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def __init__(self, redis_server):
88
# a handle to the redis server
99
self.redis_server = redis_server
1010

11-
def all_players(self):
11+
def fetch_all_players(self):
1212
# xxx need to optimize these multiple round trips
1313
player_names = self.redis_server.keys()
1414
players = []

notebooks/tps/redis/player.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import random
22
import json
33

4+
import pygame as pg
5+
46
def random_color():
57
return [random.randint(0, 255) for _ in range(3)]
68

@@ -35,10 +37,11 @@ def join(self):
3537
add local name to database
3638
with a random color
3739
"""
38-
self.redis_server.hmset(
40+
self.redis_server.hset(
3941
self.name,
40-
{'color' : json.dumps(self.color),
41-
'position': json.dumps(self.position),
42+
mapping = {
43+
'color' : json.dumps(self.color),
44+
'position': json.dumps(self.position),
4245
})
4346

4447

@@ -59,3 +62,20 @@ def move(self, dx, dy):
5962
self.position[1] %= self.height
6063
self.redis_server.hset(self.name, 'position',
6164
json.dumps(self.position))
65+
66+
67+
def handle_event(self, event):
68+
if event.type == pg.KEYDOWN:
69+
match event.key:
70+
case pg.K_UP:
71+
self.move(0, -1)
72+
case pg.K_DOWN:
73+
self.move(0, 1)
74+
case pg.K_RIGHT:
75+
self.move(1, 0)
76+
case pg.K_LEFT:
77+
self.move(-1, 0)
78+
case pg.K_c:
79+
self.color = random_color()
80+
self.redis_server.hset(self.name, 'color',
81+
json.dumps(self.color))

notebooks/tps/redis/screen.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ def draw_cell(self, board_x, board_y, color=WHITE):
4040
def display(self, players):
4141
"""
4242
players is an iterable of dictionaries
43-
b'color' -> [r g b], b'position' -> [x, y]
43+
'color' -> [r g b], 'position' -> [x, y]
4444
"""
4545
self.screen.fill(BLACK)
4646
for player in players:
47-
x, y = player[b'position']
48-
color = player[b'color']
47+
x, y = player['position']
48+
color = player['color']
4949
self.draw_cell(x, y, color)
5050
pygame.display.update()

0 commit comments

Comments
 (0)