最近学完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. Ubuntu 18.04 LTS 常见问题解决 2

    1 每次重启后都有system program problem detected sudo gedit /etc/default/apport 然后将打开的文件中的enabled=1改为0,原因暂时不 ...

  2. JAVA实训总结:继承-——子类创建对象原理

    继承关键字:extends Java只允许单继承存在 不可以被继承的东西: 1.private成员 体现了java的封装特点,外部类只允许set()get()方法调用,若无set()方法,则类创建的对 ...

  3. Jquery | 基础 | 慕课网 | 元素选择器

    getElementsByTagName方法得到页面所有的<div>元素 var divs = document.getElementsByTagName('div'); 与 同样的效果, ...

  4. [LuoGu]P2664 树上游戏

    Portal 这题真的好. 看到树上路径, 脑子里就要点分治 这一题对于每个点都要计算一遍, 如果暴算实在不好算, 这样我们就可以考虑算贡献. 直接计算每种颜色的贡献. 因为一条过重心的路径中, 可能 ...

  5. [WOJ1583]向右看齐

    题目链接: WOJ1583 题目分析: 大水题--我就来水个题解 倒序扫,单调栈维护单减序列,每个对象的答案是栈里它下面那个元素 代码: #include<bits/stdc++.h> # ...

  6. 复习Java和前端、后端框架等。

    以下便是我开始复习时做的笔记.

  7. iphone6,键盘收起,H5页面下面出现空白

  8. [转]ASP.NET MVC Bootstrap极速开发框架

    本文转自:http://www.cnblogs.com/smartbooks/p/3814927.html 前言 每次新开发项目都要从头开始设计?有木有一个通用的快速开发框架?并且得是ASP.NET ...

  9. 获取一段HTML文本中的第一张图片与截取内容摘要

    有时候我们获得到的数据是一段HTML文本,也许这段文本里面有许多图片,需要截取一张作为标题图片,这时就可以用到下面这个方法获取到第一张图片: #region 获取第一张图片 /// <summa ...

  10. JVM线程与Linux内核线程的映射[转]

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...