Commit c64bff18 by BellCodeEditor

save project

parent 00df811d
Showing with 171 additions and 135 deletions
import pygame import pygame
import sys from os import path
import time from sys import exit
import random from time import sleep
from pygame.locals import * from random import choice
from itertools import product
from pygame.locals import QUIT, KEYDOWN
# 初始化pygame
pygame.init()
# 这是游戏框
fps_clock = pygame.time.Clock()
play_sur_face = pygame.display.set_mode((640, 480))
# 设置标题
pygame.display.set_caption("小蛇冲冲冲!!!")
# 加载图标
image = pygame.image.load("game.jpg")
pygame.display.set_icon(image)
# 需要自定义设置一些颜色 def direction_check(moving_direction, change_direction):
directions = [['up', 'down'], ['left', 'right']]
if moving_direction in directions[0] and change_direction in directions[1]:
return change_direction
elif moving_direction in directions[1] and change_direction in directions[0]:
return change_direction
return moving_direction
RED_COLOR = pygame.Color(255, 0, 0)
BLACK_COLOR = pygame.Color(0, 0, 0)
WITHER_COLOR = pygame.Color(255, 255, 255)
GRE_COLOR = pygame.Color(150, 150, 150)
LIGHT_GRE = pygame.Color(220, 220, 220)
class Snake:
# 游戏结束 colors = list(product([0, 64, 128, 192, 255], repeat=3))[1:-1]
def game_over(play_sur_face, score):
# 显示GAME OVER 并定义字体以及大小
# game_over_font = pygame.font.Font('arial.tff', 72)
game_over_font = pygame.font.Font('E:\\untitled\\arial.ttf', 72)
game_over_surf = game_over_font.render("GAME OVER", True, GRE_COLOR)
game_over_rect = game_over_surf.get_rect()
game_over_rect.midtop = (320, 125)
play_sur_face.blit(game_over_surf, game_over_rect)
# 显示分数并定义字体大小
score_font = pygame.font.Font('E:\\untitled\\arial.ttf', 48)
score_surf = score_font.render('score ' + str(score), True, GRE_COLOR)
score_rect = score_surf.get_rect()
score_rect.midtop = (320, 255)
play_sur_face.blit(score_surf, score_rect)
# 刷新页面
pygame.display.flip()
time.sleep(5)
pygame.quit()
sys.exit()
def __init__(self):
self.map = {(x, y): 0 for x in range(32) for y in range(24)}
self.body = [[100, 100], [120, 100], [140, 100]]
self.head = [140, 100]
self.food = []
self.food_color = []
self.moving_direction = 'right'
self.speed = 4
self.generate_food()
self.game_started = False
def check_game_status(self):
if self.body.count(self.head) > 1:
return True
if self.head[0] < 0 or self.head[0] > 620 or self.head[1] < 0 or self.head[1] > 460:
return True
return False
snake_position = [100, 100] # 蛇头位置 def move_head(self):
snake_h = [[100, 100], [80, 100], [60, 100]] # 初始长度,三个单位 moves = {
tree_position = [300, 300] 'right': (20, 0),
# 初始化树莓的数量 'up': (0, -20),
tree = 1 'down': (0, 20),
direction = 'right' # 初始化方向 'left': (-20, 0)
change_direction = direction }
score = 0 step = moves[self.moving_direction]
# 检测例如按键等pygame事件 self.head[0] += step[0]
while True: self.head[1] += step[1]
for event in pygame.event.get():
# print(event.type)
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
# 判断键盘事件
if event.key == K_RIGHT or event.key == ord('d'):
change_direction = 'right'
if event.key == K_LEFT or event.key == ord('a'):
change_direction = 'left'
if event.key == K_UP or event.key == ord('w'):
change_direction = "up"
if event.key == K_DOWN or event.key == ord('s'):
change_direction = 'down'
if event.key == K_ESCAPE: # 按esc键
pygame.event.post(pygame.event.Event(QUIT)) # 退出游戏
if change_direction == "right" and not direction == 'left': def generate_food(self):
direction = change_direction self.speed = len(self.body) // 16 if len(self.body) // 16 > 4 else self.speed
if change_direction == "left" and not direction == 'right': for seg in self.body:
direction = change_direction x, y = seg
if change_direction == "up" and not direction == 'down': self.map[x//20, y//20] = 1
direction = change_direction empty_pos = [pos for pos in self.map.keys() if not self.map[pos]]
if change_direction == "down" and not direction == 'up': result = choice(empty_pos)
direction = change_direction self.food_color = list(choice(self.colors))
self.food = [result[0]*20, result[1]*20]
# 根据放下移动蛇头坐标
if direction == 'right':
snake_position[0] += 20
if direction == 'left':
snake_position[0] -= 20
if direction == 'up':
snake_position[1] -= 20
if direction == 'down':
snake_position[1] += 20
snake_h.insert(0, list(snake_position))
# 判断是否吃到树莓 def main():
if snake_position[0] == tree_position[0] and snake_position[1] == tree_position[1]: key_direction_dict = {
tree = 0 119: 'up', # W
else: 115: 'down', # S
snake_h.pop() # 每次将最后一单位蛇身剔除列表 97: 'left', # A
100: 'right', # D
273: 'up', # UP
274: 'down', # DOWN
276: 'left', # LEFT
275: 'right', # RIGHT
}
# 重新生成树莓 fps_clock = pygame.time.Clock()
if tree == 0: pygame.init()
x = random.randrange(1, 32) pygame.mixer.init()
y = random.randrange(1, 24) snake = Snake()
tree_position = [int(20 * x), int(20 * y)] sound = False
tree = 1 if path.exists('eat.wav'):
score += 1 sound_wav = pygame.mixer.Sound("eat.wav")
sound = True
title_font = pygame.font.SysFont('arial', 32)
welcome_words = title_font.render('Welcome to My Snake', True, (0, 0, 0), (255, 255, 255))
tips_font = pygame.font.SysFont('arial', 24)
start_game_words = tips_font.render('Click to Start Game', True, (0, 0, 0), (255, 255, 255))
close_game_words = tips_font.render('Press ESC to Close', True, (0, 0, 0), (255, 255, 255))
gameover_words = title_font.render('GAME OVER', True, (205, 92, 92), (255, 255, 255))
win_words = title_font.render('THE SNAKE IS LONG ENOUGH AND YOU WIN!', True, (0, 0, 205), (255, 255, 255))
screen = pygame.display.set_mode((640, 480), 0, 32)
pygame.display.set_caption('My Snake')
new_direction = snake.moving_direction
while 1:
for event in pygame.event.get():
if event.type == QUIT:
exit()
elif event.type == KEYDOWN:
if event.key == 27:
exit()
if snake.game_started and event.key in key_direction_dict:
direction = key_direction_dict[event.key]
new_direction = direction_check(snake.moving_direction, direction)
elif (not snake.game_started) and event.type == pygame.MOUSEBUTTONDOWN:
x, y = pygame.mouse.get_pos()
if 213 <= x <= 422 and 304 <= y <= 342:
snake.game_started = True
screen.fill((255, 255, 255))
if snake.game_started:
snake.moving_direction = new_direction # 在这里赋值,而不是在event事件的循环中赋值,避免按键太快
snake.move_head()
snake.body.append(snake.head[:])
if snake.head == snake.food:
if sound:
sound_wav.play()
snake.generate_food()
else:
snake.body.pop(0)
for seg in snake.body:
pygame.draw.rect(screen, [0, 0, 0], [seg[0], seg[1], 20, 20], 0)
pygame.draw.rect(screen, snake.food_color, [snake.food[0], snake.food[1], 20, 20], 0)
if snake.check_game_status():
screen.blit(gameover_words, (241, 310))
pygame.display.update()
snake = Snake()
new_direction = snake.moving_direction
sleep(3)
elif len(snake.body) == 512:
screen.blit(win_words, (33, 210))
pygame.display.update()
snake = Snake()
new_direction = snake.moving_direction
sleep(3)
else:
screen.blit(welcome_words, (188, 100))
screen.blit(start_game_words, (236, 310))
screen.blit(close_game_words, (233, 350))
pygame.display.update()
fps_clock.tick(snake.speed)
# 刷新显示层
# def sx_face():
# # 绘制pygame显示层
play_sur_face.fill(BLACK_COLOR)
for position in snake_h[1:]: # 蛇身为白色
pygame.draw.rect(play_sur_face, WITHER_COLOR, Rect(position[0], position[1], 20, 20))
pygame.draw.rect(play_sur_face, LIGHT_GRE, Rect(snake_position[0], snake_position[1], 20, 20)) # 蛇头为灰色
pygame.draw.rect(play_sur_face, RED_COLOR, Rect(tree_position[0], tree_position[1], 20, 20))
# 刷新显示层
pygame.display.flip()
# def check_is_alive(): if __name__ == '__main__':
# """ main()
# 判断蛇是否死亡 \ No newline at end of file
# :return:
# """
if snake_position[0] > 620 or snake_position[0] < 0: # 超出左右边界
game_over(play_sur_face, score)
if snake_position[1] > 460 or snake_position[1] < 0: # 超出上下边界
game_over(play_sur_face, score)
for snack_body in snake_h[1:]:
if snake_position[0] == snack_body[0] == snack_body[1] == snake_position[1]:
game_over(play_sur_face, score)
if len(snake_h) < 40:
speed = 6 + len(snake_h) // 4
else:
speed = 16
fps_clock.tick(speed)
\ No newline at end of file
import pygame import pygame
import random
from pygame import locals from pygame import locals
seth=['left','right','up','down']
# 初始化pygame,为使用pygame做准备 # 初始化pygame,为使用pygame做准备
pygame.init() pygame.init()
bg=pygame.image.load('bg.png') bg=pygame.image.load('bg.png')
right=pygame.image.load('right.png') right=pygame.image.load('right.png')
left=pygame.image.load('left.png')
up=pygame.image.load('up.png')
down=pygame.image.load('down.png')
food=pygame.image.load('apple.png') food=pygame.image.load('apple.png')
body=pygame.image.load('body.png') body=pygame.image.load('body.png')
FPS=pygame.time.Clock() FPS=pygame.time.Clock()
x,y=240,120 x,y=240,120
z,a=540,300
pos=[(180,90),(180,120),(210,120),(x,y)]
# 创建一个窗口 # 创建一个窗口
seth='right'
EWSN=right
screen=pygame.display.set_mode((660,480)) screen=pygame.display.set_mode((660,480))
while True: while True:
x+=30
for event in pygame.event.get(): for event in pygame.event.get():
print(event)
if event.type==locals.QUIT: if event.type==locals.QUIT:
exit() exit()
if event.type==locals.K_w: if event.type==locals.KEYDOWN:
if event.key==locals.K_w:
if seth!='down':
seth='up'
EWSN=up
if event.key==locals.K_s:
if seth!='up':
seth='down'
EWSN=down
if event.key==locals.K_a:
if seth!='right':
seth='left'
EWSN=left
if event.key==locals.K_d:
if seth!='left':
seth='right'
EWSN=right
if seth=='up':
y-=30
if seth=='down':
y+=30
if seth=='left':
x-=30
if seth=='right':
x+=30
pos.append((x,y))
if x==z and y==a:
pass pass
else:
pos.pop(0)
screen.blit(bg,(0,0)) screen.blit(bg,(0,0))
screen.blit(right,(x,y)) screen.blit(EWSN,(x,y))
screen.blit(body,(x-30,y)) for i in range(len(pos)-1):
screen.blit(body,(x-60,y)) screen.blit(body,pos[i])
screen.blit(body,(x-90,y)) screen.blit(food,(z,a))
screen.blit(food,(540,300))
pygame.display.update() pygame.display.update()
FPS.tick(3) FPS.tick(3)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment