Как стать автором
Обновить
183.52

Ненормальное программирование *

Извращения с кодом

Сначала показывать
Порог рейтинга
Уровень сложности

Деревянные игрушки или Как я писал мобильные игры с телефона

Время на прочтение4 мин
Количество просмотров9.6K
Когда-то, когда деревья были большими, а мобильники — ещё совсем дикими, и не существовало единых стандартов и Винды для телефонов, я был счастливым обладателем Siemens C72 — одного из немногих телефонов, позволяющих полноценно работать с файловой системой (на других телефонах в то время доступ к ФС был либо сильно ограничен, либо полностью отсутствовал).

Так уж вышло, что ПК к тому времени у меня ещё не было, а окунуться в увлекательный мир программирования уже хотелось. Так я поставил и родилась идея — начать кодить на мобильнике. Жесть, скажете вы? Оренбургские программисты настолько суровы, что мы пишут мобильные приложения на самих мобильных. Да, именно так, и я решил написать свою первую статью на Хабр, основываясь на своём опыте, т.к. в рунете подобные темы ещё не поднимались.

Итак, с чего все начиналось?

Читать дальше →

No Canvas

Время на прочтение7 мин
Количество просмотров2.6K
Возможно, это лучше перенести в «Я пиарюсь» или «JavaScript» (принимаются предложения). А может, стоит оставить всё как есть. Тем не менее...

3D с z-buffer-ом, субпиксельной точностью и освещением по Гуро на javascript? Да кто угодно сможет это сделать, используя canvas!

Можно долго и вкусно описывать преимущества канваса, но статья не про это; не менее интересно
посмотреть, чем же канвас плох.

Так чем же?

Лепестки роз на bash

Время на прочтение1 мин
Количество просмотров3K
Два года тому назад я вступил в братство хранителей тайны лепестков розы. Потратил на это два вечера и решил, что потратить еще один для написания игры на баше, будет не менее увлекательным занятием.

image

Для тех, кто не знаком с этой загадкой советую почитать историю о том, как вступал в братство Бил Гейтс
Читать дальше →

Сетевой морской бой на bash

Время на прочтение2 мин
Количество просмотров9K
Недавно с целью изучения bash написал на нем игру в «морской бой» для игры по сети. Игра получила название «Sink 'em all».

image

Из внешних программ используются только nc (для организации взаимодействия по TCP), stty (для выключения эха при нажатии клавиши) и clear (для очистки терминала).
Читать дальше →

Свои судоку на своих батниках

Время на прочтение2 мин
Количество просмотров5.2K
image
С предыдущего хабратопика я понял, что хабражителям очень понравился сапер на своих батниках и поэтому рискнул написать еще одну игру, а именно — Судоку. И опять же, на своих батниках.
Как и Minesweeper, Sudoku for cmd.exe имеет ряд следующих преимуществ:
  • Оригинальное лого
  • Двухцветный текстовой графический интерфейс (фон — чёрный, текст — серый)
  • Возможность воспроизведения программы практически на любом компьютере
В общем, это Судоку для настоящих мужчин. И скачать эту замечательную игру вы можете прямо сейчас, воспользовавшись этими ссылками: Plain Text | Google Docs
Читать дальше →

Работа с массивами в bat

Время на прочтение6 мин
Количество просмотров57K
Прочитав пост Свой сапер на своих батниках и пробежавшись по коду, наткнулся на комментарий, что в батниках нет массивов (кстати, в последней версии Сапера, о котором идёт речь в том посте, нет этого комментария). Так вот, если в батнике необходимо использовать некоторый набор значений, то логично объявить такое кол-во переменных, которое требуется и работать с ними. Собственно данный сценарий эту задачу помогает решить проще. Вот несколько примеров:

echo Создание массива А:
call :array new A "'one','two','three','foo','bar'"
echo Получение третьего элемента в result:
call :array get A 3 result
echo %result%
echo Изменение нулевого элемента
call :array set A 0 "первый элемент"

подробнее

Программируем «на уровне операционной системы»

Время на прочтение2 мин
Количество просмотров7.6K
b.s Сразу отбросим вопросы производительности, безопасности и оптимальности. Для данной зарисовки они не важны.

Последние топики про программирование на языке bat файлов напомнили вот такую концепцию. Оно конечно написано в шутку, но почему бы и нет. Может у кого-то в голове что-то и перевернет. ;)

Не претендую на авторство — наверняка такая идея уже кем-то была придумана ранее.

Итак. Возьмем для примера программку на языке C. Пишем, компилируем, получаем черный ящик бинарного кода. Он выполняется в отдельной области памяти и недоступен для простого обывателя (ну разве что вооруженного дебагером).

Для программки на скриптовом языке примерно то же самое — хоть исходники и под рукой, но что происходит в памяти интерпретатора — темный лес.

А не вывернуть ли все это наружу? На уровень доступный пользователю ОС. На уровень файловой системы. :)
Читать дальше →

Цепной квайн произвольного порядка на Python

