Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499

VB Golf

24.02.2026, 19:49. Показов 1507. Ответов 23

Студворк — интернет-сервис помощи студентам
Существует такой вид соревнований по программированию - Code Golf, это когда предлагается реализовать задание минимальным кол-вом исходного кода, это сродни демосцене. Довольно популярен Perl Golf.
Предлагаю посоревноваться, или просто поразвлекаться в этом направлении, только можно немного изменить правила - измерять не кол-во байт исходного кода, а кол-во задействованных выражений и операторов, чтобы не провоцировать писать неудобочитаемый из-за однобуквенных имён и отсутствия форматирования код. Так же можно не учитывать служебные выражения, типа Option Explicit, задание переменных и описание функций. Впрочем, правила можно согласовать.
Пишем код, который нужно вставить в форму нового проекта без каких-либо других настроек в IDE.

Для затравки, вставьте это в новый проект:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Option Explicit
 
Dim Ar(15) As Long
 
Private Sub Form_Load()
  ScaleMode = vbPixels
  AutoRedraw = True
  FontSize = 15
  Caption = 15
  Move Left, Top, Width - Screen.TwipsPerPixelX * (ScaleWidth - 256), Height - Screen.TwipsPerPixelY * (ScaleHeight - 256)
  Randomize Timer
  NewGame
End Sub
 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  MoveBrick (x \ 64) + (y \ 64) * 4
  ShowField
  If Victory Then
    MsgBox "Victory!", vbOKOnly, "15"
    NewGame
  End If
End Sub
 
Private Sub ShowField()
  Dim i As Long
  Dim x As Long, y As Long
 
  Line (0, 0)-(255, 255), &H507050, BF
  For i = 0 To 15
    x = (i And 3) * 64
    y = (i \ 4) * 64
    If Ar(i) > 0 Then
      Line (x + 2, y + 2)-(x + 61, y + 61), 0, B
      Line (x + 3, y + 3)-(x + 60, y + 60), &HA0A0A0, BF
      CurrentX = x + 16 - (Ar(i) < 10) * 7: CurrentY = y + 22
      ForeColor = &H0: Print Ar(i);
      CurrentX = x + 14 - (Ar(i) < 10) * 7: CurrentY = y + 20
      ForeColor = &HE0FFA0: Print Ar(i);
    End If
  Next i
End Sub
 
Private Sub NewGame()
  Dim i As Long
 
  For i = 0 To 15
    Ar(i) = (i + 1) And 15
  Next i
  For i = 0 To 1023
    MoveBrick Int(Rnd * 16)
  Next i
  ShowField
End Sub
 
Private Function Victory() As Boolean
  Dim i As Long
 
  For i = 0 To 15
    If Ar(i) <> ((i + 1) And 15) Then Exit Function
  Next i
  Victory = True
End Function
 
Private Sub MoveBrick(ByVal i As Long)
  If (i And 3) > 0 Then If Ar(i - 1) = 0 Then Swap i, i - 1
  If (i And 3) < 3 Then If Ar(i + 1) = 0 Then Swap i, i + 1
  If (i And 12) > 0 Then If Ar(i - 4) = 0 Then Swap i, i - 4
  If (i And 12) < 12 Then If Ar(i + 4) = 0 Then Swap i, i + 4
End Sub
 
Private Sub Swap(ByVal i1 As Long, ByVal i2 As Long)
  Ar(i1) = Ar(i1) Xor Ar(i2)
  Ar(i2) = Ar(i1) Xor Ar(i2)
  Ar(i1) = Ar(i1) Xor Ar(i2)
End Sub
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2026, 19:49
Ответы с готовыми решениями:

HTC Sensation xe and Explay Golf
1 проблема это HTC, по непонятным причинам начал долго думать, а иногда даже подвисать. Стоит...

Ошибка при сборке многофайлового проекта: "невозможно преобразовать "int" в "const golf"
Сделал многофайловую программу программу, вот она: //golf.h #include &lt;iostream&gt; #ifndef golg_h_...

