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_ ...
随机推荐
- 交表(Send a Table)
#include<stdio.h> #include<string.h> #define N 50010 int phi[N],n,sum[N]; void phi_table ...
- shell getopts
1, 分类: LINUX getopts命令内置于shell中,可以获取由单个字符所指定的有效命令行参数,单个字符有一个‘ - ’号或‘ + ’号. 简单的说,比如运行命令: iptables -t ...
- Linux在线安装pip和numpy
最近写Python需要用到numpy包 运行pip install numpy就会自动安装 一.因此需要先安装pip 1.如果安装的是Python>=2.7.9或者Python>=3.4, ...
- H+后台主题UI框架---整理(二)
本篇文章是针对H+后台主题UI框架的整理的第二部分.主要只有一个point.如下: 其代码如下: <div class="ibox float-e-margins"> ...
- 第8章 应用协议 图解TCP/IP 详解
第8章 应用协议 图解TCP/IP 详解 8.1 应用层协议概要 应用层协议的定义 TCP和IP等下层协议是不依赖上层应用类型.实用性非常广的协议.而应用协议则是为了实现某种应用而设计和创造的协议. ...
- Hibernate中的inverse和cascade属性
Hibernate中的inverse和cascade属性 inverse的值有两种,"true"和"false".inverse="false&quo ...
- Java 利用FTP上传,下载文件,遍历文件目录
Java实现FTP上传下载文件的工具包有很多,这里我采用Java自带的API,实现FTP上传下载文件.另外JDK1.7以前的版本与其之后版本的API有了较大的改变了. 例如: JDK1.7之前 JDK ...
- hdu 2192 MagicBuilding
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 在同一页面显示多个JavaScript统计图表
最近我接到一个开发任务,要求就"售后服务客户满意度调查问卷表"里客户填写的反馈答案做一个统计. 问题的例子如下: 您最后一次是何时购买了我们的产品? 服务人员服务态度是否友好.工作 ...
- 2019_京东JAVA实习生招聘机试第一题
题意抽象出来就是,求根节点的所有子节点中,以这些子节点为根的子树的最大节点数. 已有向图的方式来保存无向图,所以叶子结点i的eage[i].size()==1. import java.util.Ar ...