Cavaliers sur un échiquier

Contenu du snippet

Faire passer un cavalier sur toutes les cases d'un échiquier.
Ce programme fonctionne à tous les coups

Source / Exemple :


//http://pabbati.free.fr/
#include <windows.h>
#include <time.h>
#include <stdlib.h>

#pragma warn -sig
//#define CarresMagique
#define MAX 8
HINSTANCE hInst;
HWND hwnd;
char szAppName[]="Chevaux";
PAINTSTRUCT ps;
MSG         msg ;
WNDCLASS    wndclass ;
HACCEL      hAccel;
unsigned char c[MAX][MAX];
unsigned char a,b,x,y,z,xx,yy,i,j;
char s[50];
HDC hdc;
SIZE size={16,16};
int taille;

unsigned char ok(unsigned char i,unsigned char j)
{
 return ((i<MAX)&&(j<MAX)&&(c[i][j]==0));
}

#define X0 x+2,y-1
#define X1 x+2,y+1
#define X2 x-2,y-1
#define X3 x-2,y+1
#define X4 x+1,y-2
#define X5 x+1,y+2
#define X6 x-1,y-2
#define X7 x-1,y+2
void essai(unsigned char c,unsigned char x,unsigned char y)
{
 if(b&c)
 {
  b-=c;
  if(ok(x,y))
  {
	unsigned char k=ok(X0)+ok(X1)+ok(X2)+ok(X3)+ok(X4)+ok(X5)+ok(X6)+ok(X7);
	if(k<a)
	{
	 xx=x;
	 yy=y;
	 a=k;
	}
  }
 }
}

BOOL choix()
{
 a=9;
 b=0xFF;
 do
 {
  switch(random(8))
  {           
	case 0:essai(0x01,X0);break;
	case 1:essai(0x02,X1);break;
	case 2:essai(0x04,X2);break;
	case 3:essai(0x08,X3);break;
	case 4:essai(0x10,X4);break;
	case 5:essai(0x20,X5);break;
	case 6:essai(0x40,X6);break;
	case 7:essai(0x80,X7);break;
  }
 }
 while(b);
 return (a<9);
}

void CaretPos()
{
 unsigned char i,j;
 for(i=0;i<MAX;i++)
 for(j=0;j<MAX;j++)
 if(c[i][j]==z)
 {
  SetCaretPos(10+taille*i,5+taille*j);
  return;
 }
}

void init(char k)
{
 static unsigned char i=0,j=0;
 memset(c,0,sizeof(c));
 if(k)
 {
  if(k<2)if(++i>MAX-1){i=0;if(++j>MAX-1)j=0;}
  xx=i;
  yy=j;
 }
 else
 {
  xx=random(MAX);
  yy=random(MAX);
 }
 z=0;
}

#ifdef CarresMagique
BOOL CarreMagique()
{
	unsigned char i,j;
	UINT r1,r2,r3,n=0;
	for(i=0;i<MAX;i++)n+=c[i][i];
	r3=0;
	for(i=0;i<MAX;i++)
	{
	 r3+=c[i][MAX-i-1];
	 r1=r2=0;
	 for(j=0;j<MAX;j++){r1+=c[i][j];r2+=c[j][i];}
	 if((r1!=n)||(r2!=n))return FALSE;
	}
	if(r3!=n)return FALSE;
	return TRUE;
}
#endif

void cherche(char k=0)
{
 unsigned compte=0;
 encore:
 init(k);
 do
 {
  x=xx;y=yy;
  c[x][y]=++z;
 }
 while(choix());
 if(z!=MAX*MAX)
 {
  if(compte++<50)goto encore;
  z=1;
  CaretPos();
  InvalidateRect(hwnd,NULL,TRUE);
  MessageBox(hwnd,"Résultat non trouvé",szAppName,MB_ICONEXCLAMATION);
 }
 z=1;
 CaretPos();
#ifdef CarresMagique
 if(CarreMagique())
 {
  InvalidateRect(hwnd,NULL,TRUE);
  MessageBox(hwnd,"C'est un carré magique",szAppName,MB_ICONEXCLAMATION);
 }
#endif
}

