pygame试水,写一个贪吃蛇
最近学完python基础知识,就想着做一个游戏玩玩,于是就在https://www.pygame.org/docs/学着做了个贪吃蛇游戏。
首先要导入模块。
import pygame
import sys
from pygame.locals import *
import time
import random
首先需要一个游戏运行的界面。
screen = pygame.display.set_mode((1000,700))
其次要有一条蛇和一份食物。
这是蛇:
snake_Position = [200,200] #蛇的起始位置,即蛇头的位置。
snakeBody = [[100,100],[90,100],[80,100]] #列表的嵌套,每一个子列表代表一节身子的坐标。
这是食物:
foodPosition = [500,350] #初始时食物的位置,坐标随便设置就好,在屏幕内就行。
然后就是把蛇和食物画出来咯~
for body in snakeBody: #吧蛇的每节身子都画出来。
2 pygame.draw.rect(screen,pygame.Color(255,255,255),Rect(body[0], body[1],10,10)) pygame.draw.rect(screen, pygame.Color(255,0,255),Rect(foodPosition[0], foodPosition[1], 10, 10))
再之后相办法移动蛇身和转弯。
for event in pygame.event.get():
if event.type == QUIT:
GameOver()
elif event.type == KEYDOWN:
if event.key == K_RIGHT:
changeDirection = 'right'
if event.key == K_LEFT:
changeDirection = 'left'
if event.key == K_UP:
changeDirection = 'up'
if event.key == K_DOWN:
changeDirection = 'down'
#Esc键
if event.key == K_ESCAPE:
pygame.event.post(pygame.event.Event(QUIT))
#确定方向
if changeDirection == 'left' and not direction == 'right':
direction = changeDirection
if changeDirection == 'right' and not direction == 'left':
direction = changeDirection
if changeDirection == 'up' and not direction == 'down':
direction = changeDirection
if changeDirection == 'down' and not direction == 'up':
direction = changeDirection
#移动蛇头坐标 snake_Position[0]和snake_Position[1]分别代表蛇头横坐标和纵坐标
if direction == 'up':
snake_Position[1] -= 10
if direction == 'down':
snake_Position[1] += 10
if direction == 'right':
snake_Position[0] += 10
if direction == 'left':
snake_Position[0] -= 10 #每次循环先增加一个蛇头,在进行判断,不然的话蛇不会移动
snakeBody.insert(0,list(snake_Position))
#吃到了食物
if snake_Position[0] == foodPosition[0] and snake_Position[1] == foodPosition[1]:
flag = 0
#没吃到食物,把增加的头砍掉0.0
else:
snakeBody.pop()
需要一个游戏结束的条件。
#判断蛇头是否与身子相撞
if len(snakeBody)>=5:
for section in snakeBody[4:]:
if snake_Position == section:
GameOver()
else:
continue
#判断蛇头是否与墙相撞
if snake_Position[0] > 1000 or snake_Position[0] < 0:
GameOver()
elif snake_Position[1] > 700 or snake_Position[1] < 0:
GameOver()
写一个游戏开始界面和结束界面就好了。
def start_text_Display():
screen = pygame.display.set_mode((1000,700))
text_font = pygame.font.Font(None, 90)
text = text_font.render("Welcome to", 1, (255,0,0))
name_font = pygame.font.Font(None, 90)
name = name_font.render("The Game of Snake", 1, (255,0,0))
tip_font = pygame.font.Font(None,40)
tip = tip_font.render("Press '0' to start. Press 'ESC' to quit.", 1, (0,64,64,0))
STARTFLAG = 1
while STARTFLAG:
for event in pygame.event.get():
screen.fill(pygame.Color(0,0,0))
screen.blit(text, (300, 250))
screen.blit(name, (200, 350))
screen.blit(tip, (250, 650))
pygame.display.update()
if event.type == KEYDOWN:
if event.key == K_0:
STARTFLAG = 0
if event.key == K_ESCAPE:
sys.exit() def end_text_Display():
screen = pygame.display.set_mode((1000,700))
text_font = pygame.font.Font(None, 90)
text = text_font.render("Game Over:)", 1, (255,0,0))
name_font = pygame.font.Font(None, 40)
name = name_font.render("Designed by SOHOYA", 1, (64,64,64,0))
while True:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
screen.fill(pygame.Color(0,0,0))
screen.blit(text, (300, 250))
screen.blit(name, (600, 600))
pygame.display.update()
全部源代码如下:
import pygame
import sys
from pygame.locals import *
import time
import random def start_text_Display():
screen = pygame.display.set_mode((1000,700))
text_font = pygame.font.Font(None, 90)
text = text_font.render("Welcome to", 1, (255,0,0))
name_font = pygame.font.Font(None, 90)
name = name_font.render("The Game of Snake", 1, (255,0,0))
tip_font = pygame.font.Font(None,40)
tip = tip_font.render("Press '0' to start. Press 'ESC' to quit.", 1, (0,64,64,0))
STARTFLAG = 1
while STARTFLAG:
for event in pygame.event.get():
screen.fill(pygame.Color(0,0,0))
screen.blit(text, (300, 250))
screen.blit(name, (200, 350))
screen.blit(tip, (250, 650))
pygame.display.update()
if event.type == KEYDOWN:
if event.key == K_0:
STARTFLAG = 0
if event.key == K_ESCAPE:
sys.exit() def end_text_Display():
screen = pygame.display.set_mode((1000,700))
text_font = pygame.font.Font(None, 90)
text = text_font.render("Game Over:)", 1, (255,0,0))
name_font = pygame.font.Font(None, 40)
name = name_font.render("Designed by SOHOYA", 1, (64,64,64,0))
while True:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
screen.fill(pygame.Color(0,0,0))
screen.blit(text, (300, 250))
screen.blit(name, (600, 600))
pygame.display.update() def GameOver():
end_text_Display()
pygame.quit()
sys.exit() # 好戏开始了:)
start = True
while start:
#初始化
pygame.init()
#蛇移动的速度,即控制每个循环多长时间运行一次,循环一次,蛇移动一单位(距离需要自己设置)
snake_speed = pygame.time.Clock()
#游戏界面
screen = pygame.display.set_mode((1000,700))
#给游戏起个名字
pygame.display.set_caption("Snake_Game")
snake_Position = [200,200] #蛇的起始位置,即蛇头的位置
snakeBody = [[100,100],[90,100],[80,100]] #列表的嵌套,每一个子列表代表一节身子
foodPosition = [500,350] #初始时食物的位置
flag = 1 ##标识食物是否被吃的标识符
direction = 'down'
changeDirection = direction
start_text_Display() ##游戏开始界面
run = True
while run:
for event in pygame.event.get():
if event.type == QUIT:
GameOver()
elif event.type == KEYDOWN:
if event.key == K_RIGHT:
changeDirection = 'right'
if event.key == K_LEFT:
changeDirection = 'left'
if event.key == K_UP:
changeDirection = 'up'
if event.key == K_DOWN:
changeDirection = 'down'
#Esc键
if event.key == K_ESCAPE:
pygame.event.post(pygame.event.Event(QUIT))
#确定方向
if changeDirection == 'left' and not direction == 'right':
direction = changeDirection
if changeDirection == 'right' and not direction == 'left':
direction = changeDirection
if changeDirection == 'up' and not direction == 'down':
direction = changeDirection
if changeDirection == 'down' and not direction == 'up':
direction = changeDirection
#移动蛇头坐标 snake_Position[0]和snake_Position[1]分别代表蛇头横坐标和纵坐标
if direction == 'up':
snake_Position[1] -= 10
if direction == 'down':
snake_Position[1] += 10
if direction == 'right':
snake_Position[0] += 10
if direction == 'left':
snake_Position[0] -= 10 #每次循环先增加一个蛇头,在进行判断,不然的话蛇不会移动
snakeBody.insert(0,list(snake_Position))
#吃到了食物
if snake_Position[0] == foodPosition[0] and snake_Position[1] == foodPosition[1]:
flag = 0
#没吃到食物,把增加的头砍掉0.0
else:
snakeBody.pop()
# 随机位置产生一个食物
if flag == 0:
x = random.randrange(1,10)
y = random.randrange(1,7)
foodPosition = [int(x*100),int(y*100)]
flag = 1 screen.fill(pygame.Color(0,0,0))
##绘制蛇身和食物
for body in snakeBody:
pygame.draw.rect(screen, pygame.Color(255,255,255), Rect(body[0], body[1],10,10))
pygame.draw.rect(screen, pygame.Color(255,0,255), Rect(foodPosition[0], foodPosition[1], 10, 10))
pygame.display.update()
#判断蛇头是否与身子相撞
if len(snakeBody)>=5:
for section in snakeBody[4:]:
if snake_Position == section:
GameOver()
else:
continue
#判断蛇头是否与墙相撞
if snake_Position[0] > 1000 or snake_Position[0] < 0:
GameOver()
elif snake_Position[1] > 700 or snake_Position[1] < 0:
GameOver() #控制速度,tick(n),n表示每秒主函数main()循环次数,每秒循环次数越多看起来越流畅,但是游戏难度更大
snake_speed.tick(30)
这样,贪吃蛇游戏就做好啦,第一个游戏,虽然好多地方不太完美,不过自己挺满意的。
日后还要多学习学习。
pygame试水,写一个贪吃蛇的更多相关文章
- 如何用Python写一个贪吃蛇AI
前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...
- 使用Python写一个贪吃蛇
参考代码http://blog.csdn.net/leepwang/article/details/7640880 我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的 ...
- 一步一步用Canvas写一个贪吃蛇
之前在慕课网看了几集Canvas的视频,一直想着写点东西练练手.感觉贪吃蛇算是比较简单的了,当年大学的时候还写过C语言字符版的,没想到还是遇到了很多问题. 最终效果如下(图太大的话 时间太长 录制gi ...
- 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...
- 用Python写一个贪吃蛇
最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这 ...
- 用js写一个贪吃蛇小游戏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- react 写一个贪吃蛇
示例: 全部代码如下: snake.jsx import React, { Component } from 'react'; import PropTypes from 'prop-types'; ...
- python 写一个贪吃蛇游戏
#!usr/bin/python #-*- coding:utf-8 -*- import random import curses s = curses.initscr() curses.curs_ ...
随机推荐
- Luogu P1373 小a和uim之大逃离【dp】By cellur925
题目传送门 $50pts$:容易设计出状态$f[i][j][l][r][st]$表示当前的这个人在($i$,$j$),小a和uim魔瓶中的含量分别为$l$,$r$,当$st=0$表明现在是小a在吃,当 ...
- 用jQuery获取到一个类名获取到的是一个数组 ,如果对数组中的每个进行相应的操作可以这样进行
$(".userImg").each(function(){ $(this).click(function(){ var imgid = $(this).attr("id ...
- Flexbox布局的基本概念
flex container(flex容器 或 弹性容器) flex容器是flex元素的的父元素. 通过设置display 属性的值为flex 或 inline-flex定义. 注旧版本的属性值: b ...
- Jenkins持续集成多任务之MultiJob
项目实践中,我们可能需要在多个任务发布成功后在执行某个任务,这里就需要用到MultiJob这个插件. 案例场景:有3个任务:A.B.C,其中C任务需要等A和B执行成功后才会执行,那么就要先执行A和B, ...
- 回文树1960. Palindromes and Super Abilities
Bryce1010模板 http://acm.timus.ru/problem.aspx?space=1&num=1960 #include <bits/stdc++.h> usi ...
- Chrome下font-size小于12px的解决办法
自从Chorme取消了-webkit-text-size-adjust,这个问题又变得令人烦恼起来. 好在我们可以利用-webkit-transform这个私有属性. .box{ -webkit-tr ...
- Unity项目学习笔记
1.TCP和IP IP:主要作用是在复杂的网络环境中将数据包发送给的最终的目标地址. 端口号:系统会分给系统端口号 一般知名的端口号在0-1023之间,而我们经常使用的自定义/动态分配的端口号则一般 ...
- sql子查询的例子
1.单行子查询 select ename,deptno,sal from emp where deptno=(select deptno from dept ...
- qt QTableView/QTableWidget样式设置
转载请注明出处:http://www.cnblogs.com/dachen408/p/7591409.html 选中设置: QTableView::item:selected { background ...
- SEO 第二章
SEO第二章 1. 掌握搜索引擎工作原理(重点) 2. 了解百度算法 3. 关键词的分类 一.什么是搜索引擎? 搜索引擎是用来实现搜索服务的,说白了搜索引擎也属于一种网站. 浏览器是用来加载网站 ...