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_ ...
随机推荐
- JAVA实训总结:继承-——子类创建对象原理
继承关键字:extends Java只允许单继承存在 不可以被继承的东西: 1.private成员 体现了java的封装特点,外部类只允许set()get()方法调用,若无set()方法,则类创建的对 ...
- 「开源」目前见过的最好的开源OA产品
这是我目前见过的最好的开源OA产品.功能完整,代码结构清晰.值得推荐. 1.项目介绍 oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql ...
- Educational Codeforces Round 46 (Rated for Div. 2) A. Codehorses T-shirts
Bryce1010模板 http://codeforces.com/problemset/problem/1000/A 题意: 问你将一种类型的衣服转换成另一种的最小次数. #include<b ...
- Problem D: 勤奋的涟漪2 dp + 求导
http://www.gdutcode.sinaapp.com/problem.php?cid=1049&pid=3 dp[i][state]表示处理了前i个,然后当前状态是state的时候的 ...
- XSS漏洞解析(三)
系统存在xss漏洞就容易引发CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为: ...
- MVC:html动态追加行及取值
先一个button id=addRow 点击事件进行添加 $("#addRow").bind("click", function () { var addH ...
- C#中分部类和分部方法的应用
本篇文章介绍了,C#中分部类和分部方法的应用.需要的朋友参考下 分部类(Partial Class)在C#2.0引入,分部方法(Partial Method)在C#3.0引入,这两个语法特性都 ...
- 代码文件导到word里
# 创建并写入word文档 import docx import sys import os dir = "D:\\gitwork\\fm.qimeng.c-class\\src\\main ...
- AJPFX总结Java 程序初始化过程
觉得Core Java在Java 初始化过程的总体顺序没有讲,只是说了构造器时的顺序,作者似乎认为路径很多,列出来比较混乱.我觉得还是要搞清楚它的过程比较好.所以现在结合我的学习经验写出具体过程: 过 ...
- Android手机屏幕投射到电脑神器Vysor
做android开发的,经常要把手机屏幕投射到电脑,用来演示.普遍的解决方案是360或者豌豆荚的演示功能,缺点是延迟非常厉害,大概有3秒左右,非常影响演示效果.以下介绍Vysor,几乎0延迟,能与手机 ...