long FAR PASCAL WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
 switch (message)
 {
  case WM_SETCURSOR:SetCursor(LoadCursor(NULL,IDC_ARROW));return TRUE;
  case WM_PAINT:
	hdc=BeginPaint(hwnd,&ps);
	for(i=0;i<MAX;i++)
	{
	 for(j=0;j<MAX;j++)
	 {
//	  if(c[i][j]==z)CaretPos(i,j);
	  wsprintf(s,"%02u",(int)c[i][j]);
	  TextOut(ps.hdc,10+taille*i,5+taille*j,s,lstrlen(s));
	 }
	}
	EndPaint(hwnd,&ps);
  break;
  case WM_LBUTTONDOWN:PostMessage(hwnd,WM_KEYDOWN,VK_RETURN,0);break;
  case WM_MBUTTONDOWN:PostMessage(hwnd,WM_KEYDOWN,VK_TAB,0);break;
  case WM_RBUTTONDOWN:PostMessage(hwnd,WM_KEYDOWN,VK_SPACE,0);break;
  case WM_KEYDOWN:
	switch(LOWORD(wParam))
	{
	 case VK_UP:
	 case VK_RIGHT:if(++z>MAX*MAX)z=1;CaretPos();break;
	 case VK_DOWN:
	 case VK_LEFT:if(--z==0)z=MAX*MAX;CaretPos();break;
	 case VK_ESCAPE:PostMessage(hwnd,WM_CLOSE,0,0);break;
	 case VK_F1:MessageBox(hwnd,"Touches Droite, Gauche, Haut, Bas...\n\nTabulation, Entrée, Espace...",szAppName,MB_ICONINFORMATION);break;
	 case VK_F2:
	 case VK_RETURN:cherche();InvalidateRect(hwnd,NULL,TRUE);break;
	 case VK_F3:
	 case VK_TAB:cherche(1);InvalidateRect(hwnd,NULL,TRUE);break;
	 case VK_F4:
	 case VK_SPACE:cherche(2);InvalidateRect(hwnd,NULL,TRUE);break;
	}
  break;
  case WM_KILLFOCUS:DestroyCaret();break;
  case WM_SETFOCUS:CreateCaret(hwnd,NULL,size.cx,size.cy);ShowCaret(hwnd);break;
  case WM_DESTROY:PostQuitMessage(0);break;
  case WM_CREATE:
	RemoveMenu(GetSystemMenu(hwnd,FALSE),2,MF_BYPOSITION);
	RemoveMenu(GetSystemMenu(hwnd,FALSE),3,MF_BYPOSITION);
	hdc=GetDC(hwnd);
	GetTextExtentPoint32(hdc,"00",2,&size);
	ReleaseDC(hwnd,hdc);
	size.cy>size.cx?taille=size.cy:taille=size.cx;
	taille+=6;
	SetWindowPos(hwnd,HWND_TOP,0,0,12+taille*MAX+2*GetSystemMetrics(SM_CXFRAME),5+taille*MAX+GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYFRAME),SWP_NOMOVE|SWP_NOREDRAW|SWP_NOZORDER);
	PostMessage(hwnd,WM_KEYDOWN,VK_RETURN,0);
  break;
  default:return DefWindowProc(hwnd,message,wParam,lParam) ;
 }
 return 0;
}

#pragma argsused
int PASCAL WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmd,int nCmdShow)
{
 randomize();
 hInst=hInstance;
  wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  wndclass.lpfnWndProc   = (WNDPROC)WndProc ;
  wndclass.cbClsExtra    = 0 ;
  wndclass.cbWndExtra    = 0 ;
  wndclass.hInstance     = hInst;
  wndclass.hIcon         = LoadIcon(hInst,MAKEINTRESOURCE(1));
  wndclass.hCursor       = LoadCursor(NULL,IDC_ARROW);
  wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
  wndclass.lpszMenuName  = MAKEINTRESOURCE(1);
  wndclass.lpszClassName = szAppName;
  RegisterClass (&wndclass) ;

  hwnd = CreateWindow (
	szAppName,
	szAppName,
	WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION|WS_THICKFRAME,
	CW_USEDEFAULT,
	CW_USEDEFAULT,
	CW_USEDEFAULT,
	CW_USEDEFAULT,
	NULL,
	NULL,
	hInst,
	NULL);

 ShowWindow (hwnd, nCmdShow) ;
 UpdateWindow (hwnd) ;

// hAccel = LoadAccelerators( hInstance,MAKEINTRESOURCE(1));

 while (GetMessage (&msg, NULL, 0, 0))
 {
//  if ( !TranslateAccelerator( hwnd, hAccel, &msg ))
  {
	TranslateMessage (&msg) ;
	DispatchMessage (&msg) ;
  }
 }
// UnregisterClass(szAppName,hInstance);
 return msg.wParam ;
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.