文档章节

pygame写的多食物面向对象贪吃蛇

z
 zbaigao
发布于 2017/05/17 00:13
字数 683
阅读 75
收藏 0
点赞 0
评论 0

pygame的贪吃蛇,一次投递多个食物,默认画布15*15,一次投递20个食物,食物之间、食物与蛇之间不会重叠。当方块总数 - 蛇身长度 - 食物个数 < 20时,判断玩家胜利。有生之年终于可以看到贪吃蛇的结局了!

本版本的贪吃蛇Snake、Food和World均独立于具体库,稍作修改可成为命令行版本的贪吃蛇,也可迁移到其他引擎中。

# -*- coding: utf-8 -*-
"""
Created on Tue May 16 07:24:28 2017

@author: zbg
"""
import pygame
from pygame.locals import *

from random import randint, choice, shuffle

class Map(dict):
    def __init__(self, w, h):
        dict.__init__(self)
        self.w = w
        self.h = h
        self.clear()
        
    def __str__(self):
        s = ''
        for j in range(self.h):
            for i in range(self.w):
                s += self[(i, j)]
            s += '\n'
        return s
    
    def clear(self):
        for i in range(self.w):
            for j in range(self.h):
                self[(i, j)] ='.'
            
class Food(object):
    def __init__(self, world, n = 1):
        self.n = n #一次产生n个食物
        self.m = world.m
        self.world = world
        self.w = self.m.w
        self.h = self.m.h
        self.locations = {}#用字典是为了吃食物时方便删除
        
    def generate(self):#由外部world调用,维持n个食物     
        space = []#除开蛇以外的地方的坐标
        for i in range(self.w):
            for j in range(self.h):
                if (i, j) not in self.world.snake.body:
                    space.append((i, j))
        shuffle(space)
        while len(self.locations) < self.n:
            self.locations[space[-1]] = 1 #后面的值1并没有意义。
            del space[-1]
    
    def draw(self):
        for l in self.locations:
            self.m[l] = 'o'
        
class Snake(object):
    '''
    蛇做一些简单的移动、计算和绘制
    改变移动方向交给外部的World来处理
    '''
    def __init__(self, world):
        self.world = world
        self.m = world.m
        self.h = self.m.h
        self.w = self.m.w
        self.direction = "left" #
        self.state = 'alive' # 'alive' or 'dead'
        
        cw, ch = self.w / 2, self.h / 2
        self.body = [(cw, ch), (cw + 1, ch), (cw + 2, ch)]
        
    def draw(self):
        for b in self.body:
            self.m[b] = 'x'
    
    def newhead(self):    
        headw, headh = self.body[0]
        newheadw, newheadh = headw, headh
        if self.direction == "left":
            newheadw = headw - 1
        elif self.direction == "right":
            newheadw = headw + 1
        elif self.direction == "up":
            newheadh = headh - 1
        elif self.direction == "down":
            newheadh = headh + 1
        return newheadw, newheadh    
    
    def move(self):
        x, y = self.newhead()
        if len(self.body) + self.world.food.n + 20 > self.w * self.h:
            print "fine, you win!!"
        elif x == -1 or y == -1 or x == self.w or y == self.h:
            print "error, dead"
        elif (x, y) in self.body:
            print "error, dead"
        elif (x, y) in self.world.food.locations:
            self.body = [self.newhead()] + self.body[:]
            del world.food.locations[(x, y)]
        else:
            self.body = [self.newhead()] + self.body[0: -1]
        
    def changedirection(self, direction):
        self.direction = direction

class World(object):
    def __init__(self, w, h):
        self.m = Map(w, h)
        self.snake = Snake(self)
        self.food = Food(self, 20)
        self.w, self.h = w, h
        
    def run(self):
        self.food.generate()
        self.m.clear()
        self.snake.move()
        self.food.draw()
        self.snake.draw()
        
def show(screen, m):
    for i in range(m.w):
        for j in range(m.h):
            if m[(i, j)] == 'x':
                r = pygame.Rect(i * unit, j * unit, unit, unit)
                pygame.draw.rect(screen,(136,0,21),r,0)
            elif m[(i, j)] == 'o':
                r = pygame.Rect(i * unit, j * unit, unit, unit)
                pygame.draw.rect(screen,(0,174,21),r,0)

h = 15
w = 15
unit = 30
SCREEN_SIZE =  (w * unit, h * unit)  
DIRECTION = {pygame.K_UP: 'up', pygame.K_DOWN: "down", pygame.K_LEFT: "left", pygame.K_RIGHT:"right"}       
world = World(15,15)
clock = pygame.time.Clock()

pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit(0)
        if event.type == pygame.KEYDOWN:
            if event.key in DIRECTION:
                direction = DIRECTION[event.key]
                if direction in ['up', 'down'] and world.snake.direction in ['up', 'down']:
                    pass
                elif direction in ['left', 'right'] and world.snake.direction in ['left', 'right']:
                    pass
                else:
                    world.snake.changedirection(direction)
            
    screen.fill((255,255,255))
    world.run()
    show(screen, world.m)
    pygame.display.update()
    print world.m
    clock.tick(3)

 

