Skip to content

Commit 146dc7a

Browse files
committed
add code
1 parent 156d00e commit 146dc7a

File tree

6 files changed

+496
-0
lines changed

6 files changed

+496
-0
lines changed

doudou/2022-05-18-games/001.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import os
2+
import sys
3+
import random
4+
from modules import *
5+
from PyQt5.QtGui import *
6+
from PyQt5.QtCore import *
7+
from PyQt5.QtWidgets import *
8+
9+
10+
'''定义俄罗斯方块游戏类'''
11+
class TetrisGame(QMainWindow):
12+
def __init__(self, parent=None):
13+
super(TetrisGame, self).__init__(parent)
14+
# 是否暂停ing
15+
self.is_paused = False
16+
# 是否开始ing
17+
self.is_started = False
18+
self.initUI()
19+
'''界面初始化'''
20+
def initUI(self):
21+
# icon
22+
self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
23+
# 块大小
24+
self.grid_size = 22
25+
# 游戏帧率
26+
self.fps = 200
27+
self.timer = QBasicTimer()
28+
# 焦点
29+
self.setFocusPolicy(Qt.StrongFocus)
30+
# 水平布局
31+
layout_horizontal = QHBoxLayout()
32+
self.inner_board = InnerBoard()
33+
self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
34+
layout_horizontal.addWidget(self.external_board)
35+
self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
36+
layout_horizontal.addWidget(self.side_panel)
37+
self.status_bar = self.statusBar()
38+
self.external_board.score_signal[str].connect(self.status_bar.showMessage)
39+
self.start()
40+
self.center()
41+
self.setWindowTitle('Tetris —— 九歌')
42+
self.show()
43+
self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
44+
'''游戏界面移动到屏幕中间'''
45+
def center(self):
46+
screen = QDesktopWidget().screenGeometry()
47+
size = self.geometry()
48+
self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
49+
'''更新界面'''
50+
def updateWindow(self):
51+
self.external_board.updateData()
52+
self.side_panel.updateData()
53+
self.update()
54+
'''开始'''
55+
def start(self):
56+
if self.is_started:
57+
return
58+
self.is_started = True
59+
self.inner_board.createNewTetris()
60+
self.timer.start(self.fps, self)
61+
'''暂停/不暂停'''
62+
def pause(self):
63+
if not self.is_started:
64+
return
65+
self.is_paused = not self.is_paused
66+
if self.is_paused:
67+
self.timer.stop()
68+
self.external_board.score_signal.emit('Paused')
69+
else:
70+
self.timer.start(self.fps, self)
71+
self.updateWindow()
72+
'''计时器事件'''
73+
def timerEvent(self, event):
74+
if event.timerId() == self.timer.timerId():
75+
removed_lines = self.inner_board.moveDown()
76+
self.external_board.score += removed_lines
77+
self.updateWindow()
78+
else:
79+
super(TetrisGame, self).timerEvent(event)
80+
'''按键事件'''
81+
def keyPressEvent(self, event):
82+
if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
83+
super(TetrisGame, self).keyPressEvent(event)
84+
return
85+
key = event.key()
86+
# P键暂停
87+
if key == Qt.Key_P:
88+
self.pause()
89+
return
90+
if self.is_paused:
91+
return
92+
# 向左
93+
elif key == Qt.Key_Left:
94+
self.inner_board.moveLeft()
95+
# 向右
96+
elif key == Qt.Key_Right:
97+
self.inner_board.moveRight()
98+
# 旋转
99+
elif key == Qt.Key_Up:
100+
self.inner_board.rotateAnticlockwise()
101+
# 快速坠落
102+
elif key == Qt.Key_Space:
103+
self.external_board.score += self.inner_board.dropDown()
104+
else:
105+
super(TetrisGame, self).keyPressEvent(event)
106+
self.updateWindow()
107+
108+
109+
'''run'''
110+
if __name__ == '__main__':
111+
app = QApplication([])
112+
tetris = TetrisGame()
113+
sys.exit(app.exec_())

doudou/2022-05-18-games/002.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import os
2+
import sys
3+
import cfg
4+
import pygame
5+
from modules import *
6+
7+
8+
'''游戏主程序'''
9+
def main():
10+
pygame.init()
11+
screen = pygame.display.set_mode(cfg.SCREENSIZE)
12+
pygame.display.set_caption('Gemgem —— 九歌')
13+
# 加载背景音乐
14+
pygame.mixer.init()
15+
pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))
16+
pygame.mixer.music.set_volume(0.6)
17+
pygame.mixer.music.play(-1)
18+
# 加载音效
19+
sounds = {}
20+
sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
21+
sounds['match'] = []
22+
for i in range(6):
23+
sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))
24+
# 加载字体
25+
font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)
26+
# 图片加载
27+
gem_imgs = []
28+
for i in range(1, 8):
29+
gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))
30+
# 主循环
31+
game = gemGame(screen, sounds, font, gem_imgs, cfg)
32+
while True:
33+
score = game.start()
34+
flag = False
35+
# 一轮游戏结束后玩家选择重玩或者退出
36+
while True:
37+
for event in pygame.event.get():
38+
if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
39+
pygame.quit()
40+
sys.exit()
41+
elif event.type == pygame.KEYUP and event.key == pygame.K_r:
42+
flag = True
43+
if flag:
44+
break
45+
screen.fill((135, 206, 235))
46+
text0 = 'Final score: %s' % score
47+
text1 = 'Press <R> to restart the game.'
48+
text2 = 'Press <Esc> to quit the game.'
49+
y = 150
50+
for idx, text in enumerate([text0, text1, text2]):
51+
text_render = font.render(text, 1, (85, 65, 0))
52+
rect = text_render.get_rect()
53+
if idx == 0:
54+
rect.left, rect.top = (212, y)
55+
elif idx == 1:
56+
rect.left, rect.top = (122.5, y)
57+
else:
58+
rect.left, rect.top = (126.5, y)
59+
y += 100
60+
screen.blit(text_render, rect)
61+
pygame.display.update()
62+
game.reset()
63+
64+
65+
'''run'''
66+
if __name__ == '__main__':
67+
main()

doudou/2022-05-18-games/003.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from random import randrange
2+
from turtle import *
3+
from freegames import square, vector
4+
5+
food = vector(0, 0)
6+
snake = [vector(10, 0)]
7+
aim = vector(0, -10)
8+
9+
10+
def change(x, y):
11+
"""Change snake direction."""
12+
aim.x = x
13+
aim.y = y
14+
15+
16+
def inside(head):
17+
"""Return True if head inside boundaries."""
18+
return -200 < head.x < 190 and -200 < head.y < 190
19+
20+
21+
def move():
22+
"""Move snake forward one segment."""
23+
head = snake[-1].copy()
24+
head.move(aim)
25+
26+
if not inside(head) or head in snake:
27+
square(head.x, head.y, 9, 'red')
28+
update()
29+
return
30+
31+
snake.append(head)
32+
33+
if head == food:
34+
print('Snake:', len(snake))
35+
food.x = randrange(-15, 15) * 10
36+
food.y = randrange(-15, 15) * 10
37+
else:
38+
snake.pop(0)
39+
40+
clear()
41+
42+
for body in snake:
43+
square(body.x, body.y, 9, 'black')
44+
45+
square(food.x, food.y, 9, 'green')
46+
update()
47+
ontimer(move, 100)
48+
49+
50+
setup(420, 420, 370, 0)
51+
hideturtle()
52+
tracer(False)
53+
listen()
54+
onkey(lambda: change(10, 0), 'Right')
55+
onkey(lambda: change(-10, 0), 'Left')
56+
onkey(lambda: change(0, 10), 'Up')
57+
onkey(lambda: change(0, -10), 'Down')
58+
move()
59+
done()

0 commit comments

Comments
 (0)