Ściana wstydu

18

Wiem, tutaj na forum wszyscy pasjonowaliśmy się programowaniem zanim zaczęliśmy raczkować, a nasz kod od początku był idealny (i nadal jest oczywiście!) :)

Tak na poważnie- ostatnio przeglądałem swoje stare szkolne prace, i moją uwagę zwrócił program na zaliczenie przedmiotu OOP. Przeglądając kod trochę się uśmiałem, a trochę najadłem wstydu sam przed sobą. Pomyślałem że warto się "obnażyć" i podzielić. Może ktoś też będzie chętny pokazać kwiatka jakiego udało mu się popełnić na początku swojej kariery?

Link

Uwaga, oczy mogą Wam krwawić!

Ps: Nie wiedziałem czy wstawić to jako kod w treść posta. Jeśli uważacie że tak byłoby lepiej to dajcie znać- jest w ogóle możliwość zawijania dłuższego tekstu?

5

Gamemode do gry GTA San Andreas Multiplayer, rok 2010.
Skrypt gry do serwera napisany w języku PAWN (coś podobnego do C). Wszystko w jednym pliku, ponad 18 tysięcy linijek. Nie miałem wtedy pojęcia, że w programowaniu istnieją klasy (choć broni mnie to, że PAWN nie było obiektowe).

5

Mój pierwszy babol, jakiego zrobiłam w podstawówce w LOGO, wymyślając sposób narysowania okręgu:

4
Aventus napisał(a):

Link

Uwaga, oczy mogą Wam krwawić!

import.java już w drugiej linijce, faktycznie obciach, nie ma co czytać dalej.

1

Te wycinki kodu potwierdzają tylko regułę, że nawet początkowy programista napisze mniej gówniany kod od stada programistów w monolicie, gdzie nie ma wykonanej analizy przed wysłaniem ticketa do programisty :D

12

Znalazłam coś pisanego w Amiga Basicu (bez kolorowania składni). Całość ma prawie 1000 linii, ale wrzucam tylko jeden podprogram dla zobrazowania:

mysz4:
GOSUB mysz0
IF y=22 AND x>53 THEN siup=1
IF y=22 AND x>31 AND x<50 THEN usun=1
IF y=22 AND x<28 THEN Tekst=1
IF y=19 AND x>53 THEN katalog=1
IF y=19 AND x<28 THEN przeglad=1
IF y=7  AND x<40 THEN WINDOW 3,,(36,46)-(299,46),0:INPUT cosik$:WINDOW CLOSE 3
IF cosik$<>"" THEN nazwa$=LEFT$(cosik$,32):nrpl=0: LOCATE 7,6:Otwarcie=1:PRINT "                                "
cosik$=""
IF y=7  AND x>40 THEN  IF strt$="   " THEN strt$="Tak" ELSE strt$="   "
cosik$="-1"
IF y=11  AND x>40 THEN WINDOW 3,,(563,78)-(596,78),0:INPUT cosik$:WINDOW CLOSE 3
cosik=VAL(cosik$):IF cosik>0 AND cosik<100 THEN lk=cosik
cosik$="-1"
IF y=13  AND x>40 THEN WINDOW 3,,(563,94)-(596,94),0:INPUT cosik$:WINDOW CLOSE 3
cosik=VAL(cosik$):IF cosik>0 AND cosik<100 THEN op=cosik
cosik$="-1"
IF y=15  AND x<70 AND x>64 THEN WINDOW 3,,(507,110)-(539,110),0:INPUT cosik$:WINDOW CLOSE 3
cosik=VAL(cosik$):IF cosik>0 AND cosik<1000 THEN odst=cosik
cosik$="-1"
IF y=15 AND x<76 AND x>70 THEN WINDOW 3,,(563,110)-(596,110),0:INPUT cosik$:WINDOW CLOSE 3
cosik=VAL(cosik$):IF cosik>0 AND cosik<1000 THEN dost=cosik
cosik$=""
IF odst>dost THEN dost=odst
czyklik=2
RETURN:

Jakże ja swego czasu byłam dumna z tego programu i jego pięciu poziomów zagnieżdżeń.

W całym kodzie nie ma ani jednego komentarza, bo komentarze są dla cieniasów, ich pisanie zajmuje czas, a przecież i tak widać, co pogram robi.
W kodzie jest już trochę wcięć, ale traktuję je tu ciągle jako nowinkę i i nie wszędzie umieszczam.

Polecam opisowe nazwy zmiennych, typu:

siup, lk, cosik, dost

Program zawiera 29 skoków GOTO, niemniej jest też po części strukturalny, zawierając skoki do kilkudziesięciu podprogramów. Wysoce opisowe etykiety tych podprogramów również polecam łaskawej uwadze szacownego gremium:

blad: destrukcja: dnazwa: enddnazwa: glowka: katalog: koniec: korekta: licznik: mozna: mysz: mysz0: mysz2: mysz4: mysz6: mysz8: mysz10: mysz12: naglowek: najpierw: nast: numer: odstep: Otwarcie: pa: petla: ponico: prockont: przeglad: stopka: strona: Tekst: tu: UsunPlik: wis: wydruk: wyk: wywolanie: zawieszenie:

Boże, jaka ja byłam kiedyś dumna z tego programu :) W życiu nie przypuszczałabym wtedy, że kiedykolwiek pokażę go komuś jako coś innego niż powód do dumy :)

8

Niestety, z C64 Basic nic się mojego nie uchowało, więc pozostaje mi pochwalić się licealnym projektem, pisanym w Turbo Pascal, z podręcznikiem na kolanach. Około 3 miesięcy no-lajfizmu mnie kosztował w czasie wolnym po szkole. Na projekt składa się 17 plików .PAS, nie licząc konfiguracji hardware. Była to strategiczna turówka, z animacjami nawet, melodiami, obrazkami i innymi bajerami z których byłem wtedy dumny :)

Tutaj jest cały kod, rok 2003. Może komuś uda się to skompilować jakimś cudem ;p

Poniżej deklaracja zmiennych w pliku startowym. Całości tu nie wkleję, z oczywistych powodów, ale na szczególną uwagę zasługuje przemyślane nazewnictwo zmiennych i format kodu ;p

program MiK;
uses crt;

var ys:integer;
    nazwisko1:array [0..11] of char;     {nazwisko 1 gacza}
    nazwisko2:array [0..11] of char;     {nazwisko 2 gracza}
    na:word;
    xnazw: word;
    znazw,znazwf,wro: longint;
    amenug:char;                  {zm menu glownego}
    zmmg:char;
    nazwy:word;
    nazwyy:word;
    ym,xm:integer;                {zm punktow art}
    x,y,przyciski:word;           {zm.myszy}
    gracz:word;                   {nr gracza}
    kolor1,kolor2,kolor3,kolora,kolorb:word;         {kolor graczy}
    kolory:array [1..18] of word;
    zmiana:byte;                  {nowa tura?}
    xxx,yyy:integer;               {+wsp.miast}
    naleznosc:array [1..18] of word;     { naleznosc pol}
    miesiac:longint;               {miesiac}
    miesia:string;
    warunki,przyrost:byte;                  {warunki,przyrost}
    zlm:array[1..18] of longint;            {zloto miasta}
    zym:array[1..18] of longint;            {zywnosc miasta}
    drm:array[1..18] of longint;            {drewno miasta}
    pom:array[1..18] of longint;            {populacja miasta}
    zld:array[1..18] of longint;            {zloto miasta}
    zyd:array[1..18] of longint;            {zywnosc miasta}
    drd:array[1..18] of longint;            {drewno miasta}
    pod:array[1..18] of longint;
    ludzie1,ludzie2:longint;                    {populacja graczy}
    zloto1,zloto2:longint;                      {zloto gr.}
    drewno1,drewno2:longint;                    {drewno gr.}
    zywnosc1,zywnosc2:longint;                  {zywnosc gr.}
    podatek,rozpoczeta,powrot:word;         {petle,wmiasto}
    zywn1,zywn2,zlot1,zlot2,ludz1,ludz2,drewn1,drewn2:string;  {z,d,z,l-ogolnie}
    zl,zy,dr,po:array [1..18] of string;           {z,d,z,l-string}
    fort,targ,mlyn,tartak,ratusz:array[1..18] of word;        {budynki+-}
    armiam:array[1..18] of longint;                             {armie}
    wojaa1,wojab1,wojaa2,wojab2:longint;        {licz.armii mob.}
    woaa1,woab1,woaa2,woab2:string;             {licz.armii mob.string}
    armiams:array[1..18] of string;
    nowaa:longint;
    nowaab:string;
    wmiasto:longint;                                          {armie}
    a1,b1,a2,b2:word;
    xa1,ya1,xb1,yb1:integer;                         {xy arm}
    xa2,ya2,xb2,yb2:integer;
    armieeee,arm,zmienna:word;
    armiasta:longint;
    armiastas:string;
    rucha1,ruchb1,rucha2,ruchb2:word;
    miasto:word;
    arm1,arm2,arm3,arm4:string;
    zwyciestwo:word;
    w1,w2,odwrot,n1,n2:word;
    xx,yy:integer;
(...)
3
maszrum napisał(a):

Nie miałem wtedy pojęcia, że w programowaniu istnieją klasy (choć broni mnie to, że PAWN nie było obiektowe).

Hold my beer. Ja nie miałem pojęcia, że istnieją funkcje! Tak, na początku myślałem, że kod trzeba wykonuje się "od góry do dołu". I było to C++. Myślałem, że trudność w programowaniu polega na umiejętnym doborze list zmiennych podstawowych typów oraz żonglowaniu forem i while-m
Funkcje weszły w wersji 2. Klasy w wersji 3.

Poniżej filmik przedstawiający rezultat. Uwaga: gra 18+.
https://streamable.com/0t6v44

4

Kiedyś w czasach Atari miałem grę na cartridgu i przebłysk geniuszu. Przegram grę z cartridga na kasetę!

Idea była prosta:

  1. Odczytać zwartość segmentu pamięci, na który zamapowany był cartridge (PEEK)
  2. Przerobić na KOD w BASICU
  3. Nagrać kod na kasetę
  4. Odpiąć cartridge, załadować z kasety i viola!

Kod wyglądał mniej więcej tak:

1 POKE adres, wartosc
2 POKE adres+1, wartosc
...

A metodyka pracy tak:

PEEK(adres)

Następnie dopisanie kolejnej linii kodu. Przejście do adres+1.

Prace szły powoli (instrukcja FOR nie wydawała mi się wówczas interesująca)... i do momentu, w którym program w BASICu zrobił się większy niż dostępna pamięć ;)

Żeby było bardziej niezręcznie, to taki cartridge wkładałem po zbootwaniu Atari (co wiązało się z naruszeniem typowej sekwencji: wyłączyć sprzęt, włożyć cartridge, włączyć).
Prawdopodobnie odczytywałem jakieś śmieci i nie miało to prawa działać ;)

4

Gra, "symulator" giełdy, którą napisałem ~20 lat temu w QBASIC-u:

menu12:
LINE (20, 70)-(450, 400), 10, BF
COLOR 15
LOCATE 7, 5: PRINT "AGORA S.A", kurs1%; "zˆ Ilo˜†:"; ilosc1&
LOCATE 8, 5: PRINT "D¨BICA", kurs2%; "zˆ Ilo˜†:"; ilosc2&
LOCATE 9, 5: PRINT "ELEKTRIM", kurs3%; "zˆ Ilo˜†:"; ilosc3&
LOCATE 10, 5: PRINT "NETIA", kurs4%; "zˆ Ilo˜†:"; ilosc4&
LOCATE 11, 5: PRINT "OPTIMUS", kurs5%; "zˆ Ilo˜†:"; ilosc5&
LOCATE 12, 5: PRINT "PKN ORLEN", kurs6%; "zˆ Ilo˜†:"; ilosc6&
LOCATE 13, 5: PRINT "STOMIL", kurs7%; "zˆ Ilo˜†:"; ilosc7&
LOCATE 14, 5: PRINT "TPSA", kurs8%; "zˆ Ilo˜†:"; ilosc8&
LOCATE 15, 5: PRINT "WARTA", kurs9%; "zˆ Ilo˜†:"; ilosc9&
LOCATE 16, 5: PRINT "½YWIEC", kurs10%; "zˆ Ilo˜†:"; ilosc10&
LOCATE 18, 5: PRINT "DOLAR US", kurs11; "zˆ Ilo˜†"; ilosc11&
COLOR 4
LOCATE 19, 5: PRINT "EURO", kurs12; "zˆ Ilo˜†"; ilosc12&
COLOR 15
LOCATE 20, 5: PRINT "MARKA NM", kurs13; "zˆ Ilo˜†"; ilosc13&
LOCATE 21, 5: PRINT "FUNT  AN", kurs14; "zˆ ilo˜†"; ilosc14&
'atu printy do walut

DO
a$ = INKEY$
IF a$ = CHR$(0) + CHR$(80) THEN GOTO menu13
IF a$ = CHR$(0) + CHR$(72) THEN GOTO menu11
IF a$ = "+" AND kasa > 0 + (kurs12 * ilosctrans) THEN ilosc12& = ilosc12& + ilosctrans: kasa = kasa - (kurs12 * ilosctrans): LOCATE 3, 50: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu12
IF a$ = "-" AND ilosc12& >= 0 + ilosctrans AND ilosc12& <> 0 THEN ilosc12& = ilosc12& - ilosctrans: kasa = kasa + (kurs12 * ilosctrans): LOCATE 3, 50: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu12
IF a$ = CHR$(13) THEN GOTO zapistra:
LOOP

I teraz te menu13, menu11 i pozostałe to oczywiście dokładnie to samo, ale w linijce 26 jest ilosc11, kurs11, albo ilosc13, kurs13 i tak dalej. Takich etykiet było bodaj 14. Ale przecież gra miała się rozwijać, prawda? Będzie więcej rzeczy do kupienia!

Wersja parę miesięcy później (komentarze poza "i tak dalej" oryginalne):

