Solitaire en masm32 pour windows

Soyez le premier à donner votre avis sur cette source.

Vue 10 776 fois - Téléchargée 986 fois

Description

Et Voilà ! Pile poil pour Noel !
Un programme de jeux sous windows tout en MASM32 !
Le solitaire, vous connaissez ? Une planchette de bois avec 33 trous et 32 cailloux...
Le programme ne verifie pas si le joueur gagne ou perd, de toute façon le joueur, lui, le sait bien ;)

Source / Exemple :


;===================================
;SOLITAIRE.EXE	(c) 2005 RPH-CONCEPT
;===================================
;
;info@rph-concept.com
;
;Les fichiers sont disponible aux addresses suivante:
;
;	http://www.rph-concept.com/download/solitaire_exe.zip	;*** Fichiers Executables
;	http://www.rph-concept.com/download/solitaire_src.zip	;*** Source du fichier EXE
;	http://www.rph-concept.com/download/solitaire_dll.zip	;*** Source du fichier DLL
;
;----------------------------------------------------------------------------------------------------------------------------
;
;LE BUT DU JEUX
;--------------
;
;Je ne crois pas utile de rappeler les règles du Solitaire,
;la seule règle à retenir étant qu'un pion peut sauter par-dessus un pion voisin
;horizontalement ou verticalement (pas en diagonal) Le pion sauté étant alors à enlever.
; 
;Le but ou le challenge principal du Solitaire est d'atteindre l'inverse de la position de départ
;
;On débute avec un plateau remplit sauf le pion du milieu
;et le but est alors d'atteindre le plateau opposé ou inverse:
;c'est à dire un plateau vide sauf le pion du milieu qui doit rester seul. 
;
;
;----------------------------------------------------------------------------------------------------------------------------
;
;SOLITAIRE.DLL	C'est le sac a bitmap de l'application, elle contient les 3 Bitmaps (Format BMP 24 Bits par pixel) utilisés:
;		Les bitmaps sont stockés sans header, dernière ligne en premier, comme dans le fichier BMP.
;		Le code de la DLL ressemble a ça:
;
;		.data
;BM1		DB   B,G,R,B,G,R,B,G,R,...	 1024x768 pixels (1 x 1024x768)		Fond d'écran
;		DB   B,G,R,B,G,R,B,G,R,...	
;		DB   B,G,R,B,G,R,B,G,R,...
;		...
;BM2		DB   B,G,R,B,G,R,B,G,R,...	 208x552 pixels (2 x 3 x 208x92)	Sprites de Menu	
;		DB   B,G,R,B,G,R,B,G,R,...
;		DB   B,G,R,B,G,R,B,G,R,...
;		...
;BM3		DB   B,G,R,B,G,R,B,G,R,...	 64x6144 pixels (32 x 3 x 64x64)	Sprites de jeux
;		DB   B,G,R,B,G,R,B,G,R,...
;		DB   B,G,R,B,G,R,B,G,R,...
;
;		.code
;GetPtrBckGrnd	PROC
;		lea	eax,BM1			;--- Retourne un pointeur sur le fond d'écran
;		ret
;GetPtrBckGrnd	ENDP
;
;GetPtrSwitches PROC
;		lea	eax,BM2			;--- Retourne un pointeur sur les Sprites de Menu
;		ret
;GetPtrSwitches ENDP
;
;GetPtrBalls	PROC
;		lea	eax,BM3			;--- Retourne un pointeur sur les Sprites de Jeux
;		ret
;GetPtrBalls	ENDP
;
;
;
;----------------------------------------------------------------------------------------------------------------------------
;
;SOLITAIRE.EXE	C'est le programme généré par la compilation de solitaire.asm.
;		
;		L'application vas créer une fenêtre et 2 threads, ce qui nous donne 3 routines
;		fonctionnent en parallèle:
;
;		- WndProc
;		- MoniThread
;		- FireThread
;
;		
;		WndProc 	intercèpte les messages WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP
;				pour gérer le menu et les Pions. L'évennement WM_LBUTTONDOWN peut 
;				provoquer l'appel de Pion_Click qui gère le jeux.
;
;		MoniThread 	sert de timer, tout les 40/1000èmes de secondes le flag
;				fcount est mis a 1.
;
;		FireThread 	est la routine principale chargée de redessiner l'écran.
;				On alloue tout d'abord un Buffer pour le bitmap de sortie 768x3x768
;				On stocke l'adresse dans bitmap1
;				On initialise ensuite les pointeur de sprite:
;				hBackGround, hSwitchReset, hSwitchQuitt
;				On appelle ResetGame pour finir l'initialisation.
;
;				Ensuite on raffraichit l'écran en boucle 25 fois par seconde:
;				ShowPict est appeler lors-ce-que fcount passe a 1.
;				ShowPict remet a zero fcount.
;
;		Ok, a quoi bon raffraichir l'écran 25 fois par seconde pour un solitaire ?
;		Surement a rien, mais pour d'autre type de jeux... ca peut faire une base ;)
;
;		Les donnée du jeux sont stockées dans SpriteData sous la forme d'un tableau
;		7 x 7 de structure SPRITEINFO:
;
;		X1, Y1, X2, Y2	Position du sprite a l'écran, sert aussi lors de la détection souris
;		Enable		0 si la case ne fait pas partie du jeux, exclut les 16 cases des coins.
;		Selected	0=Normal / 1=Mouse Over / 2=Selectionné
;		hSprite		OFFSET Sprite / 0=Case Vide 
;		OfsDest		Adresse d'offset dans le buffer video
;		col,Row		Coordonnées dans le jeux de -3 à +3
;				La case (0, 0) etant au centre.
;
;		Autre procédures importantes:
;
;		ResetGame	Copie les variables du jeux de SpritesData vers GameData
;				et initialize les pointeurs des pions sur les sprites
;		ShowPict	Appelée 25 fois par seconde, c'est elle qui redessine le
;				BM en mémoire et l'envoie a windows avec SetDIBitsToDevice
;		Pion_Click	Déplace les pions si les Opérations demandées sont valide
;
;----------------------------------------------------------------------------------------------------------------------------

Conclusion :


Pour les mises a jours, faites un tour sur www.rph-concept.com

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BLUEBIBUBBLE
Messages postés
116
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
10 avril 2013
1 -
Hello PATALO,

Je pense que l'on est loin de dépasser ces 40ms, sur un PC presque récent en tout cas, et dans le pire des cas, si on affiche une image sur deux, il nous reste 12,5 FPS, ça devrait rester jouable...
De plus l'exactitude du timing ne me parait pas critique dans notre cas, mais effectivement, si l'utilisation d'un thread te semble inutile, plein d'autres moyens, comme le compteur hardware, sont effectivement possibles...

A+
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
salut,

superbe cette source.
Juste un truc qui me chifonne sur l'utilisation et la synchronisation de MoniThread.

Ne pourrait-on pas gerer un timer qui nous permettrait de savoir si l'appel de ShowPic depasse le delai de 40ms ? Car actuellement, MoniThread ne sert a rien dans le cas d'un depassement de ce delai.

plutot que d'utiliser un thread suplementaire pour la gestion d'un timer, utiliser le compteur cpu pour connaittre exactement le temps de gestion de l'appel a ShowPic et la valeur sleep associée si necessaire ?

@++
cs_quoi
Messages postés
11
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
26 mai 2008
-
super un beau jeux qui fonctionne en asm
le code est assez complexe
ça rappel du DIRECT DRAW le fait que
la fenêtre est toute redessinée tout les
lapses de temps définis
très interressant
c'est bien du niveau 2 voir 3 !
10/10
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
salut,

ouais !!!, de l'asm ...

@++

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.