Accueil > Technique > Informatique > Python > Cinéma ascii > Le bonhomme
Le bonhomme
vendredi 5 avril 2019, par
La technique est différente du roflcopter ou du lancer du marteau. Ici, il y a un fichier par frame.
Screencast
Télécharger
Code source
bonhomme.py :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8
#
# bonhomme.py
#
# Copyright 2019 Robert Sebille <robert@sebille.name>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
import os
import time as t
from platform import system
from couleurs import Ccxy1, Ccxy2, Ccu, Ccf, Ccb, Ccd, Ccls, Ccll
from couleurs import dessine_carre
from couleurs import Csrs, Csbr, Csd, Csu, Csbl, Csrv, Csn
# efface l'écran suivant le système'
def cls():
if system() == 'Windows':
os.system('cls')
else:
os.system('clear')
# imprime un message dans un cadre
def message(texte, hg, bd, x, y):
cls()
dessine_carre(hg, bd, Csrv, " ")
#print(Ccxy2(hg[0] + x, bd[1] + y) + texte)
print(Ccxy2(hg[0] + x, hg[1] + y) + texte)
# Lit les données
frms = []
for fichier in os.listdir('frames'):
with (open('frames/' + fichier)) as f:
frms.append(f.read())
frames = []
for f in frms:
frames.append(f.split("\n"))
# init
dep = 60
i = 0
y = 1
# Pub debian
cls()
with open('debian_pub_en.txt') as d:
p = d.readlines()
for l in p:
print(l, end='')
t.sleep(2)
cls()
# main loop
while True:
try:
message("En avant !", (2,2), (20, 10), 4, 3)
t.sleep(1)
while i <= dep:
for f in frames:
cls()
for l in range(len(f)):
print(Ccxy2(i, y + l) + f[l])
print("CTRL + C = Fin")
t.sleep(0.2)
i += 1
message("En arrière !", (dep,2), (dep + 18, 10), 4, 3)
t.sleep(1)
while i > 0:
for f in frames:
cls()
for l in range(len(f)):
print(Ccxy2(i, y + l) + f[l])
print("CTRL + C = Fin")
t.sleep(0.2)
i -= 1
except KeyboardInterrupt:
print("\nReçu CTRL + C")
input("Pressez entrée pour sortir.")
exit("Bye !")
# local encoding
# import sys
# print(sys.getdefaultencoding())
# from platform import system
# if system() == 'Windows':
# os.system("pause")
couleurs.py :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8
#
# sans titre.py
#
# Copyright 2019 Robert Sebille <robert@sebille.name>
#
# This program is free software; you can redistribute it and/orm"odify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# m"ERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# m"A 02110-1301, USA.
#
#
###############
# Version 1.0 #
###############
# ref: https://gitlab.com/dslackw/colored
# imports
# from couleurs import Csrs, Csbr, Csd, Csu, Csbl, Csrv, Csn
# from couleurs import Cfba, Cfbu, Cfr, Cfy, Cfc, Cfg, Cfm, Cfw, Cfrs
# from couleurs import Cbba, Cbbu, Cbr, Cby, Cbc, Cbg, Cbm, Cbw, Cbrs
# from couleurs import Ccxy1, Ccxy2, Ccu, Ccf, Ccb, Ccd, Ccls, Ccll
# from couleurs import dessine_carre
Csrs = "\033[0m" # reset all (colors and brightness)
Csbr = "\033[1m" # bright
Csd = "\033[2m" # dim (looks same as normal brightness)
Csu = "\033[4m" # UNDERLINED
Csbl = "\033[5m" # BLINK,
Csrv = "\033[7m" # REVERSE
Csn = "\033[22m" # normal brightness
# FOREGROUND:
Cfba = "\033[30m" # black
Cfr = "\033[31m" # red
Cfg = "\033[32m" # green
Cfy = "\033[33m" # yellow
Cfbu = "\033[34m" # blue
Cfm = "\033[35m" # magenta
Cfc = "\033[36m" # cyan
Cfw = "\033[37m" # white
Cfrs = "\033[39m" # reset
# BACKGROUND
Cbba = "\033[40m" # black
Cbr = "\033[41m" # red
Cbg = "\033[42m" # green
Cby = "\033[43m" # yellow
Cbbu = "\033[44m" # blue
Cbm = "\033[45m" # magenta
Cbc = "\033[46m" # cyan
Cbw = "\033[47m" # white
Cbrs = "\033[49m" # reset
# cursor positioning
def Ccxy1(coords): # position cursor at x across, y down
return "\033["+str(coords[1])+";"+str(coords[0])+"H"
def Ccxy2(x, y): # position cursor at x across, y down
return "\033["+str(y)+";"+str(x)+"f"
def Ccu(n):
return "\033["+str(n)+"A" # move cursor n lines up
def Ccd(n):
return "\033["+str(n)+"B" # move cursor n lines down
def Ccf(n):
return "\033["+str(n)+"C" # move cursor n characters forward
def Ccb(n):
return "\033["+str(n)+"D" # move cursor n characters backward
# clear the screen
Ccls = "\033[2J" # clear the screen
# clear the line
Ccll = "\033[K" # clear the line
def dessine_carre(hg, bd, coul=Csrv, car='·', bordure=True):
"""dessine_carre(hg, bd, coul=Csrv, car='·') dessine un rectangle,
et retourne un dict avec les param du rectangle
"""
dictparam = {
'coinexthg': hg,
'coinextbd': bd,
'coinexthd': (bd[0], hg[1]),
'coinextbg': (hg[0], bd[1]),
'coininthg': (hg[0] + 1, hg[1] + 1),
'coinintbd': (bd[0] - 1, bd[1] - 1),
'coininthd': (bd[0] - 1, hg[1] + 1),
'coinintbg': (hg[0] + 1, bd[1] - 1),
'hauteur': bd[1] - hg[1] + 1,
'longueur': bd[0] - hg[0] + 1,
'limiteg': hg[0],
'limited': bd[0],
'limiteh': hg[1],
'limiteb': bd[1]
}
if bordure:
bhb = "-"
bgd = '|'
coin = '+'
else:
bhb = car
bgd = car
coin = car
for j in range(0, dictparam['hauteur']):
for i in range(0, dictparam['longueur']):
#print(i)
if j == 0 or j == (dictparam['hauteur'] - 1):
print(coul + Ccxy2(hg[0], hg[1] + j) + coin + bhb*(dictparam['longueur']-2) + coin, sep='', end='')
else:
print(Ccxy2(hg[0] + i, hg[1] + j), sep='', end='')
if i == 0 or i == (dictparam['longueur'] - 1):
print(coul + bgd + Csrs, sep='', end='')
else:
print(car, sep='', end='')
print()
#if j == 0 or j == (dictparam['hauteur'] - 1):
# print(coul, sep='', end='')
print(Csrs, end='')
return dictparam
if __name__ == '__main__':
pass
4 fichiers frames : frames/bon00, frames/bon10, frames/bon20, frames/bon30
frames/bon00: __ _/&_\_ (;; o\ \ < | / / \ || /@| (++ || || -=- frames/bon10: __ _/&_\) (;; o\ \ < | / / \ ||\ /@| @ (++ |\ |\\ -=-=' frames/bon20: __ _/&_\) (:: o\ \ = | / / \ //||\ @ / | @ (++ / \\ // \\ `=- -=' frames/bon30: __ _/&_\_ (:: o\ \ = | / / \ //|| @ / | (++ /|| // | `=- -=-
debian_pub_en.txt
_,met$$$$$gg. ,g$$$$$$$$$$$$$$$P. | | __| _ \ ,g$$P"" """Y$$.". | |\__ \ __/ ,$$P' `$$$. \__,_|____/\___| ',$$P ,ggs. `$$b: `d$$' ,$P"' . $$$ _, _, ,'`. $$P d$' , $$P `$$' `$$' `. ,' HEX $$: $$. - ,d$$' $$ $$ `' 64 65 62 69 61 6E $$; Y$b._ _,d$P' $$ $$ _, _ Y$$. `.`"Y$$$$P"' ,d$$$g$$ ,d$$$b. $$,d$$$b.`$$' g$$$$$b.`$$,d$$b. `$$b "-.__ ,$P' `$$ ,$P' `Y$. $$$' `$$ $$ "' `$$ $$$' `$$ `Y$$b $$' $$ $$' `$$ $$' $$ $$ ,ggggg$$ $$' $$ `Y$$. $$ $$ $$ggggg$$ $$ $$ $$ ,$P" $$ $$ $$ `$$b. $$ ,$$ $$. $$ ,$P $$ $$' ,$$ $$ $$ `Y$$b. `$g. ,$$$ `$$._ _., $$ _,g$P' $$ `$b. ,$$$ $$ $$ `"Y$b._ `Y$$P'$$. `Y$$$$P',$$$$P"' ,$$. `Y$$P'$$.$$. ,$$. `""""