taquin

Menu

Voici un taquin 4x4 en console: quinze cases, et une case vide que l'on déplace avec les touches fléchées. En linux, le module curses est utilisé, il faut trouver un équivalent pour Windows.

copie écran d'une console avec taquin.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<code>
#! /usr/bin/python
# -*- coding: latin-1 -*-
 
# www.jchr.be - 2007.01.27 - GPL2
 
# Rappel: sous Windows, il faut telecharger le module WCurses: voir www.jchr.be/python/modules.htm#curses
 
from time import time
from random import randrange
import curses
 
# cette premiere fonction dessine un tableau regulier (apres initialisation d'une session curses)
# parametres: offset ligne/colonne, nombre de rangees/colonnes, hauteur de rangee, largeur de colonne
def tableau(y,x,nrang,ncol,hrang,lcol):
  ymax=hrang*nrang+1; xmax=lcol*ncol+1
  for j in range(0,ymax):
    for i in range(0,xmax):
      if j%hrang!=0 and i%lcol==0: fenetre.addch(y+j,x+i,curses.ACS_VLINE); continue # lignes
      if j%hrang==0 and i%lcol!=0: fenetre.addch(y+j,x+i,curses.ACS_HLINE); continue
      if j%hrang==0 and i%lcol==0: fenetre.addch(y+j,x+i,curses.ACS_PLUS) # croisements
      if j==0 and i%lcol==0: fenetre.addch(y+j,x+i,curses.ACS_TTEE)       # remplacement de certains croisements par les bords
      if j==ymax-1 and i%lcol==0: fenetre.addch(y+j,x+i,curses.ACS_BTEE)
      if j%hrang==0 and i==0: fenetre.addch(y+j,x+i,curses.ACS_LTEE)
      if j%hrang==0 and i==xmax-1: fenetre.addch(y+j,x+i,curses.ACS_RTEE)
      if j==0 and i==0: fenetre.addch(y+j,x+i,curses.ACS_ULCORNER)        # remplacement de certains bords par les coins
      if j==0 and i==xmax-1: fenetre.addch(y+j,x+i,curses.ACS_URCORNER)
      if j==ymax-1 and i==0: fenetre.addch(y+j,x+i,curses.ACS_LLCORNER)
      if j==ymax-1 and i==xmax-1: fenetre.addch(y+j,x+i,curses.ACS_LRCORNER)
  fenetre.refresh()
 
