python实现贪吃蛇

贪吃蛇的算法还是比较简单的,蛇的移动我是通过不停添加一个head方块,然后判断应该加到蛇头的哪个方向,加完后删掉蛇尾就行了,如果吃到食物就不删蛇尾。

只是一个贪吃蛇只需要70行代码左右就可以了,后来又加了计分,失败后重新游戏,暂停功能····结果现在代码乱成渣了。。

重新游戏部分肯定有更好的方法,我写的太乱了。。求大神指教。由于没用网格,判断吃到的时候是用范围判断的,有时候有些偏差···

代码:

  1 #-*- coding: utf-8 -*-
  2 import pygame, sys, random, time
  3 from pygame.locals import *
  4
  5 pygame.init()
  6 font = pygame.font.Font(u"c:\\windows\\fonts\\MSYH.ttf",30)
  7 mainClock = pygame.time.Clock()
  8 wsurface = pygame.display.set_mode((800,600),0,32)
  9 pygame.display.set_caption("My_Snake~")
 10
 11 Len = 20
 12 snakeRect = []
 13 for i in range(10,13):
 14     snakeRect.append(pygame.Rect(i * (Len) , 50 , Len, Len))
 15 food = pygame.Rect(10 * (Len), 10 * (Len), Len, Len)
 16 ml    = False
 17 mr    = True
 18 mu    = False
 19 md    = False
 20 score = 0
 21 black = (0, 0, 0)
 22 green = (0, 255, 0)
 23 white = (255, 255, 255)
 24 global FPSCLOCK
 25 FPSCLOCK = pygame.time.Clock()
 26 #####################################################
 27 def judge():
 28     if snakeRect[0].left - 15 <= food.left <= snakeRect[0].left + 15 and snakeRect[0].top - 15 <= food.top <= snakeRect[0].top + 15:
 29         return True
 30 def judge2(a, b):
 31     if a.left - 15 <= b.left <= a.left + 15 and a.top - 15 <= b.top <= a.top + 15:
 32         return True
 33 def checkForKeyPress():
 34     #checkForQuit()
 35     for event in pygame.event.get([KEYDOWN, KEYUP]):
 36         if event.type == KEYUP:
 37             continue
 38         return event.key
 39     return None
 40 #######################################################
 41 flagg = True
 42 speed = 8
 43 while True:
 44     for event in pygame.event.get():
 45         if event.type == QUIT:
 46             pygame.QUIT()
 47             sys.exit()
 48         if event.type == KEYDOWN:
 49             if event.key == K_r:
 50                 snakeRect = []
 51                 for i in range(10,13):
 52                     snakeRect.append(pygame.Rect(i * (Len) , 50 , Len, Len))
 53                 food = pygame.Rect(10 * (Len), 10 * (Len), Len, Len)
 54                 ml    = False
 55                 mr    = True
 56                 mu    = False
 57                 md    = False
 58                 score = 0
 59                 flagg = True
 60                 speed = 8
 61             if event.key == K_p:
 62                 wsurface.fill(black)
 63                 text_surface1 = font.render(‘Pause!‘ , True, (0, 0, 255))
 64                 wsurface.blit(text_surface1, (10, 50))
 65                 while checkForKeyPress() == None:
 66                     pygame.display.update()
 67                     FPSCLOCK.tick()
 68             if event.key == K_LEFT and mr == False:
 69                 ml = True
 70                 mr = False
 71                 mu = False
 72                 md = False
 73             if event.key == K_RIGHT and ml == False:
 74                 ml = False
 75                 mr = True
 76                 mu = False
 77                 md = False
 78             if event.key == K_UP and md == False:
 79                 ml = False
 80                 mr = False
 81                 mu = True
 82                 md = False
 83             if event.key == K_DOWN and mu == False:
 84                 ml = False
 85                 mr = False
 86                 mu = False
 87                 md = True
 88     head = pygame.Rect(snakeRect[0].left,snakeRect[0].top,snakeRect[0].width,snakeRect[0].height)
 89     if flagg == False:
 90         continue
 91     if ml == True:
 92         head.right = head.left - 1
 93     if mr == True:
 94         head.left = head.right + 1
 95     if mu == True:
 96         head.bottom = head.top - 1
 97     if md == True:
 98         head.top = head.bottom + 1
 99     snakeRect.insert(0, head)
100     #判断失败和重新游戏
101     if head.right < 0 or head.left > 800 or head.bottom < 0 or head.top > 600 or snakeRect[0] in snakeRect[1:]:
102         wsurface.fill(white)
103         text_surface2 = font.render(‘Press R to restart!‘ , True, (0, 0, 255))
104         wsurface.blit(text_surface2, (50, 80))
105         pygame.display.update()
106         while checkForKeyPress() == None:
107             pygame.display.update()
108             FPSCLOCK.tick()
109             break
110         flagg = False
111         continue
112     flagg = True
113     if judge():
114         score = score + 10
115         speed = speed + 1
116         while True:
117             flag = True
118             food.left = random.randrange(10,800)
119             food.top = random.randrange(10,600)
120             for temp in snakeRect:
121                 if judge2(food, temp):
122                     flag = False
123             if flag == True:
124                 break
125     else:
126          snakeRect.pop()
127     wsurface.fill(black)
128     for i in range(len(snakeRect)):
129         pygame.draw.rect(wsurface,green,snakeRect[i])
130     pygame.draw.rect(wsurface,white,food)
131     text_surface = font.render(u"分数: " + str(score), True, (0, 0, 255))
132     wsurface.blit(text_surface, (10, 50))
133     pygame.display.update()
134     mainClock.tick(speed)
135
136
137
138
139     