Время на прочтение3 мин
Количество просмотров1.7K
   Впечатленный цепным полиглотным квайном японца, приведенным в этом хабратопике, я, ранее уже встречавшийся с программами-квайнами, решил познакомиться с ними плотнее. После беглого гугления и непродолжительного чтения вики/блогов/сайтов по теме, у меня зачесались руки и захотелось написать свой квайн. Квайн был написан, даже в нескольких вариантах, но этого мне показалось мало. Позже я даже написал двойной квайн (код на python генерирует код на prolog а код на prolog в свою очередь первоначальный python-код).

   Однако, тут возник вопрос. А можно ли написать квайн любого порядка (т.е. тот, который будет переходить сам в себя после N запусков)? Как оказалось, это вполне возможно. Результатом изысканий явился следующий код:

# xonix
L=19;B,Q,N,q,n=map(chr,(36,81,78,39,10))
X='import sys;sys.stdout.write(%s%s%s.replace(chr(36)+chr(81)+chr(36),chr(39)).replace(chr(36)+chr(81),chr(36)).replace(chr(36)+chr(78)+chr(36),chr(10)).replace(chr(36)+chr(78),chr(36)))'
Y='# xonix%sL=%s;B,Q,N,q,n=map(chr,(36,81,78,39,10))%sX=%s%s%s%sY=%s%s%s%sE="""%s""";exec E%simport sys;sys.stdout.write(b())'
E="""def b(l=L):
  if l==L: Ql=q
  else: Ql=B+Q*(L-l)+B;Nl=B+N*(L-l)+B
  if l>0: return X%(Ql,b(l-1),Ql)
  else: return Y%(Nl,str(L),Nl,Ql,X,Ql,Nl,Ql,Y,Ql,Nl,E.replace(n,Nl),Nl)"
"";exec E
import sys;sys.stdout.write(b())


Читать дальше →

Свой сапер на своих батниках

Время на прочтение6 мин
Количество просмотров14K
image

Однажды захотелось мне написать Minesweeper… на батниках. И я его написал.

Встречайте!!! Minesweeper for cmd.exe

Итак, особенности данного продукта:
  • Оригинальное лого
  • Двухцветный текстовой графический интерфейс (фон — чёрный, текст — серый)
  • Возможность воспроизведения программы практически на любом компьютере
В общем, это настоящий сапер (а не те жалкие подобия — KMines и сапер for Windows) для настоящих мужчин. И далее вы сможете прочитать как сделать свой крутой сапер.
Читать дальше →

Немного Математики, Хабра и Марио или играемся с табулированием

Время на прочтение1 мин
Количество просмотров1K
Здравствуйте!
Возможности компилятора MSVC практически безграничны для творчества, поэтому я решил поэкспериментировать с табулированием и знаками "+"/"-". Пока создан только один экспонат, но я надеюсь развить эту мысль и сделать что-то грандиозное!
Читать дальше →

PHP: массивы, возвращаемые функцией

Время на прочтение4 мин
Количество просмотров11K
Мне нравится PHP (если вам не нравится — пожалуйста, забудьте про этот топик. Не надо холиварить) и еще мне нравится одна штука, которая прям везде есть, а в PHP отсутствует:

superFunction(foo, bar)[2];


Что делает этот код? Правильно! Возвращает третий элемент массива, который возвращает superFunction() с аргументами foo и bar.

В PHP-синтаксисе это выглядело бы так:

superFunction($foo, $bar)[2];


Вот только этот код выдает Parse Error. «И поделом!» — раздаются уж крики ненавистников синтаксического сахара. Я предлагаю им тоже отправиться подальше от этого топика, чтобы не холиварить и не доказывать, что это не нужно (посмотрите, в каком я блоге это разместил, в конце-то концов).

На сайте PHP я узнал, что такого синтаксиса разработчики позволять не планируют даже в 6 версии. Ну, блин. Я и сам — молодец! Итак, за ночь я написал небольшой класс, который, если его правильно использовать, разрешает работать с массивами по-человечески.

мне не страшно

Ближайшие события

Ностальгия: «Ящеры» на батнике

Время на прочтение3 мин
Количество просмотров6.5K
Все мы помним свой первый компьютер, а если вы программист, то и первую программу. Первым компьютером у меня был ZX-Spectrum, а первой написанной под него программой была игрушка «Ящеры» на Бейсике. Ну, если быть честным, то я ее просто переписал из одной книги1, попутно разбираясь в коде и исправляя допущенные автором ошибки :)

2.jpg - Picamatic - upload your images

Решил я дать вторую жизнь вышеуказанной игрушке. Но переписать ее на любом из известных мне языков было бы слишком просто. А так как я люблю писать батники, то переписал я ее на последних :)

Читать дальше →

Крестики-нолики по-русски!

Время на прочтение1 мин
Количество просмотров5.9K
Здравствуйте, после прочтения топика «Боярское программирование»
захотелось написать что то такое :) Сил хватило на крестики-нолики, но я хочу написать что-то тридешное, на истинном Боярском!
Читать дальше →

«OOC для C, — это как Scala для Java»

Время на прочтение7 мин
Количество просмотров2.3K
Сегодня на Hacker News наткнулся на пост о (похоже очень) новом языке "ooc". Бросил на день все дела, занялся ковырятельством — уж больно интересно выглядит.

Итак, "ooc — это современный, объектно-ориентированный, функционально(ватый), высокоуровневый, низкоуровневый, секси язык программирования". (Именно секси его и представляют разработчики, ну а я бы добавил что еще и "компилируемый")

По сути — ooc — транслятор языка высокого уровня в C со сборщиком мусора.

Как выразился один из посетителей сайта: "ooc для C, — это как Scala для Java" (jimbokun@HN).

Обязательный «Hello, World» на ooc:

hello.ooc:
"Hi, softer world =)" println()

на выходе hello.c и hello.exe.

ooc-компилятор транслирует это в c-код и использует доступный c компилятор (gcc, mingw, icc, tinycc) чтобы сделать из этого hello.exe (или ./hello). Поддержка tinycc заявлена, но в реальности ждем поддержки C99 в самом tinycc (автор обещал сделать обходные пути, но пока не работает), поэтому наслждаемся пока что довольно неслабого размера .exe'шниками (gcc от mingw других не делает).

Итак, что у нас уже есть в языке: классы, объекты, строгая типизация, угадывание типов (n := "Beer" length()), chaining (.dothis().dothat()), совместимость с c-библиотеками, абстрактные классы, шаблоны из C++, списки, разреженные(sparse) списки, хеши (ArrayList, SparseList, HashMap), for (i in list) { ... }, обертки для c-шных функций и классов, перегрузка операторов, полиморфизм, сборщик мусора (отключаемый), import file/name (не нужны .h, но .h можно использовать как extern), closures, eiffel's contracts, исключения, reflections, pattern matching, ranges, ternary operator, bindings, generics, coroutines, GTK, SDL, OpenGL, GLU, GLUT bindings…

Как сказал товарищ varjag@HN: «Я думаю это розыгрыш, сделанный пользователями Ruby, но нигде этого в тексте не вижу.» Нет, этот язык существует на самом деле. Примеры, линки, установка, подводные коряги — под катом…
Читать дальше →

Ненормальное программирование. Разработка IF игр

Время на прочтение6 мин
Количество просмотров20K

Разработка игр



Кто не мечтал попробывать разработать собственную игру. Мы будем создавать игру в стиле interactive fiction Сюжет я взял на сайте одной из систем программирования RTADS. Система локализована на русский язык и содержит полный набор средств и руководств для программирования. Но… Программировать мы будем в другой системе Inform7 Она мне больше нравится, т.к. я люблю английский. Итак сюжет.

Сюжет


… В качестве примера мы разработаем игру, действие которой будет происходить в небольшом аэропорту. Наш аэропорт будет иметь терминал, центральный зал, а также выходы к самолетам.
Продолжить программировать

Примеры использования языкоориентированного программирования

Время на прочтение5 мин
Количество просмотров1.9K
Идея language oriented programming (LOP), состоит в том, что во время разработки программы, постоянно создаются миниязыки. Они могут как расширять основной язык разработки, так и быть отдельными языками. Лучшим языком для LOP является Common Lisp с его макросами, но здесь речь пойдёт не о нём. Примеры использования LOP с Common Lisp советую посмотреть в замечательной книге Peter Seibel Practical Common Lisp. Я считаю, что LOP один из самых простых и эффективных способов программирования. Мы описываем задачу и предметную область на самом подходящем для этого языке, а потом стараемся его реализовать.

Я разрабатываю браузерные игры на Ruby, поэтому часто использую LOP, как для расширения языка и встроенных DSL (Ruby позволяет делать это очень хорошо), так и для создания миниязыков связанных со сложной игровой механикой. В этой статье я рассмотрю простое расширение основного языка, встроенный мини-DSL и два не встроенных языка. Буду приводить примеры в близкой мне тематике, надеюсь они будут вполне понятны.

Читать дальше →

Katahdin: метапрограммирование на грани фантастики

Время на прочтение2 мин
Количество просмотров2.4K
Katahdin — это интерпретируемый язык программирования, в котором синтаксис и семантика могут изменяться во время исполнения. Чтобы идея стала ясна, сразу приведу пример с официального сайта. В примере определяется операция получения остатка от деления ("%" в C, «mod» в Pascal).
class ModExpression : Expression {
  pattern {
    option leftRecursive;
    a:Expression "%" b:Expression
  }
 
  method Get() {
    a = this.a.Get...();
    b = this.a.Get...();
    return a - (b * (a / b));
  }
}

Читать дальше →

В продолжение темы 3D на осциллографе

Время на прочтение1 мин
Количество просмотров4K
На днях мне было нечего делать, да еще я случайно наткнулся на другую статью на хабре на эту же тему, и решил сваять вот это.

Встречайте, Vector Damage. Полноценный (ну, почти) 3D шутер на осциллографе.


Далее