-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathDemo_PyGame_Snake_Game.py
142 lines (112 loc) · 4.18 KB
/
Demo_PyGame_Snake_Game.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import pygame
import FreeSimpleGUI as sg
import os
"""
Demo - Simple Snake Game using PyGame and PySimpleGUI
This demo may not be fully functional in terms of getting the coordinate
systems right or other problems due to a lack of understanding of PyGame
The purpose of the demo is to show one way of adding a PyGame window into your PySimpleGUI window
Note, you must click on the game area in order for PyGame to get keyboard strokes, etc.
Tried using set_focus to switch to the PyGame canvas but still needed to click on game area
"""
# --- Globals ---
# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# Set the width and height of each snake segment
segment_width = 15
segment_height = 15
# Margin between each segment
segment_margin = 3
# Set initial speed
x_change = segment_width + segment_margin
y_change = 0
class Segment(pygame.sprite.Sprite):
""" Class to represent one segment of the snake. """
# -- Methods
# Constructor function
def __init__(self, x, y):
# Call the parent's constructor
super().__init__()
# Set height, width
self.image = pygame.Surface([segment_width, segment_height])
self.image.fill(WHITE)
# Make our top-left corner the passed-in location.
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
# --------------------------- GUI Setup & Create Window -------------------------------
layout = [[sg.Text('Snake Game - PySimpleGUI + PyGame')],
[sg.Graph((800, 600), (0, 0), (800, 600),
background_color='lightblue', key='-GRAPH-')],
[sg.Exit()]]
window = sg.Window('Snake Game using PySimpleGUI and PyGame',
layout, finalize=True)
# ------------------------ Do the magic that integrates PyGame and Graph Element ------------------
graph = window['-GRAPH-'] # type: sg.Graph
embed = graph.TKCanvas
os.environ['SDL_WINDOWID'] = str(embed.winfo_id())
os.environ['SDL_VIDEODRIVER'] = 'windib'
# ----------------------------- PyGame Code -----------------------------
# Call this function so the Pygame library can initialize itself
# pygame.init()
screen = pygame.display.set_mode((800, 600))
screen.fill(pygame.Color(255, 255, 255))
pygame.display.init()
pygame.display.update()
# Set the title of the window
pygame.display.set_caption('Snake Example')
allspriteslist = pygame.sprite.Group()
# Create an initial snake
snake_segments = []
for i in range(15):
x = 250 - (segment_width + segment_margin) * i
y = 30
segment = Segment(x, y)
snake_segments.append(segment)
allspriteslist.add(segment)
clock = pygame.time.Clock()
while True:
event, values = window.read(timeout=10)
if event in (sg.WIN_CLOSED, 'Exit'):
break
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
break
# Set the speed based on the key pressed
# We want the speed to be enough that we move a full
# segment, plus the margin.
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = (segment_width + segment_margin) * -1
y_change = 0
if event.key == pygame.K_RIGHT:
x_change = (segment_width + segment_margin)
y_change = 0
if event.key == pygame.K_UP:
x_change = 0
y_change = (segment_height + segment_margin) * -1
if event.key == pygame.K_DOWN:
x_change = 0
y_change = (segment_height + segment_margin)
# Get rid of last segment of the snake
# .pop() command removes last item in list
old_segment = snake_segments.pop()
allspriteslist.remove(old_segment)
# Figure out where new segment will be
x = snake_segments[0].rect.x + x_change
y = snake_segments[0].rect.y + y_change
segment = Segment(x, y)
# Insert new segment into the list
snake_segments.insert(0, segment)
allspriteslist.add(segment)
# -- Draw everything
# Clear screen
screen.fill(BLACK)
allspriteslist.draw(screen)
# Flip screen
pygame.display.flip()
# Pause
clock.tick(5)
window.close()