© 著作权归作者所有

共有 人打赏支持
z
粉丝 4
博文 22
码字总数 14115
作品 0
杭州
做游戏,学编程(C语言) 22 贪吃蛇(printf输出版本)

这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储、如何实现转弯的效果、吃到食物后如何增加长度。更多内容可参看《C语言课程设计与游戏开发实践教程》第...

童晶
2017/09/06
0
0
Make Games with Python & Pygame (4)

从现在开始,就是具体游戏的制作了。作者是每章一个游戏,有些游戏我不是很感兴趣,只对其中有兴趣,所以就只讲这一些。 第一个游戏就是贪吃蛇游戏,说起这个游戏,这可能是我玩的最早的游戏...

NightCode
2015/04/13
0
0
从零开始学 Web 之 JavaScript 高级(一)原型,贪吃蛇案例

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ CSDN...

fengdaoting
06/29
0
0
13岁Python开发者写给青少年的多人游戏编程(上)

本文由伯乐在线 -justyoung 翻译,黄利民 校稿。未经许可,禁止转载! 英文出处:Julian Meyer。欢迎加入翻译组。 这篇博客的作者是一名13岁的Python开发者Julian Meyer。你可以在Google+和T...

伯乐在线
2014/11/30
0
0
Fly的狐狸/GameSnake

贪吃蛇游戏 这是打砖块游戏之后,本人学习JavaFX的又一作品《贪吃蛇》 根据打砖块游戏核心包进行优化 更新说明 2014-11-04 贪吃蛇1.1版本已经OK了 加入信息展示,如生命,积分。 加入暂停和重...

Fly的狐狸
2014/10/30
0
0
pygame开发2048游戏

背景 最近入手新游戏:《Threes》,2048的前身,难度比2048大,这个游戏的命运比较悲哀,App上架没几天,便被人仿制出与之类似、入手更快的《2048》,2048获得了巨大的成功,无论App store 还...

yancy_
2017/06/21
0
0
C语言设计之贪吃蛇,150行代码的小案列少侠有没有兴趣了解下

前言 智慧与美貌并重,英雄与侠义的化身的小编上线了,没错我就是传说中的讲课通俗而不庸俗,说话风流而不下流的小编。百年修得阁下回眸于本文。今天的主题是带着大家吃顿蛇肉,没错C语言设计...

这个人很懒什么都没留下
07/16
0
0
贪吃蛇系列之八——我是吃货我自豪

在上一个项目中,我们已经把食物绘制在我们的游戏界面上了,那么在这次的项目中,我们就来把这个食物吃掉。好了,还是先来看代码: /** 判断蛇有没有吃到食物的方法 @param food 食物对象 @r...

多利的猫粮
2012/12/29
0
0
Java实现贪吃蛇小游戏(附完整源码)

今天我就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现。 第一步完成的功能:写一个界面 大家见到的贪吃蛇小游戏,界面肯定是少不了的。因此,第一步就是写一...

Java团长
05/14
0
0
Pygame编译报错

编译一个简单程序是报错 请多指教 # -- coding: cp936 -- bif = "chenjianhong.jpg" mif = "code.png" import pygame, sys from pygame.locals import * pygame.init() screen = pygame.dis......

giantchen2011
2011/05/28
509
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
29分钟前
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
34分钟前
0
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
39分钟前
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
46分钟前
0
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
47分钟前
0
0
Centos7编译安装ntp-4.2.8p11

Centos7编译安装ntp-4.2.8p11 背景 因公司做等保评级,在进行安全漏洞检测时发现ntp需要升级到ntp-4.2.7p25以上版本,经过一番搜索,没有该版本及新版本ntp的yum安装包,所以只能编译安装了,...

阿dai
53分钟前
0
0
antd pro 新增模块的步骤

index.js是整个项目的入口文件。 // 1. Initializeconst app = dva({ history: createHistory(),});// 2. Pluginsapp.use(createLoading());// 3. Register global modelapp.model......

灯下草虫鸣_
今天
0
0
Cisco VPN在win10下报Error 56的解决办法

问题描述 Cisco VPN在win10下报Error 56: The Cisco Systems, Inc. VPN Service has not been started 解决方案 方案一:在计算机管理-》服务 查看Cisco Systems, Inc. VPN Service服务是否存...

chenfj_fer
今天
0
0
Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
今天
0
0
RxJava2的错误处理方案

最近使用retrofit2 + rxKotlin2写接口访问,想尽量平铺代码,于是就想到当借口返回的状态码为「不成功」时(比如:code != 200),就连同网络错误一起,统一在onError方法中处理。想法总是好的...

猴亮屏
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部