Créez un programme de peinture!

51

introduction

Un jour, vous montriez à votre enfant comment dessiner sur un ordinateur. Vous tapez mspaint.exedans la barre d'exécution. À votre horreur, il est écrit "Aucun élément ne correspond à votre recherche". Vous devez créer une version simple de peinture pour que votre enfant puisse dessiner!

Défi

Vous devez créer un programme de dessin simple. Pour ce faire, ouvrez une fenêtre d’affichage blanche (supérieure à 99 x 99 pixels). Chaque fois que la souris est enfoncée, changez le pixel sur lequel la souris est allumée.

C'est du , donc la réponse la plus courte en octets gagne!

pydude
la source
8
Faut-il que ce soit des pixels? ou peut-il s'agir de 99x99 carrés?
Fəˈnɛtɪk
2
Combien de temps faut-il courir?
Rɪᴋᴇʀ
2
Quand TI-Basic Penfait exactement cela: o
Timtech le
1
@Riker il devrait durer au moins 10 secondes, de préférence pour toujours
pydude le
1
Est-ce plus grand que 99 × 99 juste pour que nous devions utiliser trois chiffres en notation décimale pour chaque dimension? Est-ce que 99 × 100 ou 100 × 99 seraient valables?
Sebastian Simon

Réponses:

86

8086 code machine, 32 31 28 26 octets

00000000  b8 0f 00 cd 10 b8 02 10  ba 18 01 cd 10 b8 03 00  |................|
00000010  cd 33 4b b8 01 0c eb f3  3f 00                    |.3K.....?.|
0000001a

Suppose la présence d'une carte graphique VGA et de tout pilote de souris compatible avec Microsoft.

-2 octets grâce à @berendi!

capture d'écran

Comment ça fonctionne:

            |   org 0x100
            |   use16
b8 0f 00    |       mov ax, 0x000f      ; set screen mode: 640x350 monochrome
cd 10       |       int 0x10            ; call video bios
b8 02 10    |       mov ax, 0x1002      ; set palette
ba 18 01    |       mov dx, palette     ; pointer to palette data
cd 10       |   @@: int 0x10            ; call video bios
b8 03 00    |       mov ax, 0x0003      ; get mouse position in (CX, DX) and button status in BL
cd 33       |       int 0x33            ; call mouse driver
4b          |       dec bx              ; if no buttons pressed, --BX = 0xFFFF (invalid page)
b8 01 0c    |       mov ax, 0x0c01      ; plot pixel with color AL at (CX, DX) in page BH
eb f3       |       jmp @b              ; repeat
3f 00       |   palette db 0x3f, 0x00   ; palette in 2:2:2 rgb. color 0 = white, 1 = black.
            |                           ; this should be a 17-byte struct, but we only care about the first two colors here

C'est tout ce qu'on peut en dire. Aucune magie impliquée, juste quelques appels de fonction.

utilisateur5434231
la source
1
Code propre, clair et intelligent. Très bien fait! Je ne vois nulle part où cela peut être optimisé pour la taille. Pour une raison quelconque, lorsque j'ai essayé d'utiliser le pilote CuteMouse, cela dessine sans que le bouton de la souris soit enfoncé, mais il se peut que le problème ne soit pas que CuteMouse ne soit pas compatible à 100% avec Microsoft. Quel pilote avez-vous utilisé pour les tests?
Cody Grey
2
Hmm. Après avoir exécuté le code avec un débogueur (bon vieux DEBUG.COM, bien sûr!), Il apparaît que ce n'est pas un problème avec le pilote CuteMouse. Sans un bouton enfoncé, INT 33hretourne 0 à BX, et ceci est décrémenté en FFFFh comme prévu, mais une ligne est toujours en cours de tracé. C'est peut-être parce que le mode 11h n'a qu'une seule page vidéo et que le numéro de page non valide est automatiquement corrigé? Je teste sur VM VirtualBox, alors peut-être que son implémentation du BIOS est en train de le faire.
Cody Grey
2
On dirait que VirtualBox est à blâmer ici, il ignore simplement le numéro de page: virtualbox.org/browser/vbox/trunk/src/VBox/Devices/Graphics/…
user5434231
2
Bill Atkinson lui-même serait fier de cela. Splendide travail.
Wossname
4
-2 octets suppriment le dernier int 0x10et jmpreviennent à la seconde int 0x10. Le décalage jmpreste inchangé, ajustez l'adresse inmov dx
berendi - en signe de protestation le
25

