OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů

Tlsk Mln 2019

Právě je 08 pro 2019, 18:34

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 14 ] 
Autor Zpráva
PříspěvekNapsal: 14 říj 2019, 16:10 
Offline
Kecálek

Registrován: 28 říj 2016, 21:03
Příspěvky: 83
Has thanked: 9 times
Been thanked: 38 times
Na 8bitech lidé dřív často programovali v BASICU, ostatně na 16bitech pak asi
taky. Přitom ale dialekt jazyka se na různých počítačích lišil, a kolikrát i na
jedné platformě bylo víc různých dialektů. A člověk, který zná jeden počítač,
nemusí vůbec vědět, jaké možnosti nabízí programování na jiném systému.

Napadlo mě tedy, pokud o to bude zájem, udělat takovou výstavku řešení stejného
problému na různých platformách - jazycích. Mohlo by to proběhnout tak, že si
zadáme jednotnou úlohu, nebo dvě, a každý kdo zná nějaký systém a chce se zapojit,
napíše jméno počítače, na kterém program odzkoušel (emulátory se povolují také),
název jazyka (pokud jich je na platformě víc, tak aby čtenář věděl pro který je daný
program napsaný) a text programu. Jazyk může být i jiný než BASIC, platforma by
neměla být moderní PC ať už na x86 nebo na ARMu (tam je pak jazyků ohromné
množství), s PC bychom mohli skončit u i8086, u ostatních platforem bez omezení.
Také by to mělo být něco, co je možné přeložit nebo interpretovat na daném stroji,
ne cross-compilation z PC.

Ještě přidejme možnost, že pogram může být vložen buď jako text, nebo screenshot
obrazovky stroje (nebo dvou obrazovek, když je dlouhý).


Nahoru
 Profil  
 
PříspěvekNapsal: 14 říj 2019, 17:48 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 644
Bydliště: Most, Praha
Has thanked: 183 times
Been thanked: 162 times
Nabízím program LINES, který jsem kdysi (1987) psal na SHARP MZ-800, jazyk BASIC MZ1Z-016. Program vytváří pohyblivé čárové obrazce a jeho funkce je celkem jednoduchá: Vykreslí se čára mezi krajními body (120 a 130) a souřadnice se posunou o inkrement (170). Když některá souřadnice přesáhne okraj, odrazí se náhodnou rychlostí opačným směrem (200-230) - tj. vygeneruje se náhodný inkrement s opačným znaménkem (90). Barva čáry se mění po náhodném počtu kroků (110, 270). Souřadnice se ukládají do pole (240) a nejstarší čára se přemaže (150, 160) (černou barvou, nebo jako tady ANDováním původní barvy). (proč se souřadnice inkrementují 2x, tak to fakt už netuším, asi amatérismus :-( )
Příloha:
lines.png
lines.png [ 5.98 KiB | Zobrazeno 1084 krát ]

Příloha:
screen.png
screen.png [ 7.04 KiB | Zobrazeno 1083 krát ]


Naposledy upravil Panda38 dne 14 říj 2019, 18:27, celkově upraveno 1

Nahoru
 Profil  
 
PříspěvekNapsal: 14 říj 2019, 18:11 
Offline
Pan Generální

Registrován: 22 kvě 2013, 21:14
Příspěvky: 2346
Bydliště: Bratislava
Has thanked: 259 times
Been thanked: 455 times
Panda38 píše:
Nabízím program LINES...
:thumbup:

A odo mna nieco podobne:
https://busy.speccy.cz/tvorba/superlin.htm
(releasnute 14.06.1994)


Nahoru
 Profil  
 
PříspěvekNapsal: 14 říj 2019, 18:23 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 644
Bydliště: Most, Praha
Has thanked: 183 times
Been thanked: 162 times
Busy píše:
A odo mna nieco podobne:
https://busy.speccy.cz/tvorba/superlin.htm
(releasnute 14.06.1994)
Kde se tam řeší práce s barvou, určení barevného atributu čáře? Ptám se protože jsem do ATmega8 implementoval Spectrovský videorežim a přemýšlím jak bych tam takový program realizoval (=jak rozhodovat o barvách barevného atributu).


Nahoru
 Profil  
 
PříspěvekNapsal: 14 říj 2019, 19:54 
Offline
Pan Generální

Registrován: 22 kvě 2013, 21:14
Příspěvky: 2346
Bydliště: Bratislava
Has thanked: 259 times
Been thanked: 455 times
Panda38 píše:
Busy píše:
https://busy.speccy.cz/tvorba/superlin.htm
(releasnute 14.06.1994)
Kde se tam řeší práce s barvou, určení barevného atributu čáře?
Aha, v tej verzii nikde. Tu je novsia farebna verzia:
https://busy.speccy.cz/download/sil1kbas.rar
Kód:
     1 LET z=NOT PI: LET j=SGN PI: POKE VAL "23693",VAL "7": INVERSE z: OVER j: BORDER NOT PI: CLS : PRINT #z;"   SIL 1k in ZX basic by BUSY": RESTORE : LET r=VAL "10": LET p=CODE "2": LET c=p: LET d=j+j: LET t=INT PI: LET s=d+d: LET k=PEEK PI: LET l=PEEK SGN PI: DIM s(c,s): DIM m(c): DIM b(s): DIM d(s): DIM h(s): FOR u=j TO s: READ b(u),d(u),h(u): NEXT u: LET m=z: LET a=j: LET b=s: LET n=z: LET v=z
     2 FOR i=j TO c: IF m THEN INK s+s: GO SUB VAL "9": INK b
     3 LET n=n+j: IF n>r THEN LET n=z: LET b=VAL "(a<7)*(7-a)+(a>6)*(a-5)": INK b: LET a=a+j: IF a>t*s THEN LET a=j: LET v=v+j: IF v>t THEN LET v=z
     4 FOR u=j TO s
     5 LET b(u)=b(u)+d(u): IF b(u)<z OR b(u)>h(u) THEN LET d(u)=-d(u): GO TO d+t
     6 LET s(i,u)=b(u): NEXT u: LET m(i)=v: GO SUB VAL "9": NEXT i: IF NOT m THEN LET m=j
     7 GO TO d
     8 LET y=l-y: LET f=-f: RETURN
     9 LET w=m(i): LET x=s(i,j): LET y=s(i,d): LET e=s(i,t)-x: LET f=s(i,s)-y: IF w=j THEN GO TO VAL "13"
    10 IF w=d THEN GO SUB VAL "15": GO SUB s+s: GO TO VAL "15"
    11 IF w=t THEN GO SUB VAL "15": GO SUB s+s: GO TO VAL "14"
    12 GO SUB VAL "13": GO SUB s+s
    13 GO SUB VAL "15"
    14 LET x=k-x: LET e=-e
    15 PLOT x,y: DRAW e,f: RETURN
    16 DATA p,t,k,r,s,l,r,t,k,p,d,l
Nejake vysvetlivky:
POKE 23693,7 ... nastavi cierny podklad a biele pismo (ciary)
NOT PI ... usporne zapisana hodnota 0
SGN PI ... usporne zapisana hodnota 1
PEEK PI ... usporne zapisana hodnota 255 (vodorovne rozlisenie obrazovky)
PEEK SGN PI ... usporne zapisana hodnota 175 (zvisle rozlisenie obrazovky)
Relacne operatory vracaju false ako ciselnu hodnotu 0 a true ako 1


Nahoru
 Profil  
 
PříspěvekNapsal: 14 říj 2019, 22:35 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 23 bře 2014, 20:13
Příspěvky: 1826
Has thanked: 87 times
Been thanked: 349 times
Já bych porovnání jazyků viděl maličko jinak. Na počátku byl vývojový diagram...

Jako první podle něj vznikl program pro ZX81:
Kód:
   9 REM ------------
  10 REM HRA ZX81 NIM
  11 REM ------------
  20 GOSUB 1000
  30 GOSUB 5000
  40 GOSUB 3000
  50 PRINT ,,,,"HRU HRAJE CLOVEK PROTI POCITACI,STRIDAVE ODEBIRAJI ZAPALKY PODLESTANOVENEHO MAXIMA. TEN, NA KOHOZUSTANE POSLEDNI, PROHRAVA.",,,,,"STISKNI NEJAKOU KLAVESU..."
  60 LET R=RND
  70 IF INKEY$="" THEN GOTO 70
  80 RANDOMIZE

  99 REM -------------
 100 REM HLAVNI CYKLUS
 101 REM -------------
 110 GOSUB 5000
 120 IF O=0 THEN GOTO 400

 199 REM -------------
 200 REM HRAJE POCITAC
 201 REM -------------
 210 GOSUB 3000
 220 IF P>1 THEN GOTO 270
 230 PRINT "VITEZI CLOVEK."
 240 LET V=V+1
 250 GOSUB 4000
 260 GOTO 200
 270 LET O=(P-1)-(M+1)*INT ((P-1)/(M+1))
 280 IF O=0 THEN LET O=INT (RND*M)+1
 290 IF O>(P-1) THEN GOTO 280
 300 PRINT "POCITAC BERE ";O;"."
 310 LET P=P-O

 399 REM ------------
 400 REM HRAJE CLOVEK
 401 REM ------------
 410 GOSUB 3000
 420 IF P>1 THEN GOTO 460
 430 PRINT "VITEZI POCITAC."
 440 GOSUB 4000
 450 GOTO 400
 460 PRINT "MUZES VZIT 1 AZ ";M;", KOLIK BERES?"
 470 INPUT O
 480 LET O=INT O
 490 IF O<1 OR O>M OR O>=P THEN GOTO 470
 500 LET P=P-O
 510 GOTO 100

 999 REM ----------------------
1000 REM POCATECNI INICIALIZACE
1001 REM ----------------------
1010 LET H=0
1020 LET V=0
1030 LET O=0

1999 REM ----------------
2000 REM GENERATOR NAHODY
2001 REM ----------------
2010 LET P=2*INT (RND*6)+17
2020 LET M=INT (RND*4)+2
2030 LET H=H+1
2040 RETURN

2999 REM ------------------
3000 REM NAKRESLENI ZAPALEK
3001 REM ------------------
3010 PRINT
3020 FOR R=1 TO 4
3030 FOR S=1 TO P
3040 PRINT CHR$ 133;
3050 NEXT S
3060 PRINT
3070 NEXT R
3080 LET Q=(P-10*INT (P/10))*(P<10 OR P>20)
3090 LET K$="EK"
3100 IF Q>1 AND Q<5 THEN LET K$="KY"
3110 IF Q=1 THEN LET K$="KA"
3120 PRINT ,,"NA STOLE LEZI ";P;" ZAPAL";K$;","
3130 RETURN

3999 REM -----------------
4000 REM VOLBA POKRACOVANI
4001 REM -----------------
4010 PRINT ,,"HER:",H
4020 PRINT "VYHER:",V
4030 PRINT ,,"CHCES HRAT ZNOVU? (A/N)"
4040 IF INKEY$="A" THEN GOTO 4070
4050 IF INKEY$="N" THEN NEW
4060 GOTO 4040
4070 GOSUB 5000
4080 GOTO 2000

4999 REM -----------------
5000 REM SMAZANI OBRAZOVKY
5001 REM -----------------
5010 CLS
5020 PRINT "ZX81 NIM (C)2015 FARAON"
5030 RETURN


O něco později přišel na řadu FORTRAN 66:
Kód:
      PROGRAM NIM                                                       MAIN01
      INTEGER VYHER,POCET,MAXIM,ODBER                                   MAIN02
      LOGICAL KONEC                                                     MAIN03
      CHARACTER*60 NAVOD(5)                                             MAIN04
      COMMON /UDAJE/VYHER,POCET,MAXIM,KONEC                             MAIN05
      COMMON /TEXT/NAVOD                                                MAIN06
      CALL INICI                                                        MAIN07
C VYPIS NAVODU                                                          MAIN08
      PRINT 600,(NAVOD(I),I=1,5)                                        MAIN09
      READ *                                                            MAIN10
C HRAJE CLOVEK                                                          MAIN11
1     CALL ZOBRAZ(POCET)                                                MAIN12
      IF (POCET.GT.1) GOTO 2                                            MAIN13
      PRINT 100                                                         MAIN14
      CALL UKONC                                                        MAIN15
      IF (KONEC) GOTO 9                                                 MAIN16
      GOTO 1                                                            MAIN17
C DOTAZ NA ODBER                                                        MAIN18
2     PRINT 200,MAXIM                                                   MAIN19
      READ 300,ODBER                                                    MAIN20
      ODBER=INT(ODBER)                                                  MAIN21
      IF (ODBER.LT.1.OR.ODBER.GT.MAXIM.OR.ODBER.GE.POCET) GOTO 2        MAIN22
      POCET=POCET-ODBER                                                 MAIN23
C HRAJE POCITAC                                                         MAIN24
3     CALL ZOBRAZ(POCET)                                                MAIN25
      IF (POCET.GT.1) GOTO 4                                            MAIN26
      PRINT 400                                                         MAIN27
      VYHER=VYHER+1                                                     MAIN28
      CALL UKONC                                                        MAIN29
      IF (KONEC) GOTO 9                                                 MAIN30
      GOTO 3                                                            MAIN31
C VYPOCET ODBERU                                                        MAIN32
4     ODBER=MOD(POCET-1,MAXIM+1)                                        MAIN33
      IF (ODBER.GT.0) GOTO 5                                            MAIN34
6     ODBER=MOD(NAHODA(),MAXIM)+1                                       MAIN35
      IF (ODBER.GE.POCET) ODBER=POCET-1                                 MAIN36
      IF (ODBER.LT.POCET) GOTO 5                                        MAIN37
      GOTO 6                                                            MAIN38
C PROVEDENI ODBERU                                                      MAIN39
5     PRINT 500,ODBER                                                   MAIN40
      POCET=POCET-ODBER                                                 MAIN41
      GOTO 1                                                            MAIN42
100   FORMAT (16H VITEZI POCITAC!,/)                                    MAIN43
200   FORMAT (16H MUZES VZIT 1 AZ,I2,15H, KOLIK BERES? )                MAIN44
300   FORMAT (I10)                                                      MAIN45
400   FORMAT (15H VITEZI CLOVEK!,/)                                     MAIN46
500   FORMAT (13H POCITAC BERE,I2/)                                     MAIN47
600   FORMAT (1A60)                                                     MAIN48
9     END                                                               MAIN49

C VYPIS VYSLEDKU A VOLBA POKRACOVANI NEBO UKONCENI                      UKONC01
      SUBROUTINE UKONC                                                  UKONC02
      INTEGER HER,VYHER,POCET,MAXIM                                     UKONC03
      LOGICAL KONEC                                                     UKONC04
      CHARACTER VOLBA                                                   UKONC05
      COMMON /UDAJE/VYHER,POCET,MAXIM,KONEC                             UKONC06
      PRINT 100,HER,VYHER                                               UKONC07
1     PRINT 200                                                         UKONC08
      READ 300,VOLBA                                                    UKONC09
      IF (VOLBA.EQ.'A'.OR.VOLBA.EQ.'a') GOTO 2                          UKONC10
      IF (VOLBA.NE.'N'.AND.VOLBA.NE.'n') GOTO 1                         UKONC11
      KONEC=.TRUE.                                                      UKONC12
      GOTO 2                                                            UKONC13
C POCATECNI INICIALIZACE PROMENNYCH                                     UKONC14
      ENTRY INICI                                                       UKONC15
      HER=0                                                             UKONC16
      VYHER=0                                                           UKONC17
      KONEC=.FALSE.                                                     UKONC18
C VYGENEROVANI NAHODNYCH HODNOT                                         UKONC19
2     POCET=MOD(NAHODA(),6)*2+17                                        UKONC20
      MAXIM=MOD(NAHODA(),4)+2                                           UKONC21
      HER=HER+1                                                         UKONC22
      RETURN                                                            UKONC23
100   FORMAT (7H HER:  ,I8/,7H VYHER:,I8)                               UKONC24
200   FORMAT (25H0CHCES POKRACOVAT? [A/N] )                             UKONC25
300   FORMAT (A1)                                                       UKONC26
      END                                                               UKONC27

C NAKRESLENI ZAPALEK NA STOLE                                           ZOBRAZ01
      SUBROUTINE ZOBRAZ(POC)                                            ZOBRAZ02
      INTEGER Q,POC,KON,ZAP                                             ZOBRAZ03
      CHARACTER RADEK(60)                                               ZOBRAZ04
      CHARACTER*2 KONCOVKA(3)                                           ZOBRAZ05
      DATA KONCOVKA/2HKA,2HKY,2HEK/                                     ZOBRAZ06
C HLAVICKY                                                              ZOBRAZ07
      DO 10 ZAP=1,27                                                    ZOBRAZ08
      RADEK(ZAP*2)=' '                                                  ZOBRAZ09
      IF (ZAP.LE.POC) RADEK(ZAP*2)='0'                                  ZOBRAZ10
10    CONTINUE                                                          ZOBRAZ11
      PRINT 100,RADEK                                                   ZOBRAZ12
C DRIVKA                                                                ZOBRAZ13
      DO 20 ZAP=1,27                                                    ZOBRAZ14
      RADEK(ZAP*2)=' '                                                  ZOBRAZ15
      IF (ZAP.LE.POC) RADEK(ZAP*2)='|'                                  ZOBRAZ16
20    CONTINUE                                                          ZOBRAZ17
      PRINT 100,((RADEK),I=1,3)                                         ZOBRAZ18
C VYPOCET KONCOVKY                                                      ZOBRAZ19
      IF (POC.GE.10.AND.POC.LE.20) GOTO 3                               ZOBRAZ20
      Q=MOD(POC,10)                                                     ZOBRAZ21
      KON=2                                                             ZOBRAZ22
      IF (Q.EQ.1) KON=1                                                 ZOBRAZ23
      IF (Q.GT.4) KON=3                                                 ZOBRAZ24
      GOTO 2                                                            ZOBRAZ25
3     KON=3                                                             ZOBRAZ26
2     PRINT 200,POC,KONCOVKA(KON)                                       ZOBRAZ27
      RETURN                                                            ZOBRAZ28
100   FORMAT (60A1)                                                     ZOBRAZ29
200   FORMAT (14H0NA STOLE LEZI,I3,6H ZAPAL,A2,1H,)                     ZOBRAZ30
      END                                                               ZOBRAZ31

C GENERATOR PSEUDONAHODNEHO CISLA                                       NAHODA01
      FUNCTION NAHODA()                                                 NAHODA02
      INTEGER NAHODA,SEED                                               NAHODA03
      SAVE SEED                                                         NAHODA04
C INICIALIZACE SEEDU                                                    NAHODA05
      IF (SEED.GT.0) GOTO 1                                             NAHODA06
      CALL GETDAT(I,J,K)                                                NAHODA07
      SEED=I*365+J*12+K                                                 NAHODA08
      CALL GETTIM(I,J,K,L)                                              NAHODA09
      SEED=MOD(SEED+I*3600+I*60+K,134456)                               NAHODA10
1     SEED=MOD(8121*SEED+28411,134456-1)                                NAHODA11
      NAHODA=SEED                                                       NAHODA12
      RETURN                                                            NAHODA13
      END                                                               NAHODA14

C NAPLNENI NAVODU                                                       DATA01
      BLOCK DATA                                                        DATA02
      COMMON /TEXT/NAVOD                                                DATA03
      CHARACTER*60 NAVOD(5)                                             DATA04
      DATA NAVOD/                                                       DATA05
     1 27H FORTRAN NIM (C)2015 FARAON,                                  DATA06
     2 33H0HRU HRAJE CLOVEK PROTI POCITACI,,                            DATA07
     3 53H STRIDAVE ODEBIRAJI ZAPALKY PODLE STANOVENEHO MAXIMA.,        DATA08
     4 41H TEN, NA KOHO ZUSTANE POSLEDNI, PROHRAVA.,                    DATA09
     5 17H0STISKNI ENTER.../                                            DATA10
      END                                                               DATA11

_________________
GOTT is REAL, unless declared INTEGER


Nahoru
 Profil  
 
PříspěvekNapsal: 14 říj 2019, 22:38 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 23 bře 2014, 20:13
Příspěvky: 1826
Has thanked: 87 times
Been thanked: 349 times
Další bylo na řadě ANSI C:
Kód:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>



int her,vyher,pocet,maximum;



/* vygenerování náhodných hodnot */
void nahoda(void)
     {
     pocet=2*(rand()%6)+17;
     maximum=rand()%4+2;
     ++her;
     }



/* počáteční inicializace proměnných */
void inicializace(void)
     {
     her=vyher=0;
     srand(time(NULL));
     nahoda();
     }



/* výpis výsledků a volba pokračování nebo ukončení */
int ukonceni(void)
    {
    char konec;

    printf("\nHer:\t%d\nVýher:\t%d\nChceš hrát znovu? [A/N] ",her,vyher);
    do {
       while (!scanf("%1[aAnN]",&konec)) getchar();
       if ('n'==konec||'N'==konec) return 1;
       } while ('a'!=konec&&'A'!=konec);
    nahoda();
    return 0;
    }



/* výpočet koncovky */
char *koncovka(n)
     {
     if (n<10||20<n)
        {
        if (1==(n%=10)) return "ka";
        else if (n<5) return "ky";
        }
     return "ek";
     }



/* nakreslení zápalek na stole */
void zobraz(void)
     {
     static int radek,sloupec;

     putchar('\n');
     for (radek=0;radek<5;++radek)
         {
         for (sloupec=0;sloupec<pocet;++sloupec)
             printf("%c ",radek?'|':'O');
         putchar('\n');
         }
     printf("\nNa stole leží %d zápal%s.\n",pocet,koncovka(pocet));
     }



int main(void)
    {
    int odber;

    inicializace();
    /* výpis návodu */
    printf("\n                C NIM (C)2016 FARAON\n\n"
           "          Hru hraje člověk proti počítači,\n"
           "střídavě odebírají zápalky podle stanoveného maxima.\n"
           "      Ten, na koho zůstane poslední, prohrává.\n\n"
           "                  Stiskni Enter...");
    getchar();

    /* hlavní cyklus */
    for (;;)
        {
        /* hraje člověk */
        zobraz();
        if (pocet>1)
           {
           do {
              /* dotaz na odběr */
              printf("Můžeš vzít 1 až %d, kolik bereš? ",maximum<pocet?maximum:pocet-1);
              while (!scanf("%d",&odber)) getchar();
              } while (odber<1||odber>maximum||odber>=pocet);
           pocet-=odber;
           loop:
           zobraz();
           /* hraje počítač */
           if (pocet>1)
              {
              /* výpočet odběru */
              odber=(pocet-1)%(maximum+1);
              if (!odber) do odber=(rand()%maximum)+1; while (odber>=pocet);
              printf("Počítač bere %d\n",odber);
              pocet-=odber;
              }
           else
              {
              printf("Vítězí člověk!\n");
              ++vyher;
              if (ukonceni()) break;
              goto loop;
              }
           }
        else
           {
           printf("Vítězí počítač!\n");
           if (ukonceni()) break;
           }
        }

    return 0;
    }


A nakonec verze pro ZX Spectrum, vzniklá prostým doplněním toho úplně prvního programu o schopnosti Spectra:
Kód:
   9 REM ------------
  10 REM HRA ZX82 NIM
  11 REM ------------
  20 GOSUB 1000
  30 GOSUB 5000
  40 GOSUB 3000
  50 PRINT ''"Hru hraje ";CHR$ 150;"lov";CHR$ 151;"k proti po";CHR$ 150;CHR$ 148;"ta";CHR$ 150;"i,st";CHR$ 152;CHR$ 148;"dav";CHR$ 151;" odeb";CHR$ 148;"raj";CHR$ 148;" z";CHR$ 146;"palky podlestanoven";CHR$ 147;"ho maxima. Ten, na kohoz";CHR$ 155;"stane posledn";CHR$ 148;", prohr";CHR$ 146;"v";CHR$ 146;"."''"Stiskni n";CHR$ 151;"jakou kl";CHR$ 146;"vesu..."
  60 LET r=RND
  70 IF INKEY$="" THEN GOTO 70

  99 REM -------------
 100 REM HLAVNI CYKLUS
 101 REM -------------
 110 GOSUB 5000
 120 IF o=0 THEN GOTO 400

 199 REM -------------
 200 REM HRAJE POCITAC
 201 REM -------------
 210 GOSUB 3000
 220 IF p>1 THEN GOTO 270
 230 PRINT "V";CHR$ 148;"t";CHR$ 151;"z";CHR$ 148;" ";CHR$ 150;"lov";CHR$ 151;"k."
 240 LET v=v+1
 250 GOSUB 4000
 260 GOTO 200
 270 LET o=(p-1)-(m+1)*INT ((p-1)/(m+1))
 280 IF o=0 THEN LET o=INT (RND*m)+1
 290 IF o>(p-1) THEN GOTO 280
 300 PRINT "Po";CHR$ 150;CHR$ 148;"ta";CHR$ 150;" bere ";o;"."
 310 LET p=p-o

 399 REM ------------
 400 REM HRAJE CLOVEK
 401 REM ------------
 410 GOSUB 3000
 420 IF p>1 THEN GOTO 460
 430 PRINT "V";CHR$ 148;"t";CHR$ 151;"z";CHR$ 148;" po";CHR$ 150;CHR$ 148;"ta";CHR$ 150;"."
 440 GOSUB 4000
 450 GOTO 400
 460 PRINT "M";CHR$ 155;CHR$ 154;"e";CHR$ 153;" vz";CHR$ 148;"t 1 a";CHR$ 154;" ";m;", kolik bere";CHR$ 153;"?"
 470 INPUT "beru ";o
 480 LET o=INT o
 490 IF o<1 OR o>m OR o>=p THEN GOTO 470
 500 LET p=p-o
 510 GOTO 100

 999 REM ----------------------
1000 REM POCATECNI INICIALIZACE
1001 REM ----------------------
1010 LET h=0
1020 LET v=0
1030 LET o=0
1040 DIM x(8)
1050 RANDOMIZE: RESTORE

1099 REM -----------
1100 REM SEMIGRAFIKA
1101 REM -----------
1110 LET a=USR "a"
1120 FOR i=0 TO 15
1130 READ p: POKE a,p
1140 LET a=a+1
1150 NEXT i
1160 DATA 28,62,62,127,127,127,62,62
1170 DATA 28,28,28,28,28,28,28,28

1199 REM -------
1200 REM CESTINA
1201 REM -------
1210 LET m=PEEK 23607*256+PEEK 23606
1220 READ x(1),x(2)
1230 FOR i=0 TO 9: PAPER i: CLS
1240 READ p: LET m=m+p
1250 FOR j=1 TO 8
1260 LET p=PEEK m: IF j=2 THEN LET p=0
1270 POKE a,p+x(j): LET a=a+1: LET m=m+1
1280 NEXT j
1290 IF i=3 THEN READ x(1)
1300 IF i=8 THEN READ x(1),x(2),x(3)
1310 NEXT i
1320 DATA 12,8,776,24,24,120
1330 DATA 20,-184,8,96,0,48
1340 DATA 8,20,8,-48

1999 REM ----------------
2000 REM GENERATOR NAHODY
2001 REM ----------------
2010 LET p=2*INT (RND*6)+17
2020 LET m=INT (RND*4)+2
2030 LET h=h+1
2040 RETURN

2999 REM ------------------
3000 REM NAKRESLENI ZAPALEK
3001 REM ------------------
3010 PRINT
3020 FOR r=1 TO 4
3030 FOR s=1 TO p
3035 IF r=1 THEN PRINT INK 0; CHR$ 144;: GOTO 3050
3040 PRINT INK 6; CHR$ 145;
3050 NEXT s
3060 PRINT
3070 NEXT r
3080 LET q=(p-10*INT (p/10))*(p<10 OR p>20)
3090 LET K$="ek"
3100 IF q>1 AND q<5 THEN LET K$="ky"
3110 IF q=1 THEN LET K$="ka"
3120 PRINT '"Na stole le";CHR$ 154;CHR$ 148;" ";BRIGHT 1;p;BRIGHT 0;" z";CHR$ 146;"pal";K$;","
3130 RETURN

3999 REM -----------------
4000 REM VOLBA POKRACOVANI
4001 REM -----------------
4010 PRINT '"Her:",INVERSE 1;h
4020 PRINT "V";CHR$ 149;"her:",PAPER 2*(INT ((h+1)/2/(v+1))<1);FLASH 1;v
4030 PRINT '"Chce";CHR$ 153;" hr";CHR$ 146;"t znovu? (a/N)"
4040 IF INKEY$="a"OR INKEY$="A" THEN GOTO 4070
4050 IF INKEY$="N" THEN NEW
4060 GOTO 4040
4070 GOSUB 5000
4080 GOTO 2000

4999 REM -----------------
5000 REM SMAZANI OBRAZOVKY
5001 REM -----------------
5010 INK 9: PAPER 1: FLASH 0: BRIGHT 0: OVER 0: INVERSE 0: BORDER 1: CLS
5020 PRINT BRIGHT 1; "ZX82 NIM (C)2015/2018 FARAON"
5030 RETURN

_________________
GOTT is REAL, unless declared INTEGER


Nahoru
 Profil  
 
PříspěvekNapsal: 14 říj 2019, 23:26 
Offline
Kecálek

Registrován: 28 říj 2016, 21:03
Příspěvky: 83
Has thanked: 9 times
Been thanked: 38 times
Úloha LINES vypadá pěkně, i když možná už je to až moc komplikované. V zájmu
usnadnění portování na co nejvíc systémů bych to tedy zjednodušil (stačí kreslit
černobíle, použití barev je volitelné) a specifikoval v pseudokódu pro ty, co to
těžko přečtou z BASICu.

Tedy cílem je napsat program, který vykreslí 59x2 čar na obrazovku, vždy dvě čáry
jsou navzájem symetrické podle svislé osy, aby výsledný obrazec byl symetrický.
Když potom jsou čáry přidávány, tak dřívější musí být umazávány, abychom stále
udržovali na obrazovce 59x2 čar.
Kód:
proměnné: S=T=U=V=0
          O=P=Q=R=-1
          fronta F (prázdná)

Opakuj stále:
  Vlož čtveřici (S, T, U, V) do fronty F

  Kresli čáru mezi body (S, T) a (U, V)
  Kresli zrcadlový obraz předchozí čáry podle svislé osy

  Uprav hodnoty S, T, U, V zvětšením nebo zmenšením o malou hodnotu
      s podmínkou, že nová hodnota S, T, U, V musí odpovídat viditelné
      části obrazovky

  Pokud F má 60 prvků:
    Vyzvedni čtveřici (O, P, Q, R) z fronty F
    Smaž čáru mezi body (O, P) a (Q, R)
    Smaž zrcadlový obraz předchozí čáry podle svislé osy
Pro úpravu souřadnic bodů nechám volnost, buď je možné použít původní postup od
Panda38 nebo i něco trochu jiného. Výsledek může vypadat nějak takto
(přizpůsobený ovšem rozlišení daného stroje)
https://gistcdn.githack.com/lukq/c067c1 ... /lines.htm
.

Chceme získat porty na co nejvíc strojů a co nejvíc jazyků.


Nahoru
 Profil  
 
PříspěvekNapsal: 15 říj 2019, 18:39 
Offline
Pan Generální

Registrován: 22 kvě 2013, 21:14
Příspěvky: 2346
Bydliště: Bratislava
Has thanked: 259 times
Been thanked: 455 times
lukz píše:
vždy dvě čáry jsou navzájem symetrické podle svislé osy, aby výsledný obrazec byl symetrický.
Navrhujem obe ciary este zozrkadlit aj podla vodorovnej osi, vznikne este zaujimavsi obrazec.
A popripade zmensit pocet ciar, ono aj 32 ciar je na nizkych rozliseniach osembitov uplne bohate-prebohate. Ale zalezi od kroku o ktory sa zmenia suradnice bodov po kazdej ciare (a ich zrkadleniach).


Nahoru
 Profil  
 
PříspěvekNapsal: 15 říj 2019, 18:56 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 644
Bydliště: Most, Praha
Has thanked: 183 times
Been thanked: 162 times
Zrcadlení i podle vodorovné osy raději nedoporučuji - měl jsem i takovou verzi (se 4 čárami), ale byla nudnější, nebyl tam tak výrazný ten efekt běhání obrazce po obrazovce.

Jo také zkouším že u nízkého rozlišení je potřeba menší počet čar - pro 112x96 to je tak na 20.

Počet čar naopak zvýšit je zajímavé v případě, když hardware umí čáry ztmavovat - pak to vytváří zajímavý prostorový 3D efekt. https://www.shutterstock.com/video/clip ... mless-loop (ale to už je asi mimo schopnosti 8-bitů)


Nahoru
 Profil  
 
PříspěvekNapsal: 16 říj 2019, 00:10 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 644
Bydliště: Most, Praha
Has thanked: 183 times
Been thanked: 162 times
Zkusil jsem si to v C v ATpad (procesor ATmega). Není to sice historický počítač, ale je to 8-bit s dost omezenou RAM, rozlišení 112x104 pixelů s barevnými atributy jako ZX Spectrum, tak snad to nikoho nepohorší.
Kód:
#define LINES 20 // number of lines
#define W (WIDTH*8) // width in pixels
#define H (HEIGHT*8) // height in pixels

// lines history
char X1[LINES], Y1[LINES], X2[LINES], Y2[LINES];

// random direction
char RandDir(char old)
{
   char dir = RandByteMinMax(1, 4);
   if (old >= 0) dir = -dir;
   return dir;
}

// main function
void main()
{
   // initialize hardware
   Init();

   // variables
   char x1, y1, x2, y2; // coordinates
   x1 = W/2-1; x2 = W/2+1; y1 = H/2-1; y2 = H/2+1;
   char dx1, dy1, dx2, dy2; // increments
   dx1 = dy1 = dx2 = dy2 = -1;
   int i = 0; // line index
   char col = COLOR(WHITE, BLACK); // color
   char colnum = 10; // color counter
   for (i = 0; i < LINES; i++) X1[i] = Y1[i] = X2[i] = Y2[i] = 0;

   while (1)
   {
      // clear old lines
      ResLine(X1[i], Y1[i], X2[i], Y2[i]);
      ResLine(W-1-X1[i], Y1[i], W-1-X2[i], Y2[i]);

      // shift coordinates
      x1 += dx1; if ((x1 < 0) || (x1 >= (char)W)) { x1 -= dx1; dx1 = RandDir(dx1); x1 += dx1; }
      x2 += dx2; if ((x2 < 0) || (x2 >= (char)W)) { x2 -= dx2; dx2 = RandDir(dx2); x2 += dx2; }
      y1 += dy1; if ((y1 < 0) || (y1 >= (char)H)) { y1 -= dy1; dy1 = RandDir(dy1); y1 += dy1; }
      y2 += dy2; if ((y2 < 0) || (y2 >= (char)H)) { y2 -= dy2; dy2 = RandDir(dy2); y2 += dy2; }

      // new color
      if (--colnum == 0) { colnum = RandByteMinMax(10, 50); col = COLOR(RandByteMinMax(1,15), BLACK); }

      // draw new lines
      SetLine(x1, y1, x2, y2, col);
      SetLine(W-1-x1, y1, W-1-x2, y2, col);

      // save new coordinates
      X1[i] = x1; Y1[i] = y1; X2[i] = x2; Y2[i] = y2;

      // increase line index
      i = (i + 1) % LINES;

      // delay 1/10 seconds
      WaitFrameNum(6);
   }
}

Příloha:
lines.jpg
lines.jpg [ 51.7 KiB | Zobrazeno 909 krát ]


Nahoru
 Profil  
 
PříspěvekNapsal: 16 říj 2019, 08:41 
Offline
Pan Generální

Registrován: 22 kvě 2013, 21:14
Příspěvky: 2346
Bydliště: Bratislava
Has thanked: 259 times
Been thanked: 455 times
Panda38 píše:
Zrcadlení i podle vodorovné osy raději nedoporučuji - měl jsem i takovou verzi (se 4 čárami), ale byla nudnější, nebyl tam tak výrazný ten efekt běhání obrazce po obrazovce.
Mne zase pride ovela nudnejsie zrkadlenie iba po jednej osi, preto by som symetriu podla oboch osi jednoznacne doporucil. A ani efekt behania po obrazovke neutrpi ked sa zvoli spravny pocet ciar - pri zrkadleni podla oboch osi treba tych ciar samozrejme menej.

Alebo idealne je ak sa zrkadlenia rozne striedaju, potom si kazdy pride na svoje :)

Priklad efektu pre typicke 8-bitove rozlisenie 256x256 a 36 ciar na obrazovke:
phpBB [video]


Efekt v rozliseni 64x96, pocet ciar 8 (uplne staci):
phpBB [video]


A este len cisto pre porovnanie, rozlisenie 1600x1200.
V tomto pripade by boli ciary prilis tenke a nevyrazne, tak su hrube 4 pixely.
Takze teoreticke virtualne rozlisenie je akoze 400x300, a pocet ciar ktory sa mi k tomu hodil je 64.
phpBB [video]


Nahoru
 Profil  
 
PříspěvekNapsal: 16 říj 2019, 09:05 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 644
Bydliště: Most, Praha
Has thanked: 183 times
Been thanked: 162 times
No jo to už jsou trochu vyšší levely, když to přechází plynule mezi různými typy symetrií a barvy se mění podle duhového gradientu. :-)


Nahoru
 Profil  
 
PříspěvekNapsal: 16 říj 2019, 12:46 
Offline
Kecálek

Registrován: 28 říj 2016, 21:03
Příspěvky: 83
Has thanked: 9 times
Been thanked: 38 times
Příspěvky jsou tu pěkné. Abychom ale nezamluvili to zkoušení různých jazyků. Našel jsem na Scav nějaký X basic compiler, tak jsem udělal malý pokus v něm.

Počítač: Sharp MZ-800, Jazyk: XBC F 1.02 for MZ-7/800 (soubor X-Basic_Compiler.mzf)


Přílohy:
lines-xb.png
lines-xb.png [ 5.1 KiB | Zobrazeno 848 krát ]
Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 14 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz