| Faire passer toutes les balles rouges dans la partie droite | |
|
+6Marc jjn4 Yannick Jean Claude Jicehel papydall 10 participants |
Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 2:44 | |
| Comme la mode ce temps-ci est aux jeux, voici ma contribution. En moins d’une centaine de lignes de code, y compris les commentaires, voici un petit jeu qui peut vous distraire ou … vous énervez ! Le but du jeu : Faire passer toutes les balles rouges à droite, rien que ça. Mais attention, ce n’est pas si facile que ça en a l’air ! Commencez par un petit nombre de balles : pour cela modifier la ligne 12. Commencez avec … 3 balles, puis augmentez ce nombre 4,5,…, 10, 20 … Tout est dans le code. Bon amusement. - Code:
-
rem ============================================================================ rem Jeu de balles rem Par Papydall rem Mars 2017 rem ============================================================================ A_Vos_Marques_Pret_Partez() end rem ============================================================================ SUB A_Vos_Marques_Pret_Partez() label clic ' Variables et constantes du programme dim NbBalles : NbBalles = 5 : ' Nombres de balles, plus le nombre est grand plus ça devient difficile dim xPosRed(NbBalles) ,yPosRed(NbBalles) : ' Coordonnées des balles rouges dim xPosGreen(NbBalles),yPosGreen(NbBalles) : ' Coordonnées des balles vertes dim xVitRed(NbBalles) ,yVitRed(NbBalles) : ' Vitesse des balles rouges selon les axes X/Y dim xVitGreen(NbBalles),yVitGreen(NbBalles) : ' Vitesse des balles vertes selon les axes X/Y dim r : r = 5 : ' rayon des balles dim w,h : ' largeur et hateur du terrain de jeu ' ------------------------------------------------------------------------------ width 0, 1000 button 2 : left 2,100 : font_bold 2 : caption 2,"Jeu" : on_click 2,clic button 3 : left 3,200 : font_bold 3 : caption 3,"Info" : on_click 3,clic button 4 : left 4,300 : font_bold 4 : caption 4,"Quitter" : on_click 4,clic ' ------------------------------------------------------------------------------ picture 10 : width 10,width(0)-50 : height 10,height(0)-100 top 10,30 : left 10,20 : 2d_target_is 10 : 2d_fill_on : print_target_is 10 w = width(10) : h = height(10) font_color 10,255,255,255 : font_size 10,14 : font_bold 10 caption 0,"Faire passer les balles rouges à droite" END_SUB rem ============================================================================ ' Initialisation des balles SUB Init_Balles() dim_local i for i = 1 to NbBalles xPosRed(i) = 10 + int(rnd(100)) : yPosRed(i) = 10+int(rnd(100)) xVitRed(i) = rnd(10) :yVitRed(i) = rnd(5) xPosGreen(i) = 10 + int(rnd(100)) : yPosGreen(i) = 10+int(rnd(100)) xVitGreen(i) = rnd(10) :yVitGreen(i) = rnd(5) next i END_SUB rem ============================================================================ Clic: select number_click case 2 : Jeu() case 3 : Info() case 4 : terminate end_select return rem ============================================================================ SUB Info() dim_local t$ t$ = "Le terrain du jeu est divisé en deux partie par une cloison imperméable." + chr$(13) t$ = t$ + "Cette cloison comporte une ouverture par où peuvent passer les différentes balles." + chr$(13) t$ = t$ + "Le but du jeu est de faire passer toutes les balles rouges dans la partie droite." + chr$(13) t$ = t$ + "Pour cela, vous utilisez les flèches <HAUT> et <BAS> pour déplacer cette ouverture." + chr$(13)+chr$(13) t$ = t$ + " B O N A M U S E M E N T !!!" message t$ END_SUB rem ============================================================================ SUB Jeu() dim_local i,r2,h2,deb, NbRouges r2 = 2*r : h2 = 50 : deb = 20 : inactive 2 : Init_Balles() while 1 = 1 cls : NbRouges = NbBalles select scancode case 38 : deb = deb - 10 : if deb < r2 then deb = r2 : ' Haut case 40 : deb = deb + 10 : if deb > (h-7*r2) then deb = h-7*r2 : ' Bas end_select 2d_pen_width r2 : 2d_pen_color 0,0,0 : 2d_line w/2,0,w/2,h : ' Cloison 2d_poly_from 0,0 : 2d_poly_to w,0 : 2d_poly_to w,h : 2d_poly_to 0,h : 2d_poly_to 0,0 2d_pen_color 255,255,255 : 2d_line w/2,deb,w/2,deb+h2 : ' Ouverture 2d_pen_width 1 : 2d_fill_color 255,255,255 : 2d_pen_color 255,255,255 for i = 1 to NbBalles ' Calculer les nouvelles positions des balles xPosRed(i) = xPosRed(i) + xVitRed(i) : yPosRed(i) = yPosRed(i) + yVitRed(i) xPosGreen(i) = xPosGreen(i) + xVitGreen(i) : yPosGreen(i) = yPosGreen(i) + yVitGreen(i) ' Rebondissement des balles sur les obstacles ? If (xPosRed(i) <= r2) Or ((xPosRed(i) >= (W/2-r2)) and (color_pixel_red(10,xPosRed(i),yPosRed(i)) = 0)) then xVitRed(i) = 0-xVitRed(i) If (yPosRed(i) <= r2) Or (yPosRed(i) >= H) Then yVitRed(i) = 0-yVitRed(i) If (xPosGreen(i) <= r2) Or ((xPosGreen(i) >= (W/2-r2)) and (color_pixel_red(10,xPosGreen(i),yPosGreen(i)) = 0)) then xVitGreen(i) = 0-xVitGreen(i) If (yPosGreen(i) <= r2) Or (yPosGreen(i) >= H) Then yVitGreen(i) = 0-yVitGreen(i) ' Actualiser les positions des balles 2d_fill_color 255,0,0 : 2d_pen_color 255,0,0 : 2d_circle xPosRed(i)-r,yPosRed(i)-r,r 2d_fill_color 0,255,0 : 2d_pen_color 0,255,0 : 2d_circle xPosGreen(i)-r,yPosGreen(i)-r,r if xPosRed(i) > (w/2+2*r2) : ' Balle rouge à droite ? NbRouges = NbRouges + 1 : ' Oui : incrémenter else NbRouges = NbRouges - 1 : ' Non : décrémenter end_if if NbRouges >= 2*NbBalles : ' Toutes les balles rouges à droite ? message "BRAVO !!!" + chr$(13) + "Tu as bien accompli la mission.": ' Félicitations cls : active 2 : exit_sub end_if next i end_while END_SUB rem ============================================================================
| |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 8:57 | |
| Bonne idée mais j'ai un gros problème: le scancode est un système qui fonctionne très mal chez moi pour ton jeu: j'ai réussi une fois à ce que la touche "bas" soit prise en compte, le reste du temps, je peux appuyer plein de fois dessus ou rester appuyé, ça ne bouge pas... c'est génant alors que ça devrait être très réactif pour ce type de jeu.
Bref, le trou ne bouge pas et du coup, je ne peux pas jouer (j'ai vérifié le scancode des touches de mon clavier et il correspond bien aux valeurs de ton code).
J'essayerais ce soir le système bignonosien, je ne l'ai plus en tête mais je crois que pour la gestion des touches ça marchait mieux (mémorisation de la touche par événement lors de l'appui)
| |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 9:57 | |
| Salut à tous, Chez moi ça marche bien, mais c'est très rapide. En diminuant la vitesse, c'est un peu plus facile Oui, je sais, c'est de la triche A+ | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 11:59 | |
| Jicehel et Jean Claude, merci pour vos retours. - Jicehel a écrit:
- J'essayerais ce soir le système bignonosien,
Fais-toi plaisir et donne-nous une autre manière de scruter le clavier. A-propos, Bignono si jamais tu passes par ici, fais-nous un petit coucou. - Jean Claude a écrit:
- En diminuant la vitesse, c'est un peu plus facile
Oui, je sais, c'est de la triche Non, ce n’est pas de la triche ! C’est juste une adaptation pour chacun selon son PC, sa dextérité, son temps de réponse, etc. D’ailleurs, les vitesses des balles sont déterminées aléatoirement par le programme en lignes 37 et 39 que l’on peut modifier à son goût. Tous les paramètres du jeu peuvent être modifiés. Et si on corse le jeu en imposant que toutes les balles rouges soient à droite ET toutes les vertes à gauche ? Bon, faites ce que vous voulez. | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 6 Mar 2017 - 12:36 | |
| Je constate qu' il n' y a pas que le martien qui s' amuse ! Bravo Papydall, encore un joli casse-tête... | |
|
| |
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Lun 6 Mar 2017 - 13:53 | |
| | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| |
| |
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 17:42 | |
| Merci Papydall ! Pas facile sans diminuer la vitesse ! La fluidité est excellente. C'est fou ce que l'on peut faire avec quelques lignes de code ! Quant au code, c'est du Papydall ! Facile à comprendre et très détaillé. | |
|
| |
RMont
Nombre de messages : 233 Age : 82 Localisation : charente maritime Date d'inscription : 29/12/2008
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 18:15 | |
| bonjour a tous chez moi ,cela fonctionne tres bien.jeu assez difficile :c'est tres rapide merci papydall pour tes lignes de rem
| |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 18:50 | |
| Merci Marc37 et RMont pour vos appréciations. - Marc37 a écrit:
- La fluidité est excellente.
J’étais moi aussi surpris d’une telle fluidité. - RMont a écrit:
- chez moi ,cela fonctionne tres bien.jeu assez difficile :c'est tres rapide
merci papydall pour tes lignes de rem La vitesse est inversement proportionnelle au nombre de balles. Plus le nombre de balles augmente, plus la vitesse diminue (ce qui permet de mieux gérer tout ce beau monde de balles) et plus la difficulté de les faire passer à droite augmente). On se trouve devant un compromis : diminuer la vitesse des balles ou augmenter la facilité de les gérer. Mais comme toutes les variables peuvent être modifiées, chacun peut les adapter à son niveau. Essayez avec 50 ou plus comme nombre de balles. Amusez-vous bien ! | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 6 Mar 2017 - 18:58 | |
| | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 22:32 | |
| Et si tu essayes avec une dizaine de balles ? En tous cas BRAVO ! | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Lun 6 Mar 2017 - 23:46 | |
| Joli papydall !
mais... t'as pas sans balles ? | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 7 Mar 2017 - 0:30 | |
| J' ai réussi avec 5,10 mais à 20 j' ai abandonné... | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Mar 7 Mar 2017 - 0:37 | |
| @JL35 Tu me demandes cent balles et un Mars ? Ok ! Je te les envoie par colis postal dès que je reçois de toi 100 € pour frais d'envoi. | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Mar 7 Mar 2017 - 0:54 | |
| - 15 balles. Qui dit mieux ?:
| |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 7 Mar 2017 - 3:08 | |
| Tu pourrais peut-être ajouter un spin pour choisir le nombre de balles...non ?... | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Mar 7 Mar 2017 - 16:35 | |
| @Jicehel et ceux qui ont des dysfonctionnements avec SCANCODEUtiliser KEY_DOWN_CODE au lieu de SCANCODE en ligne 66. - Code:
-
select key_down_code
Ça devrait bien marcher ! | |
|
| |
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Mar 7 Mar 2017 - 20:22 | |
| @papydall Tu devrais synchroniser le temps d'éxécution de la boucle principale afin qu'elle s'éxécute à la même vitesse, quelque soit le pc, ce serait plus équitable. Une démo: - Code:
-
' initialise les variables de synchronisation SYNC_ON() :' <----- sub en action
' variables pour la démo dim debut_chrono,cpt_image,i,temps,somme_images '
print "5 tests:":print
temps=number_ticks for i=1 to 5 :' 5 tests cpt_image=0 : debut_chrono=number_ticks+1000 SYNC_START(50) :' <----- sub en action(50=nb d'image par seconde souhaité) repeat ' ' repeat :' on simule du code à synchroniser show 0 until 1=1 ' ' cpt_image=cpt_image+1 SYNC() :' <----- sub en action until number_ticks>=debut_chrono ' print "NUMBER_TICKS : ",cpt_image," images/seconde PERF_TIMER : ",perf_timer_fps%," images/seconde ",perf_timer_fps_moy," = nb moyen d'images/seconde" print cpt_image," images/seconde" somme_images=somme_images+cpt_image next i print : print "Statistique number_ticks:" print (number_ticks-temps)/1000," secondes écoulées" print (1000*somme_images)/(number_ticks-temps)," = nb moyen d'images/seconde"
END sub SYNC_START(fps) ' fps=nb d'image par seconde souhaité if perf_timer_start=0 and perf_timer_frequency>0 :' if fps>1000 then fps=1000 perf_timer adr(perf_timer_start) :' mesure le temps courant et inscrit le dans 'perf_timer_start' ' one_second=perf_timer_start+(perf_timer_frequency) :' initialise le compteur de seconde trame_duration=perf_timer_frequency/fps :' trame_duration = temps d'affichage d'1 trame end_if end_sub
sub SYNC() if perf_timer_frequency>0 perf_timer_start=perf_timer_start+trame_duration :' détermine la durée d'affichage pour 1 trame perf_timer adr(perf_timer_end) :' mesure le temps courant et inscrit le dans 'perf_timer_end'
if perf_timer_end<perf_timer_start :' si le temps écoulé est strictement inférieur à la durée d'1 trame(ordinateur véloce, boucle rapide,...) repeat :' on attend perf_timer adr(perf_timer_end) :' ... until perf_timer_end>=perf_timer_start :' jusqu'à ce que la durée de la trame soit écoulée else :' sinon repeat :' la trame en cours est affichée mais plusieurs autres ont été perdu(ordinateur lent, boucle lourde,...) perf_timer_start=perf_timer_start+trame_duration :' on compte le nb de tramde perdue until perf_timer_start>perf_timer_end :' jusqu'à atteindre le temps calculé, de la prochaine trame qui va s'afficher end_if
' tmp_perf_fps%=tmp_perf_fps%+1 :' incrémente le compteur temporaire de trame ' ' if perf_timer_end>one_second :' si 1 seconde s'est écoulé ' perf_timer_fps%=tmp_perf_fps% :' rempli le compteur de trame ' perf_timer_fps_moy=100*(tmp_perf_fps%/(1+((perf_timer_end-one_second)/perf_timer_frequency))) ' perf_timer_fps_moy=int(perf_timer_fps_moy)/100 :' rempli un autre compteur de trame, mais moyenné ' tmp_perf_fps%=0 :' raz le compteur temporaire de trame ' one_second=perf_timer_end+perf_timer_frequency :' incrémente le compteur de la prochaine seconde ' end_if ' end_if end_sub
sub SYNC_ON() ' https://msdn.microsoft.com/fr-fr/library/windows/desktop/dn553408%28v=vs.85%29.aspx
' fonctions/commandes de comptage haute résolution du kernel32 dim kernel32% kernel32%=3 LIBRARY kernel32%,"kernel32" ' function "perf_timer_exist","QueryPerformanceCounter",kernel32%,"I","stdcall" ' ex.: null%=perf_timer_exist(adr(float)) ' command "perf_timer","QueryPerformanceCounter",kernel32%,"I","stdcall" ' ex.: perf_timer adr(float) ' command "perf_frequency","QueryPerformanceFrequency",kernel32%,"I","stdcall" ' ex.: perf_frequency adr(float)
' le résultat du compteur et de la fréquence doivent être stocké dans une variable de type "float" dim perf_timer_frequency,perf_timer_start,perf_timer_end dim trame_duration ' dim one_second,perf_timer_fps_moy ' dim tmp_perf_fps%,perf_timer_fps%
' vérifie que le compteur haute résolution existe if perf_timer_exist(adr(perf_timer_start))<>0 perf_frequency adr(perf_timer_frequency) :' fréquence du compteur haute résolution else perf_timer_frequency=0 ' print "compteur haute résolution inexistant." end_if perf_timer_start=0 end_sub Pas facile ton petit jeu! | |
|
| |
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite Sam 11 Mar 2017 - 17:50 | |
| Complètement FOU ce jeu ! Et en plus avec seulement une centaine lignes. et une fluidité à faire pâlir les joueurs de WOW ! Chapeau bas Papydall ! J'y retourne, je crois que je deviens accro... | |
|
| |
Contenu sponsorisé
| Sujet: Re: Faire passer toutes les balles rouges dans la partie droite | |
| |
|
| |
| Faire passer toutes les balles rouges dans la partie droite | |
|