截图:

时间: 2024-07-31 22:21:09

python实现贪吃蛇的相关文章

10分钟教你用python打造贪吃蛇超详细教程

10分钟教你用python打造贪吃蛇超详细教程 在家闲着没妹子约, 刚好最近又学了一下python,听说pygame挺好玩的.今天就在家研究一下, 弄了个贪吃蛇出来.希望大家喜欢. 先看程序效果: 01 整体框架 平台:pycharm 关于pygame的安装这里就不在赘述,大家自行上网找合适自己的版本的安装即可.关于pygame模块知识会穿插在下面代码中介绍,用到什么就介绍什么.这里就不统一介绍了. 整个程序由于是调用了大量的pygame里面的库函数,所以也非常简单(卧槽你这不是调包侠嘛).也就

多线程的Python 教程--“贪吃蛇”

本指南的里代码可以在这里下载:  threadworms.py ,或者从  GitHub.代码需要  Python 3 或 Python 2 ,同时也需要安装  Pygame . 点击查看大版本图片 这是一篇为初学者准备的关于  线程 和Python中的多线程编程的指南. 如果你有一些  类(class)的基础知识 (什么是类,如何定义方法(method),还有方法总是将self作为他的第一个参数,子类是什么以及子类如何从父类继承一个方法,等等)这篇指南会对你有所帮助.  这里有一篇较为深入地介

Python入门学习:一步步教你怎么用Python写贪吃蛇游戏

前几天,有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Python(蛇)玩Snake(贪吃蛇),再合适不过了. 这里通过一个Python入门学习的例子跟大家详细讲解一下! 先通过下面这个效果图来感受下吧! 1 环境 操作系统:Windows Python版本:3.7.3 2 需求分析 我们先来回顾下贪吃蛇中的游戏元素及游戏规则. 首先呢,需要有贪吃蛇.有食物:需要能控制贪吃蛇来上下移动获取食物:贪吃蛇在吃取食物后,自身长度增加,同时食物消

python写贪吃蛇小游戏

python的pygame模块写的. 运行界面: # 没搞素材,丑了点 身体跟随蛇头的实现思路: 1. 通过双向链表+两个标志. 链表是为了,蛇头改变方向后,告诉后一个身体,移动后跟着主蛇方向改变,之后身体在告诉后一个身体,跟随前一个身体方向改变. 两个标志(start_flag,change_flag)是为了,每一帧依次改变方向,而不是一个帧内就循环告诉完全部身体方向改变. 2. 加上两个标志,只记录一次前者方向,那么主体发生连续两次改变会出现的情况 解决方式:身体有存前者改变方向的列表 #

用Python写一个贪吃蛇

最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这条贪吃蛇不会自己动,运行效果如下: 要求:用#表示边框,用*表示食物,o表示蛇的身体,O表示蛇头,使用wsad来移动 Python版本:3.6.1 系统环境:Win10 类: board:棋盘,也就是游戏区域 snake:贪吃蛇,通过记录身体每个点来记录蛇的状态 game:游戏类 本来还想要个foo

python学习笔记05:贪吃蛇游戏代码

贪吃蛇游戏截图: 首先安装pygame,可以使用pip安装pygame: pip install pygame 运行以下代码即可: #!/usr/bin/env python import pygame,sys,time,random from pygame.locals import * # 定义颜色变量 redColour = pygame.Color(255,0,0) blackColour = pygame.Color(0,0,0) whiteColour = pygame.Color(

如何用Python写一个贪吃蛇AI

前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD,它把矩形中出现的食物吃了个遍, 然后华丽丽地把整个矩形填满,真心是看得赏心悦目.作为一个CSer, 第一个想到的是,这东西是写程序实现的(因为,一般人干不出这事. 果断是要让程序来干的)第二个想到的是,写程序该如何实现,该用什么算法? 既然开始想了,就开始做.因为Talk is cheap,要sho

Python制作AI贪吃蛇

前提:本文实现AI贪吃蛇自行对战,加上人机对战,文章末尾附上源代码以及各位大佬的链接,还有一些实现步骤,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都一样) 大佬Coco2d制作:http://www.waitingfy.com/html5/snake/ 实现效果: 具体功能: 1.智能模式:电脑自己玩(自己吃食物) 2.人机对战:电脑和人操作(在上步的基础上加一个键盘控制的贪吃蛇即可) 实现环境: Pycharm + Python3.6 + C

python游戏练手--贪吃蛇

啥也不说了,就是个小练习 #!/usr/bin/env python# coding=utf-8import pygameimport sysimport random # 全局定义,screen的长和宽SCREEN_X = 600SCREEN_Y = 600 # 蛇类# 点以25为单位class Snake(object): # 定义一个类--Snake,默认使用object类,如果你有更好的话,可以替换它 # 初始化各种需要的属性 [开始时默认向右/身体块x5] def __init__(s