Perl Golf местного значения. Определить количество файлов в директории
Perl Golf - это такая игра, когда игрующие мерятся* у кого самый короткий. ( однострочник,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
25.02.2026, 10:18  [ТС]
The trick, отлично! Первое и третье прямо по теме.

А я по играм прохожусь. Ещё пример:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Option Explicit
 
Dim Ar(15, 15) As Integer, bX As Long, bY As Long, dX As Long, dY As Long, L As Long
 
Private Sub Form_Activate()
  Dim T As Single
 
  BackColor = &H509950
  Move Left, Top, Width - ScaleWidth + 7000, Height - ScaleHeight + 7000
  Scale (-0.5, -0.5)-(15.5, 15.5)
  DrawWidth = 6500 / (Screen.TwipsPerPixelX * 16)
  Randomize Timer
  Ar(1, 0) = -1
  dX = 1
  While DoEvents
    If T < Timer Then
      T = Timer + 0.2
      Tick
    End If
  Wend
End Sub
 
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case vbKeyLeft: dX = -1: dY = 0
    Case vbKeyUp: dX = 0: dY = -1
    Case vbKeyRight: dX = 1: dY = 0
    Case vbKeyDown: dX = 0: dY = 1
  End Select
End Sub
 
Private Sub Tick()
  Dim x As Long, y As Long
 
  bX = (bX + dX) And 15
  bY = (bY + dY) And 15
  If Ar(bX, bY) = -1 Then
    L = L + 1
    Caption = L
    Do
      x = Int(Rnd * 16)
      y = Int(Rnd * 16)
    Loop While Ar(x, y) > 0
    Ar(x, y) = -1
    PSet (x, y), &H205099
  ElseIf Ar(bX, bY) > 0 Then MsgBox L, , "Snake": End
  Else
    For y = 0 To 15
      For x = 0 To 15
        If Ar(x, y) = 1 Then Ar(x, y) = 0: PSet (x, y), BackColor
        If Ar(x, y) > 1 Then Ar(x, y) = Ar(x, y) - 1
      Next x
    Next y
  End If
  Ar(bX, bY) = L
  PSet (bX, bY), &HFFFFFF
End Sub
2
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
25.02.2026, 20:45
Mikle Quits, прикольно. Вот еще нашел из своего Нарисовать 3 цветочка и как они растут
2
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
25.02.2026, 21:06  [ТС]
The trick, отлично тема пополняется.
0
 Аватар для KoGG
5646 / 1628 / 418
Регистрация: 23.12.2010
Сообщений: 2,450
Записей в блоге: 1
26.02.2026, 15:09
Предлагаю создать параллельную тему в разделе VBA, там народу больше.
Рисование на форме реализовал, только гольф там не поехал.
Вложения
Тип файла: 7z API_LineSquare_Forma.7z (30.5 Кб, 3 просмотров)
Тип файла: 7z API_Golf_Forma.7z (33.6 Кб, 15 просмотров)
1
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
26.02.2026, 19:46  [ТС]
Цитата Сообщение от KoGG Посмотреть сообщение
Предлагаю создать параллельную тему в разделе VBA, там народу больше.
Я не против, только лучше, если её создаст завсегдатай раздела, и если будет готов хоть один пример на VBA, хотя бы примеры из этой темы адаптировать.
0
 Аватар для KoGG
5646 / 1628 / 418
Регистрация: 23.12.2010
Сообщений: 2,450
Записей в блоге: 1
02.03.2026, 15:35
Питон адаптировал в 2-х вариантах:
http://www.cyberforum.ru/vba/thread3220778.html
1
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
02.03.2026, 15:40  [ТС]
Цитата Сообщение от KoGG Посмотреть сообщение
Собственно Golf для затравки в исходной теме содержит ошибки и явно не тестировался.
А можно подробнее, что за ошибки?
0
 Аватар для KoGG
5646 / 1628 / 418
Регистрация: 23.12.2010
Сообщений: 2,450
Записей в блоге: 1
02.03.2026, 15:44
Были выходы за границы массивов в VBA.
Возможно это масштабозависимые эффекты.
0
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
02.03.2026, 15:52  [ТС]
Цитата Сообщение от KoGG Посмотреть сообщение
операторы Swap i, i - 1 ничего не делают для игры
Эта ф-ция обменивает ячейки массива Ar() с индексами i1 и i2 значениями.
Visual Basic
1
2
3
4
5
Private Sub Swap(ByVal i1 As Long, ByVal i2 As Long)
  Ar(i1) = Ar(i1) Xor Ar(i2)
  Ar(i2) = Ar(i1) Xor Ar(i2)
  Ar(i1) = Ar(i1) Xor Ar(i2)
End Sub
Ф-ция вызывается в коде 4 раза, удаление любого вызова ведёт к невозможности двигать кубик в соответствующем направлении.
Выхода за границы массивов найти не могу.
0
 Аватар для KoGG
5646 / 1628 / 418
Регистрация: 23.12.2010
Сообщений: 2,450
Записей в блоге: 1
02.03.2026, 16:26
Со Swap я понял, что это функция.
Просто раньше был одноименный оператор в qbascic

Добавлено через 21 минуту
Выход за границы возникал при клике на форме в области превышающей 256 по высоте или ширине.
Уменьшил форму до 256 * 256.
0
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
02.03.2026, 18:08  [ТС]
Цитата Сообщение от KoGG Посмотреть сообщение
Выход за границы возникал при клике на форме в области превышающей 256 по высоте или ширине.
Уменьшил форму до 256 * 256.
Там есть строка:
Visual Basic
1
Move Left, Top, Width - Screen.TwipsPerPixelX * (ScaleWidth - 256), Height - Screen.TwipsPerPixelY * (ScaleHeight - 256)
Она как раз устанавливает размер клиентской части формы 256*256.
Так что ошибок у меня нет.

Добавлено через 1 час 38 минут
Есть у меня ещё один примерчик в стиле классического Code Golf, где важен именно размер исходника в байтах:
Создайте пустой проект, вставьте в форму такой код:

Code
1
Sub Form_Activate:j=90:x=j:y=x:a=60:b=20:w=ScaleWidth-j:z=255:While DoEvents:t=Timer:While t=Timer:Wend:x=x+a:a=a*(x<w)*(x>j)*2-a:y=y+b:b=b*(y<ScaleHeight-j)*(y>j)*2-b:Cls:Circle(x,y),67,z:Line(0,y-z)-(j,y+z),z,BF:Line(w,y-z)-(w+j,y+z),z,BF:Wend:End Sub
Размер txt с кодом - 253 байта, помню, у меня было немного больше 256-ти, Хакер с VBStreets нашёл, как уменьшить.
1
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
03.03.2026, 11:19  [ТС]
Ещё одна игра.
Исходник чуть длиннее, но и функционал соответствует.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Option Explicit
 
Dim XX As Long, pY As Single, sY As Single, KK As Boolean, Wall(3) As Long, Sc As Long, t As Single
 
Private Sub Form_KeyDown(Key As Integer, Shift As Integer)
  KK = True
End Sub
 
Private Sub Form_KeyUp(Key As Integer, Shift As Integer)
  KK = False
End Sub
 
Sub Form_Load()
  ScaleMode = vbPixels
  Move Left, Top, Width - Screen.TwipsPerPixelX * (ScaleWidth - 512), Height - Screen.TwipsPerPixelY * (ScaleHeight - 384)
  Show
  t = Timer + 0.03
  pY = 32
  While DoEvents
    While t > Timer: Wend: t = t + 0.03
    Tick
  Wend
End Sub
 
Private Sub Tick()
  Dim x As Long, y As Long, d As Single
 
  Line (0, 0)-(512, 384), &HAA7755, BF
  For x = -3 To 512 Step 4
    If (x + XX) And 192 Then
    Else
      y = Wall((x + XX) \ 256 And 3)
      Line (x, 0)-(x, y), ((x + XX) And 63) * &H20402
      Line (x, y + 128)-(x, 384), ((x + XX) And 63) * &H20402
    End If
  Next x
 
  DrawWidth = 5
  d = Sin(Timer * 25)
  Line (74, pY - d * 2)-(84, pY + d * 5), &HAAAAAA
  Line (69, pY + 1 - d * 2)-(79, pY + 3 - d * 2), &HFFFFFF
  Line (74, pY - d * 2)-(64, pY + d * 5), &HCCCCCC
 
  DrawWidth = 12
  If (XX Mod 256) > 160 Then
    y = Wall(XX \ 256 + 1 And 3)
    If pY < y + 12 Or pY > y + 112 Then
      t = Timer + 1
      Circle (74, pY), 32, &HFF
      pY = y + 64: sY = 0: Sc = 0
    End If
  End If
  XX = (XX + 4) And 1023
  If (XX And 255) = 0 Then
    Wall((XX \ 256) + 3 And 3) = Rnd * 256
    Sc = Sc + 1: Caption = Sc
  End If
  If KK Then sY = sY - 0.8 Else sY = sY + 0.3
  pY = pY + sY
End Sub
И EXE тем, у кого нет VB6.
Вложения
Тип файла: zip FB.zip (4.1 Кб, 20 просмотров)
2
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
03.03.2026, 14:37  [ТС]
The trick, кстати, как бы в рантайме сменить BorderStyle на Fixed Single? Чтобы у пользователя не было возможности изменить размер окна.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
03.03.2026, 17:47
Цитата Сообщение от Mikle Quits Посмотреть сообщение
The trick, кстати, как бы в рантайме сменить BorderStyle на Fixed Single? Чтобы у пользователя не было возможности изменить размер окна.
Visual Basic
1
2
3
4
5
6
7
8
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongW" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongW" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_THICKFRAME = &H40000
 
Private Sub Form_Load()
    SetWindowLong hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) And Not WS_THICKFRAME
End Sub
1
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
03.03.2026, 19:30  [ТС]
The trick, о, отлично!
В рамках Code Golf можно от объявления констант избавиться, ещё короче выйдет.
0
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
04.03.2026, 15:21  [ТС]
The trick, но кнопка максимизации продолжает работать...
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
04.03.2026, 18:21
Цитата Сообщение от Mikle Quits Посмотреть сообщение
The trick, но кнопка максимизации продолжает работать...
Visual Basic
1
2
3
4
5
6
7
8
9
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongW" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongW" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_THICKFRAME = &H40000
Private Const WS_MAXIMIZEBOX = &H10000
 
Private Sub Form_Load()
    SetWindowLong hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) And Not (WS_THICKFRAME Or WS_MAXIMIZEBOX)
End Sub
1
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 499
04.03.2026, 19:05  [ТС]
The trick, благодарю.
Есть одна странность - при смене Caption эта настройка слетает, приходится восстанавливать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru