本文依据 Windows 环境开发,合适 Python 新手

用 Python 写个贪吃蛇,保姆级教程!

本文作者:HelloGitHub-Anthony

这是我参加更文应战的第 1 天,活动详情查看: 更文应战

HelloGitHub 推出的《阐明开源项目》系列,本期介绍 Python 练手级项目——贪吃蛇!

原本想举荐一个贪吃蛇的开源项目:python-conso代码标准的优点le-snake,python培训班膏火一般多少但由于该项目最近一次更新是 8 年前,而且在作业的时候windows怎样激活出现了许多问题。干脆我就着手用 Python 从头windows7写了一https安全问题个贪吃蛇游戏。

项目地址:github.com/AnthonySun2…

下面windows7咱们就一重用 Python 结束一个简略诙谐的指令行贪吃蛇小游戏,发起指令:

git clone ht代码标准化tps://github.com/AnthonySun256/easy_games
cd easpython是什么意思y_games
python snake

用 Python 写个贪吃蛇,保姆级教程!

本文包括规划和阐明,全体分为两个部分:windows更新有必要吗第一部分是关于 Python 指令行图形化库 curses 接着是 snake 相关代码。

一、初识 curses

Python 现已内置了 curses 库,可是关于 Windows 操作体系咱们需求设备一个补丁以进行适配。

Windowwindows10激活密钥s 下设备补全包:

pip instawindows7旗舰版ll windows-curses

curses 是一个运用广泛的图形函数库,能够在终端内制作简略的用户界面。

在这儿咱们只进行简略的介绍,只学代码标准习贪吃蛇需求的功用

假定您现已接触过 cur代码标准包括什么ses,请跳过此部分内容。

1.1 简略运用

Pythwindows更新有必要吗on 内置了 curses 库,其运用办法非常简略,以下脚本能够闪现出当时按键对应编号:

# 导入有必要的库
im代码标准port curses
import time
# 初始化指令行界面,回来的 stdscr 为窗口政策,表明指令行界面
stdscr = curses.initscr()
# 运用 noecho 办法封闭指令行回显
curses.noecho()
# 运用 nodelapplicationay(True) 办法让 getch 为非堵塞等候(即便没有输入程序也能继续实施)
stds代码标准包括什么cr.nodelay(Truwindows10激活密钥e)
while True:
# 铲除 stdscr 窗口的内容(铲除残留的符号)
stdscr.erase()
# 获取用户输入并放回对应按键的编号
# 非堵塞等候办法下没有输入则回来 -1windows10
key = stdscr.getch()
# 在 stdscr 的第一行第三列闪现文字
stdscr.aappstoreddstr(1, 3, "Hello GitHub.")
# 在 stdscr 的第二行第三列闪现文字
stdscr.addstr(2, 3, "Key: %d" % key)
# 改写窗口windows10,让方才的 addstr 收效
stdscr.refresh()
# 等app装置下载候 0.1s 给用户足够反应时刻查看文字
time.sleep(0.1)

用 Python 写个贪吃蛇,保姆级教程!

您也能够检验把 nodelay(WindowsTrue) 改为 nodelay(False) 后再次作业,这时候程序会堵塞在 stdscr.getch() 只需当您按下按键后才会继续实施。

1.2 整点把戏

您或许会觉得上面的比方太菜了,apple随意用几个 print 都能抵达相同的作用,python能够自学吗现在咱们来整点把戏以结束一些运用一般输出无法抵达的作用。

1.2.1 新建一个子窗口

appointment再多的话代码标准七大准则也不如一张图来的实践:

用 Python 写个贪吃蛇,保姆级教程!

假定咱们想要结束图中 Game over! 窗口,能够运用 newwin 办法:

