关于什么是Brainfuck:
http://blog.csdn.net/shenpibaipao/article/details/73692164
明文转Brainfuck语句:
http://blog.csdn.net/shenpibaipao/article/details/73698430
Piet的表现形式就是用色块(Codel Block),利用两个指针Direction Pointer 和 Codel Choser,指导程序在Stack上进行移动、算术操作。
这个Piet我看了一下,似乎没有现成的成型中文教程和开发工具、编译器整理......我几天我会考虑补上这个。
不过,把程序语句表示为“图形”的思路非常有趣,将程序变成色彩瑰丽的图像,既便于展示(装逼),也可以用于存储。
Brainfuck语句由于只有8个操作符,所以只需要用8个色块简单替代就行,一个基于这种展示思想的例子见下:
这个图片中的色块直接记录了一个程序,这个程序可以输出"Hello World!"。
目前只是吃完晚饭有了点念头随便写了一个程序实现了一下,之后有可能的话准备抛弃原有的Brainfuck的框架体系,并在色彩和排列上做一些优化,还可以加入一些注释色块,使得Pixel Picture看起来更好看,以及可以拼凑出有趣的像素图(比如一个地球,里面藏了一句“hello world!”)
具体的代码见下:
/**
* @author Shenpibaipao
* @contact AT http://my.csdn.net/Shenpibaipao
* @Date 2017.7.30
* @Version 1.0
*/
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
public class MyPietCanva extends JFrame{
private int canvaWidth,canvaHeight,codelPix;
private int topX=5,topY=25;
private String str="";
private Graphics jg;
public MyPietCanva(){
canvaWidth=10;canvaHeight=10;codelPix=25;
}
public MyPietCanva(int width,int height,int pix){
canvaWidth=width;canvaHeight=height;codelPix=pix;
}
public MyPietCanva(String s,int pix){
int sqrtNum=(int)Math.sqrt(s.length());
canvaWidth=sqrtNum+1;canvaHeight=sqrtNum+1;codelPix=pix;
str=s;
buildPicture();
}
public void setString(String s){
str=s;
}
public void buildPicture(){
if(!str.equals("")){
drawCanva();
}else{
System.out.println("请先设置要转换成图像的Brainfuck语句!");
}
}
private void drawCanva(){
Container con=getContentPane();
setBounds(0,0,topX+codelPix*canvaWidth,topY+codelPix*canvaHeight);
con.setBackground(Color.gray);
setVisible(true);
setLayout(null);
setTitle("我的Piet编译器·生成器 V1.0");
setLocationRelativeTo(null);
setResizable(false);
try {
Thread.sleep(500);
}catch (Exception e) {
}
jg=this.getGraphics();
paintComponents(jg);
}
public void paintComponents(Graphics g){
System.out.println("画图");
try{
for(int currentNum=0;currentNum<str.length();currentNum++){
int x=currentNum%canvaWidth,y=currentNum/canvaWidth;
switch(str.charAt(currentNum)){
case '<':
paintRed(g,x,y);
break;
case '>':
paintBlue(g,x,y);
break;
case '+':
paintYellow(g,x,y);
break;
case '-':
paintGreen(g,x,y);
break;
case '[':
paintOrange(g,x,y);
break;
case ']':
paintPink(g,x,y);
break;
case ',':
paintWhite(g,x,y);
break;
case '.':
paintBlack(g,x,y);
break;
default:
System.out.println("检测到注释文字:"+str.charAt(currentNum));
break;
}
}
}catch (Exception e) {
// TODO: handle exception
}
}
//各种颜色
private void paintRed(Graphics g,int x,int y){
g.setColor(Color.red);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
private void paintBlue(Graphics g,int x,int y){
g.setColor(Color.blue);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
private void paintYellow(Graphics g,int x,int y){
g.setColor(Color.yellow);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
private void paintGreen(Graphics g,int x,int y){
g.setColor(Color.green);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
private void paintOrange(Graphics g,int x,int y){
g.setColor(Color.orange);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
private void paintPink(Graphics g,int x,int y){
g.setColor(Color.pink);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
private void paintWhite(Graphics g,int x,int y){
g.setColor(Color.white);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
private void paintBlack(Graphics g,int x,int y){
g.setColor(Color.black);
g.fillRect(topX+x*codelPix,topY+y*codelPix,codelPix,codelPix);
}
public static void main(String[] args){
String codeSeg="+++++++[>++++++++++<-]>++.>++++++++++[>++++++++++<-]>+++++.";
String code="+-<>[],.++";
MyPietCanva c=new MyPietCanva(codeSeg,5);
}
}