最近学完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试水,写一个贪吃蛇的更多相关文章

  1. 如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  2. 使用Python写一个贪吃蛇

    参考代码http://blog.csdn.net/leepwang/article/details/7640880 我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的 ...

  3. 一步一步用Canvas写一个贪吃蛇

    之前在慕课网看了几集Canvas的视频,一直想着写点东西练练手.感觉贪吃蛇算是比较简单的了,当年大学的时候还写过C语言字符版的,没想到还是遇到了很多问题. 最终效果如下(图太大的话 时间太长 录制gi ...

  4. 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)

    C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...

  5. 用Python写一个贪吃蛇

    最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这 ...

  6. 用js写一个贪吃蛇小游戏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  8. react 写一个贪吃蛇

    示例: 全部代码如下: snake.jsx import React, { Component } from 'react'; import PropTypes from 'prop-types'; ...

  9. python 写一个贪吃蛇游戏

    #!usr/bin/python #-*- coding:utf-8 -*- import random import curses s = curses.initscr() curses.curs_ ...

随机推荐

  1. mysql 用 group by 和 order by同时使用

    首先,这是不可能实现的 mysql的查询的顺序 select -> from-> where->group by->having->order by. 但mysql的解析 ...

  2. 微信BUG之微信内置的浏览器中window.location.href 不跳转

    最近做微信开发遇到这个问题,查了一些文档,总结一下 1.url后面加参数 indow.location.href = url +'?timestamp='+ new Date().getTime()+ ...

  3. bzoj 4821 [Sdoi2017]相关分析

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解 做法显然 就是维护一颗线段树 里面装4个东西 区间x的和 区间y的和 区间$x^ ...

  4. EOJ Monthly

    ###2018.10 A.oxx 的小姐姐们 oxx 和他的小姐姐(们)躺在图书馆前的大草坪上看星星. 有强迫症的 oxx 想要使得他的小姐姐们正好躺成一块 n×m 的长方形. 已知小姐姐的形状是 1 ...

  5. Java学习笔记之log4j与commons-logging<转>

    Java学习笔记之log4j与commons-logging<转> (2011-02-16 11:10:46) 转载▼ 标签: 杂谈 分类: 技术学习之其他 Logger来自log4j自己 ...

  6. Unity Mesh 初体验

    什么是Mesh Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成.所以一个3D模型的表面是 ...

  7. void运算符

    void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但忽略计算结果并返回undefined.由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序 ...

  8. canvas防画图工具

    <style> body {   background: black;   text-align: center; } #cans {   background: white; } < ...

  9. IOS之pageControl

    用户点击页面控件,会触发UIControlEventValueChanged事件,并启动设置为控件动作的任何方法.可以通过调用currentPage查询控件的新值,并通过调整numberOfPages ...

  10. 【HEVC帧间预测论文】P1.5 Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule

    Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule <HEVC标准介绍.HEVC帧间预测论文笔记&g ...