Welcome, Guest
You have to register before you can post on our site.

Username/Email:
  

Password
  





Search Forums

(Advanced Search)

Forum Statistics
» Members: 308
» Latest member: Donaldvem
» Forum threads: 1,741
» Forum posts: 17,901

Full Statistics

Latest Threads
The QB64 IDE shell
Forum: Utilities
Last Post: JasonPag
09-16-2024, 05:37 PM
» Replies: 9
» Views: 764
Importance regarding Ches...
Forum: Utilities
Last Post: JasonPag
09-01-2024, 06:34 PM
» Replies: 0
» Views: 31
Chess and Analysis and En...
Forum: Utilities
Last Post: JasonPag
08-28-2024, 02:37 PM
» Replies: 0
» Views: 32
DAY 009:_PutImage
Forum: Keyword of the Day!
Last Post: grymmjack
09-02-2023, 02:57 PM
» Replies: 54
» Views: 2,034
Fall Banner Contest?
Forum: Site Suggestions
Last Post: grymmjack
08-31-2023, 11:50 PM
» Replies: 36
» Views: 1,262
ColorPicker - Function th...
Forum: Dav
Last Post: Dav
08-31-2023, 11:04 PM
» Replies: 3
» Views: 316
Goals(1) = New Tile()
Forum: Works in Progress
Last Post: RhoSigma
08-31-2023, 09:45 PM
» Replies: 3
» Views: 127
micro(A)v11
Forum: QBJS, BAM, and Other BASICs
Last Post: bplus
08-31-2023, 09:14 PM
» Replies: 90
» Views: 3,589
Updating The Single Most ...
Forum: QBJS, BAM, and Other BASICs
Last Post: bplus
08-31-2023, 09:13 PM
» Replies: 7
» Views: 254
QBJS Image Question
Forum: QBJS, BAM, and Other BASICs
Last Post: bplus
08-31-2023, 05:49 PM
» Replies: 5
» Views: 155

 
  InForm-pe for QB64PE v 3.4.0 on Linux.
Posted by: Fifi - 11-07-2022, 10:07 PM - Forum: Announcements - Replies (1)

Hi all,

This post is for the users who want to test or use InForm with the latest QB64PE version 3.4.0.

I've updated my multi lingual installation bash script that includes both QB64PE v 3.4.0 and InForm-pe (a fork of InForm v 1.3 that I made to communicate with the latest QB64PE release).

This script allows you to create icons starters for QB64PE, InForm-pe and the QB64PE folder directly on your desktop and adds the ability to invoque QB64PE from any terminal session without being into the QB64PE folder (as you can do with any standard compiler such as gcc).

You can get my pure bash script here: Bash muti lingual installation script.

The script can also cleanly uninstall QB64PE and InForm (they're installed in the /opt/qb64pe folder to not interfer with your own installation folder) as well as their different starters (desktop and programming menu) and you're free to copy their complete install forder to any other location that best suits your needs (then you'll have to modify the different starters).

Note: due to my poor and limited programming capabilities, I do not provide any support for InForm (so, no need for a sub-section for me). [Image: tongue.png]

Thank you for your return and enjoy QB64PE v 3.4.0 with InForm-pe when creating event driven GUI applications with the ease of the BASIC language.

Cheers.
Fifi

Print this item

  Select Case mistake
Posted by: Kernelpanic - 11-07-2022, 09:09 PM - Forum: Help Me! - Replies (18)

A question about Select Case. The query should be: Case Is > 5500 but less than 7000

I just can't do it. I even got a compiler error with it.

[Image: Select-Case-Fehler2022-11-07.jpg]



Attached Files
.txt   SelectCase-Fehler.txt (Size: 1.83 KB / Downloads: 26)
Print this item

  QBJS v0.6.0 Release
Posted by: dbox - 11-07-2022, 01:43 PM - Forum: QBJS, BAM, and Other BASICs - Replies (32)

Hi All,

The latest version of QBJS (0.6.0) is now available.  Here are some of the highlights for this release:

File I/O Support
Support has been added for standard QBasic file input/output.  QBJS now has a virtual file system that supports most file system operations.  As part of this update there is now a File tab in the console to manage the virtual file system.  Files can be dragged into the currently selected folder and downloaded by clicking the file name.

What is supported so far:
- INPUT, OUTPUT, APPEND and BINARY file modes

What is NOT supported yet:
- RANDOM file mode


Project Support
Now more complex projects can be managed and shared in QBJS.  There is a new toolbar which allows you to open and save either individual .bas source files or a .zip file containing an entire project.  Additionally, you can share publicly published projects with the src parameter.  Here are a couple of examples:
- Simple Project Example
- Sleighless


Expanded Set of QB/QB64 Keywords
25 new keywords have been included with this release:
_CWD$, _DirExists, _FileExists, _OS$, _StartDir, ChDir, Close, EOF, Files, FreeFile, Get, Input (file statement), Kill, Line Input (file statement), LOF, MkDir, Open, Print (file statement), Put, Name, RmDir, Seek, Write, Write (file statement), XOR (bitwise)


See the full release announcement for a complete list of fixes and enhancements.

Download the latest version of QBJS at: https://github.com/boxgaming/qbjs/releases/latest

Try it out online here: https://qbjs.org

Print this item

  QBJS Complex Numbers
Posted by: vince - 11-07-2022, 09:03 AM - Forum: QBJS, BAM, and Other BASICs - No Replies

some basic complex math routines to get started

Code: (Select All)
const sw = 1024
const sh = 768

dim shared pi
pi = 4*atn(1)

zoom = 140

screen _newimage(sw, sh, 32)

dim z(1), w(1), p(1), q(1), f(1), g(1)

for yy=0 to sh
for xx=0 to sw

    x = (xx - sw/2)/zoom
    y = (sh/2 - yy)/zoom

i=0
select case i
case 0
    cnum p, x + 1, y - 1
    cnum q, x + 1, y + 1

    cnum z, 1, 0
    cmul w, z, p

    cnum z, w(0), w(1)
    cmul w, z, q

    cnum g, x - 1, y
    cnum z, w(0), w(1)
    cdiv w, z, g

    'pset (xx, yy), checker(w)
    pset (xx, yy), hue1(w)
case 1

    'cnum z, exp(1), 0
    cnum z, x, y
    'cnum w, x, y
    ccos w, z
    'cexp w, z, w
   
    pset (xx, yy), checker(w)
   
case 2

    n=10

    cnum g, 0, 0
    for j=0 to n-1
        'C: z(t)
        p(0) = 1.5*cos(j*2*pi/n)
        p(1) = 1.5*sin(j*2*pi/n)
       
        'f(z(t))
        csin w, p
        'cnum f, exp(1), 0
        'cexp w, f, w
       
        'f(z)/(z - z0)^(n + 1)
        cnum q, p(0) - x, p(1) - y
        cnum f, 2, 0
        cexp q, q, f
        cdiv w, w, q
       
        'dz/dt
        cnum q, -1.5*sin(j*2*pi/n), 1.5*cos(j*2*pi/n)
        cmul w, w, q
       
        if j=0 or j=n - 1 then
            g(0) = g(0) + 0.5*w(0)
            g(1) = g(1) + 0.5*w(1)
        else
            g(0) = g(0) + 0.5*w(0)
            g(1) = g(1) + 0.5*w(1)
        end if
    next
   
    'dt
    w(0) = g(0)*2*pi/n
    w(1) = g(1)*2*pi/n
   
    '1/(2 pi i)
    cnum q, 0, -1/(2*pi)
    cmul w, w, q
   
    'n!
    w(0) = 1*w(0)
    w(1) = 1*w(1)
   
    pset (xx, yy), checker(w)

case 3

    cnum z, x + 1, y
    cnum w, x - 1, y
   
    zz = checker(z)
    if zz = 0 then
    else
        pset (xx, yy), zz
    end if
   
    ww = checker(w)
    if ww = 0 then
    else
        pset (xx, yy), ww
    end if
   
    'pset (xx, yy), checker(z)' + checker(w)
    'pset (xx, yy), hue1(w)

end select
next
next

'n=100
'for a=0 to 2*pi step 2*pi/n
'    x = 1.5*cos(a)
'    y = 1.5*sin(a)
'    circle (x*zoom + sw/2, sh/2 - y*zoom), 3, _rgb(255,255,0)
'next
'sleep
system

function hue1( z() )

    m = sqr(z(0)*z(0) + z(1)*z(1))
    a = (pi + _atan2(z(1), z(0))) / (2*_pi)

    'dim rr, gg, bb
    'hue(v) ( .6 + .6 * cos( 2.*PI*(v) + vec3(0,-2.*PI/3.,2.*PI/3.)))
    rr =  0.5 - 0.5*sin(2*pi*a - pi/2)
    gg = (0.5 + 0.5*sin(2*pi*a*1.5 - pi/2)) * (a < 0.66)
    bb = (0.5 + 0.5*sin(2*pi*a*1.5 + pi/2)) * (a > 0.33)

    'polar contouring
    n = 16
    mm = (m*500) mod 500
    pp = abs(a*n - int(a*n))

    rr = rr - 0.0005*mm - 0.14*pp
    gg = gg - 0.0005*mm - 0.14*pp
    bb = bb - 0.0005*mm - 0.14*pp

    hue1 = _rgb(255*rr, 255*gg, 255*bb)
end function

function checker(z())
    if 0 then
        x = z(0)
        y = z(1)
    else
        x = _atan2(z(1), z(0))/(pi/8)
        y = sqr(z(0)*z(0) + z(1)*z(1))
    end if

    a = 2*(abs(x - int(x)))
    'b = 2*(abs(y - int(y)))

    $If Javascript Then
        c = a ^ b;
    $End If

    if c = 0 then
        checker = 0'_rgb(0,0,0)
    else
        checker = _rgb(255,255,255)
    end if
end function

sub cnum( w(), x, y )
    w(0) = x
    w(1) = y
end sub

sub cmul( w(), z1(), z2() )
    x1 = z1(0)
    y1 = z1(1)
    a1 = z2(0)
    b1 = z2(1)

    w(0) = x1*a1 - y1*b1
    w(1) = x1*b1 + y1*a1
end sub

sub cdiv( w(), z1(), z2() )
    x1 = z1(0)
    y1 = z1(1)
    a1 = z2(0)
    b1 = z2(1)

    d1 = a1*a1 + b1*b1
    w(0) = (x1*a1 + y1*b1)/d1
    w(1) = (y1*a1 - x1*b1)/d1
end sub

sub cexp( w(), z1(), z2() )
    x1 = z1(0)
    y1 = z1(1)
    a1 = z2(0)
    b1 = z2(1)
   
    lnz = x1*x1 + y1*y1
   
    if lnz = 0 then
        w(0) = 0
        w(1) = 0
    else
        lnz = 0.5*log(lnz)
        argz = _atan2(y1, x1)
        mz = exp(a1*lnz - b1*argz)
        az = a1*argz + b1*lnz
        w(0) = mz*cos(az)
        w(1) = mz*sin(az)
    end if
end sub

function cosh(x)
    cosh = 0.5*(exp(x) + exp(-x))
end function

function sinh(x)
    sinh = 0.5*(exp(x) - exp(-x))
end function

sub csin( w(), z1() )
    x1 = z1(0)
    y1 = z1(1)
    w(0) = sin(x1)*cosh(y1)
    w(1) = cos(x1)*sinh(y1)
end sub

sub ccos( w(), z1() )
    x1 = z1(0)
    y1 = z1(1)
    w(0) = cos(x1)*cosh(y1)
    w(1) =-sin(x1)*sinh(y1)
end sub

Print this item

  QBJS Sextris
Posted by: vince - 11-07-2022, 08:57 AM - Forum: QBJS, BAM, and Other BASICs - No Replies

Block stacking game

Code: (Select All)
'todo: optimize shape rotations around center of mass, otherwise is playable

randomize timer

'pentris
'dim shared piece(17, 2, 4)

'sextris
dim shared piece(34, 2, 5)
dim shared piece_color(34)
dim shared size, sw, sh

'big x and y
dim shared xx, yy

size = 25
sw = 16
sh = 35

redim shared board(sw - 1, sh - 1)

piece(0,0,0)=0: piece(0,1,0)=1: piece(0,2,0)=0
piece(0,0,1)=0: piece(0,1,1)=1: piece(0,2,1)=0
piece(0,0,2)=0: piece(0,1,2)=1: piece(0,2,2)=0
piece(0,0,3)=0: piece(0,1,3)=1: piece(0,2,3)=0
piece(0,0,4)=0: piece(0,1,4)=1: piece(0,2,4)=0
piece(0,0,5)=0: piece(0,1,5)=1: piece(0,2,5)=0

piece(1,0,0)=0: piece(1,1,0)=0: piece(1,2,0)=0
piece(1,0,1)=0: piece(1,1,1)=1: piece(1,2,1)=1
piece(1,0,2)=0: piece(1,1,2)=1: piece(1,2,2)=0
piece(1,0,3)=0: piece(1,1,3)=1: piece(1,2,3)=0
piece(1,0,4)=0: piece(1,1,4)=1: piece(1,2,4)=0
piece(1,0,5)=0: piece(1,1,5)=1: piece(1,2,5)=0

piece(2,0,0)=0: piece(2,1,0)=0: piece(2,2,0)=0
piece(2,0,1)=0: piece(2,1,1)=1: piece(2,2,1)=0
piece(2,0,2)=0: piece(2,1,2)=1: piece(2,2,2)=1
piece(2,0,3)=0: piece(2,1,3)=1: piece(2,2,3)=0
piece(2,0,4)=0: piece(2,1,4)=1: piece(2,2,4)=0
piece(2,0,5)=0: piece(2,1,5)=1: piece(2,2,5)=0

piece(3,0,0)=0: piece(3,1,0)=0: piece(3,2,0)=0
piece(3,0,1)=0: piece(3,1,1)=1: piece(3,2,1)=0
piece(3,0,2)=0: piece(3,1,2)=1: piece(3,2,2)=0
piece(3,0,3)=0: piece(3,1,3)=1: piece(3,2,3)=1
piece(3,0,4)=0: piece(3,1,4)=1: piece(3,2,4)=0
piece(3,0,5)=0: piece(3,1,5)=1: piece(3,2,5)=0

piece(4,0,0)=0: piece(4,1,0)=0: piece(4,2,0)=0
piece(4,0,1)=0: piece(4,1,1)=0: piece(4,2,1)=1
piece(4,0,2)=0: piece(4,1,2)=1: piece(4,2,2)=1
piece(4,0,3)=0: piece(4,1,3)=1: piece(4,2,3)=0
piece(4,0,4)=0: piece(4,1,4)=1: piece(4,2,4)=0
piece(4,0,5)=0: piece(4,1,5)=1: piece(4,2,5)=0

piece(5,0,0)=0: piece(5,1,0)=0: piece(5,2,0)=0
piece(5,0,1)=0: piece(5,1,1)=0: piece(5,2,1)=0
piece(5,0,2)=0: piece(5,1,2)=1: piece(5,2,2)=1
piece(5,0,3)=0: piece(5,1,3)=1: piece(5,2,3)=1
piece(5,0,4)=0: piece(5,1,4)=1: piece(5,2,4)=0
piece(5,0,5)=0: piece(5,1,5)=1: piece(5,2,5)=0

piece(6,0,0)=0: piece(6,1,0)=0: piece(6,2,0)=0
piece(6,0,1)=0: piece(6,1,1)=0: piece(6,2,1)=0
piece(6,0,2)=0: piece(6,1,2)=1: piece(6,2,2)=1
piece(6,0,3)=0: piece(6,1,3)=1: piece(6,2,3)=0
piece(6,0,4)=0: piece(6,1,4)=1: piece(6,2,4)=1
piece(6,0,5)=0: piece(6,1,5)=1: piece(6,2,5)=0
'''
piece(7,0,0)=0: piece(7,1,0)=0: piece(7,2,0)=0
piece(7,0,1)=0: piece(7,1,1)=0: piece(7,2,1)=0
piece(7,0,2)=0: piece(7,1,2)=1: piece(7,2,2)=1
piece(7,0,3)=0: piece(7,1,3)=1: piece(7,2,3)=0
piece(7,0,4)=0: piece(7,1,4)=1: piece(7,2,4)=0
piece(7,0,5)=0: piece(7,1,5)=1: piece(7,2,5)=1

piece(8,0,0)=0: piece(8,1,0)=0: piece(8,2,0)=0
piece(8,0,1)=0: piece(8,1,1)=0: piece(8,2,1)=0
piece(8,0,2)=0: piece(8,1,2)=1: piece(8,2,2)=0
piece(8,0,3)=0: piece(8,1,3)=1: piece(8,2,3)=1
piece(8,0,4)=0: piece(8,1,4)=1: piece(8,2,4)=1
piece(8,0,5)=0: piece(8,1,5)=1: piece(8,2,5)=0

piece(9,0,0)=0: piece(9,1,0)=0: piece(9,2,0)=0
piece(9,0,1)=0: piece(9,1,1)=0: piece(9,2,1)=0
piece(9,0,2)=1: piece(9,1,2)=1: piece(9,2,2)=1
piece(9,0,3)=1: piece(9,1,3)=0: piece(9,2,3)=0
piece(9,0,4)=1: piece(9,1,4)=0: piece(9,2,4)=0
piece(9,0,5)=1: piece(9,1,5)=0: piece(9,2,5)=0

piece(10,0,0)=0: piece(10,1,0)=0: piece(10,2,0)=0
piece(10,0,1)=0: piece(10,1,1)=0: piece(10,2,1)=0
piece(10,0,2)=1: piece(10,1,2)=0: piece(10,2,2)=0
piece(10,0,3)=1: piece(10,1,3)=1: piece(10,2,3)=1
piece(10,0,4)=1: piece(10,1,4)=0: piece(10,2,4)=0
piece(10,0,5)=1: piece(10,1,5)=0: piece(10,2,5)=0

piece(11,0,0)=0: piece(11,1,0)=0: piece(11,2,0)=0
piece(11,0,1)=0: piece(11,1,1)=0: piece(11,2,1)=0
piece(11,0,2)=1: piece(11,1,2)=1: piece(11,2,2)=1
piece(11,0,3)=0: piece(11,1,3)=1: piece(11,2,3)=0
piece(11,0,4)=0: piece(11,1,4)=1: piece(11,2,4)=0
piece(11,0,5)=0: piece(11,1,5)=1: piece(11,2,5)=0

piece(12,0,0)=0: piece(12,1,0)=0: piece(12,2,0)=0
piece(12,0,1)=0: piece(12,1,1)=0: piece(12,2,1)=0
piece(12,0,2)=0: piece(12,1,2)=1: piece(12,2,2)=1
piece(12,0,3)=1: piece(12,1,3)=1: piece(12,2,3)=0
piece(12,0,4)=0: piece(12,1,4)=1: piece(12,2,4)=0
piece(12,0,5)=0: piece(12,1,5)=1: piece(12,2,5)=0

piece(13,0,0)=0: piece(13,1,0)=0: piece(13,2,0)=0
piece(13,0,1)=0: piece(13,1,1)=0: piece(13,2,1)=0
piece(13,0,2)=0: piece(13,1,2)=1: piece(13,2,2)=1
piece(13,0,3)=0: piece(13,1,3)=1: piece(13,2,3)=0
piece(13,0,4)=1: piece(13,1,4)=1: piece(13,2,4)=0
piece(13,0,5)=0: piece(13,1,5)=1: piece(13,2,5)=0
'''
piece(14,0,0)=0: piece(14,1,0)=0: piece(14,2,0)=0
piece(14,0,1)=0: piece(14,1,1)=0: piece(14,2,1)=0
piece(14,0,2)=0: piece(14,1,2)=1: piece(14,2,2)=1
piece(14,0,3)=0: piece(14,1,3)=1: piece(14,2,3)=0
piece(14,0,4)=0: piece(14,1,4)=1: piece(14,2,4)=0
piece(14,0,5)=1: piece(14,1,5)=1: piece(14,2,5)=0

piece(15,0,0)=0: piece(15,1,0)=0: piece(15,2,0)=0
piece(15,0,1)=0: piece(15,1,1)=0: piece(15,2,1)=0
piece(15,0,2)=0: piece(15,1,2)=1: piece(15,2,2)=0
piece(15,0,3)=0: piece(15,1,3)=1: piece(15,2,3)=1
piece(15,0,4)=1: piece(15,1,4)=1: piece(15,2,4)=0
piece(15,0,5)=0: piece(15,1,5)=1: piece(15,2,5)=0

piece(16,0,0)=0: piece(16,1,0)=0: piece(16,2,0)=0
piece(16,0,1)=0: piece(16,1,1)=0: piece(16,2,1)=0
piece(16,0,2)=0: piece(16,1,2)=1: piece(16,2,2)=0
piece(16,0,3)=1: piece(16,1,3)=1: piece(16,2,3)=1
piece(16,0,4)=0: piece(16,1,4)=1: piece(16,2,4)=0
piece(16,0,5)=0: piece(16,1,5)=1: piece(16,2,5)=0

piece(17,0,0)=0: piece(17,1,0)=0: piece(17,2,0)=0
piece(17,0,1)=0: piece(17,1,1)=0: piece(17,2,1)=0
piece(17,0,2)=0: piece(17,1,2)=1: piece(17,2,2)=0
piece(17,0,3)=1: piece(17,1,3)=1: piece(17,2,3)=1
piece(17,0,4)=1: piece(17,1,4)=0: piece(17,2,4)=0
piece(17,0,5)=1: piece(17,1,5)=0: piece(17,2,5)=0

piece(18,0,0)=0: piece(18,1,0)=0: piece(18,2,0)=0
piece(18,0,1)=0: piece(18,1,1)=0: piece(18,2,1)=0
piece(18,0,2)=0: piece(18,1,2)=1: piece(18,2,2)=0
piece(18,0,3)=1: piece(18,1,3)=1: piece(18,2,3)=0
piece(18,0,4)=1: piece(18,1,4)=0: piece(18,2,4)=0
piece(18,0,5)=1: piece(18,1,5)=1: piece(18,2,5)=0

piece(19,0,0)=0: piece(19,1,0)=0: piece(19,2,0)=0
piece(19,0,1)=0: piece(19,1,1)=1: piece(19,2,1)=0
piece(19,0,2)=0: piece(19,1,2)=1: piece(19,2,2)=0
piece(19,0,3)=1: piece(19,1,3)=1: piece(19,2,3)=0
piece(19,0,4)=1: piece(19,1,4)=0: piece(19,2,4)=0
piece(19,0,5)=1: piece(19,1,5)=0: piece(19,2,5)=0

piece(20,0,0)=0: piece(20,1,0)=0: piece(20,2,0)=0
piece(20,0,1)=0: piece(20,1,1)=0: piece(20,2,1)=0
piece(20,0,2)=0: piece(20,1,2)=1: piece(20,2,2)=0
piece(20,0,3)=1: piece(20,1,3)=1: piece(20,2,3)=0
piece(20,0,4)=1: piece(20,1,4)=1: piece(20,2,4)=0
piece(20,0,5)=1: piece(20,1,5)=0: piece(20,2,5)=0
'''
piece(21,0,0)=0: piece(21,1,0)=0: piece(21,2,0)=0
piece(21,0,1)=0: piece(21,1,1)=0: piece(21,2,1)=0
piece(21,0,2)=0: piece(21,1,2)=0: piece(21,2,2)=0
piece(21,0,3)=1: piece(21,1,3)=1: piece(21,2,3)=0
piece(21,0,4)=1: piece(21,1,4)=1: piece(21,2,4)=0
piece(21,0,5)=1: piece(21,1,5)=1: piece(21,2,5)=0

piece(22,0,0)=0: piece(22,1,0)=0: piece(22,2,0)=0
piece(22,0,1)=0: piece(22,1,1)=0: piece(22,2,1)=0
piece(22,0,2)=0: piece(22,1,2)=0: piece(22,2,2)=1
piece(22,0,3)=1: piece(22,1,3)=1: piece(22,2,3)=1
piece(22,0,4)=0: piece(22,1,4)=1: piece(22,2,4)=0
piece(22,0,5)=0: piece(22,1,5)=1: piece(22,2,5)=0

piece(23,0,0)=0: piece(23,1,0)=0: piece(23,2,0)=0
piece(23,0,1)=0: piece(23,1,1)=0: piece(23,2,1)=0
piece(23,0,2)=0: piece(23,1,2)=0: piece(23,2,2)=0
piece(23,0,3)=1: piece(23,1,3)=1: piece(23,2,3)=1
piece(23,0,4)=0: piece(23,1,4)=1: piece(23,2,4)=1
piece(23,0,5)=0: piece(23,1,5)=1: piece(23,2,5)=0

piece(24,0,0)=0: piece(24,1,0)=0: piece(24,2,0)=0
piece(24,0,1)=0: piece(24,1,1)=0: piece(24,2,1)=0
piece(24,0,2)=0: piece(24,1,2)=0: piece(24,2,2)=1
piece(24,0,3)=0: piece(24,1,3)=1: piece(24,2,3)=1
piece(24,0,4)=1: piece(24,1,4)=1: piece(24,2,4)=0
piece(24,0,5)=0: piece(24,1,5)=1: piece(24,2,5)=0

piece(25,0,0)=0: piece(25,1,0)=0: piece(25,2,0)=0
piece(25,0,1)=0: piece(25,1,1)=0: piece(25,2,1)=0
piece(25,0,2)=0: piece(25,1,2)=0: piece(25,2,2)=1
piece(25,0,3)=1: piece(25,1,3)=1: piece(25,2,3)=1
piece(25,0,4)=1: piece(25,1,4)=0: piece(25,2,4)=0
piece(25,0,5)=1: piece(25,1,5)=0: piece(25,2,5)=0

piece(26,0,0)=0: piece(26,1,0)=0: piece(26,2,0)=0
piece(26,0,1)=0: piece(26,1,1)=0: piece(26,2,1)=0
piece(26,0,2)=0: piece(26,1,2)=1: piece(26,2,2)=1
piece(26,0,3)=1: piece(26,1,3)=1: piece(26,2,3)=0
piece(26,0,4)=1: piece(26,1,4)=0: piece(26,2,4)=0
piece(26,0,5)=1: piece(26,1,5)=0: piece(26,2,5)=0

piece(27,0,0)=0: piece(27,1,0)=0: piece(27,2,0)=0
piece(27,0,1)=0: piece(27,1,1)=0: piece(27,2,1)=0
piece(27,0,2)=0: piece(27,1,2)=0: piece(27,2,2)=0
piece(27,0,3)=1: piece(27,1,3)=1: piece(27,2,3)=1
piece(27,0,4)=1: piece(27,1,4)=0: piece(27,2,4)=1
piece(27,0,5)=1: piece(27,1,5)=0: piece(27,2,5)=0
'''
piece(28,0,0)=0: piece(28,1,0)=0: piece(28,2,0)=0
piece(28,0,1)=0: piece(28,1,1)=0: piece(28,2,1)=0
piece(28,0,2)=0: piece(28,1,2)=0: piece(28,2,2)=0
piece(28,0,3)=1: piece(28,1,3)=0: piece(28,2,3)=1
piece(28,0,4)=1: piece(28,1,4)=1: piece(28,2,4)=1
piece(28,0,5)=1: piece(28,1,5)=0: piece(28,2,5)=0

piece(29,0,0)=0: piece(29,1,0)=0: piece(29,2,0)=0
piece(29,0,1)=0: piece(29,1,1)=0: piece(29,2,1)=0
piece(29,0,2)=0: piece(29,1,2)=0: piece(29,2,2)=0
piece(29,0,3)=1: piece(29,1,3)=0: piece(29,2,3)=1
piece(29,0,4)=1: piece(29,1,4)=1: piece(29,2,4)=1
piece(29,0,5)=0: piece(29,1,5)=1: piece(29,2,5)=0

piece(30,0,0)=0: piece(30,1,0)=0: piece(30,2,0)=0
piece(30,0,1)=0: piece(30,1,1)=0: piece(30,2,1)=0
piece(30,0,2)=0: piece(30,1,2)=1: piece(30,2,2)=1
piece(30,0,3)=0: piece(30,1,3)=1: piece(30,2,3)=0
piece(30,0,4)=1: piece(30,1,4)=1: piece(30,2,4)=0
piece(30,0,5)=1: piece(30,1,5)=0: piece(30,2,5)=0

piece(31,0,0)=0: piece(31,1,0)=0: piece(31,2,0)=0
piece(31,0,1)=0: piece(31,1,1)=0: piece(31,2,1)=0
piece(31,0,2)=0: piece(31,1,2)=0: piece(31,2,2)=0
piece(31,0,3)=1: piece(31,1,3)=0: piece(31,2,3)=0
piece(31,0,4)=1: piece(31,1,4)=1: piece(31,2,4)=0
piece(31,0,5)=1: piece(31,1,5)=1: piece(31,2,5)=1

piece(32,0,0)=0: piece(32,1,0)=0: piece(32,2,0)=0
piece(32,0,1)=0: piece(32,1,1)=0: piece(32,2,1)=0
piece(32,0,2)=0: piece(32,1,2)=0: piece(32,2,2)=0
piece(32,0,3)=0: piece(32,1,3)=1: piece(32,2,3)=0
piece(32,0,4)=1: piece(32,1,4)=1: piece(32,2,4)=1
piece(32,0,5)=1: piece(32,1,5)=1: piece(32,2,5)=0

piece(33,0,0)=0: piece(33,1,0)=0: piece(33,2,0)=0
piece(33,0,1)=0: piece(33,1,1)=0: piece(33,2,1)=0
piece(33,0,2)=0: piece(33,1,2)=0: piece(33,2,2)=0
piece(33,0,3)=0: piece(33,1,3)=0: piece(33,2,3)=1
piece(33,0,4)=1: piece(33,1,4)=1: piece(33,2,4)=1
piece(33,0,5)=1: piece(33,1,5)=1: piece(33,2,5)=0

piece(34,0,0)=0: piece(34,1,0)=0: piece(34,2,0)=0
piece(34,0,1)=0: piece(34,1,1)=0: piece(34,2,1)=0
piece(34,0,2)=0: piece(34,1,2)=0: piece(34,2,2)=1
piece(34,0,3)=0: piece(34,1,3)=1: piece(34,2,3)=1
piece(34,0,4)=1: piece(34,1,4)=1: piece(34,2,4)=0
piece(34,0,5)=1: piece(34,1,5)=0: piece(34,2,5)=0

screen _newimage(sw*size, sh*size, 32)

piece_color(0) = _rgb(255,0,0)
piece_color(1) = _rgb(255,145,0)
piece_color(2) = _rgb(255,200,211)
piece_color(3) = _rgb(0,255,220)
piece_color(4) = _rgb(0,230,255)
piece_color(5) = _rgb(0,170,10)
piece_color(6) = _rgb(0,250,20)
piece_color(7) = _rgb(128,230,0)
piece_color(8) = _rgb(80,150,0)
piece_color(9) = _rgb(0,200,0)
piece_color(10) = _rgb(50,160,170)
piece_color(11) = _rgb(50,110,175)
piece_color(12) = _rgb(50,50,175)
piece_color(13) = _rgb(110,50,175)
piece_color(14) = _rgb(210,0,255)
piece_color(15) = _rgb(110,0,130)
piece_color(16) = _rgb(255,0,140)
piece_color(17) = _rgb(170,0,100)
piece_color(18) = _rgb(50,160,170)
piece_color(19) = _rgb(50,110,175)
piece_color(20) = _rgb(50,50,175)
piece_color(21) = _rgb(110,50,175)
piece_color(22) = _rgb(210,0,255)
piece_color(23) = _rgb(110,0,130)
piece_color(24) = _rgb(255,0,140)
piece_color(25) = _rgb(170,0,100)
piece_color(26) = _rgb(50,160,170)
piece_color(27) = _rgb(50,110,175)
piece_color(28) = _rgb(50,50,175)
piece_color(29) = _rgb(110,50,175)
piece_color(30) = _rgb(210,0,255)
piece_color(31) = _rgb(110,0,130)
piece_color(32) = _rgb(255,0,140)
piece_color(33) = _rgb(170,0,100)
piece_color(34) = _rgb(170,0,100)

dim t as double

redraw = 1

speed = 3
lines = 0
pause = 0
putpiece = 0
startx = (sw - 4)/2

pn = int(rnd*35)
px = startx
py = -2
rot = 0

dim title$
title$ = "lines="+ltrim$(str$(lines))+",speed="++ltrim$(str$(speed))
_title title$

t = timer

do
    if (timer - t) > (1/speed) and not pause then
        if valid(pn, px, py + 1, rot) then py = py + 1 else putpiece = 1

        t = timer
        redraw = 1
    end if

    if putpiece then
        if valid(pn, px, py, rot) then
            n = place(pn, px, py, rot)
            if n then
                lines = lines + n
                title$ = "lines="+ltrim$(str$(lines))+",speed="++ltrim$(str$(speed))
                _title title$
            end if
        end if

        pn = int(rnd*35)
        px = startx
        py = -2
        rot = 0

        putpiece = 0
        redraw = 1

        if not valid(pn, px, py, rot) then
            for y=0 to sh-1
                for x=0 to sw-1
                    board(x, y) = 0
                next
            next
            lines = 0
            title$ = "lines="+ltrim$(str$(lines))+",speed="++ltrim$(str$(speed))
            _title title$
        end if
    end if

    if redraw then
        line (0,0)-(sw*size, sh*size),_rgb(0,0,0),bf
        for y=0 to sh - 1
            for x=0 to sw - 1
                if board(x, y) <> 0 then
                    line (x*size, y*size)-step(size-2, size-2), piece_color(board(x, y)-1), bf
                else
                    line (x*size, y*size)-step(size-2, size-2), _rgb(50,50,50), b
                end if
            next
        next

        for y=0 to 5
            for x=0 to 2
                rotate x, y, pn, rot
                if piece(pn, x, y) then line ((px + xx)*size, (py + yy)*size)-step(size-2, size-2), piece_color(pn), bf
            next
        next

        _display
        redraw = 0
    end if

    k = _keyhit
    if k then
        shift = _keydown(100304) or _keydown(100303)
        select case k
        case 18432 'up
            if valid(pn, px, py, (rot + 1) mod 4) then rot = (rot + 1) mod 4
            pause = 0
        case 19200 'left
            if shift then
                for x2=0 to sw-1
                    if not valid(pn, px - x2, py, rot) then exit for
                next
                px = px - x2 + 1
            else
                if valid(pn, px - 1, py, rot) then px = px - 1
            end if
            pause = 0
        case 19712 'right
            if shift then
                for x2=px to sw-1
                    if not valid(pn, x2, py, rot) then exit for
                next
                px = x2 - 1
            else
                if valid(pn, px + 1, py, rot) then px = px + 1
            end if
            pause = 0
        case 20480, 32 'down
            if shift or k = 32 then
                for y2=py to sh-1
                    if not valid(pn, px, y2, rot) then exit for
                next
                py = y2 - 1
                putpiece = 1
            else
                if valid(pn, px, py + 1, rot) then py = py + 1
            end if
            pause = 0
        case 112 'p
            pause = not pause
        case 13 'enter
            for y=0 to sh-1
                for x=0 to sw-1
                    board(x, y) = 0
                next
            next
            pn = int(rnd*35)
            px = startx
            py = -2
            rot = 0
            putpiece = 0
            lines = 0
            title$ = "lines="+ltrim$(str$(lines))+",speed="++ltrim$(str$(speed))
            _title title$
        case 43, 61 'plus
            if speed < 100 then
                speed = speed + 1
                title$ = "lines="+ltrim$(str$(lines))+",speed="++ltrim$(str$(speed))
                _title title$
            end if
        case 95, 45
            if speed > 1 then
                speed = speed - 1
                title$ = "lines="+ltrim$(str$(lines))+",speed="++ltrim$(str$(speed))
                _title title$
            end if
        case 27
            exit do
        end select

        redraw = 1
    end if
   
    _limit 60
loop
system

sub rotate(x, y, pn, rot)
    select case pn
    case 0
        rot_new = rot mod 2
    case else
        rot_new = rot
    end select

    select case rot_new
    case 0
        xx = x
        yy = y
    case 1
        if pn = 0 then
            xx = y - 1
            yy = 3 - x
        elseif pn = 14 or pn = 15 then
            xx = y - 1
            yy = 3 - x
        else
            xx = y - 2
            yy = 4 - x
        end if
    case 2
        if pn = 14 or pn = 15 then
            xx = 2 - x
            yy = 4 - y
        else
            xx = 2 - x
            yy = 6 - y
        end if
    case 3
        if pn = 14 or pn = 15 then
            xx = 3 - y
            yy = x + 1
        else
            xx = 4 - y
            yy = x + 2
        end if
    end select
end sub

function valid(pn, px, py, rot)
    for y=0 to 5
        for x=0 to 2
            rotate x, y, pn, rot
            if py + yy >= 0 then
                if piece(pn, x, y) then
                    if (px + xx >= sw) or (px + xx < 0) then
                        valid = 0
                        exit function
                    end if
                    if (py + yy >= sh) then
                        valid = 0
                        exit function
                    end if
                    'if (py >= 0) then
                    if board(px + xx, py + yy) then
                        valid = 0
                        exit function
                    end if
                    'end if
                end if
            end if
        next
    next
    valid = 1
end function

function place(pn, px, py, rot)
    lines2 = 0

    for y=0 to 5
        for x=0 to 2
            rotate x, y, pn, rot
            if py + yy >= 0 then
                if piece(pn, x, y) then board(px + xx, py + yy) = pn + 1
            end if
        next
    next

    'clear lines
    for y=py-6 to py+6
        if y>=0 and y<sh then
            clr = 1
            for x=0 to sw - 1
                if board(x, y) = 0 then
                    clr = 0
                    exit for
                end if
            next

            if clr then
                lines2 = lines2 + 1
                for y2=y to 1 step -1
                    for x=0 to sw-1
                        board(x, y2) = board(x, y2-1)
                    next
                next
            end if
        end if
    next

    place = lines2
end function

Print this item

  DAY 002: CVSMBF
Posted by: SMcNeill - 11-07-2022, 05:10 AM - Forum: Keyword of the Day! - Replies (7)

Yay!  Today, we get one of those keywords that I personally find utterly useless, but it is what it is. Tongue

Let's start by talking about how to decipher that long string of random characters, and try and understand what CVSMBF might actually stand for:

CV -- Convert
S -- SINGLE
M -- Microsoft
B -- Binary
F -- Format

So, what does it do?  

It converts a properly formatted string (one stored in Microsoft Binary Format -- which is outdated and obsoleted and thus why I find this to be basically a worthless command, unless one is working with ancient data from the late 70s or early 80s) into a SINGLE precision number.

Let me share an example of this, and its twin function MKSMBF, and then I'll explain a little more about how and where one might use these type commands:

Code: (Select All)
a! = 700.2213
Print "Value of a!:"; a!
b$ = MKSMBF$(a!): c$ = MKS$(a!)
Print "Value of a! encoded using MKSMBF$: "; b$
Print "The string above, decoded using CVSMBF:"; CVSMBF(b$)
Print "Value of a! encoded using MKS$: "; c$
Print "The string above, decoded using CVS:"; CVS(c$)



Now you'll notice that I started the above by converting a SINGLE value into a STRING.  The reason for this is simple -- I don't know the string representations of the values off the top of my head, so it's just easier to start with a number which I do know how to represent, and then showcase the conversion back and forth.

You'll also notice that, in the example above, I also showcased MKS$ and CVS.  These do exactly the same as MKSMBF$ and CVSMBF, with one exception -- they convert to the modern standard SINGLE values and not the antiquated Microsoft Binary Format.

So *WHY* would someone want to convert these values into such odd strings?  Why not just use STR$(a!) and be done with it??

STR$() converts a number to a string -- but it basically preserves the formatting of that string.  STR$(700.2213) would become " 700.2213" -- an eight digit string.

MKS$ and MKSMBF$ converts a number to a string -- but those strings are *always* going to be 4-bytes in size.  The character representation you get is (more or less) going to be exactly the same as that value looks like in memory.  (With the exception of MKSMBF which is, as I've said several times, an outdated method of representing the value in memory nowadays.)

123.456789 will convert to a 4-byte string.
1.1 will convert to a 4-byte string.
0 will convert to a 4-byte string.

And why is this 4-byte constant so important for us??

When saving data to the drive FOR BINARY or RANDOM access!!

We can store 100 numbers in a text file, in MKS$ format, and use a total of 400 bytes to store those numbers.  Unlike variable length data entries, we can easily access our file and tell instantly where any certain number is in it.  

At position 1 in the file is the zero-index number.   (Think of my index here as DIM array(0 TO 99), for my 100 numbers.)
At position 5 in the file is the one-index number.
At position 41 in the file is the ten-index number.

At position (p) in the file in the file is the ((p - 1) / 4)-index number.

We convert the value to a set string size, so we can easily track where that value lands inside a larger string or a data file.  Set and constant sized data makes data alignment a breeze.

Print this item

  A new sub-forum!
Posted by: SMcNeill - 11-07-2022, 03:31 AM - Forum: QBJS, BAM, and Other BASICs - Replies (3)

A place for dbox and the creators of other BASIC-variants to come and showcase their projects, offer some demos, and share their vision for what they're doing and where they're going with it.  

If, over time, this little home gets too crowded and it becomes confusing to navigate between QBJS and BAM conversations and such, I'll divide this further into smaller little sub-sections, but until we see how active the developers are going to be, and how much our user base posts here, I think one forum for everything should work as a starting point.  We can always expand and grow from here, if interest develops to that point!  Wink

Print this item

  What is BASIC Anywhere Machine (aka, maybe: BAM)
Posted by: CharlieJV - 11-07-2022, 12:11 AM - Forum: General Discussion - Replies (6)

It is something I have had a devil of a time trying to explain since I started this project back in the late fall of 2021.

So I will start with this, and refactor in an incremental and iterative way to try and get it just right.  (Bear with me: cognitive disabilities make it a challenge to put down into succinct and organised words this mess of intertwingled thoughts in my sponge.)

Imagine if you had the product (not the content) that is Wikipedia, but all in one file.  And that one file had a QB64PE interpreter, IDE, and everything else needed to create a large QB64PE project:  all the stuff you need for project management, task management, source code management (versioning, promotion levels, etc.), project and software documentation, all things needed for all artifacts and all processes related to all of that and everything needed in an end-to-end software development process.

It would be a bit like a bottle garden.  Everything you need is in there, in one file.  And all you need to work with it and all of your programs in it is a web browser.  The web browser can be offline or online, and the one HTML file can be stored anywhere: USB thumbdrive (or whatever other portable storage), file hosting service on the web, storage on whatever kind of device.

The operating system is irrelevant.  And your one standards-compliant file should still work A-1 in whatever web browser 15 years from now.  At worst, browsers no longer exist so you need to find a web browser to run in some virtual machine.

Now replace Wikipedia with TiddlyWiki, which has it's own language for creating whatever kind of user interface you want for all of the things you want this bottle-garden programming environment to be.

And you have access to all of the TiddlyWiki power to use as a meta-programming/scripting/macro-tool during pre-processing of your QB64PE program.  The macro language can be used to dynamically create QB64PE code, or to include all of the program's parts that have been broken down into individual modules,

And the data used to run/test the program exists in the TiddlyWiki, and can be dynamically turned into DATA statements in your program.

Everything is there, in that one file.  And because it is a wiki, you can easily manage it all, categorise, link, transclude, you name it.

And it has a whole bunch of export options, so you can export your program for different purposes: .BAS files for bringing those programs into QB64PE; source code in HTML file as documentation; small HTML application files (the minimal HTML needed, along with the interpreter and the program) for deploying/sharing the program as a single file for running in an offline/online web browser.

(The export options are limitless and ridiculously easy to develop: imagine the ability for all of the previous exports to include a language option for localisation!)

And so much more.  How do I wrap that nicely into a short paragraph?  Yikes ...

Print this item

  Thoughts on BAM and QBJS (etc.)
Posted by: CharlieJV - 11-06-2022, 05:42 PM - Forum: General Discussion - Replies (13)

I didn't want to risk clogging "JavaScript-ing it, I need to get with it" with anything of no interest to anybody (or of interest and creating a whole discussion maybe not fitting the OP in that thread.

To me, every BASIC implementation out there that isn't "dead" is filling a place for however many folk that no other BASIC implementation can.

I can imagine that some folk might very well use one ore more BASIC implementations, each for one or more specific purposes.

Although both BAM and QBJS can outright stand on their own for what they are good at, I think both of them also have the potential of being great sidekick helpers for QB64/QB64PE/QBASIC (the big boys) programming.

If not 100% compatible with the big boys, then at least compatible enough for coding certain snippets of code.  Why?  To be able to create/edit those snippets of code from anywhere anytime (you just need a web browser), regardless of device and without an available install of "a big boy" BASIC.

This is a pretty big deal not just for anywhere-programming-anytime, but also for testing algorithms/functions/subroutines/whatever.  You can put the code on the web not just for viewing the code, but also running it.  That kind of world-wide access/availability means you can get collaboration from anywhere at any time easy peasy.

In my mind, QBJS and BAM are otherwise very different beasts.  I think:

  • QBJS is and will be the cat's meow for compatibility and performance
  • BAM is and will be the cat's meow for serious project management, source code management, and all things software development process, including documentation (being a TiddlyWiki instance, BAM inherits all of the core TiddlyWiki goodies, and the goodies from whatever TW plugin's get added as you make BAM your own)

Just like neither QBJS nor BAM can ever be competition for QB64/QB64PE/QBASIC, QB64/QB64PE/QBASIC can never be competition for either QBJS or BAM, just like QBJS and BAM can never be competition to the other: all very different beasts really good at specific things.

QBJS and/or BAM as sidekicks for QB64/QB64PE/QBASIC for whatever projects?  There is some bad-a$$ potential there.

Print this item

  Catch Waldo !
Posted by: MasterGy - 11-06-2022, 05:08 PM - Forum: MasterGy - No Replies

The game that I've been making continuously for about a month is ready.
I used a lot of things in it that I haven't used before. I still only used _maptriangle command for graphics.
Find Waldo! I wonder who will succeed and how long it will take!




download:
https://drive.google.com/file/d/1zzE6Czi...sp=sharing

Print this item