144
社区成员




课程:《Python程序设计》
班级: 2223
姓名: 黄媛怡
学号:20223315
实验教师:王志强
实验日期:2023年5月10日
必修/选修: 公选课
1. 实验内容
利用pygame编写扫雷的小游戏,包含基本的游戏界面和胜负判定。
2. 游戏运行过程
3. 源代码
import pygame
import random
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (100, 100)
# 游戏窗口大小
WINDOW_WIDTH = 300
WINDOW_HEIGHT = 300
# 游戏格子大小
CELL_SIZE = 20
# 雷的数量
NUM_MINES = 20
# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)
# 初始化pygame
pygame.init()
# 创建游戏窗口
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('扫雷游戏')
# 加载字体
font = pygame.font.SysFont('Arial', 20)
# 随机生成雷的位置
mine_positions = random.sample(
range(WINDOW_WIDTH * WINDOW_HEIGHT // CELL_SIZE // CELL_SIZE), NUM_MINES)
# 游戏状态
game_over = False
# 游戏格子状态
grid = [[9 for y in range(WINDOW_HEIGHT // CELL_SIZE)]
for x in range(WINDOW_WIDTH // CELL_SIZE)]
# 绘制游戏格子
def draw_grid():
for x in range(WINDOW_WIDTH // CELL_SIZE):
for y in range(WINDOW_HEIGHT // CELL_SIZE):
if grid[x][y] == -1:
pygame.draw.rect(window, BLACK, (x * CELL_SIZE, y * CELL_SIZE,
CELL_SIZE - 1, CELL_SIZE - 1))
elif grid[x][y] == 9:
pygame.draw.rect(window, GRAY, (x * CELL_SIZE, y * CELL_SIZE,
CELL_SIZE - 1, CELL_SIZE - 1))
else:
for i in range(x - 1, x + 2):
for j in range(y - 1, y + 2):
if i >= 0 and j >= 0 and i < WINDOW_WIDTH // CELL_SIZE and j < WINDOW_HEIGHT // CELL_SIZE and not (
i == x and j == y):
if grid[i][j] == 0:
grid[i][j] = 0
window.fill(WHITE)
draw_grid()
pygame.display.update()
if grid[x][y] != 0:
text = font.render(str(grid[x][y]), True, BLACK)
window.blit(text, (x * CELL_SIZE + 6, y * CELL_SIZE + 2))
# 绘制游戏结束界面
def draw_game_over():
text = font.render('Game Over', True, BLACK)
window.blit(text, (WINDOW_WIDTH // 2 - text.get_width() // 2,
WINDOW_HEIGHT // 2 - text.get_height() // 2))
# 计算周围雷的数量
def get_num_mines(x, y):
num_mines = 0
for i in range(x - 1, x + 2):
for j in range(y - 1, y + 2):
if i >= 0 and j >= 0 and i < WINDOW_WIDTH // CELL_SIZE and j < WINDOW_HEIGHT // CELL_SIZE and not (
i == x and j == y):
if (i * (WINDOW_WIDTH // CELL_SIZE - 1) + j -
1) in mine_positions:
num_mines += 1
return num_mines
# 点击格子
def click_cell(x, y):
global game_over
if (x * (WINDOW_WIDTH // CELL_SIZE - 1) + y - 1) in mine_positions:
game_over = True
grid[x][y] = -1
else:
grid[x][y] = get_num_mines(x, y)
# 主循环
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:
x, y = event.pos[0] // CELL_SIZE, event.pos[1] // CELL_SIZE
click_cell(x, y)
# 绘制游戏界面
window.fill(WHITE)
draw_grid()
if game_over:
draw_game_over()
pygame.display.update()
4. 上传Gitee
5. 思路过程
6. python结课总结
不知不觉已经学习python这门课程一学期了,从最初帮助我从C语言转换为python语言的“猜数字”小游戏,到开拓的新领域——数据库、socket函数、爬虫技术……虽然学习python时也会感到枯燥和痛苦,但它带给我更多的是掌握知识的成就感与快乐。
不得不说,Python选修课是一门非常实用的课程,它可以帮助我们掌握Python编程语言的基本知识和技能,包括变量、数据类型、条件语句、循环语句、函数、模块、文件操作等。这些知识和技能可以应用于各种领域,像数据分析、机器学习、人工智能等等。
此外,Python需要很多努力和时间,需要认真听讲、认真完成作业、认真思考问题,才能够真正掌握Python编程语言。同时,python也需要有耐心和毅力,因为编程是一个需要反复尝试和调试的过程,而且有时候会遇到很难解决的问题。但是,只要坚持下去,就一定会有所收获。
最后我认为,编程不仅仅是一门技能,更是一种思维方式。即使未来的我们从事工作用不到python技术,我们也会潜移默化地接受到python带来的便利。
7.参考资料