Scratch, 10 Scratch Octets

Scratch a été pratiquement conçu pour des choses comme celle-ci.

Essayez-le en ligne!

dkudriavtsev
la source
Est-ce que cela fait réellement des pixels? De plus, si vous cliquez rapidement avec la souris, vous obtenez des résultats différents (sans le déplacer, bien sûr). Je pense que cela invalide cela.
Rɪᴋᴇʀ
19
Ce ne sont pas 10 octets à gratter, selon l'évaluation que nous utilisons actuellement.
Okx le
2
Vous devriez probablement utiliser l'application scratchblocks pour convertir en texte ou la taille du fichier SB2.
Matthew Roh le
2
J'utilise la notation que j'ai utilisée avec les réponses Scratch précédentes. Quelqu'un peut-il me relier à la notation actuelle? @Okx
dkudriavtsev le
8
@Mendeleev, je n'en suis pas certain, mais il fait probablement référence à ce système de notation Scratch .
FreeAsInBeer
20

HTML + JavaScript (ES6), 66 64 62 octets

HTML

<canvas id=c>

JavaScript

onclick=e=>c.getContext`2d`.fillRect(e.x,e.y,1,1)

Sauvegardé 2 octets grâce à Gustavo Rodrigues et 2 octets de Shaggy.

onclick=e=>c.getContext`2d`.fillRect(e.x,e.y,1,1)
/* This css isn't needed for the program to work. */
*{margin: 0}
#c{border:1px solid black}
<canvas id=c>

À M
la source
Que diriez- <canvas id=c>vous
Gustavo Rodrigues
2
Cela met effectivement le point non pas là où va mon curseur, mais en bas à droite de la flèche. Est-ce intentionnel?
Anoplexian
Économisez 2 octets en supprimant le c.depuis le début de votre JS. @Anoplexian, c'est le corps par défaut qui marginjette des choses de quelques pixels.
Shaggy
4
Comment puis-je faire ce travail? Je clique dans la zone de résultat et cela ne fait rien.
numbermaniac
1
@Anoplexian C'est un problème connu. il n’existe aucun moyen fiable d’obtenir la position relative du curseur de la souris sur un élément (à l’exception de fonctions volumineuses spécifiques au navigateur qui échouent lorsqu’un nouveau type de remplissage CSS est introduit).
wizzwizz4
17

C + Win32, 209 200 195 octets

Merci, Cody et Quentin! J'espérais me débarrasser de la #include <windows.h>mais cela conduit à toutes sortes d'erreurs. Au moins, cela fonctionne correctement avec plusieurs moniteurs ...

#include<windows.h> 
struct{int h,m,w,x:16,y:16;}m;h;main(){for(h=CreateWindow("EDIT","",1<<28,0,0,199,199,0,0,0,0);GetMessage(&m,h,0,0);m.m^513?DispatchMessage(&m):SetPixel(GetDC(h),m.x,m.y,0));}

Code précédent:

#include<windows.h> 
main(){MSG m;HWND h;for(h=CreateWindow("EDIT","",1<<28,0,0,199,199,0,0,0,0);GetMessage(&m,h,0,0);m.message^513?DispatchMessage(&m):SetPixel(GetDC(h),LOWORD(m.lParam),HIWORD(m.lParam),0));}

entrez la description de l'image ici

Johan du Toit
la source
2
Je ne peux pas tester pour le moment, mais je pense que vous pouvez fusionner la déclaration de hdans l' forinitialiseur pour économiser deux octets :)
Quentin
Je sais que c'est le golf de code et il peut être souhaitable, mais LOWORDet HIWORDsont pas la bonne façon d'extraire les coordonnées du curseur d'une salle comble LPARAM. Vous devriez utiliser GET_X_LPARAMet GET_Y_LPARAM, sinon, vous obtiendrez des résultats erronés avec plusieurs moniteurs.
Cody Grey
@Quentin, cela fonctionnera en c ++ mais pas en c. J'aurais pu utiliser c ++ mais j'aurais alors écrit int maince qui aurait ajouté 4 octets supplémentaires.
Johan du Toit
@Cody, commentaire juste. Je n'ai pas de système multi-moniteur à tester, mais pensez-vous utiliser (short)LOWORD()et (short)HIWORD()résoudre le problème?
Johan du Toit
Ce que Quentin a suggéré fonctionne très bien dans n’importe quelle version moderne de C, y compris C99. Bien entendu, vous utilisez le compilateur C de Microsoft, qui est bloqué dans C89 / 90, avec ses règles de portée de variable démente. C89 est également la raison pour laquelle vous êtes autorisé à omettre le maintype de retour de la fonction (à cause de la intrègle implicite ). Le seul problème est d’omettre le return 0;comportement indéfini des causes dans C89 et MSVC. En C99 et C ++, vous avez besoin d'un type de retour pour main, mais le return 0;est implicite et donc inutile. Eh bien, la langue n’était pas faite pour le code golf. :-)
Cody Gray
10

Traitement en cours, 98 à 79 octets

19 octets sauvegardés grâce à @dzaima

void setup(){background(-1);}void draw(){if(mousePressed)point(mouseX,mouseY);}

Explication (obsolète)

void setup() {
  size(100,100);            // size of the sketch
  background(-1);           // set the background to white
                            // 1 byte shorter than background(255);
}

void draw(){}               // required for mousePressed to work

void mousePressed() {       // function that is called whenever the mouse is pressed
  point(mouseX, mouseY);    // draw a point at the mouse's coordinates
                            // the colour is set to black as default
}

clicketty click

Kritixi Lithos
la source
@ Dzaima Je ne savais pas size(100,100);qu'il n'était pas nécessaire de le mentionner, merci! (aussi je ne sais pas pourquoi je n'ai pas vu le if(mousePressed)bit)
Kritixi Lithos
7

JavaScript ES6, 126 octets

Testé en chrome.

onclick=e=>document.body.outerHTML+=`<a style=position:fixed;top:${e.y}px;left:${e.x}px;width:1px;height:1px;background:#000>`

Essayez-le en ligne!

onclick=e=>document.body.outerHTML+=`<a style=position:fixed;top:${e.y}px;left:${e.x}px;width:1px;height:1px;background:#000>`

Powelles
la source
7

Haskell, 189 184 170 169 octets

import Graphics.Gloss.Interface.Pure.Game
main=play FullScreen white 9[]Pictures(#)(\_->id)
EventKey(MouseButton LeftButton)Down _(x,y)#l=Translate x y(Circle 1):l
_#l=l

Ceci utilise la Glossbibliothèque (v1.11). Il ouvre une fenêtre plein écran et peint les pixels noirs (en fait, les cercles de rayon 1) en appuyant sur le bouton gauche de la souris. Appuyez sur ESCpour quitter.

Comment ça fonctionne:

play                 -- handles the whole event handling, screen update, etc. process
    FullScreen       -- use a full screen window
    white            -- use a white background
    9                -- 9 simulation steps per second (see simulation handler below)
    []               -- the initial world state, an emtpy list of circles
    Pictures         -- a function to turn the world state into a picture.
                     -- The world state is a list of translated circles and
                     -- "Pictures" turns this list into a single picture
    (#)              -- event handler, see below
    (\_->id)         -- simulation step handler. Ignore time tick and return the
                     -- world state unchanged. More readable: "\tick world -> world"

EventKey ... # l=... -- if the left mouse button is pressed, add a circle with
                     -- radius 1 translated to the current position of the mouse
                     -- to the world state
_#l=l                -- on all other events do nothing

Edit: @ cessé de tourner à l’horloge, m’a parlé de la nouvelle version de gloss qui économise 5 octets lors de l’utilisation de fenêtres en plein écran. Merci!

nimi
la source
FullScreenest nullary in gloss> = 1.11, ce qui réduit le score de 5. (Je reçois une erreur unknown GLUT entry glutInit, mais mon système de saturation ne fonctionne probablement pas; je ne l'ai jamais utilisé sur cette machine.)
cessé de tourner en sens inverse
@ceasedtoturncounterclockwis: ah, merci pour l'allusion. J'avais 1.10.2.3 sur mon système et maintenant mis à jour à la dernière version.
nimi
5

SmileBASIC 2, 52 51 octets

Celui - ci fonctionne dans le papa de SmileBASIC, Petit ordinateur (et est l' un de deux octets plus court.)

PNLTYPE"OFF
GPAGE 1GCLS 15@A
GPSET TCHX,TCHY
GOTO@A

Explication:

PNLTYPE"OFF       'turn off keyboard
GPAGE 1           'set graphics to lower screen
GCLS 15           'clear with color 15 (white)
@A                'loop begin
GPSET TCHX,TCHY   'set black pixel at draw location
GOTO@A            'loop
escargot_
la source
Vous pouvez enregistrer 1 octet en faisant GPSET TCHX,TCHY:GOTO@Apuisque la couleur par défaut est 0 (transparent).
12
4

Javascript + jQuery 138 octets

d=$(document.body).click((e)=>d.append("<div style='background:black;width:5;height:5;position:fixed;top:"+e.pageY+";left:"+e.pageX+"'>"))

Découvrez-le en ligne!

Ajouter un support clic et glisser serait simple, vous définiriez une variable, cependant, conformément aux instructions et pour raccourcir le code, celle-ci ne serait pas prise en charge. . J'ai interprété l'instruction comme un clickévénement.

Neil
la source
3
Salut! La prochaine fois, vous devrez annuler la suppression de votre ancienne réponse au lieu de créer une nouvelle réponse. De plus, je crains que cela ne fonctionne dans un environnement spécifié. S'il s'agit de JavaScript javascript, vous devrez inclure le nombre d'octets de jQuery dans votre soumission. Vous pouvez appeler cette soumission "JavaScript + jQuery", et ce serait très bien: vous pouvez donc supposer que jQuery est installé. Dans l’état actuel de cette réponse, c’est plutôt une réponse "HTML", pas une réponse javascript.
Conor O'Brien
1
@ ConorO'Brien Je m'assurerai de le faire la prochaine fois. J'ai mis à jour la réponse en utilisant vos suggestions.
Neil
4

SpecBAS - 61 59 octets

1 CLS 15 
2 IF MOUSEBTN=1 THEN PLOT MOUSEx,MOUSEy
3 GO TO 2

Le noir est déjà la couleur par défaut du stylo, mais l'arrière-plan est généralement une nuance de gris désagréable. Réglez-le donc CLS 15sur blanc éclatant.

entrez la description de l'image ici

Brian
la source
La plupart des variantes de base ne nécessitent pas d'espace entre le numéro de commande et le code sur cette ligne.
Pavel
SpecBAS ajoute tous les espaces après avoir atteint le retour (y compris le fait de GOTOdevenir GO TO)
Brian
1
Mais pouvez-vous supprimer les espaces et le faire fonctionner correctement? Si oui, vous ne les comptez pas.
Pavel
Si l'utilisateur ne craint pas que de peindre en noir, pourquoi s'inquiéterait-il d'un fond gris?
Cees Timmerman
3

SmileBASIC, 70 58 53 octets

XSCREEN 4GCLS-1@L
TOUCH OUT,X,Y
GPSET X,Y+240,0GOTO@L

A expliqué:

XSCREEN 4 'display one graphics page on both screens
GCLS -1 'fill screen with white
@L 'loop
TOUCH OUT,X,Y 'get touch location
GPSET X,Y+240,0 'draw black pixel at touch position, offset by the height of the top screen.
GOTO @L 'loop
12Me21
la source
3

Clojure, 91 71 octets

-20 octets grâce à @cfrick pour avoir signalé que je peux utiliser usepour réduire mon importation.

(use 'quil.core)(defsketch P :mouse-dragged #(point(mouse-x)(mouse-y)))

Utilise la bibliothèque Quil . Dessine un point chaque fois que la souris est déplacée.

Fondamentalement, la réponse Processing, puisque Quil est un wrapper Processing pour Clojure.

(q/defsketch P ; Start a new drawing

             :mouse-dragged ; Attach a mouse drag listener
             ; that draws a point at the current mouse location
             #(q/point (q/mouse-x) (q/mouse-y))) 

entrez la description de l'image ici

Carcigenicate
la source
71:(use 'quil.core)(defsketch P :mouse-dragged #(point(mouse-x)(mouse-y)))
cfrick
@frick LOL, j'oublie toujours useparce que c'est "pas approprié". Je vous remercie.
Carcigenicate
3

Tcl / Tk, 45 46 51 57

gri [can .c]
bind . <1> {.c cr o %x %y %x %y}

pentacle

sergiol
la source
C'est un pentogramme ogram
Johan du Toit
1
@ JohanduToit: Tu n'aimes pas les étoiles?
sergiol
2

Java 7, 353 octets

import java.awt.*;import java.awt.event.*;class M{static int x,y;public static void main(String[]a){Frame f=new Frame(){public void paint(Graphics g){g.drawLine(x,y,x,y);}};f.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e){x=e.getX();y=e.getY();f.repaint(x,y,1,1);}});f.setBackground(Color.WHITE);f.resize(500,500);f.show();}}

Ungolfed:

import java.awt.*;
import java.awt.event.*;

class M {
    //store the last point
    static int x, y;
    public static void main(String[] a) {
        Frame f = new Frame() {
            @Override
            public void paint(Graphics g) {
                g.drawLine(x, y, x, y);
            }
        }
        f.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                //repaint only the "new pixel"
                f.repaint(x, y, 1, 1);
            }
        });
        //default background is grey
        f.setBackground(Color.WHITE);
        f.resize(500, 500);
        f.show();
    }
}
tonychow0929
la source
2

Python2 et Python3, 82 octets (ou 77?)

from turtle import *;up();onscreenclick(lambda x,y: goto(x,y)or dot(1));mainloop()

En utilisant le module Tortue, ce n'est pas si mal :)

Ungolfed:

import turtle
turtle.up()

def fun(x, y):
    turtle.goto(x,y)
    turtle.dot(1)

turtle.onscreenclick(fun)
turtle.mainloop()

Si vous pouvez insérer des lignes entre les points, vous pouvez réellement économiser 5 octets:

from turtle import *;onscreenclick(lambda x,y: goto(x,y)or dot(1));mainloop()
Wayne Werner
la source
de tortue import *; up (); onclick (lambda * x: goto (* x) ou point (1)); done ()
innisfree
C'est 70 octets
innisfree le
2

Excel VBA, 62 octets

Fonction de fenêtre immédiate VBE anonyme permettant à l’utilisateur de dessiner sur n’importe quelle feuille en la sélectionnant simplement

Cells.RowHeight=48:Do:DoEvents:Selection.Interior.Color=0:Loop

Exemple de sortie

entrez la description de l'image ici

Taylor Scott
la source
1

HTML + Javascript, 152 148 octets

<body onclick="document.body.innerHTML+='<x style=position:fixed;width:1;height:1;left:'+event.clientX+';top:'+event.clientY+';background:#000;>'"/>
Johan du Toit
la source
1

Turing , 77 octets

var x,y,b:int loop mousewhere(x,y,b)if b=1then drawdot(x,y,1)end if end loop

Ungolfed:

var x,y,b : int      
loop
  mousewhere(x,y,b)  % Set (x,y) to mouse co-ords, and b to 1 or 0 indicating if the button is pressed
  if b=1 then
    drawdot(x,y,1)  % Draw a black pixel at (x,y)
  end if
end loop
Chat d'affaires
la source
1

HTML + CSS + JavaScript (ES6), 8 + 31 + 64 = 103 octets

Amusez-vous avec CSS box-shadow!

s='0 0 0',onclick=e=>p.style.boxShadow=s+=`,${e.x}px ${e.y}px 0`
*{margin:0;width:1px;height:1px
<p id=p>

HTML + CSS + JavaScript (ES6), 8 + 22 + 69 = 99 octets

Celui-ci tente de compenser la valeur par défaut marginde l' <body>élément, mais cela peut être différent selon les navigateurs et les feuilles de style de l'agent utilisateur. Testé avec succès dans Chrome.

s='0 0 0',onclick=e=>p.style.boxShadow=s+=`,${e.x-8}px ${e.y-16}px 0`
*{width:1px;height:1px
<p id=p>

HTML + CSS + JavaScript (ES6), 8 + 18 + 69 = 95 octets

Les pixels de celui-ci peuvent paraître plus gros car ils sont dessinés à des coordonnées d'un demi-pixel.

s='0 0 0',onclick=e=>p.style.boxShadow=s+=`,${e.x}px ${e.y}px 0 .5px`
*{margin:0;width:0
<p id=p>

Darrylyeo
la source
1

TI-Basic, 1 octet

Pt-Change(

Je suis sûr que la plupart d’entre vous avec les calculateurs TI ont pensé à la Pencommande, mais il s’avère que ce n’est pas un jeton, il serait donc logique de compter cela comme 3 octets. Vous pouvez lire la version interactive Pt-Change(à http://tibasicdev.wikidot.com/pt-change

Timtech
la source
Cela ne répond pas au défi: les calculateurs TI ne peuvent pas gérer les entrées de souris, à ma connaissance.
Grimmy
2
@ Grimy Si vous insistez, vous pouvez toujours utiliser la bibliothèque usb8x pour obtenir une entrée de souris USB. Mais je suis sûr que la navigation par défaut du curseur suffira.
Timtech le
1

Lua (love2d Framework), 180 octets

version golfée

l=love v,g,m,p=255,l.graphics,l.mouse,{}d=m.isDown function l.draw()g.setBackgroundColor(v,v,v)if d(1)or d(2)then p[#p+1],p[#p+2]=m.getPosition()end g.setColor(0,0,0)g.points(p)end

non-golfé

l=love 
v,g,m,p=255,l.graphics,l.mouse,{}
d=m.isDown 
function l.draw()
  g.setBackgroundColor(v,v,v)
  if d(1)or d(2)then 
    p[#p+1],p[#p+2]=m.getPosition()
  end 
  g.setColor(0,0,0)
  g.points(p)
end

assez facile comment ça marche. Tout d’abord quelques initialisations pour raccourcir les choses. Après cela, il vérifiera que la souris est cliquée et enregistre les points dans le tableau. Après cela, il dessine les points. De plus, il définit la couleur en blanc et noir car le défaut est l’inverse :)
Et voici l’image:

entrez la description de l'image ici

Lycea
la source
1
Croyez-le ou non, je suis venu ici pour répondre à l'aide de Love2d, ce que je viens de découvrir et que j'adore, alors +1 pour le bel effort! Quoi qu'il en soit, je pense que vous pouvez le raccourcir un peu plus comme ceci: il en l=love v,g,m,p=255,l.graphics,l.mouse,{}function l.draw()g.setBackgroundColor(v,v,v)if m.isDown(1)then p[#p+1],p[#p+2]=m.getPosition()end g.setColor(0,0,0)g.points(p)endrésulte 169 octets!
DimP
1
Je suis venu ici pour la même raison, c'est bien de voir qu'il y a d'autres personnes ici qui le savent: D Merci :)
Lycea
1

Traitement, 65 octets

void draw(){if(mousePressed)line(mouseX,mouseY,pmouseX,pmouseY);}

tirage minimal

George Profenza
la source
1

glslsandbox 232 octets

Ancien post, mais j'ai trouvé cela intéressant.
Comme le traitement a déjà été effectué, j'ai décidé de faire quelque chose de différent.

Ceci dessine si la souris est pressée ou non, donc pas ce que pydude a demandé mais presque.

#ifdef GL_ES
precision lowp float;
#endif
uniform float time;uniform vec2 mouse,resolution;uniform sampler2D t;void main(){vec2 f=gl_FragCoord.xy,r=resolution;gl_FragColor=vec4(time<2.||length(f-mouse*r)>2.&&texture2D(t,f/r).x>.1);}

Essayez-le sur glslsandbox

PrincePolka
la source
0

Traitement, 93 octets, 91 octets si les espaces ne comptent pas

void setup(){size(100,100);background(-1);}void draw(){if(mousePressed) point(mouseX,mouseY);}
Dat
la source
1
Dans PPCG, s’ils ne sont pas mentionnés dans le challenge, les espaces et tous les éléments sont considérés comme normaux (en octets dans le codage de choix, par défaut, UTF-8). Votre score serait donc de 92 octets, car le premier espace ne peut pas être supprimé sans interrompre le programme, mais le deuxième espace peut être supprimé en toute sécurité.
dzaima
0

UCBlogo avec wxWidgets, 65 octets

setbg 7
setpc 0
ht
pu
make "buttonact[setpos clickpos pd fd 1 pu]

Explication (le code attribué à la variable buttonactest exécuté à chaque clic de bouton):

SetBackground 7 ; white
SetPenColor 0 ; black
HideTurtle
PenUp
make "buttonact [
  SetPos ClickPos
  PenDown
  Forward 1
  PenUp
]

Au moins, je pense que cela fonctionne. Cela devrait être conforme à la documentation , mais apparemment, la buttonactvariable ne fonctionne que dans une construction wxWidgets et je peine à créer UCBLogo avec wxWidgets sur un Linux moderne (waddyamean vous ne pouvez pas utiliser un pointeur vers intet en arrière?).

UCBlogo sans wxWidgets, 73 octets

Pour voir l'effet recherché, vous pouvez exécuter cette version plus longue avec une boucle infinie.

setbg 7 setpc 0 ht pu
while[1=1][setpos mousepos if[button?][pd] fd 1 pu]

Mais cela se bloque ucblogosur ma machine ... On dirait une condition de concurrence.

UCBlogo, travaillant actuellement sur ma machine, 80 octets

setbg 7 setpc 0 ht pu
while[1=1][setpos mousepos if[button?][pd] fd 1 pu wait 1]
Gilles, arrête de faire le mal
la source