python贪吃蛇要多少代码(贪吃蛇编程代码Python)

导读:本篇文章首席CTO笔记来给大家介绍有关python贪吃蛇要多少代码的相关内容,希望对大家有所帮助,一起来看看吧。

100行Python代码,轻松完成贪吃蛇小游戏?

你是想让我们向你提问题?你这个放错地方了,应该发布到自己的博客或论坛上面才对

如何用Python写一个贪吃蛇AI

但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了。问题的关键在于,图片中的贪吃蛇真的很贪吃XD,它把矩形中出现的食物吃了个遍,然后华丽丽地把整个矩形填满,真心是看得赏心悦目。作为一个CSer,第一个想到的是,这东西是写程序实现的(因为,一般人干不出这事。果断是要让程序来干的)第二个想到的是,写程序该如何实现,该用什么算法?既然开始想了,就开始做。因为Talk is cheap,要show me the code才行。 (从耗子叔那学来的)开始之前,让我们再欣赏一下那只让人涨姿势的贪吃蛇吧:( 如果下面的动态图片浏览效果不佳的话,可以右键保存下来查看)语言选择Life is short, use python! 所以,根本就没多想,直接上python。最初版本先让你的程序跑起来首先,我们第一件要做的就是先不要去分析这个问题。你好歹先写个能运行起来的贪吃蛇游戏,然后再去想AI部分。这个应该很简单, c\\c++也就百来行代码(如果我没记错的话。不弄复杂界面,直接在控制台下跑), python就更简单了,去掉注释和空行,5、60行代码就搞定了。而且,最最关键的,这个东西网上肯定写滥了,你没有必要重复造轮子,去弄一份来按照你的意愿改造一下就行了。简单版本我觉得直接写perfect版本不是什么好路子。因为perfect版本往往要考虑很多东西,直接上来就写这个一般是bug百出的。所以,一开始我的目标仅仅是让程序去控制贪吃蛇运动,让它去吃食物,仅此而已。现在让我们来陈述一下最初的问题:在一个矩形中,每一时刻有一个食物,贪吃蛇要在不撞到自己的条件下,找到一条路(未必要最优),然后沿着这条路运行,去享用它的美食 我们先不去想蛇会越来越长这个事实,问题基本就是,给你一个起点(蛇头)和一个终点( 食物),要避开障碍物(蛇身),从起点找到一条可行路到达终点。我们可以用的方法有:BFSDFSA*只要有选择,就先选择最简单的方案,我们现在的目标是要让程序先跑起来,优化是后话。so,从BFS开始。我们最初将蛇头位置放入队列,然后只要队列非空,就将队头位置出队,然后把它四领域内的4个点放入队列,不断地循环操作,直到到达食物的位置。这个过程中,我们需要注意几点:1.访问过的点不再访问。 2.保存每个点的父结点(即每个位置是从哪个位置走到它的,这样我们才能把可行路径找出来)。3.蛇身所在位置和四面墙不可访问。通过BFS找到食物后,只需要让蛇沿着可行路径运动即可。这个简单版本写完后,贪吃蛇就可以很欢快地运行一段时间了。看图吧:(不流畅的感觉来自录屏软件@_@)为了尽量保持简单,我用的是curses模块,直接在终端进行绘图。从上面的动态图片可以看出,每次都单纯地使用BFS,最终有一天,贪吃蛇会因为这种不顾后果的短视行为而陷入困境。而且,即使到了那个时候,它也只会BFS一种策略,导致因为当前看不到目标(食物),认为自己这辈子就这样了,破罐子破摔,最终停在它人生中的某一个点,不再前进。(我好爱讲哲理XD)BFS+Wander上一节的简单版本跑起来后,我们认识到,只教贪吃蛇一种策略是不行的。它这么笨一条蛇,你不多教它一点,它分分钟就会挂掉的。所以,我写了个Wander函数,顾名思义,当贪吃蛇陷入困境后,就别让它再BFS了,而是让它随便四处走走,散散心,思考一下人生什么的。这个就好比你困惑迷茫的时候还去工作,效率不佳不说,还可能阻碍你走出困境;相反,这时候你如果放下手中的工作,停下来,出去旅个游什么的。回来时,说不定就豁然开朗,土地平旷,屋舍俨然了。Wander函数怎么写都行,但是肯定有优劣之分。我写了两个版本,一个是在可行的范围内,朝随机方向走随机步。也就是说,蛇每次运动的方向是随机出来的,总共运动的步数也是随机的。Wander完之后,再去BFS一下,看能否吃到食物,如果可以那就皆大欢喜了。如果不行,说明思考人生的时间还不够,再Wander一下。这样过程不断地循环进行。可是就像“随机过程随机过”一样,你“随机Wander就随机挂”。会Wander的蛇确实能多走好多步。可是有一天,它就会把自己给随机到一条死路上了。陷入困境还可以Wander,进入死胡同,那可没有回滚机制。所以,第二个版本的Wander函数,我就让贪吃蛇贪到底。在BFS无解后,告诉蛇一个步数step(随机产生step),让它在空白区域以S形运动step步。这回运动方向就不随机了,而是有组织有纪律地运动。先看图,然后再说说它的问题:没错,最终还是挂掉了。S形运动也是无法让贪吃蛇避免死亡的命运。贪吃蛇可以靠S形运动多存活一段时间,可是由于它的策略是:while 没有按下ESC键: if 蛇与食物间有路径: 走起,吃食物去 else: Wander一段时间 问题就出在蛇发现它自己和食物间有路径,就二话不说跑去吃食物了。它没有考虑到,你这一去把食物给吃了后形成的局势(蛇身布局),完全就可能让你挂掉。(比如进入了一个自己蛇身围起来的封闭小空间)so,为了能让蛇活得久一些,它还要更高瞻远瞩才行。高瞻远瞩版本我们现在已经有了一个比较低端的版本,而且对问题的认识也稍微深入了一些。现在可以进行一些比较慎密和严谨的分析了。首先,让我们罗列一些问题: (像头脑风暴那样,想到什么就写下来即可)蛇和食物间有路径直接就去吃,不可取。那该怎么办?如果蛇去吃食物后,布局是安全的,是否就直接去吃?(这样最优吗?)怎样定义布局是否安全?蛇和食物之间如果没有路径,怎么办?最短路径是否最优?(这个明显不是了)那么,如果布局安全的情况下,最短路径是否最优?除了最短路径,我们还可以怎么走?S形?最长?怎么应对蛇身越来越长这个问题?食物是随机出现的,有没可能出现无解的布局?暴力法(brute force)能否得到最优序列?(让贪吃蛇尽可能地多吃食物)只要去想,问题还挺多的。这时让我们以面向过程的思想,带着上面的问题,把思路理一理。一开始,蛇很短(初始化长度为1),它看到了一个食物,使用BFS得到矩形中每个位置到达食物的最短路径长度。在没有蛇身阻挡下,就是曼哈顿距离。然后,我要先判断一下,贪吃蛇这一去是否安全。所以我需要一条虚拟的蛇,它每次负责去探路。如果安全,才让真正的蛇去跑。当然,虚拟的蛇是不会绘制出来的,它只负责模拟探路。那么,怎么定义一个布局是安全的呢?如果你把文章开头那张动态图片中蛇的销魂走位好好的看一下,会发现即使到最后蛇身已经很长了,它仍然没事一般地走出了一条路。而且,是跟着蛇尾走的!嗯,这个其实不难解释,蛇在运动的过程中,消耗蛇身,蛇尾后面总是不断地出现新的空间。蛇短的时候还无所谓,当蛇一长,就会发现,要想活下来,基本就只能追着蛇尾跑了。在追着蛇尾跑的过程中,再去考虑能否安全地吃到食物。(下图是某次BFS后,得到的一个布局, 0代表食物,数字代表该位置到达食物的距离,+号代表蛇头,*号代表蛇身, -号代表蛇尾,#号代表空格,外面的一圈#号代表围墙)# # # # # # # # 0 1 2 3 4 # # 1 2 3 # 5 # # 2 3 4 - 6 # # 3 + * * 7 # # 4 5 6 7 8 # # # # # # # # 经过上面的分析,我们可以将布局是否安全定义为蛇是否可以跟着蛇尾运动,也就是蛇吃完食物后,蛇头和蛇尾间是否存在路径,如果存在,我就认为是安全的。OK,继续。真蛇派出虚拟蛇去探路后,发现吃完食物后的布局是安全的。那么,真蛇就直奔食物了。等等,这样的策略好吗?未必。因为蛇每运动一步,布局就变化一次。布局一变就意味着可能存在更优解。比如因为蛇尾的消耗,原本需要绕路才能吃到的食物,突然就出现在蛇眼前了。所以,真蛇走一步后,更好的做法是,重新做BFS。然后和上面一样进行安全判断,然后再走。接下来我们来考虑一下,如果蛇和食物之间不存在路径怎么办?上文其实已经提到了做法了,跟着蛇尾走。只要蛇和食物间不存在路径,蛇就一直跟着蛇尾走。同样的,由于每走一步布局就会改变,所以每走一步就重新做BFS得到最新布局。好了,问题又来了。如果蛇和食物间不存在路径且蛇和蛇尾间也不存在路径,怎么办?这个我是没办法了,选一步可行的路径来走就是了。还是一个道理,每次只走一步,更新布局,然后再判断蛇和食物间是否有安全路径;没有的话,蛇头和蛇尾间是否存在路径;还没有,再挑一步可行的来走。上面列的好几个问题里都涉及到蛇的行走策略,一般而言,我们会让蛇每次都走最短路径。这是针对蛇去吃食物的时候,可是蛇在追自己的尾巴的时候就不能这么考虑了。我们希望的是蛇头在追蛇尾的过程中,尽可能地慢。这样蛇头和蛇尾间才能腾出更多的空间,空间多才有得发展。所以蛇的行走策略主要分为两种:1. 目标是食物时,走最短路径 2. 目标是蛇尾时,走最长路径 那第三种情况呢?与食物和蛇尾都没路径存在的情况下,这个时候本来就只是挑一步可行的步子来走,最短最长关系都不大了。至于人为地让蛇走S形,我觉得这不是什么好策略,最初版本中已经分析过它的问题了。 (当然,除非你想使用最最无懈可击的那个版本,就是完全不管食物,让蛇一直走S,然后在墙边留下一条过道即可。这样一来,蛇总是可以完美地把所有食物吃完,然后占满整个空间,可是就很boring了。没有任何的意思)上面还提到一个问题:因为食物是随机出现的,有没可能出现无解的局面?答案是:有。我运行了程序,然后把每一次布局都输出到log,发现会有这样的情况:# # # # # # # # * * * * * # # * * - 0 * # # * * # + * # # * * * * * # # * * * * * # # # # # # # # 其中,+号是蛇头,-号是蛇尾,*号是蛇身,0是食物,#号代表空格,外面一圈# 号代表墙。这个布局上,食物已经在蛇头面前了,可是它能吃吗?不能!因为它吃完食物后,长度加1,蛇头就会把0的位置填上,布局就变成:# # # # # # # # * * * * * # # * * - + * # # * * # * * # # * * * * * # # * * * * * # # # # # # # # 此时,由于蛇的长度加1,蛇尾没有动,而蛇头被自己围着,挂掉了。可是,我们却还有一个空白的格子#没有填充。按照我们之前教给蛇的策略,面对这种情况,蛇头就只会一直追着蛇尾跑,每当它和食物有路径时,它让虚拟的蛇跑一遍发现,得到的新布局是不安全的,所以不会去吃食物,而是选择继续追着蛇尾跑。然后它就这样一直跑,一直跑。死循环,直到你按ESC键为止。由于食物是随机出现的,所以有可能出现上面这种无解的布局。当然了,你也可以得到完满的结局,贪吃蛇把整个矩形都填充满。上面的最后一个问题,暴力法是否能得到最优序列。从上面的分析看来,可以得到,但不能保证一定得到。最后,看看高瞻远瞩的蛇是怎么跑的吧:矩形大小10*20,除去外面的边框,也就是8*18。Linux下录完屏再转成GIF格式的图片,优化前40多M,真心是没法和Windows的比。用下面的命令优化时,有一种系统在用生命做优化的感觉:convert output.gif -fuzz 10% -layers Optimize optimised.gif 最后还是拿到Windows下用AE,三下五除二用图片序列合成的动态图片 (记得要在format options里选looping,不然图片是不会循环播放的)Last but not least如果对源代码感兴趣,请戳以下的链接: Code goes here另外,本文的贪吃蛇程序使用了curses模块,类Unix系统都默认安装的,使用Windows的童鞋需要安装一下这个模

python贪吃蛇要多少代码(贪吃蛇编程代码Python)  第1张

怎样从零开始用 Python 写一个贪吃蛇

from tkinter import *

import threading

import queue

import time

import random

class GUI(Tk):

    \'\'\'class GUI use to create the gui\'\'\'

    def __init__(self, queue):

        Tk.__init__(self)

        self.queue = queue

        self.is_game_over = False

        self.canvas = Canvas(self, width=495, height=305, bg=\'#000000\')

        self.canvas.pack()

        self.snake = self.canvas.create_line((0,0),(0,0), fill=\'#FFFF00\', width=10)

        self.food = self.canvas.create_rectangle(0,0,0,0, fill=\'#00FF00\', outline=\'#00FF00\')

        self.point_score = self.canvas.create_text(455, 15, fill=\'white\', text=\'score:0\')

        self.queue_handler()

    def restart(self):

        self.destroy()

        main()

    def queue_handler(self):

        try:

            while True:

                task = self.queue.get(block=False)

                if task.get(\'game_over\'):

                    self.game_over()

                elif task.get(\'move\'):

                    points = [x for point in task[\'move\'] for x in point]

                    self.canvas.coords(self.snake, *points)

                elif task.get(\'food\'):

                    self.canvas.coords(self.food, *task[\'food\'])

                elif task.get(\'points_score\'):

                    self.canvas.itemconfigure(self.point_score,

                                              text=\'score:{}\'.format(task[\'points_score\']))

                    self.queue.task_done()

        except queue.Empty:

            if not self.is_game_over:

                self.canvas.after(100, self.queue_handler)

    def game_over(self):

        self.is_game_over = True

        self.canvas.create_text(220, 150, fill=\'white\',text=\'Game Over!\')

        quitbtn = Button(self, text=\'Quit\', command=self.destroy)

        retbtn = Button(self, text=\'Resume\', command=self.restart)

        self.canvas.create_window(230, 180, anchor=W, window=quitbtn)

        self.canvas.create_window(200, 180, anchor=E, window=retbtn)

class Food():

    \'\'\'class Food use to make food\'\'\'

    def __init__(self, queue):

        self.queue = queue

        self.make_food()

    def make_food(self):

        x = random.randrange(5, 480, 10)

        y = random.randrange(5, 295, 10)

        self.position = x,y

        self.exppos = x-5,y-5,x+5,y+5

        self.queue.put({\'food\':self.exppos})

class Snake(threading.Thread):

    \'\'\'class Snake use to create snake and response action\'\'\'

    def __init__(self, gui, queue):

        threading.Thread.__init__(self)

        self.gui = gui

        self.queue = queue

        self.daemon = True

        self.points_score = 0

        self.snake_points = [(495,55),(485,55),(475,55),(465,55),(455,55)]

        self.food = Food(queue)

        self.direction = \'Left\'

        self.start()

    def run(self):

        if self.gui.is_game_over:

            self._delete()

        while not self.gui.is_game_over:

            self.queue.put({\'move\':self.snake_points})

            time.sleep(0.2)

            self.move()

    def key_pressed(self,e):

        self.direction = e.keysym

    def move(self):

        new_snake_point = self.calculate_new_coordinates()

        if self.food.position == new_snake_point:

            add_snake_point = self.calculate_new_coordinates()

            self.snake_points.append(add_snake_point)

            self.points_score += 1

            self.queue.put({\'points_score\':self.points_score})

            self.food.make_food()

        else:

            self.snake_points.pop(0)

            self.check_game_over(new_snake_point)

            self.snake_points.append(new_snake_point)

    def calculate_new_coordinates(self):

        last_x,last_y = self.snake_points[-1]

        if self.direction == \'Up\':

            new_snake_point = last_x,last_y-10

        elif self.direction == \'Down\':

            new_snake_point = last_x,last_y+10

        elif self.direction == \'Left\':

            new_snake_point = last_x-10,last_y

        elif self.direction == \'Right\':

            new_snake_point = last_x+10,last_y

        return new_snake_point

    def check_game_over(self, snake_point):

        x,y = snake_point[0],snake_point[1]

        if not -5  x  505 or not -5  y  315 or snake_point in self.snake_points:

            self.queue.put({\'game_over\':True})

def main():

    q = queue.Queue()

    gui = GUI(q)

    snake = Snake(gui, q)

    gui.bind(\'Key-Left\', snake.key_pressed)

    gui.bind(\'Key-Right\', snake.key_pressed)

    gui.bind(\'Key-Up\', snake.key_pressed)

    gui.bind(\'Key-Down\', snake.key_pressed)

    gui.mainloop()

if __name__ == \'__main__\':

    main()

main()

Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

Python版本: 3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块。

安装Python并添加到环境变量,pip安装需要的相关模块即可。

贪吃蛇的 游戏 规则应该不需要我多做介绍了吧T_T。写个贪吃蛇 游戏 其实还是很简单的。首先,我们进行一下 游戏 初始化:

然后定义一个贪吃蛇类:

其中head_coord用来记录蛇头所在位置,而tail_coords是一个二维数组,用来记录所有蛇身的位置。一开始,贪吃蛇长为3,并且位置是随机生成的。用户通过 键来控制贪吃蛇的行动:

需要注意的是,贪吃蛇不能180 大拐弯,只能90 地拐弯。例如正在向左行动的贪吃蛇不能瞬间变成向右行动。具体而言,代码实现如下:

然后,我们需要随机生成一个食物,且需要保证该食物的位置不与贪吃蛇的位置相同:

在更新贪吃蛇的时候,如果它吃到了食物,则蛇身长加一,否则只是简单的按照给定的方向行动而不改变蛇身长度:

同时,当贪吃蛇吃到食物时,需要重新生成一个新的食物:

最后,当贪吃蛇碰到墙壁或者蛇头碰到蛇身时, 游戏 结束:

并显示一下 游戏 结束界面:

玩家通过 键控制 游戏 的主角吃豆人吃掉藏在迷宫内的所有豆子,并且不能被鬼魂抓到。

若能顺利吃完迷宫内的所有豆子并且不被鬼魂抓到,则 游戏 胜利,否则 游戏 失败。

逐步实现:

Step1:定义 游戏 精灵类

首先,让我们先来明确一下该 游戏 需要哪些 游戏 精灵类。

① 墙类

② 食物类(即豆豆)

③ 角色类

角色类包括吃豆人和鬼魂,鬼魂由电脑控制其运动轨迹,吃豆人由玩家控制其运动轨迹。

显然,其均需具备更新角色位置和改变角色运动方向的能力,其源代码如下:

Step2:设计 游戏 地图

利用Step1中定义的 游戏 精灵类,我们就可以开始设计 游戏 地图了。由于时间有限,我只写了一个关卡的 游戏 地图,有兴趣的小伙伴可以在此基础上进行扩展(在我的源代码基础上进行扩展是很方便滴~)。 游戏 地图的设计包括以下四方面内容:

① 创建墙

② 创建门(一开始关幽灵用的)

image.gif

③ 创建角色

④ 创建食物

因为食物不能和墙、门以及角色的位置重叠,所以为了方便设计 游戏 地图,要先创建完墙、门以及角色后再创建食物:

Step3:设计 游戏 主循环

接下来开始设计 游戏 主循环。首先是初始化:

然后定义主函数:

其中startLevelGame函数用于开始某一关 游戏 ,其源代码如下:

showText函数用于在 游戏 结束或关卡切换时在 游戏 界面中显示提示性文字,其源代码如下:

哪位能告诉我贪吃蛇游戏的全部代码?

//package main;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStreamReader;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

public class TanChiShe implements KeyListener,ActionListener{

/**

* @param args

*/

int max = 300;//蛇长最大值

final int JianJu = 15; //设定蛇的运动网格间距(窗口最大32*28格)

byte fangXiang = 4; //控制蛇的运动方向,初始为右

int time = 500; //蛇的运动间隔时间

int jianTime = 2;//吃一个减少的时间

int x,y;//蛇的运动坐标,按网格来算

int x2,y2;//暂存蛇头的坐标

int jiFenQi = 0;//积分器

boolean isRuned = false;//没运行才可设级别

boolean out = false;//没开始运行?

boolean run = false;//暂停运行

String JiBie = \"中级\";

JFrame f = new JFrame(\"贪吃蛇 V1.0\");

JPanel show = new JPanel();

JLabel Message = new JLabel(\"级别:中级 蛇长:5 时间500ms 分数:00\");

// JButton play = new JButton(\"开始\");

JLabel sheTou;

JLabel shiWu;

JLabel sheWei[] = new JLabel[max];

static int diJi = 4; //第几个下标的蛇尾要被加上

ImageIcon shang = new ImageIcon(\"tuPian\\\\isSheTouUp.png\");//产生四个上下左右的蛇头图案

ImageIcon xia = new ImageIcon(\"tuPian\\\\isSheTouDown.png\");

ImageIcon zhuo = new ImageIcon(\"tuPian\\\\isSheTouLeft.png\");

ImageIcon you = new ImageIcon(\"tuPian\\\\isSheTouRight.png\");

JMenuBar JMB = new JMenuBar();

JMenu file = new JMenu(\"开始游戏\");

JMenuItem play = new JMenuItem(\" 开始游戏 \");

JMenuItem pause = new JMenuItem(\" 暂停游戏 \");

JMenu hard = new JMenu(\"游戏难度\");

JMenuItem gao = new JMenuItem(\"高级\");

JMenuItem zhong = new JMenuItem(\"中级\");

JMenuItem di = new JMenuItem(\"低级\");

JMenu about = new JMenu(\" 关于 \");

JMenuItem GF = new JMenuItem(\"※高分榜\");

JMenuItem ZZ = new JMenuItem(\"关于作者\");

JMenuItem YX = new JMenuItem(\"关于游戏\");

JMenuItem QK = new JMenuItem(\"清空记录\");

static TanChiShe tcs = new TanChiShe();

public static void main(String[] args) {

// TanChiShe tcs = new TanChiShe();

tcs.f();

}

public void f(){

f.setBounds(250,100,515,530);

f.setLayout(null);

f.setAlwaysOnTop(true);//窗口始终保持最前面

f.setBackground(new Color(0,0,0));

f.setDefaultCloseOperation(0);

f.setResizable(false);

f.setVisible(true);

// f.getContentPane().setBackground(Color.BLACK);

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);//退出程序

}

});

f.setJMenuBar(JMB);

JMB.add(file);

file.add(play);

file.add(pause);

JMB.add(hard);

hard.add(gao);

hard.add(zhong);

hard.add(di);

JMB.add(about);

about.add(GF);

GF.setForeground(Color.blue);

about.add(ZZ);

about.add(YX);

about.add(QK);

QK.setForeground(Color.red);

f.add(show);

show.setBounds(0,f.getHeight()-92,f.getWidth(),35);

// show.setBackground(Color.green);

// f.add(play);

// play.setBounds(240,240,80,25);

play.addActionListener(this);

pause.addActionListener(this);

gao.addActionListener(this);

zhong.addActionListener(this);

di.addActionListener(this);

GF.addActionListener(this);

ZZ.addActionListener(this);

YX.addActionListener(this);

QK.addActionListener(this);

show.add(Message);

Message.setForeground(Color.blue);

f.addKeyListener(this);

// show.addKeyListener(this);

play.addKeyListener(this);

sheChuShi();

}

public void sheChuShi(){//蛇初始化

sheTou = new JLabel(you);//用向右的图来初始蛇头

f.add(sheTou);

sheTou.setBounds(JianJu*0,JianJu*0,JianJu,JianJu);

// System.out.println(\"ishere\");

shiWu = new JLabel(\"■\");

f.add(shiWu);

shiWu.setBounds(10*JianJu,10*JianJu,JianJu,JianJu);

for(int i=0;i=diJi;i++) {

sheWei[i] = new JLabel(\"■\");

f.add(sheWei[i]);

sheWei[i].setBounds(-1*JianJu,0*JianJu,JianJu,JianJu);

}

while(true){

if(out == true){

yunXing();

break;

}

try{

Thread.sleep(200);

}catch(Exception ex){

ex.printStackTrace();

}

}

}

public void sheJiaChang(){//蛇的长度增加

if(diJi max){

sheWei[++diJi] = new JLabel(new ImageIcon(\"tuPian\\\\isSheWei.jpg\"));

f.add(sheWei[diJi]);

sheWei[diJi].setBounds(sheWei[diJi-1].getX(),sheWei[diJi-1].getY(),JianJu,JianJu);

// System.out.println(\"diJi \"+diJi);

}

}

public void pengZhuanJianCe(){//检测蛇的碰撞情况

if(sheTou.getX()0 || sheTou.getY()0 ||

sheTou.getX()f.getWidth()-15 || sheTou.getY()f.getHeight()-105 ){

gameOver();

// System.out.println(\"GameOVER\");

}

if(sheTou.getX() == shiWu.getX() sheTou.getY() == shiWu.getY()){

out: while(true){

shiWu.setLocation((int)(Math.random()*32)*JianJu,(int)(Math.random()*28)*JianJu);

for(int i=0;i=diJi;i++){

if(shiWu.getX()!= sheWei[i].getX() shiWu.getY()!=sheWei[i].getY()

sheTou.getX()!=shiWu.getX() sheTou.getY()!= shiWu.getY()){//如果食物不在蛇身上则退出循环,产生食物成功

break out;

}

}

}

sheJiaChang();

// System.out.println(\"吃了一个\");

if(time100 ){

time -= jianTime;

}

else{}

Message.setText(\"级别:\"+JiBie+\" 蛇长:\"+(diJi+2)+\" 时间:\"+time+\"ms 分数:\"+(jiFenQi+=10)+\"\");

}

for(int i=0;i=diJi;i++){

if(sheTou.getX() == sheWei[i].getX() sheTou.getY() == sheWei[i].getY()){

gameOver();

// System.out.println(\"吃到尾巴了\");

}

}

}

public void yunXing(){

while(true){

while(run){

if(fangXiang == 1){//上

y-=1;

}

if(fangXiang == 2){//下

y+=1;

}

if(fangXiang == 3){//左

x-=1;

}

if(fangXiang == 4){//右

x+=1;

}

x2 = sheTou.getX();

y2 = sheTou.getY();

sheTou.setLocation(x*JianJu,y*JianJu); //设置蛇头的坐标 网格数*间隔

for(int i=diJi;i=0;i--){

if(i==0){

sheWei[i].setLocation(x2,y2);

// System.out.println(i+\" \"+sheTou.getX()+\" \"+sheTou.getY());

}

else{

sheWei[i].setLocation(sheWei[i-1].getX(),sheWei[i-1].getY());

// System.out.println(i+\" \"+sheWei[i].getX()+\" \"+sheWei[i].getY());

}

}

pengZhuanJianCe();

try{

Thread.sleep(time);

}catch(Exception e){

e.printStackTrace();

}

}

Message.setText(\"级别:\"+JiBie+\" 蛇长:\"+(diJi+2)+\" 时间:\"+time+\"ms 分数:\"+(jiFenQi+=10)+\"\");

try{

Thread.sleep(200);

}catch(Exception e){

e.printStackTrace();

}

}

}

public void gameOver(){//游戏结束时处理

int in = JOptionPane.showConfirmDialog(f,\"游戏已经结束!\\n是否要保存分数\",\"提示\",JOptionPane.YES_NO_OPTION);

if(in == JOptionPane.YES_OPTION){

// System.out.println(\"YES\");

String s = JOptionPane.showInputDialog(f,\"输入你的名字:\");

try{

FileInputStream fis = new FileInputStream(\"GaoFen.ini\");//先把以前的数据读出来加到写的数据前

InputStreamReader isr = new InputStreamReader(fis);

BufferedReader br = new BufferedReader(isr);

String s2,setOut = \"\";

while((s2=br.readLine())!= null){

setOut =setOut+s2+\"\\n\";

}

FileOutputStream fos = new FileOutputStream(\"GaoFen.ini\");//输出到文件流

s = setOut+s+\":\"+jiFenQi+\"\\n\";

fos.write(s.getBytes());

}catch(Exception e){}

}

System.exit(0);

}

public void keyTyped(KeyEvent arg0) {

// TODO 自动生成方法存根

}

public void keyPressed(KeyEvent arg0) {

// System.out.println(arg0.getSource());

if(arg0.getKeyCode() == KeyEvent.VK_UP){//按上下时方向的值相应改变

if(fangXiang != 2){

fangXiang = 1;

// sheTou.setIcon(shang);//设置蛇的方向

}

// System.out.println(\"UP\");

}

if(arg0.getKeyCode() == KeyEvent.VK_DOWN){

if(fangXiang != 1){

fangXiang = 2;

// sheTou.setIcon(xia);

}

// System.out.println(\"DOWN\");

}

if(arg0.getKeyCode() == KeyEvent.VK_LEFT){//按左右时方向的值相应改变

if(fangXiang != 4){

fangXiang = 3;

// sheTou.setIcon(zhuo);

}

// System.out.println(\"LEFT\");

}

if(arg0.getKeyCode() == KeyEvent.VK_RIGHT){

if(fangXiang != 3){

fangXiang = 4;

// sheTou.setIcon(you);

}

// System.out.println(\"RIGHT\");

}

}

public void keyReleased(KeyEvent arg0) {

// TODO 自动生成方法存根

}

public void actionPerformed(ActionEvent arg0) {

// TODO 自动生成方法存根

JMenuItem JI = (JMenuItem)arg0.getSource();

if(JI == play){

out = true;

run = true;

isRuned = true;

gao.setEnabled(false);

zhong.setEnabled(false);

di.setEnabled(false);

}

if(JI == pause){

run = false;

}

if(isRuned == false){//如果游戏还没运行,才可以设置级别

if(JI == gao){

time = 200;

jianTime = 1;

JiBie = \"高级\";

Message.setText(\"级别:\"+JiBie+\" 蛇长:\"+(diJi+2)+\" 时间:\"+time+\"ms 分数:\"+jiFenQi);

}

if(JI == zhong){

time = 400;

jianTime = 2;

JiBie = \"中级\";

Message.setText(\"级别:\"+JiBie+\" 蛇长:\"+(diJi+2)+\" 时间:\"+time+\"ms 分数:\"+jiFenQi);

}

if(JI == di){

time = 500;

jianTime = 3;

JiBie = \"低级\";

Message.setText(\"级别:\"+JiBie+\" 蛇长:\"+(diJi+2)+\" 时间:\"+time+\"ms 分数:\"+jiFenQi);

}

}

if(JI == GF){

try{

FileInputStream fis = new FileInputStream(\"GaoFen.ini\");

InputStreamReader isr = new InputStreamReader(fis);

BufferedReader br = new BufferedReader(isr);

String s,setOut = \"\";

while((s=br.readLine())!= null){

setOut =setOut+s+\"\\n\";

}

if(setOut.equals(\"\")){

JOptionPane.showMessageDialog(f,\"暂无保存记录!\",\"高分榜\",JOptionPane.INFORMATION_MESSAGE);

}

else{

JOptionPane.showMessageDialog(f,setOut);

}

}catch(Exception e){

e.printStackTrace();

}

}

if(JI == ZZ){//关于作者

JOptionPane.showMessageDialog(f,\"软件作者:申志飞\\n地址:四川省绵阳市\\nQQ:898513806\\nE-mail:shenzhifeiok@126.com\",\"关于作者\",JOptionPane.INFORMATION_MESSAGE);

}

if(JI == YX){//关于游戏

JOptionPane.showMessageDialog(f,\"贪吃蛇游戏\\n游戏版本 V1.0\",\"关于游戏\",JOptionPane.INFORMATION_MESSAGE);

}

if(JI == QK){

try{

int select = JOptionPane.showConfirmDialog(f,\"确实要清空记录吗?\",\"清空记录\",JOptionPane.YES_OPTION);

if(select == JOptionPane.YES_OPTION){

String setOut = \"\";

FileOutputStream fos = new FileOutputStream(\"GaoFen.ini\");//输出到文件流

fos.write(setOut.getBytes());

}

}catch(Exception ex){}

}

}

}

//是我自己写的,本来里面有图片的,但无法上传,所以把图片去掉了,里面的ImageIcon等语句可以去掉。能正常运行。

python有趣的编程代码

class Point:

  row=0

  col=0

  def __init__(self, row, col):

    self.row=row

    self.col=col

  def copy(self):

    return Point(row=self.row, col=self.col)

#初始框架

import pygame

import random

#初始化

pygame.init()

W=800

H=600

ROW=30

COL=40

size=(W,H)

window=pygame.display.set_mode(size)

pygame.display.set_caption(\'贪吃蛇\')

bg_color=(255,255,255)

snake_color=(200,200,200)

head=Point(row=int(ROW/2), col=int(COL/2))

head_color=(0,128,128)

snakes=[

  Point(row=head.row, col=head.col+1),

  Point(row=head.row, col=head.col+2),

  Point(row=head.row, col=head.col+3)

]

#生成食物

def gen_food():

  while 1:

    pos=Point(row=random.randint(0,ROW-1), col=random.randint(0,COL-1))

    #

    is_coll=False

    #是否跟蛇碰上了

    if head.row==pos.row and head.col==pos.col:

      is_coll=True

    #蛇身子

    for snake in snakes:

      if snake.row==pos.row and snake.col==pos.col:

        is_coll=True

        break

    if not is_coll:

      break

  return pos

#定义坐标

food=gen_food()

food_color=(255,255,0)

direct=\'left\'       #left,right,up,down

#

def rect(point, color):

  cell_width=W/COL

  cell_height=H/ROW

  left=point.col*cell_width

  top=point.row*cell_height

  pygame.draw.rect(

    window, color,

    (left, top, cell_width, cell_height)

  )

  pass

#游戏循环

quit=True

clock=pygame.time.Clock()

while quit:

  #处理事件

  for event in pygame.event.get():

    if event.type==pygame.QUIT:

      quit=False

    elif event.type==pygame.KEYDOWN:

      if event.key==273 or event.key==119:

        if direct==\'left\' or direct==\'right\':

          direct=\'up\'

      elif event.key==274 or event.key==115:

        if direct == \'left\' or direct == \'right\':

          direct=\'down\'

      elif event.key==276 or event.key==97:

        if direct == \'up\' or direct == \'down\':

          direct=\'left\'

      elif event.key==275 or event.key==100:

        if direct == \'up\' or direct == \'down\':

          direct=\'right\'

  #吃东西

  eat=(head.row==food.row and head.col==food.col)

  #重新产生食物

  if eat:

    food = gen_food()

  #处理身子

  #1.把原来的头,插入到snakes的头上

  snakes.insert(0, head.copy())

  #2.把snakes的最后一个删掉

  if not eat:

    snakes.pop()

  #移动

  if direct==\'left\':

    head.col-=1

  elif direct==\'right\':

    head.col+=1

  elif direct==\'up\':

    head.row-=1

  elif direct==\'down\':

    head.row+=1

  #检测

  dead=False

  #1.撞墙

  if head.col0 or head.row0 or head.col=COL or head.row=ROW:

    dead=True

  #2.撞自己

  for snake in snakes:

    if head.col==snake.col and head.row==snake.row:

      dead=True

      break

  if dead:

    print(\'死了\')

    quit=False

  #渲染——画出来

  #背景

  pygame.draw.rect(window, bg_color, (0,0,W,H))

  #蛇头

  for snake in snakes:

    rect(snake, snake_color)

  rect(head, head_color)

  rect(food, food_color)

  #

  pygame.display.flip()

  #设置帧频(速度)

  clock.tick(8)

#收尾工作

这是一个简易版贪吃蛇的代码,虽然结构简单,但是该有的功能都是完整的,可玩性也不错

结语:以上就是首席CTO笔记为大家整理的关于python贪吃蛇要多少代码的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于python贪吃蛇要多少代码的相关内容别忘了在本站进行查找喔。

以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!

版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023-09-23
下一篇 2023-09-23

相关推荐

发表回复

登录后才能评论