import代码标准标准 curses
import time
stdscr = curses.initscr()
curses.noecho()
stdscr.addstr(1, 2, "HelloGitHub")
# 新建窗口,高为 5 宽为 25,在指令行窗口的 四行六列处
new_win = curses.newwin(5, 25, 4, 6)
# 运用堵塞等候办法
new_win.nodela代码标准y(False)
# 在新窗口的 2 行 3 列处增加文字
new_win.addstr(代码标准文档2, 3, "www.HelloGitHub.com")
# 给新窗口增加边框,其间边框符号能够这是,这儿运用默许字符
new_win.border()
# 改写窗口
stdscr.refresh()
# 等候字符输入(这儿会一贯等候输入)
new_win.getch()
#python123渠道登录 删去新窗口政策
del new_win
# 铲除悉数内容(比 erhttps域名ase 更彻底)
stdscr.clear()
# 从头增加文字
stdscr.addstr(1, 2, "HelloGitHub")
# 改写窗口
stdscr.refresh()
# 等候两秒钟
time.sleep(2)
# 结束 curseappstores 办法,恢复到正常指令行办法
curses.endwin()

用 Python 写个贪吃蛇,保姆级教程!

除了 curses.newwin 新建一个独立的窗口,咱们还能在恣意窗口上运用 subwin 或许 subpad 办法新建子窗口,例如 stdscr.subwinstdscr.subpadnew_win.subwinn代码标准七大准则ew_win.subpad 等等,其运用办法与本节中创立的 new_win 或许 stdscr 没有差异,仅仅新建窗口运用独立的缓存区,而子窗口和父窗口同享缓存区。

假定某个窗口会在运用后删去,最好运用 newwin 办法新建独approach立窗口,以防止删去子窗口构成父窗口的缓存内容出现问题。

1.2.2 上点颜色

白与黑的分配看久了也会显得单调,cursapprovees 供应了内置颜色能够让咱们自定代码标准七大准则义前后背景。

在运用五颜六色办法之前咱们需求先运用运用 curses.start_python培训班膏火一般多少corlor() 进行初始化操作:

import curses
import time
stdscr = curses.init代码标准七大准则scr()
stdscr.nodelhttps安全问题ay(False)
curses.noecho()
# 初代码标准查看东西始化五颜六色办法
curspython123渠道登录es.starpython编程t_color()https协议
# 在1号方位增加前景色是绿色,背景色是黑色的五颜六色对儿
curpython能够做什么作业ses.init_pair(1, curses.COLOR_GREEhttps和http的差异N, curses.COLOR_BLACK)
# 在一行一列处闪现文字,运用 1号 颜色分配
stdscr.addstr(1, 1, "HelloGitHub!", curses.color_pairpython123(1))
# 堵塞等候按键然后结束程序
stdscr.getch()
curses.endwin()

需求留神的是,0号 方位颜色是默许是非配色,无法修改

用 Python 写个贪吃蛇,保姆级教程!

1.2.3 给点细代码标准的重要性

在此部分究竟的究竟,咱们来说说怎样给文字加一点文字作用:

import curses
import time
stds代码标准查看东西cr = curses.initscr()
stdscr.nodelay(False)
curses.nhttps协议oecho()
# 之后的文字都加上下划线,直到调用 attroff中止
sPythontdscr.attronappreciate(curses.A_UNDERLINE)
stdscr.addstr(application1, 1, "www.HelloGitHub.com")
stdscr.getch()

用 Python 写个贪吃蛇,保姆级教程!

二、贪吃蛇

前面说了这么多,现在总算到了咱们的主菜。在这部分,我将一步步教给咱们https和http的差异怎样从零开始做出一个简略却又不失appearance细节的贪吃蛇。

2.1 规划

关于一个项application目来讲,相比于赶快着手写下第一行代码不如先花点时刻进行一些必要的规划,究竟结构抉择功用,一个项目没有一代码标准快捷键个超卓的结构是没有出路的。

snake 将贪吃蛇这个游戏分为了三大块:

  1. 界面:担任闪现相关的悉数作业
  2. 游戏流程操控:判别游戏输赢、游戏初始化等
  3. 蛇和食物:代码标准标准移动本身、判别是否逝世、是否被吃等

每一块都被做成了单独的政策,通过相互配合结束游戏。下面让咱们来分别看看应该怎样结束。

2.2 蛇语者

关于贪吃代码标准的重要性蛇游戏里面的蛇来讲,它能够做的作业有三种:移动,https域名逝世(吃到自己,撞墙)和吃东西

围绕着这三个功用,咱们能够首要写出一个粗陋的蛇,其类图如图所示python能够做什么作业

用 Python 写个贪吃蛇,保姆级教程!

这个蛇能够查看自己是不是逝世,是不是吃了东西,以及更新自己的方位信息。

其间,bodylast_body 是列表,分别存python能够做什么作业储当时蛇身坐标和上一步蛇身坐标,默许列表第一个元素是蛇头。direction 是当时跋涉方向,window_size 是蛇能够活动的区域大小。

rest 办法用于重置蛇的状况,它与 __init__ 一同担任蛇的初始化作业:

class Snake(object):
def __init__(self) -&代码标准的优点gt; None:
#windows更新有必要吗 Position 是我自定义的类,只需 x, y 两个特征,存储一个坐标点
# 初始化蛇能够移动规划的大小
self.window_size = Position(game_config.game_sizes["width"], game_config.game_sizes["height"])
# 初始化移动方向
self.dirwindows更新有必要吗ection = game_config.D_Down
# 重置身体列表
s代码标准elf.body = []
self.last_body = []
# 生成新的身体,默许在左上角,头朝下,长三个格子
for i in range(3):
self.body.append(Position(2, 3 - i))
# rest 重置相关特征
def reset(self) -> None:
self.direction = game_configwindows7旗舰版.D_Down
self.body = []
selfpython是什么意思.last_body = []
for i in range(3):
self.bopython培训班膏火一般多少dy.append(Position(2, 3 - i))

Position 是我自定义的类,只需 x, y 两个特征,存储一个坐标点

在最开始咱们或许仅仅迷糊的感觉应该有这几个特征,可是关于其间的内容和初始化办法又python123不彻底清楚,这是正常的。咱们需求做的便是继续结束需求的功用,在实践中增加和代码标准快捷键完善开始的设想。

之后,咱们从继续上到下结束,对照类图https认证,咱们接下来应该结束一下 update_snake_pos 即 更新蛇的方位,这部分非常简略:

deappearf updatewindows许可证行将过期怎样办_snake_papproveos(代码标准性self) -> None:
# 这python123渠道登录个函数在文章下方,python123渠道登录获得蛇在 x, y 方向上分别增加多少
dis_incremwindows许可证行将过期怎样办ent_factor = self.gpython保留字et_dis_python怎样读inc_factor()
# 需求留神,这儿要用深拷贝(imporpython是什么意思t copy)
self.laapproachst_body = copy.deepcopy(self.body)
# 先移动蛇头,然后蛇身依次向前
for index, item in enume代码标准七大准则rathttps协议e(self.body):
if index < 1:
item.x += dis_increment_fac代码标准包括什么toappler.x
item.y += dis_increment_factor.y
else:  # 剩余的部分要跟着前一部分走
item.x = self.代码标准的重要性last_代码标准七大准则body[index - 1].x
item.y = self.last_body[ipython123渠道登录ndex - 1].y

其实 last_b代码标准查看东西ody 能够只记载究竟一次修改windows体系的身体,这儿我偷了个懒

在这儿有一个细节,假定我代码标准的优点们是第一次写这个函数,为了让蛇头能够正确的依照玩家操作代码标准查看东西移动,咱们需求知道蛇头元素在 x, y 方向上各移动了多少。

最简略的办法是直接一串 if-elif,判别方向再相加:

if self.direction == LEFT:
head.x -= 1
elif self.direction == RIGHT:代码标准七大准则
head.x += 1
....

可是这样的问题在于,假定咱们的需求更改(比方我现在说蛇能够一次走两个格子,或许吃了特别道具 x,代码标准文档 y 方向上走的距离不相同等等)直接修改这样的代码会让人很苦楚。

所以在这儿更好的解决方python编程法是运用一个 dis_increment_factor 存储蛇再 x 和 y 上各移动多python基础教程少,而且新建一个函数 get_dis_inc_factor 进行判别:

def get_dis_inc_factor(self) -> Positionwindows10:
# 初始windows7旗舰版
dis_incremepython123nt_factor = Position(0, 0)
# 修改每个方向上的速度代码标准快捷键
if self.direction == gwindows更新ame_config.D_Up:
dis_increment_factor.y = -1
elif self.direction == game_config.https安全问题D_Down:
dis_increment_factor.y = 1
elif sehttps认证lf.direcpython能够自学吗tion == game_config.D_Left:
dis_increment_factorwindows7.x = -1
elif self.direction == game_config.windows10激活密钥D_Right:
dis_increment_factor.x = 1
return dis_increment_factor

当然了,这么做或许有点剩余,可是努力做到一个函数只做一件作业能帮忙化简咱们的代码,下降写出又臭又代码标准标准长还难调试代码的或许性。

解决了移动问题,下一步便是考虑贪吃蛇怎样吃到食物了,在这儿咱们用 check_eat_foodeat_food 两个函数结束:

def eat_food(self, food) -> None:
self.body.append(self.last_body[-1])  # 长大一个元素
def check_eat_food(self, foods: list) -> int:  #appreciate 回来吃到了哪个食物
# 遍历食物,看看当时食物和蛇头是不是重合,重合便是吃到
for index, food in enumerate(foods):Python
if food == self.body[0]:
# 吃到食物则调用 eat_appearfood 函数,处理蛇身长大等操作
self.eat_food(food)
# 弹出appstore吃掉的食物
foods.pop(index)
# 回来吃掉食物的序号,没吃则回来 -1
return index
return代码标准七大准则 -1

在这儿,foods 是一个存储着悉数食物方位信息的列表,每次蛇体移动后都会调用 check_eat_food 函数查看是不是吃到了某APP一个食windows7旗舰版物。

能够发现,查看是不是「吃到」和「吃下去」这两个动作我分为了两个函数,以做到每个函数「聚精会神」便利后期修改。

现在,咱们的蛇现已能跑能吃了。可是作为一只能照料自己的贪吃蛇,咱们还需求能够判别当时本身状况,比方最根柢的我需求知道我刚刚是不是咬到自己了,只需求看看蛇头是不是移动到了身体代码标准七大准则代码标准文档边:

def check_eat_self(self) -> bool:
return self.bodpython编程y[0] in self.bwindows许可证行将过期怎样办ody[1:]  # 判别蛇头是不是和身体重合

或许我想知道是不是跑得太快而撞了墙:

def check_hit_wall(self) -python编程> bool:
# 是不是在上下边框之间
is_between_top_bottom = self.window_size.y - 1 > self.body[0].y > 0
# 是不是在左右边框之间
is_b代码标准七大准则etween_left_right = self.window_size.x - 1 > self.body[0].x > 0
# 回来 是 或许 不是 撞了墙
return not (appearis_between_top代码标准的重要性_bottom and is_between_left_riHTTPSght)

这些功用都是简略python能够自学吗得不能再简略了,可是要信赖自己,便是这么简略的几行代码就能结束一个听你指挥能做出杂乱动作的

完好代码:github.com/AnthonySun2…

2.3 指令行?画板!

https协议一节中咱们结束了游戏里的第一位人物:。为了将它闪现出来咱们现在需求将咱们的指令行改构成一块「画板」。

在着手之前咱们相同考虑:咱们需求画哪些东西在咱们的指令行windows是什么意思上?windows许可证行将过期怎样办直接上类图:

用 Python 写个贪吃蛇,保姆级教程!

是不是觉得有些眼花缭乱以至于感觉无app装置下载从下手?其实 Graphic 类办法虽多可是大多数办法仅仅实施一个特定的功用算了,而且每次更新游戏只需求调用 draw_game代码标准 办法即可:

def draw_game(self, snake: Snake, foods, lives, scores, highest_score) -> Nowindows10激活密钥ne:
# 整理窗口字符
self.window.erase()
# 制作帮忙信息
self.draw_help()
# 更新当时帧率
se代码标准快捷键lf.update_fps()
# 制作帧率信息
self.draw_fps()
# 制作生命代码标准快捷键、得分信息
self.draw_lives_and_scores(liveapproves, scores, highest_score)
# 制作边框
self.draw_bordehttps域名r()
# 制作食物
self.draw_foods(foods)
# 制作蛇身体
self.draw_snake_body(snake)
# 更新界面
self.window.refresh()
# 更新界面
self.game_area.refresh()
# 推延一段时刻,以操控帧率
time.sleep(self.delay_timeapplication)

遵循从上到下规划,从下到上结束的准则

能够看出 draw_gamhttps安全问题e 实践上现已结束了 Graphiappointmentc 的悉数功用。

再往下深入,咱们能够发现类似 draw_foodsappeardraw_snake_body 结束根柢相同,都是遍历坐标列表然后直接在相应方位上增加字符即可:

def draw_snake_body(self, snake: Snake) -> None:
fowindows7r item in snake.body:
self.game_area.addchpython编程(item.y, item.x,
game_config.game_themes[python能够做什么作业"tiles"]["snakHTTPSeappearance_body"],
self.C_snake)
def draw_foods(self, foods) -> None:
for item in foowindows7旗舰版ds:
self.game_area.addch(item.y, itemappreciate.x,
game_config.game_themes["tiles"]["food"],
self.C_f代码标准标准ood)

将其分隔结束也是为了坚持代码洁净易懂以及便利windows7后期修改。draw_helpdraw_fpsdraw_lives_and_scores 也是分别打印了不同文字代码标准查看东西信息,没有任何新的把戏。

update_fps 结束了帧率的预算以及调度等候时刻安稳帧率:

def esp_fps(self) -> bool:  # 回来是否更新了fps
# 每python基础教程 fps_update_interval 帧核算一次
if self.frpython能够自学吗ame_count < self.fps_update_interhttps和http的差异val:
self.frame_count += 1
return False
# 核算时刻花费
time_span = time.time() - self.last_time
# 重置开始时刻
self.last_time = time.time()
# 预算帧率
self.true_fps = 1.0 / (time_span / self.frapython能够自学吗me_count)
# 重置计代码标准性
self.frame_count = 0
return True
def update_fps(self) -> None:
# 假定从头估量了帧率
if spython保留字elf.esp_fps():
# 核算过失
erWindowsr = selfpython编程.true_fps - self.target_fps
# 调windows体系度等候时刻,安稳fps
self.delay_time += 0.00001 * err

draw_message_window 则结束了制作成功、windows许可证行将过期怎样办失败的画面:

def draw_message_windo代码标准查看东西w(self, texts: list) -> None:  # 接收一个 str 列表
text1 =https协议 "Press anpython基础教程y key to continue."
nrows = 6 + len(tpython能够自学吗exts)  # 留出行与行之间的空位
ncols = max(*[le代码标准性n(len_tex) for len_tex in texts], len(text1)) + 20
# 居中闪现窗口
x = (self.window.getmaxyx()[代码标准包括什么1] - ncols) / 2
y = (self.window.getmaxypython能够做什么作业x()[0] - nrows) / 2
pos = Position(int(x), int(y))
# 新建独立窗口
mess代码标准的重要性age_win = curses.newwin(nrows, ncols, pos.y, pos.x)
# 堵塞等候,结束恣意键继续作用
message_win.nodelay(False)
# 制作文字提示
# 底部文字居中
pos.y = nrows - 2
pos.x = self.get_middle(ncols, len(text1))
message_win.addstpython是什么意思r(pos.y, pos.x, text1, self.C_default)
# 制作其他信息
pos.y = 2
for text in textshttps协议:
pos.x = self.get_middle(ncols, len(text))
message_win.addstr(pos.y, pos.x, text, self.C_defa代码标准的重要性ult)
pos.y += 1
# 制作边框
message_win.border()
# 改写内容
message_win.refresh()
# 等候恣意windows7按键
message_win.getch()
# 恢复非堵塞办法
message_winpython基础教程.nodelay(True)
# 清空窗口
message_win.clear()
# 删去窗口
del message_win

代码标准七大准则样,咱们就结束了游戏动画的闪现!

2.4 操控!

到目前中止,咱们结束了游戏内容制作以及游戏人物结束,本节咱们来学习 snakepython保留字 的究竟一个内容:操控

老规矩,敲代码之前咱们应该先想一想:假定要写一个 control 类,他应该都包括哪些办法呢?

用 Python 写个贪吃蛇,保姆级教程!

仔细考虑也不难想到:应该有一个循环,只需没输或许没赢就一贯进行游戏https安全问题,每轮应该更新画面、蛇移动方向等等。这便是咱们的 startapp装置下载

def start(windows10激活密钥self) -> None:
# 重置游戏
self.resetwindows10()
# 游戏作业标志
while self.game_flag:
# 制作游戏
self.graphic.draw_game(selwindows更新f.snake, self.foods, self.lives, self.scores, self.higwindows许可证行将过期怎样办hest_score)
# 读取按键操控
if not self.update_control():
continue代码标准
# 操控游戏速度
if tiappearme.time() - self.start_time < 1/game_config.snake_confapproveig["speeAPPd"]:
continue
self.start_time = time.time()
# 更新蛇
self.uhttps域名pdate_snake()

只需咱们写出了 start 关于剩余的结构也就能轻松的结束,比方读取windows许可证行将过期怎样办按键操控便是最根柢的比较数字是不是相同大:

def update_control(self) -> bool:
key = self.graphic.game_area.getch代码标准()
# 不允许 180度 转弯
if key == curses.KEY_UP and self.snake.direction != game_confwindows更新ig.D_Down:
self.windows10激活密钥snake.direction = game_config.D_Up
elif key == curses.KEY_Dwindows怎样激活OWN and self.snake.di代码标准快捷键rection != game_config.D_Up:
self.snake.direction = game_config.D_Down
elif key == curses.KEY_LEFT and self.snake.direction != game_config.D_Right:
self.snake.direction =代码标准的重要性 gamehttps安全问题_config.D_Left
elif key == curses.KEY_RIG代码标准性HT and self.snake.direction != game_config.D_Left:
self.snakpython怎样读e.direction = game_config.D_Right
# 判别是不是退出
elif key == game_config.keys['Q']:
self.game_flag = Fa代码标准化lse
return False
# 判别是不是重开
elif key == game_config.keys['R']:
self.res代码标准的重要性et()
return Fapplealse

更新蛇的状况时只需求判别是不是逝世、成功、吃到东西就可:

def update_snake(self) -> None:
self.snake.update_snake_pos()
index = sewindows更新lf.snake.check_eat_food(self.foAPPods)
if index != -1:  # 假定吃到食物
# 得分 +1
self.scoresappointment += 1
# 假定填满了游戏https认证区域就成功
if len(self.snake.body) >= (self.snake.window_size.x - 2) * (self.snake.window_size.y - 2):  # 蛇身现已填满游戏区域
self.win()
else:
# 再放置一个食物
self.sppython能够做什么作业an_food()
# 假定死了,就看看是不是游戏结束
if not self.snake.check_alive():
self.game_over()

2.5 直接python保留字运用

为了让这个包能够直接运用 pyappearthon snake 就能直接开始游戏,咱们来看一下 __main__.py

import game
g = game.Game()
g.start()
g.quit()

当咱们检验直接作业一个包时,Python 从 __main__.py 中开始实施,关于咱们写好的代码,只需三行即可开始游戏python123渠道登录

用 Python 写个贪吃蛇,保姆级教程!

三、结尾

到这儿appearance怎样编写一个贪吃windows怎样激活蛇游戏就结束啦!实践上编写一个小游戏不难,关于新windows许可证行将过期怎样办手来讲难点在于怎样去组织程序的结构。我windows是什么意思所结束的仅仅其间的一种办法,每个人关于游python是什么意思戏结构了解不同所写出的代码也会不同。但无论Windows怎样,咱们都approach应该遵循一个政策:尽量遵循代码标准,养成超卓的python培训班膏火一般多少风格。这样不只利于别人阅读你的代码,也利于自己排查 bug、增加新的功用。

究竟windows10激活密钥,感谢您的阅读。这儿是 HelloGitHub 同享 GitHub 上诙谐、入门级的开源项目。您的每个点赞、留言、同享都是对咱们最大的鼓舞!


注重 HelloGitHub 群众号 第一时刻收到更新。

还有更多开源项目的python基础教程介绍和珍宝项目等候你的发现。