Welcome, Guest |
You have to register before you can post on our site.
|
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
|
|
|
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
|
|
|
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
|
|
|
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
|
|
|
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.
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.
|
|
|
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 ...
|
|
|
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.
|
|
|
|