增加了蛇
This commit is contained in:
parent
92e6ea8d77
commit
db85f0a0ce
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1,3 @@
|
||||
__pycache__/
|
||||
idea.km
|
||||
idea.png
|
@ -14,10 +14,10 @@ def check_events(settings):
|
||||
sys.exit()
|
||||
# 按1键选择手动模式
|
||||
elif event.key == pygame.K_1:
|
||||
settings.game_mode = -1
|
||||
settings.game_mode = 1
|
||||
# 按2键选择自动模式
|
||||
elif event.key == pygame.K_2:
|
||||
settings.game_mode = -1
|
||||
settings.game_mode = 2
|
||||
|
||||
|
||||
def show_start(settings, screen):
|
||||
@ -44,7 +44,7 @@ def show_start(settings, screen):
|
||||
|
||||
|
||||
def show_end(settings, screen):
|
||||
"""结算界面"""
|
||||
"""失败结算界面"""
|
||||
title_font = pygame.font.Font(settings.font_name, 80)
|
||||
game_image = title_font.render('Game', True, (233, 150, 122))
|
||||
over_image = title_font.render('Over', True, (233, 150, 122))
|
||||
@ -58,3 +58,84 @@ def show_end(settings, screen):
|
||||
pygame.display.flip()
|
||||
pygame.time.wait(1500)
|
||||
settings.game_mode = 0
|
||||
|
||||
def draw_grid(settings, screen):
|
||||
#绘制横向线
|
||||
for x in range(0, settings.width, settings.cell_size):
|
||||
pygame.draw.line(screen,(40,40,40),(x,0),(x,settings.height))
|
||||
#绘制竖向线
|
||||
for y in range(0, settings.height, settings.cell_size):
|
||||
pygame.draw.line(screen,(40,40,40),(0, y),(settings.width,y))
|
||||
|
||||
def update_screen(settings, screen):
|
||||
screen.fill(settings.bg_color)
|
||||
draw_grid(settings, screen)
|
||||
|
||||
#绘制蛇
|
||||
def draw_snake(ai_settings, screen, snake):
|
||||
#头部用白色
|
||||
x = snake.coords[0]['x'] * ai_settings.cell_size
|
||||
y = snake.coords[0]['y'] * ai_settings.cell_size
|
||||
snake_head_rect = pygame.Rect(x, y, ai_settings.cell_size, ai_settings.cell_size)
|
||||
pygame.draw.rect(screen,(255,255,255), snake_head_rect)
|
||||
#蛇身内部用浅绿,外框用深绿
|
||||
for coord in snake.coords[1: -1]:
|
||||
x = coord['x'] * ai_settings.cell_size
|
||||
y = coord['y'] * ai_settings.cell_size
|
||||
snake_part_rect = pygame.Rect(x, y, ai_settings.cell_size, ai_settings.cell_size)
|
||||
pygame.draw.rect(screen,(0,155,0), snake_part_rect)
|
||||
snake_part_inner_rect = pygame.Rect(x + 4, y + 4, ai_settings.cell_size - 8, ai_settings.cell_size - 8)
|
||||
pygame.draw.rect(screen,(0,255,0), snake_part_inner_rect)
|
||||
#蛇尾用浅绿
|
||||
coord = snake.coords[-1]
|
||||
x = coord['x'] * ai_settings.cell_size
|
||||
y = coord['y'] * ai_settings.cell_size
|
||||
snake_tail_rect = pygame.Rect(x, y, ai_settings.cell_size, ai_settings.cell_size)
|
||||
pygame.draw.rect(screen,(0,255,0), snake_tail_rect)
|
||||
|
||||
#绘制游戏界面
|
||||
def update_screen(settings, screen, snake):
|
||||
screen.fill(settings.bg_color)
|
||||
draw_grid(settings, screen)
|
||||
#移动蛇
|
||||
del snake.coords[-1]#加蛇头
|
||||
snake.update()#去蛇尾
|
||||
if not is_game_over(settings, snake):
|
||||
settings.game_mode = -1
|
||||
else:
|
||||
draw_snake(settings, screen, snake)
|
||||
pygame.display.flip()
|
||||
#暂停一下
|
||||
settings.my_clock.tick(settings.clock_frq)
|
||||
|
||||
def is_game_over(settings,snake):
|
||||
#碰到左右墙壁
|
||||
if (snake.coords[snake.head_index]['x'] == -1 or snake.coords[snake.head_index]['x'] == settings.cell_w):
|
||||
return False
|
||||
#碰到上下墙壁
|
||||
if(snake.coords[snake.head_index]['y'] == -1 or snake.coords[snake.head_index]['y'] == settings.cell_h):
|
||||
return False
|
||||
#碰到自己
|
||||
if(snake.coords[snake.head_index] in snake.coords[1:]):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
#检测游戏过程中的按键
|
||||
def check_play_events(snake):
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
elif event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
elif event.key == pygame.K_LEFT and not snake.direction == 'right':
|
||||
snake.direction = 'left'
|
||||
elif event.key == pygame.K_RIGHT and not snake.direction == 'left':
|
||||
snake.direction = 'right'
|
||||
elif event.key == pygame.K_UP and not snake.direction == 'down':
|
||||
snake.direction = 'up'
|
||||
elif event.key == pygame.K_DOWN and not snake.direction == 'up':
|
||||
snake.direction = 'down'
|
115
idea.km
115
idea.km
@ -1,115 +0,0 @@
|
||||
{
|
||||
"root": {
|
||||
"data": {
|
||||
"id": "d2oi0jx7h6o0",
|
||||
"created": 1720882729134,
|
||||
"text": "Astar贪吃蛇"
|
||||
},
|
||||
"children": [
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi1r6uoww0",
|
||||
"created": 1720882823319,
|
||||
"text": "游戏本体(Pygame)",
|
||||
"layout_mind_offset": {
|
||||
"x": -29,
|
||||
"y": 1
|
||||
}
|
||||
},
|
||||
"children": [
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi2k2ygw00",
|
||||
"created": 1720882886210,
|
||||
"text": "蛇",
|
||||
"expandState": "expand",
|
||||
"layout_right_offset": {
|
||||
"x": 8,
|
||||
"y": -54
|
||||
}
|
||||
},
|
||||
"children": [
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi21ezqoo0",
|
||||
"created": 1720882845579,
|
||||
"text": "如何表示蛇"
|
||||
},
|
||||
"children": []
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi2vcyync0",
|
||||
"created": 1720882910760,
|
||||
"text": "蛇如何移动"
|
||||
},
|
||||
"children": []
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi30i8aj40",
|
||||
"created": 1720882921962,
|
||||
"text": "如何判定游戏结束?"
|
||||
},
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi3jwwljc0",
|
||||
"created": 1720882964209,
|
||||
"text": "食物"
|
||||
},
|
||||
"children": [
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi3vw1ujc0",
|
||||
"created": 1720882990278,
|
||||
"text": "如何生成食物"
|
||||
},
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi7hsyoao0",
|
||||
"created": 1720883273073,
|
||||
"text": "界面"
|
||||
},
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oijamyvjc0",
|
||||
"created": 1720884197843,
|
||||
"text": "游戏玩法"
|
||||
},
|
||||
"children": [
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oi4mwhxi80",
|
||||
"created": 1720883049078,
|
||||
"text": "自动(A*寻路算法)"
|
||||
},
|
||||
"children": []
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"id": "d2oijfl72io0",
|
||||
"created": 1720884208620,
|
||||
"text": "手动"
|
||||
},
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"template": "default",
|
||||
"theme": "snow",
|
||||
"version": "1.4.43"
|
||||
}
|
23
main.py
23
main.py
@ -1,20 +1,29 @@
|
||||
import pygame
|
||||
from settings import Settings
|
||||
import game_functions as gf
|
||||
import pygame
|
||||
from snake import Snake
|
||||
|
||||
settings = Settings()
|
||||
#设置屏幕
|
||||
screen = pygame.display.set_mode((settings.width, settings.height))
|
||||
#添加游戏标题
|
||||
pygame.display.set_caption('贪吃蛇')
|
||||
#创建蛇
|
||||
snake = Snake(settings)
|
||||
|
||||
screen = pygame.display.set_mode((settings.width, settings.height)) # 设置屏幕
|
||||
pygame.display.set_caption('贪吃蛇') # 添加游戏标题
|
||||
|
||||
def run_game1():
|
||||
gf.check_play_events(snake)
|
||||
gf.update_screen(settings, screen, snake)
|
||||
|
||||
def run_game():
|
||||
while True:
|
||||
if settings.game_mode == 0:
|
||||
gf.show_start(settings, screen)
|
||||
gf.show_start(settings,screen)
|
||||
elif settings.game_mode == -1:
|
||||
gf.show_end(settings, screen)
|
||||
|
||||
gf.show_end(settings,screen)
|
||||
snake.reset(settings)
|
||||
elif settings.game_mode == 1:
|
||||
run_game1()
|
||||
|
||||
if __name__ == "__main__":
|
||||
pygame.init()
|
||||
|
38
snake.py
Normal file
38
snake.py
Normal file
@ -0,0 +1,38 @@
|
||||
import random
|
||||
|
||||
class Snake():
|
||||
def __init__(self,settings):
|
||||
self.reset(settings)
|
||||
|
||||
#蛇的初始化
|
||||
def reset(self,settings):
|
||||
#蛇头的坐标
|
||||
self.start_x = random.randint(5, settings.cell_w - 6)
|
||||
self.start_y = random.randint(5, settings.cell_h - 6)
|
||||
self.head_index = 0
|
||||
#蛇的初始运动方向
|
||||
self.direction = 'right'
|
||||
#蛇的初始坐标字典,初始蛇为蛇头位置及其左边的两个格子
|
||||
self.coords = [{'x' : self.start_x, 'y': self.start_y},
|
||||
{'x' : self.start_x - 1, 'y': self.start_y},
|
||||
{'x' : self.start_x - 2, 'y': self.start_y}]
|
||||
#更新蛇,每次蛇移动一步,因此相当于每次移动在蛇的坐标字典中再插入一个新蛇头
|
||||
#按常识,每次移动后,不仅仅是蛇头向前移动一个,更重要的是蛇尾也要向前移,但是在该函数中先不处理蛇尾
|
||||
#因为如果蛇吃了食物,此时蛇尾其实并没有移动
|
||||
def update(self):
|
||||
newHead = {}
|
||||
#根据移动方向确定蛇头
|
||||
if self.direction == 'up':
|
||||
newHead = {'x' : self.coords[self.head_index]['x'],
|
||||
'y' : self.coords[self.head_index]['y'] - 1}
|
||||
elif self.direction == 'down':
|
||||
newHead = {'x' : self.coords[self.head_index]['x'],
|
||||
'y' : self.coords[self.head_index]['y'] + 1}
|
||||
elif self.direction == 'left':
|
||||
newHead = {'x' : self.coords[self.head_index]['x'] - 1,
|
||||
'y' : self.coords[self.head_index]['y']}
|
||||
elif self.direction == 'right':
|
||||
newHead = {'x' : self.coords[self.head_index]['x'] + 1,
|
||||
'y' : self.coords[self.head_index]['y']}
|
||||
self.coords.insert(0,newHead)
|
||||
|
Loading…
Reference in New Issue
Block a user