# permute la case vide avec une case numerotee adjacente
def permute(lieu1,lieu2):
  fenetre.move(2+lieu1//4*2,3+lieu1%4*4)
  if k[lieu1]>0: fenetre.addstr(str(k[lieu1]).rjust(2))
  else: fenetre.addstr('  ')
  fenetre.move(2+lieu2//4*2,3+lieu2%4*4)
  if k[lieu2]>0: fenetre.addstr(str(k[lieu2]).rjust(2))
  else: fenetre.addstr('  ')
  fenetre.refresh()
 
def gauche():
  global zero, cpt
  if (zero%4>0):
    k[zero],k[zero-1]=k[zero-1],k[zero]
    permute(zero,zero-1)
    zero-=1; cpt+=1
 
def droite():
  global zero, cpt
  if (zero%4<3):
    k[zero],k[zero+1]=k[zero+1],k[zero]
    permute(zero,zero+1)
    zero+=1; cpt+=1
 
def bas():
  global zero, cpt
  if (zero>3):
    k[zero],k[zero-4]=k[zero-4],k[zero]
    permute(zero,zero-4)
    zero-=4; cpt+=1
 
def haut():
  global zero, cpt
  if (zero<12):
    k[zero],k[zero+4]=k[zero+4],k[zero]
    permute(zero,zero+4)
    zero+=4; cpt+=1
 
def initial(): # (re)initialisation du jeu (melange du taquin)
  global k, zero, ordre, sec, cpt
  ordre=range(1,16)
  ordre+=[0]; zero=15
  k=ordre[:]
  i=0; anc=0
  # le melange se fait en glissant les pieces au hasard cela ne peut se faire
  # par random.shuffle: un taquin sur deux seulement serait soluble
  while i <1000:
    anc=(anc+2)%4
    r=randrange(0,4)
    if (r==0) and r!=anc: haut(); anc=r; i+=1
    if (r==1) and r!=anc: bas(); anc=r; i+=1
    if (r==2) and r!=anc: gauche(); anc=r; i+=1
    if (r==3) and r!=anc: droite(); anc=r; i+=1
  cpt=0
  for i in range(16):
    if (k[i]==0):
      zero=i
  fenetre.addstr(7,25,' '*20) # efface le score
  fenetre.addstr(8,25,' '*20)
 
  sec=time()
 
# ****** Initialisation de l'application
sec=0.; zero=15; cpt=0; fin=0
 
# Initialisation de la session 'curses' (a ne faire qu'une fois)
ecran= curses.initscr()
fenetre= curses.newwin(15,50,0,0)
fenetre.keypad(1)
curses.curs_set(0)
curses.cbreak()
curses.noecho()
tableau(1,2,4,4,2,4) # dessin du tableau
tableau(0,0,1,1,10,20)
fenetre.addstr(1,25,'Taquin -- www.jchr.be')
fenetre.addstr(2,25,'2007.01.27 -- GPL2')
fenetre.addstr(4,27,'Quitter avec [q]')
fenetre.addstr(5,27,'Melanger avec [Esc]')
fenetre.refresh()
 
initial()
while (fin==0):
  if (ordre==k): # si la liste-taquin est en ordre
    tps=divmod(time()-sec,60);
    fenetre.addstr(7,25,'Resolu en '+str(int(tps[0]))+':'+str(int(tps[1])).zfill(2)+' et')
    fenetre.addstr(8,25,str(cpt)+' deplacements  ')
    fenetre.refresh()
    key=fenetre.getch()
    if key==113 or key==81: break # touche [q] ou [Q]
    initial()
  key=fenetre.getch()
  if key==curses.KEY_LEFT: gauche(); continue
  if key==curses.KEY_RIGHT: droite(); continue
  if key==curses.KEY_DOWN: haut(); continue
  if key==curses.KEY_UP: bas(); continue
  if key==27: initial()
  if key==113 or key==81: break
 
# le break permet de terminer la session 'curses'
fenetre.keypad(0)
curses.echo()
curses.curs_set(1)
curses.nocbreak()
curses.endwin()</code>

Quelques lignes / Some scripts...

J'utilise python pour le dépouillement des statistiques de logs, la génération ou la gestion de pages html, mais aussi pour générer des images et quelques futilitaires... Ce blog est une occasion de partager tout cela. J'ai également réalisé quelques pages concernant python: www.jchr.be/python - À part cela, je déteste les blogs, qui ne permettent pas d'organiser facilement les fichiers. 

I use python for many purposes (logs statistics, html generation...) and also for art and unutilities. My aim is to share some of my products. I will try to write french/english pages... - I dislike blogs, which don't let me set easily the files in order I want.

2014.11.07 - Soon: a gui for 3-cycles-composition application.


Menu

  • Un taquin en mode console (avec le module 'curses': affichage semi-graphique)
  • Un genre de spirographe simplifié: composition de deux cycles - two cycles-composition
  • Compositions de cycles sur trois niveaux - three cycles-composition, such as my avatar
  • PNM graphic format, easy to generate
  • Automatic Mondrian (PNM -> PNG) - Un générateur de tableau à la Mondrian
  • displaying dynamic graphic (Tkinter) and saving it
  • A brainf*ck interpreter (debugging mode) - un interpréteur brainf*ck (mode pas-à-pas)
  • ATARI-ST Charset Nostalgia