IF a$ = CHR$(0) + CHR$(80) THEN menu = menu + 1: GOTO menu2
IF menu > 47 THEN menu = 1: GOTO menu2
IF a$ = CHR$(0) + CHR$(72) THEN menu = menu - 1: GOTO menu2
IF menu < 1 THEN menu = 47: GOTO menu2
IF a$ = "+" AND menu = 1 AND kasa > 0 + (kurs1% * ilosctrans) THEN ilosc1 = ilosc1 + ilosctrans: kasa = kasa - (kurs1% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
IF a$ = "+" AND menu = 2 AND kasa > 0 + (kurs2% * ilosctrans) THEN ilosc2 = ilosc2 + ilosctrans: kasa = kasa - (kurs2% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
IF a$ = "+" AND menu = 3 AND kasa > 0 + (kurs3% * ilosctrans) THEN ilosc3 = ilosc3 + ilosctrans: kasa = kasa - (kurs3% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
IF a$ = "+" AND menu = 4 AND kasa > 0 + (kurs4% * ilosctrans) THEN ilosc4 = ilosc4 + ilosctrans: kasa = kasa - (kurs4% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
'......... i tak dalej ........
IF a$ = "+" AND menu = 47 AND kasa > 0 + (kurs47% * ilosctrans) THEN ilosc47 = ilosc47 + ilosctrans: kasa = kasa - (kurs47% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2

IF a$ = "-" AND menu = 1 AND ilosc1 <> 0 THEN ilosc1 = ilosc1 - ilosctrans: kasa = kasa + (kurs1% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
'......... i tak dalej ........
IF a$ = "-" AND menu = 44 AND ilosc44 <> 0 THEN ilosc44 = ilosc44 - ilosctrans: kasa = kasa + (kurs44% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
IF a$ = "-" AND menu = 45 AND ilosc45 <> 0 THEN ilosc45 = ilosc45 - ilosctrans: kasa = kasa + (kurs45% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
IF a$ = "-" AND menu = 46 AND ilosc46 <> 0 THEN ilosc46 = ilosc46 - ilosctrans: kasa = kasa + (kurs46% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
IF a$ = "-" AND menu = 47 AND ilosc47 <> 0 THEN ilosc47 = ilosc47 - ilosctrans: kasa = kasa + (kurs47% * ilosctrans): LOCATE 4, 58: PRINT "Stan konta:"; kasa; "zˆ": GOTO menu2
IF a$ = CHR$(13) THEN GOTO notowania 'nie bedzie tego zapisywal, tylko mial w pamieci
LOOP
1

Najstarszy kod, który się uchował kostka Mengera. Wcześniej był trochę gorszy kod, ale nic z tego już się nie zachowało.

1

Pamiętam, że pierwszy kod ever to był w Basicu dla 8051. Okolice roku 2000, nie miałem wtedy kompa jeszcze i pisałem na kartce. Później, pierwszy działający skompilowany program to chyba w Turbo Pascalu, który liczył P = U * I, a później to już się potoczyło.

Tu jest kilka moich kwiatków, które zachowały się do dnia dzisiejszego.
https://cepa.io/2018/02/04/coding-before-it-was-cool/

7

Moim pierwszym językiem był BASIC. Niestety nic się z tego nie uchowało poza moją głową.
Większość przechowywałem albo w zeszycie albo na taśmach (pozdrawiam pracowników Stilon Gorzów!).
Moim drugim językiem był assembler (najpierw Z80, potem 6502C - różne odmiany).
Dlatego na studiach początkowo mój kod wyglądał tak (rok 1993, Turbo Pascal):

  procedure nop;
  begin end;

  procedure setleds(B:byte);
  var dana:byte;
  begin
    dana:=b and 7;
    asm
     MOV AL,$ed
     OUT $60,AL
     MOV CX,$2000
    @czekaj: LOOP @czekaj
     MOV AL,dana
     OUT $60,AL
    end;
  end;

  function mouse_type.init(x,y:word;m_mode:byte):word;
  var rejestry:registers;
  begin
  with rejestry do
    begin
      AX:=0;
      Intr($33,rejestry); (* Inicjalizacja *)
      init:=AX;
      DX:=8*x;
      CX:=8*y;
      AX:=4;
      Intr($33,rejestry);   { Przesuniecie kursora myszy }
      AX:=1;
      Intr($33,rejestry);   { Pokazanie kursora }
    end;
    mouse_mode:=m_mode;
  end;


4

Mój pierwszy bot do Tibii. Rok chyba 2011/2012 - końcówka liceum.
Umiał chodzić, zabijać potwory i zbierać z nich rzeczy.
C--, WinAPI, czytanie pamięciu procesu Tibii, symulowanie klawiatury i myszki
Potwory, waypointy, rzeczy do zbierania są hardkodowane, więc miałem osobne binarki do różnych miejscówek w grze.
Kod wygląda tragicznie, ale bądź co bądź mogłem go zostawić na parę godzin i jak mnie gracze nie dojechali, to było spoko. Patrząc na to ile wtedy umiałem, to dalej jestem zadowolony, że to napisałem.
No i wbił mi trochę expa :)

https://www.codepile.net/pile/L3AYye3A

5
10 PRINT "ATARI"
20 GOTO 10

Przed chwilą przetestowałem na moim 65XE. Kod nadal działa.

4

Na pewno nie mój pierwszy kod, ale jedna ze starszych rzeczy którą mam na tym kompie. Program przelicza funkcję kwadratową z postaci ogólnej na na kanoniczną.
Data pliku 9.09.1998:

uses crt;
function delta(a,b,c:double):double;
begin
delta:=b*b-4*a*c;
end;

procedure kanon(a,b,c:double; var p,q:double);
begin
	p:=-(b/(2*a));
   q:=-(delta(a,b,c)/(4*a));
end;

var a,b,c,p,q:double;
begin
clrscr;
writeln('y=ax^2+bx+c'#13#10);
write('Podaj a:');
readln(a);
write('Podaj b:');
readln(b);
write('Podaj c:');
readln(c);
kanon(a,b,c,p,q);
writeln;
writeln('y=a(x-p)^2+q'#13#10);
writeln('p=',p:5:5);
writeln('q=',q:5:5);
readkey;
end.

Jak widać na pytanie "taby czy spacje" moją odpowiedzią było "wszystko jedno". Skutki tego podejścia widać tym bardziej w poniższym fragmencie – jest to jeden z około 5 efektów graficznych prymitywnego "demka" wzorowanego na tych z demosceny. Plik datowany na 7.04.1999:

procedure Sprezynka;
procedure RysujSprezynke(tryb:boolean);
const max=23;
var
	time:byte;
   sstart,s,h,s100,m:word;
   tab:array[1..max] of record
                      x:integer;
                      y:integer;
                     end;
   i,x1,y1:integer;


begin
 if tryb then time:=30 else time:=20;
 x1:=4;y1:=3;
 cls(vga,0);
 rectangle(1,1,319,199,123,vga);
 for i:=1 to max do begin tab[i].x:=100+i*x1; tab[i].y:=50+i*y1; end;
 for i:=1 to max do Circle(tab[i].x,tab[i].y,15,i+32,vga);
gettime(h,m,sstart,s100);
 repeat
if tryb then  Circle(tab[1].x,tab[1].y,15,0,vga)
	else Circle(tab[1].x,tab[1].y,15,51,vga);
  for i:=1 to max-1 do tab[i]:=tab[i+1];
  if ((tab[max].x<21) or (tab[max].x>299)) then x1:=-x1;
  if ((tab[max].y<18) or (tab[max].y>181)) then y1:=-y1;
  tab[max].x:=tab[max].x+x1;tab[max].y:=tab[max].y+y1;
  for i:=1 to max do Circle(tab[i].x,tab[i].y,15,i+32,vga);
  delay(10); {a tu malutki delay}
 gettime(h,m,s,s100);
 if s<sstart then s:=s+60;
 until s>=sstart+time;
 while keypressed do readkey;
end;
begin
rysujsprezynke(true);
rysujsprezynke(false);
cls(vga,0);
end;

Oczy mi krwawią.

A to już zdecydowanie XXI-wieczny kod, ale kiedy jeszcze mi się chciało w WinAPI i okolice:

HRESULT WicHelper::createSurfaceFromWicBitmap(IWICBitmapSource *bmp, IDirectDrawSurface7 **asurface)
{
	*asurface = nullptr;
	if (!dd)
		return E_FAIL;
	
	HRESULT hr;

	CComPtr<IWICFormatConverter> converter;
	hr = wic->CreateFormatConverter(&converter);
	if (FAILED(hr))
		return hr;

	hr = converter->Initialize(bmp, GUID_WICPixelFormat32bppBGR, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeCustom);
	if (FAILED(hr))
		return hr;

	UINT w, h;
	hr = converter->GetSize(&w, &h);
	if (FAILED(hr))
		return hr;

	CComPtr<IDirectDrawSurface7> surface;
	DDSURFACEDESC2 ddsd = {sizeof(DDSURFACEDESC2)};
	ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
	ddsd.dwWidth = w;
	ddsd.dwHeight = h;
	hr = dd->CreateSurface(&ddsd, &surface, nullptr);
	if (FAILED(hr))
		return hr;

	hr = surface->Lock(nullptr, &ddsd, 0, nullptr);
	if (FAILED(hr))
		return hr;
	
	hr = converter->CopyPixels(nullptr, ddsd.lPitch, h*ddsd.lPitch, (BYTE*)ddsd.lpSurface);
	if (FAILED(hr))
		return hr;

	surface->Unlock(nullptr);
	if (FAILED(hr))
		return hr;

	*asurface=surface.Detach();
	return S_OK;
}
1

Mój pierwszy komputer to był 386 DX 40MHz z dyskiem 52MB ściągnięty z Niemiec za 10 milionów złotych. Byłem w 7 klasie podstawówki. Pamiętam, że ja dałem 5 milionów, a rodzice dołożyli drugie tyle. Desktop (płaski) leżący pod monitorem, klawiatura (mam do dziś) mająca w środku blachę ~0,8mm, którą w razie globalnej pandemii można było ścinać drzewa albo odrąbywać głowy zombie.
Anyway, mój pierwszy program napisany był w debug.exe, który pozwalał na pisanie bezpośrednio w pamięci i robienie zrzutu tej pamięci do pliku .com, a miał on treść taką:

int 20h

Jakiż byłem dumny, że program nie zresetował komputera :D
(dla niewtajemniczonych, to jeden z prawidłowych sposobów kończenia programu, ale od czegoś trzeba było zacząć ;-) )

5

Moje pierwsze to bylo cos w stylu:

10 print "jakis string"
20 goto 10

A tutaj link jak to zrobic lepiej w jednej linijce z naprawde fajnym efektem:

10 PRINT( CHR$(205.2+RND(1));: GOTO 10

6

Programowałem (zawodowo) w wielu dziwnych językach. Te, których nie wyparłem z pamięci to m.in. DEX, Natural, AmBasic. A do tych hermetycznych języków cięzko było wtedy (pewnie teraz też) o dobry support.
I w jednej z firm miałem do napisania jakiś kawałek kodu. Nie potrafiłem sobie z tym poradzić, bo jeżyk dziwny i zachowuje się "trochę" inaczej, niż bym się spodziewał. Spytałem szefa IT, jak to mam zrobić. Odpowiedział mi, że mam wejść na forum, tam jest rozwiązanie i przekopiować. A że nie zrozumiałem tego kodu, więc się go spytałem o co chodzi w jakiejś tam linijce, albo czemu tak to zrobione (lubię wiedzieć czemu i jak kod działa). Odpowiedział mi mniej więcej : "Shut Up and paste code!"
Wstyd mi, że tam pracowałem...

4

Pierwszy kod napisałem w C++, oj tak. Tutorial od zera do gier kodera i takie tam. Piękne czasy. Potem skakałem po wielu językach, technologiach, ale na szczęście żaden kod z tamtego czasu się nie zachował, bom wtedy jakoś w czwartek klasie był chyba.
Zwłaszcza podoba mi sie końcówka z precision <3
Zachował się za to kawałek z drugiej liceum, kiedy wyrzeźbiłem prosty programik w JSie służacy nam na lekcjach matematyki jako coś do rysowania wykresów - nauczycielka odpalała projektor i wyświetlała na tablicy cuda wianki za pomocą tegoż programiku.
To był triple win. Ja win, bo przepuściła mnie z matemtyki. Klasa win, bo nie trzeba było ręcznie rysować kraty, jednostek, podstawowych wykresów i osi, nauczycielka win, bo nikt jej nie narzekał, że obożeznowurysowaniewykresów, plus łatwo było pewne rzeczy zobrazować i szybciej.

Kod wygląda jak poniżej a całość dalej sobie hula (i chyba jest wykorzystywana w mojej dawnej szkole xD) na https://grski.pl/szkola/uklad/.
Jak używać? Po prawej klikamy w rozwijane menu, oznaczone jakże intuicyjnie, takim niebieskim paskiem - wtedy nam sie wysuwa.

Można by powiedzieć, że to był mój pierwszy sprint swego rodzaju i to tak zaczęła się moja przygoda z budowaniem produktów xD
Było kilka iteracji/sprintów, zbieranie wymagan od nauczycielki, smoke testy, demo (na lekcjach) i tak dalej XD Fun times.

var lengthOfUnit = math.round(window.innerHeight / 18);
var height = window.innerHeight - (window.innerHeight % lengthOfUnit);
var width = window.innerWidth - 20 - (window.innerWidth % lengthOfUnit);
var precision = 0.0030000003;
var prBtn = document.getElementById('prBtn'),
    prBtn2 = document.getElementById('prBtn2');
var prBtn3 = document.getElementById('prBtn3'),
    prBtn4 = document.getElementById('prBtn4');
var lastEquation;
var colors = ['darkblue', 'darkgoldenrod', 'darkgreen', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkred', 'darkViolet', 'deeppink', 'dodgerblue', 'fuchsia', 'gold', 'lawngreen', 'lime', 'maroon', 'yellow', 'olive', 'purple'];
var plotNumber = 0;
var x0 = width / 2;
var y0 = height / 2;
var c = document.getElementById("myCanvas");
c.width = width;
c.height = height;
var ctx = c.getContext("2d");
var numberOfUnitsOnXAxis = x0 / lengthOfUnit;
var numberOfUnitsOnYAxis = y0 / lengthOfUnit;
ctx.translate(x0 + 0.5, y0 + 0.5);

function makePlane() {
    ctx.strokeStyle = "#b3b3b3";
    ctx.beginPath();
    ctx.font = "15px Arial";
    for (i = 0; i < numberOfUnitsOnXAxis; i++) {
        ctx.fillText(i, i * lengthOfUnit + 5, 15);
        ctx.fillText(-i, -i * lengthOfUnit + 5, 15);
        ctx.moveTo(i * lengthOfUnit, -y0);
        ctx.lineTo(i * lengthOfUnit, y0);
        ctx.moveTo(-i * lengthOfUnit, -y0);
        ctx.lineTo(-i * lengthOfUnit, y0);
        ctx.stroke();
    }
    ctx.closePath();
    ctx.beginPath();
    for (i = 0; i < numberOfUnitsOnYAxis; i++) {
        ctx.fillText(-i, 5, i * lengthOfUnit + 15);
        ctx.fillText(i, 5, -i * lengthOfUnit + 15);
        ctx.moveTo(-x0, i * lengthOfUnit);
        ctx.lineTo(x0, i * lengthOfUnit);
        ctx.moveTo(-x0, -i * lengthOfUnit);
        ctx.lineTo(x0, -i * lengthOfUnit);
        ctx.stroke();
    }
    ctx.closePath();
    ctx.strokeStyle = "#000";
    ctx.beginPath();
    ctx.lineWidth = 2;
    ctx.moveTo(-0, -y0);
    ctx.lineTo(-20, -y0 + 25);
    ctx.moveTo(-0, -y0);
    ctx.lineTo(20, -y0 + 25);
    ctx.moveTo(0, -y0);
    ctx.lineTo(0, y0);
    ctx.moveTo(-x0, 0);
    ctx.lineTo(x0, 0);
    ctx.lineTo(x0 - 20, 20);
    ctx.moveTo(x0, 0);
    ctx.lineTo(x0 - 20, -20);
    ctx.stroke();
    ctx.closePath();
}

function draw(equation, p = 0, q = 0) {
    var color = colors[plotNumber];
    plotNumber++;
    lastEquation = equation;
    var x, y, lastY;
    var scope = {
        x: 0
    }
    ctx.beginPath();
    ctx.strokeStyle = color;
    for (i = -numberOfUnitsOnXAxis; i < numberOfUnitsOnXAxis; i += precision) {
        x = i * lengthOfUnit;
        scope.x = i;
        y = -math.eval(equation, scope) * lengthOfUnit;
        if (math.abs(lastY - y) > lengthOfUnit - 1) ctx.moveTo(x, y)
        else ctx.lineTo(x + (p * lengthOfUnit), y - (q * lengthOfUnit));
        lastY = y;
    }
    ctx.stroke();
    ctx.closePath();
}

function ts() {
    var p = document.getElementById('vectorP').value;
    var q = document.getElementById('vectorQ').value;
    draw(lastEquation, p, q);
}
prBtn.onclick = function() {
    precision = 0.01500000003;
};
prBtn2.onclick = function() {
    precision = 0.00300000003;
};
prBtn3.onclick = function() {
    precision = 0.00200000003;
};
prBtn4.onclick = function() {
    precision = 0.00100000003;
};

screenshot-20210119010234.png

2

Mój pierwszy "dokończony program".

PROGRAM Danaimus;
Uses Crt,graph;
Type
 xY=record
  x,y:integer;
 end;
 xYxY=record
  x1,y1,x2,y2:integer;
 end;
Var
wsk,OldWsk,Mon,OldMon:xY; Linia,StaraLinia:xYxY;
karta,tryb:Integer;
Licznik:array[1..5] of byte; hp,PoziomTrudnosci,kolorNad:byte;
button:char; Ilosc_Pkt: longint;
Rusz,Czy_Linia,Wzielo_hp,Czy_Mon,Cant_add:boolean;
PROCEDURE losujPol;
 begin
 Linia.x1:=random(565)+10;
 Linia.y1:=random(150);
 Linia.x2:=random(565)+10;
 Linia.y2:=random(150);
 IF ((Linia.x1>=0) and (Linia.x2>=575)) OR ((Linia.x1>=545) and (Linia.x2>=0)) THEN LosujPol;
end;
PROCEDURE LosujMon;
begin
 Mon.x:=random(505)+40;
 Mon.y:=random(100);
end;
PROCEDURE ShowMon1;
begin
 SetColor(yellow);
 Rectangle(Mon.x,Mon.y,Mon.x-3,Mon.y-3);
end;
PROCEDURE ShowMon2;
begin
 SetColor(BLACK);
 Rectangle(OldMon.x,OldMon.y,OldMon.x-3,OldMon.y-3);
end;
PROCEDURE GetOldMon;
begin
 OldMon.x:=Mon.x; OldMon.y:=Mon.y;
end;
PROCEDURE GrafikaGracza;
Begin
 SetLineStyle(0,0,3); SetColor(7);
 Line(wsk.x,wsk.y+20,wsk.x,wsk.y); Line(wsk.x+3,wsk.y+20,wsk.x+2,wsk.y+4); Line(wsk.x+6,wsk.y+18,wsk.x+4,wsk.y+12);
 Line(wsk.x-3,wsk.y+20,wsk.x-2,wsk.y+4); Line(wsk.x-6,wsk.y+18,wsk.x-4,wsk.y+12);
end;
PROCEDURE GrafikaGracza2; {Poprawnosc: jakies 45%(bo mogloby byc duzo szybsze)}
Begin
 SetColor(BLACK);
 Line(OldWsk.x,OldWsk.y+20,OldWsk.x,OldWsk.y); Line(OldWsk.x+3,OldWsk.y+20,OldWsk.x+2,OldWsk.y+4);
 Line(OldWsk.x+6,OldWsk.y+18,OldWsk.x+4,OldWsk.y+12);
 Line(OldWsk.x-3,OldWsk.y+20,OldWsk.x-2,OldWsk.y+4); Line(OldWsk.x-6,OldWsk.y+18,OldWsk.x-4,OldWsk.y+12);
end;
PROCEDURE PoczZm;
begin
 wsk.x:=200;
 wsk.y:=400;
end;
PROCEDURE WczytajPrzycisk;
Begin
 button:=UpCase(readkey);
 CASE button OF
  'W': wsk.y:=wsk.y-5;
  'S': wsk.y:=wsk.y+5;
  'A': wsk.x:=wsk.x-5;
  'D': wsk.x:=wsk.x+5;
 end;
 Rusz:=true;
End;
PROCEDURE HealthPointsStarts;
begin
 SetColor(RED);
 Circle(5,15,5);
 Circle(5,35,5);
 Circle(5,55,5);
end;
PROCEDURE kolizje;
begin
 IF wsk.y<150 THEN wsk.y:=wsk.y+5;
 IF wsk.y>450 THEN wsk.y:=wsk.y-5;
 IF wsk.x<50 THEN wsk.x:=wsk.x+5;
 IF wsk.x>535 THEN wsk.x:=wsk.x-5;
 IF Mon.y>500 THEN Czy_Mon:=false;
 IF (linia.y1>500) and (Linia.y2>500) THEN BEGIN Czy_Linia:=false; Inc(Ilosc_Pkt); END;
end;
PROCEDURE GetOldXY;
begin
 OldWsk.x:=wsk.x; OldWsk.y:=wsk.y;
end;
PROCEDURE GetOldLine;
begin
 StaraLinia.x1:=Linia.x1; StaraLinia.y1:=Linia.y1; StaraLinia.x2:=Linia.x2; StaraLinia.y2:=Linia.y2;
end;
PROCEDURE ZmniejszHp;
begin
 IF hp=1 THEN button:=chr(27);
 Dec(hp);
 Wzielo_hp:=true;
 SetColor(BLACK);
 CASE hp OF
 2: Circle(5,15,5);
 1: Circle(5,35,5);
 0: Circle(5,55,5);
 end;
end;
PROCEDURE gra;
begin
 button:='o';
 licznik[1]:=0; Licznik[5]:=0;
 Czy_linia:=false; Czy_Mon:=false; cant_add:=false;
 SetColor(RED);
 Licznik[3]:=0; Licznik[4]:=0;
 hp:=3;
 HealthPointsStarts;
 Randomize;
 REPEAT
  GetOldXY;
  IF keypressed THEN WczytajPrzycisk;
  kolizje;
  IF Czy_Mon THEN begin
                   IF cant_add=true THEN cant_add:=false;
                   GetOldMon;
                   ShowMon2;
                   IF licznik[3]=0 THEN Inc(Mon.y);
                   ShowMon1;
                  end Else begin
                            IF licznik[5]=30 THEN begin
                                                   GetOldMon; ShowMon2;
                                                   losujMon; Czy_Mon:=true; Licznik[5]:=0;
                                                  end Else Inc(Licznik[5]);
                           end;
  IF (GetPixel(wsk.x,wsk.y-1)=yellow) and (cant_add=false) THEN begin Inc(Ilosc_Pkt); Czy_Mon:=false; cant_add:=true; end;
  IF (GetPixel(wsk.x,wsk.y-1)=GREEN) and (Licznik[4]=0) THEN ZmniejszHp;
  IF Czy_Linia THEN begin
                     SetColor(Black);
                     GetOldLine;
                     Line(StaraLinia.x1,StaraLinia.y1,StaraLinia.x2,StaraLinia.y2);
                     IF licznik[3]=0 THEN begin Inc(Linia.y1); Inc(Linia.y2); end;
                     SetColor(GREEN);
                     Line(Linia.x1,Linia.y1,Linia.x2,Linia.y2);
                     end Else begin losujPol; Czy_Linia:=true; end;
  IF Rusz THEN begin
                GrafikaGracza2;
                Rusz:=false;
               end;
  GrafikaGracza;
  Inc(Licznik[3]);
  IF Wzielo_hp THEN begin
                     Inc(Licznik[4]);
                     IF Licznik[4]=30 THEN begin
                                            Wzielo_hp:=false;
                                            Licznik[4]:=0;
                                           end;
                    end;
  CASE PoziomTrudnosci OF
   1: BEGIN IF licznik[3]>=5 THEN licznik[3]:=0; end;
   2: BEGIN IF Licznik[3]>=1 THEN Licznik[3]:=0; end;
   3: BEGIN Licznik[3]:=0; end;
  end;
  Delay(1);
 UNTIL button=chr(27);
end;
PROCEDURE PrzygotowanieGry;
begin
 ClearDevice;
 OutTextXY(200,200,'Wczytywanie...');
 PoczZm;
 GrafikaGracza;
 ClearDevice;
 Delay(10);
 gra;
end;
PROCEDURE wybWmenu3(SelCol,NotSelCol,Selected:byte;n1x,n1y,n2x,n2y,n3x,n3y:word;s1,s2,s3:string);
begin
 CASE Selected OF
  1: SetColor(SelCol); 2: SetColor(NotSelCol); 3: SetColor(NotSelCol);
 end;
 OutTextXY(n1x,n1y,s1);
 CASE Selected OF
  1: SetColor(NotSelCol); 2: SetColor(SelCol); 3: SetColor(NotSelCol);
 end;
 OutTextXY(n2x,n2y,s2);
 CASE Selected OF
  1: SetColor(NotSelCol); 2: SetColor(NotSelCol); 3: SetColor(SelCol);
 end;
 OutTextXY(n3x,n3y,s3);
end;
PROCEDURE OutColorTextXY(x,y,color:integer; s2:string);
begin
 SetColor(color);
 OutTextXY(x,y,s2);
end;
PROCEDURE graphON;
begin
InitGraph(karta,tryb,'D:\Danaimus\BGI');
end;
PROCEDURE graphOFF;
begin
 closegraph;
end;
PROCEDURE logo1;
begin
 PoziomTrudnosci:=3;
 SetFillStyle(10,4); FloodFill(100,100,2); SetLineStyle(0,0,3);
 FOR Licznik[1]:=20 DOWNTO 0 DO begin
                                 Circle(130,200,Licznik[1]+50+18);
                                 SetColor(4);
                                 Circle(130,200,Licznik[1]+50+18-22);
                                 Circle(130,200,Licznik[1]+50+18-44);
                                 Circle(130,200,Licznik[1]+50+18-66);
                                 SetColor(15);
                                 Delay(30);
                                end;
 FOR Licznik[1]:=20 DOWNTO 0 DO begin
                                 Circle(100,200,Licznik[1]);
                                 Circle(160,200,Licznik[1]);
                                 Delay(20);
                                end;
 OutTextXY(320,240,'prezentuje...');
 Delay(3000);
end;
PROCEDURE Opcje;
begin
 SetColor(Green);
 OutTextXY(370,120,'Ustaw poziom trudnosci:');
 PoziomTrudnosci:=2;
 REPEAT
  wybWmenu3(3,1,licznik[1],380,159,380,176,380,192,'Ciapowaty','Wzburzony','Powalony');
  button:=readkey;
  Sound(2000); Delay(10); NoSound;
  CASE button OF
   'w': Dec(licznik[1]); 's': Inc(licznik[1]);
  end;
  IF licznik[1]<1 THEN licznik[1]:=3; IF licznik[1]>3 THEN licznik[1]:=1;
 UNTIL button=chr(13);
 CASE licznik[1] OF
  1: PoziomTrudnosci:=1;
  2: PoziomTrudnosci:=2;
  3: PoziomTrudnosci:=3;
 end;
end;
PROCEDURE logo2;
begin
 ClearDevice;
 Delay(50);
 SetFillStyle(3,8);
 FloodFill(100,100,2);
 SetTextStyle(1,0,4);
 OutColorTextXY(110,100,1,'D'); OutColorTextXY(130,100,2,'A'); OutColorTextXY(150,100,3,'N'); OutColorTextXY(170,100,4,'A');
 OutColorTextXY(190,100,5,'I'); OutColorTextXY(200,100,6,'M'); OutColorTextXY(223,100,7,'U'); OutColorTextXY(246,100,9,'S');
 Line(30,155,30,210); Line(115,155,115,210); Line(30,155,115,155);
 Line(30,210,115,210); Line(30,173,115,173); Line(30,192,115,192);
 SetTextStyle(2,0,4);
 licznik[1]:=1;
 REPEAT
  wybWmenu3(3,1,licznik[1],40,159,40,176,40,195,'Nowa Gra','Opcje','Wyjscie');
  button:=readkey;
  Sound(2000); Delay(10); NoSound;
  CASE button OF
   'w': Dec(licznik[1]); 's': Inc(licznik[1]);
  end;
  IF licznik[1]<1 THEN licznik[1]:=3; IF licznik[1]>3 THEN licznik[1]:=1;
 UNTIL button=chr(13);
 CASE licznik[1] OF
  1: PrzygotowanieGry;
  2: begin Opcje; logo2; end;
  3: Halt;
 end;
end;
Begin
 {$i-}
 graphON;
 logo1;
 logo2;
 GraphOFF;
 GotoXY(15,15);
 Write('Twoja ilosc zdobytych punkt¢w to: ',Ilosc_Pkt);
 Delay(2000);
 GotoXY(15,17);
 Write('...Wcisnik przycisk...');
 readkey;
 {$i+}
End.

Jak uda mi się to odpalić to wstawię zdj.

6

Moja pierwsza gra komputerowa - "saper"

<script>
function bomba(){
alert("BOMBA!");
}
function pusto(){
alert("Pusto");
}
function cyfra(x){
alert("Cyfra "+x);
}
</script>
<html>
<h1>Saper</h1>
<p><button onclick="cyfra(1)">x</button><button onclick="cyfra(1)">x</button><button onclick="pusto()">x</button><button onclick="pusto()">x</button></p>
<p><button onclick="bomba()">x</button><button onclick="cyfra(2)">x</button><button onclick="cyfra(1)">x</button><button onclick="cyfra(1)">x</button></p>
<p><button onclick="cyfra(1)">x</button><button onclick="cyfra(2)">x</button><button onclick="bomba()">x</button><button onclick="cyfra(1)">x</button></p>
<p><button onclick="pusto()">x</button><button onclick="cyfra(1)">x</button><button onclick="cyfra(1)">x</button><button onclick="cyfra(1)">x</button></p>
</html>

Nie chciało mi się szukać na starym dysku, więc napisałem z pamięci. Da się nawet zagrać: https://js.do/Muminek1234/my-first-game-ever

2

Moja pierwsza aplikacja - kalkulator orbitalny:

Sub orbita()
Dim x As Double
Dim y As Double
Dim vx As Double
Dim vy As Double
Dim k As Double
Dim r As Double
Dim ax As Double
Dim ay As Double
Dim i As Integer


x = [R3C6]
y = [R4C6]
vx = [R5C6]
vy = [R6C6]
k = [R7C6]

For i = 1 To 10000
   
    x = x + vx * k
    y = y + vy * k
   
    r = (x * x + y * y) ^ (-3 / 2)
   
    ax = -x * r
    ay = -y * r
   
    vx = vx + ax * k
    vy = vy + ay * k
   
    Cells(10 + i, 1) = 180 * x
    Cells(10 + i, 2) = 180 * y
Next

End Sub

i tutaj jeszcze post, z takiego jednego forum. Kategoria: perełki
forum.PNG

3

To jak już o Excelu mowa, kiedyś się bawiłem w krzywe Beziera:

screenshot-20210213153329.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1