CC的小站

  • 首页
  • 友链
  • 小游戏
  • 关于 / 留言板

Java字符画

发表于 2021-02-04 |

七个礼拜的寒假到今天已经过去一半了,感觉比想象中的还慢一点呢,可能是以前的假期是真的没这么闲吧😂

主要是有关IO的东东,思路很简单,就是把一个个像素替换为对应的字符。


>>> 一:

读取指定位置的图片,在控制台和文件夹输出字符画

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import javax.imageio.ImageIO;

public class Word_1 {
//把in.png转换为out.txt,路径:D:/CC/image2word_2
public static void main(String[] argv) throws IOException {
java.awt.image.BufferedImage img = ImageIO.read(new File(“D:/CC/image2word_2/in.png”));
File newfiFile = new File(“D:/CC/image2word_2/out.txt”);
FileOutputStream fileOutputStream;
int width = img.getWidth();
int height = img.getHeight();
int q = 1;
//多少像素取一个点进行转换,越大越抽象(这种方法有点偷鸡,但大多数情况还行)
int max = 0;
try {
fileOutputStream = new FileOutputStream(newfiFile);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(newfiFile));
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

for (int y = 0; y < height; y += q) {
for (int x = 0; x < width; x += q) {
int r = img.getRGB(x, y);

int red = (r >> 16) & 0x0ff;
int green = (r >> 8) & 0x0ff;
int blue = r & 0x0ff;
//上面三行我具体也不清楚,“r”经过上面的操作,分成能看懂的RGB。

max = Math.max(red, Math.max(green, blue));
if (max < 178) {
bufferedWriter.write(“* “);
System.out.print(“* “);
} else {
bufferedWriter.write(“. “);
System.out.print(“. “);
}
//这里是试出来的,不知道有没有更好的方法

}
bufferedWriter.write(“\n”);
System.out.println(“”);
}
bufferedWriter.close();
outputStreamWriter.close();
fileOutputStream.close();
System.err.println(“ok”);

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


颜色

把像素点的RGB数值均调为最大的那个值,那个像素点就成黑白的了,每个像素都做一遍,整个图片就灰化了

例如: R:200 G:100 B:50 -> R:200 G:200 B:200

把上面的改改就能实现灰化图片了,把RGB数值还原回一个数的语句:r = (red << 16) | (green << 8) | blue;

IO流

我就是从这里学的,这里就不把你们往茄子地里带了😝

隔壁B站的教学视频

字符画

得先自己试好一套字体,字符。首先得满足不同字符占位大小是一样的,再自己多试试不同字符字体间的搭配

@ # $ % ^ & X O H I + / . ‘ `

在if语句那里多写几句就可以让字符画细节保留的更多一些,把0~255平均分成若干份就行了(0到255,从黑到白)。都是差不多的

成品

>>> 蛋糕.doc <<<

输入的图片最好提前处理的好一点。相比与靠改程序里的“q”,还是提前把图片缩小好效果好,亮度提前也要调好,不要整个画面都太亮或太暗(除非你有针对这种情况调整程序)


>>> 二:

把Bad apple视频逐帧拆解为图片,再用上面的程序转换为字符画并创建窗口进行播放

下面是实现前半句的程序,从网上复制的。得引用外部库,下一个javacv全都有了

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Test {

// 视频文件路径
private static String videoPath = “D:\图片\test”;

// 视频帧图片存储路径
public static String videoFramesPath = “D:\图片\test”;

public static void grabberVideoFramer(String videoFileName) {
// Frame对象
Frame frame = null;
// 标识
int flag = 0;

FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + “/“ + videoFileName);

try {
fFmpegFrameGrabber.start();

int ftp = fFmpegFrameGrabber.getLengthInFrames();
// System.out.println(fFmpegFrameGrabber.grabKeyFrame());
System.out.println(“时长 “ + ftp / fFmpegFrameGrabber.getFrameRate());

BufferedImage bImage = null;
System.out.println(“开始运行视频提取帧,耗时较长”);

while (flag <= ftp) {
// 文件绝对路径+名字
String fileName = videoFramesPath + “/img_” + String.valueOf(flag) + “.jpg”;
// 文件储存对象
File outPut = new File(fileName);
// 获取帧
frame = fFmpegFrameGrabber.grabImage();
// System.out.println(frame);
if (frame != null) {
ImageIO.write(FrameToBufferedImage(frame), “jpg”, outPut);
}
flag++;
}
System.out.println(“============运行结束============”);
fFmpegFrameGrabber.stop();
} catch (IOException E) {
}
}

public static BufferedImage FrameToBufferedImage(Frame frame) {
// 创建BufferedImage对象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}

public static void main(String[] args) {
String videoFileName = “123.mp4”;
//这里写视频的文件名
grabberVideoFramer(videoFileName);
}

public static String getVideoPath() {
return videoPath;
}

public static void setVideoPath(String videoPath) {
Test.videoPath = videoPath;
}
}


下面是实现后半句的程序,有两个类(要新建两个class)
Wordplayer中的all参数是看你总共提取出多少图片,如果你是用上面提取的,文件名应该是img_1.jpg,img_2.jpg顺下去的,下面就是不停的打开下一帧的图片

//Wordplayer

import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Wordplayer {
public static void main(String[] args) {
new Window();
new cc().start();
}
}

class cc extends Thread {
int width = 0, height = 0, q = 20, r = 0, sleeptime = 1, all = 13147;
String word = “”;

public void run() {
for (int i = 0; i <= all; i++) {
try {
java.awt.image.BufferedImage img = ImageIO.read(new File(“D:\图片\test\img_” + i + “.jpg”));
//上面写你那一帧帧的图片在哪个文件夹,叫什么名
width = img.getWidth();
height = img.getHeight();
for (int y = 0; y < height; y += q) {
for (int x = 0; x < width; x += q) {
r = img.getRGB(x, y);
if (((r >> 16) & 0x0ff) > 178 || ((r >> 8) & 0x0ff) > 178 || ((r >> 8) & 0x0ff) > 178)
word += “.”;
else
word += “*”;
}
word += “\n”;
}
// System.out.println(word);
Window.settext(word);
sleep(sleeptime);
word = “”;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.err.println(“End”);
System.exit(0);
}
}


//Window

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.*;
import javax.swing.JTextPane;
import java.awt.Font;

public class Window extends JFrame {

private static final long serialVersionUID = 1L;
static JTextPane textPane = new JTextPane();
private static JPanel contentPane;

public Window() {
setTitle(“Bad apple BY:CC2001”);
setVisible(true);
setAlwaysOnTop(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(900, 500, 465, 385);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
textPane.setFont(new Font(“Calibri Light”, Font.PLAIN, 12));
textPane.setEditable(false);
Style style = new StyleContext().new NamedStyle();
StyleConstants.setLineSpacing(style, -0.6f);
StyleConstants.setFontSize(style, 10);
StyleConstants.setBold(style, true);
textPane.setLogicalStyle(style);
contentPane.add(textPane, BorderLayout.CENTER);
}

public static void settext(String text) {
textPane.setText(text);
textPane.repaint();
}
}


成品

效果还是挺爽的,可能有点吃配置

还没有声音,没法控制播放速度(这里的sleeptime是死的,没法根据运算的快慢进行动态调整)

存一群图片才能放片也是有点不爽的一点

Java贪吃蛇

发表于 2021-01-28 |

闲来无聊,想找点事干。突然想起上学时烂尾了的贪吃蛇,好久没看,加上写的贼烂于是便从头再试一试。先去网上找了找现成的,怪我太懒,改都懒得改。虽然不是完整版,但还是给了我好多帮助。


下面是从网上复制过来的:(有点不一样)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;

public class InterFace extends JFrame {

/**
*
*/
private static final long serialVersionUID = 123;

public static final int WIDTH = 800, HEIGHT = 600, SLEEPTIME = 70, L = 1, R = 2, U = 3, D = 4;
BufferedImage offersetImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(20, 40, 15 * 50, 15 * 35);
Snake snake;
Node node;

public InterFace() {
snake = new Snake(null);
createNode();
this.setBounds(0, 0, WIDTH, HEIGHT);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent arg0) {
// System.out.println(arg0.getKeyCode());
switch (arg0.getKeyCode()) {
case KeyEvent.VK_LEFT:
snake.dir = L;
break;
case KeyEvent.VK_RIGHT:
snake.dir = R;
break;
case KeyEvent.VK_UP:
snake.dir = U;
break;
case KeyEvent.VK_DOWN:
snake.dir = D;
}
}
});
this.setTitle(“贪吃蛇 0.1 By : Easy”);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
new Thread(new ThreadUpadte()).start();
}

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.white);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.red);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height);
if (snake.hit(node)) {
createNode();
}
snake.draw(g2d);
node.draw(g2d);
g.drawImage(offersetImage, 0, 0, null);
}

class ThreadUpadte implements Runnable {

public void run() {
while (true) {

try {
Thread.sleep(SLEEPTIME);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public void createNode() {
int x = (int) (Math.random() * 650) + 50, y = (int) (Math.random() * 500) + 50;
Color color = Color.red;
node = new Node(x, y, color);
}

public static void main(String args[]) {
new InterFace();
}
}

class Node {

int x, y, width = 15, height = 15;
Color color;

public Node(int x, int y, Color color) {
this(x, y);

this.color = color;

}

public Node(int x, int y) {

this.x = x;

this.y = y;

this.color = Color.black;

}

public void draw(Graphics2D g2d) {
g2d.setColor(color);
g2d.drawRect(x, y, width, height);

}

public Rectangle getRect() {

return new Rectangle(x, y, width, height);

}

}

class Snake {

public List nodes = new ArrayList();

InterFace interFace;

int dir = InterFace.R;

public Snake(InterFace interFace) {

this.interFace = interFace;

nodes.add(new Node(20 + 150, 40 + 150));

addNode();

}

public boolean hit(Node node) {

for (int i = 0; i < nodes.size(); i++) {

if (nodes.get(i).getRect().intersects(node.getRect())) {

addNode();

return true;

}

}

return false;

}

public void draw(Graphics2D g2d) {

for (int i = 0; i < nodes.size(); i++) {

nodes.get(i).draw(g2d);

}

move();

}

public void move() {

nodes.remove((nodes.size() - 1));

addNode();

}

public synchronized void addNode() {

Node nodeTempNode = nodes.get(0);

switch (dir) {

case InterFace.L:

if (nodeTempNode.x <= 20) {

nodeTempNode = new Node(20 + 15 * 50, nodeTempNode.y);

}

nodes.add(0, new Node(nodeTempNode.x - nodeTempNode.width,

nodeTempNode.y));

break;

case InterFace.R:

if (nodeTempNode.x >= 20 + 15 * 50 - nodeTempNode.width) {

nodeTempNode = new Node(20 - nodeTempNode.width, nodeTempNode.y);

}

nodes.add(0, new Node(nodeTempNode.x + nodeTempNode.width, nodeTempNode.y));

break;

case InterFace.U:

if (nodeTempNode.y <= 40) {

nodeTempNode = new Node(nodeTempNode.x, 40 + 15 * 35);

}

nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y - nodeTempNode.height));

break;

case InterFace.D:

if (nodeTempNode.y >= 40 + 15 * 35 - nodeTempNode.height) {

nodeTempNode = new Node(nodeTempNode.x, 40 - nodeTempNode.height);

}

nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y + nodeTempNode.height));

break;

}

}

}


下面这个是我费了一整天才搞出来的半成品:(下面有改进过的版本,虽然这个也能跑一会)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;

public class Eatsnake extends JFrame {
private static final long serialVersionUID = 1L;
public static final int L = 1, R = 2, U = 3, D = 4,
SLEEPTIME = 100, AX = 50, AY = 35, A = 20, RX = 20, RY = 50;
// AX为横向格子个数,A为格子边长,RX为窗口框到矩形框的横向距离
Random CC = new Random();
int keyboard = R, rwidth = AX * A, rheight = AY * A,
width = rwidth + 2 * RX, height = rheight + RY + RX;
int x = AX / 3, y = AY / 2, length = 1,
grade = 0, c = 0, px = 0, py = 0;
int cc[][] = new int[AX * AY][2];

BufferedImage offersetImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(RX, RY, AX * A, AY * A);
// 矩形外框参数

public Eatsnake() {
createegg();
new Thread(new Thread1()).start();
// 新建一个线程“Thread1”用于一直循环
setBounds(0, 0, width, height);
// 等同于this.setBounds(0, 0, width,height);this关键字是用来调用当前类的方法,不写this编译器会自动补上
setTitle(“贪吃蛇 BY:CC2001”);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
keyboard = D;
break;
case KeyEvent.VK_UP:
keyboard = U;
break;
case KeyEvent.VK_LEFT:
keyboard = L;
break;
case KeyEvent.VK_RIGHT:
keyboard = R;
break;
}
}
});
}

class Thread1 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(SLEEPTIME);
cc[++c][0] = x;
cc[c][1] = y;
if (x == AX || y == AY || x < 0 || y < 0) {
grade = 0;
x = AX / 3;
y = AY / 2;
length = 1;
keyboard = R;
c = 1;
}
switch (keyboard) {
case D:
y += 1;
break;
case U:
y -= 1;
break;
case L:
x -= 1;
break;
case R:
x += 1;
break;
}
if (x == px && y == py) {
createegg();
grade += 10;
length += 1;
}
repaint();
System.out.println(c + “ x:” + cc[c][0] + “ y:” + cc[c][1]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.black);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.white);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height); // 画矩形外框
g2d.drawString(“分数:” + grade + “ X:” + x + “ Y:” + y, 10, 45);
for (int i = c; i > c - length; i–) {
g2d.fillRect(RX + cc[i][0] * A, RY + cc[i][1] * A, A, A);
}
g2d.setColor(Color.green);
g2d.fillRect(RX + px * A, RY + py * A, A, A);
g.drawImage(offersetImage, 0, 0, null);
}

public void createegg() {
px = CC.nextInt(AX);
py = CC.nextInt(AY);
}

public static void main(String[] args) {
new Eatsnake();
}
}


里面用数组来记录脑袋之前走过的路(用来实现增长),运行一会就会炸(数组大小固定的,到头就塞不进去了)。所以又改了改,到头再折回去,应该能一直运行下去了。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;

public class Eatsnake extends JFrame {
private static final long serialVersionUID = 1L;
public static final int L = 1, R = 2, U = 3, D = 4, SLEEPTIME = 100, AX = 50, AY = 35, A = 20, RX = 20, RY = 50;
// AX为横向格子个数,A为格子边长,RX为窗口框到矩形框的横向距离
Random CC = new Random();
int keyboard = R, rwidth = AX * A, rheight = AY * A, width = rwidth + 2 * RX, height = rheight + RY + RX;
int x = AX / 3, y = AY / 2, length = 1, grade = 0, c = 0, px = 0, py = 0;
int cc[][] = new int[AX * AY][2];

BufferedImage offersetImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(RX, RY, AX * A, AY * A);
// 矩形外框参数

public Eatsnake() {
createegg();
new Thread(new Thread1()).start();
// 新建一个线程“Thread1”用于一直循环
setBounds(0, 0, width, height);
// 等同于this.setBounds(0, 0, width,height);this关键字是用来调用当前类的方法,不写this编译器会自动补上
setTitle(“贪吃蛇 BY:CC2001”);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
keyboard = D;
break;
case KeyEvent.VK_UP:
keyboard = U;
break;
case KeyEvent.VK_LEFT:
keyboard = L;
break;
case KeyEvent.VK_RIGHT:
keyboard = R;
break;
}
}
});
}

class Thread1 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(SLEEPTIME);
c += 1;
if (c < AX * AY) {
cc[c][0] = x;
cc[c][1] = y;
} else {
cc[0][0] = x;
cc[0][1] = y;
c = 0;
}
if (x == AX || y == AY || x < 0 || y < 0) {
grade = 0;
x = AX / 3;
y = AY / 2;
length = 1;
keyboard = R;
c = 1;
}
switch (keyboard) {
case D:
y += 1;
break;
case U:
y -= 1;
break;
case L:
x -= 1;
break;
case R:
x += 1;
break;
}
if (x == px && y == py) {
createegg();
grade += 10;
length += 1;
}
repaint();
System.out.println(c + “ x:” + cc[c][0] + “ y:” + cc[c][1]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.black);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.white);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height); // 画矩形外框
g2d.drawString(“分数:” + grade + “ X:” + x + “ Y:” + y, 10, 45);
for (int i = c; i > c - length; i–) {
if (i < 0) {
int r = AX * AY + i;
g2d.fillRect(RX + cc[r][0] * A, RY + cc[r][1] * A, A, A);
}
else {
g2d.fillRect(RX + cc[i][0] * A, RY + cc[i][1] * A, A, A);
}
}
g2d.setColor(Color.green);
g2d.fillRect(RX + px * A, RY + py * A, A, A);
g.drawImage(offersetImage, 0, 0, null);
}

public void createegg() {
px = CC.nextInt(AX);
py = CC.nextInt(AY);
}

public static void main(String[] args) {
new Eatsnake();
}
}


但还是没编蛇头碰身子的东东,就这样了,实在懒得弄了😂

我这个版本虽然有点乱,但是因为我的编码水平和大多新手相近,应该更好理解一点吧。。。


又改了改,让蛇自己动,看个乐子了,感觉有点吃配置。编蛇头碰身子的东东是不可能做的

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;

public class AIEatsnake extends JFrame {
private static final long serialVersionUID = 1L;
public static final int L = 1, R = 2, U = 3, D = 4, SLEEPTIME = 10, AX = 80, AY = 45, A = 20, RX = 20, RY = 50;
// AX为横向格子个数,A为格子边长,RX为窗口框到矩形框的横向距离
// SLEEPTIME调整刷新时间,调高以缓解运行压力<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Random CC = new Random();
int keyboard = R, rwidth = AX * A, rheight = AY * A, width = rwidth + 2 * RX, height = rheight + RY + RX;
int x = AX / 3, y = AY / 2, length = 1, grade = 0, c = 0, px = 0, py = 0;

//int max = 50;
int max = AX * AY;
// 这里的“AX * AY”是蛇的长度上限,可以自定一个<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

int cc[][] = new int[max][2];
BufferedImage offersetImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(RX, RY, AX * A, AY * A);
// 矩形外框参数

public AIEatsnake() {
createegg();
new Thread(new Thread1()).start();
// 新建一个线程“Thread1”用于一直循环
setBounds(0, 0, width, height);
// 等同于this.setBounds(0, 0, width,height);this关键字是用来调用当前类的方法,不写this编译器会自动补上
setTitle(“贪吃蛇 BY:CC2001”);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}

class Thread1 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(SLEEPTIME);
c += 1;
if (c < max) {
cc[c][0] = x;
cc[c][1] = y;
} else {
cc[0][0] = x;
cc[0][1] = y;
c = 0;
}
if (x == AX || y == AY || x < 0 || y < 0) {
grade = 0;
x = AX / 3;
y = AY / 2;
length = 1;
keyboard = R;
c = 1;
}

if (x == px) {
if (y < py) {
keyboard = D;
} else {
keyboard = U;
}
} else if (x < px) {
keyboard = R;
} else {
keyboard = L;
}
// 让蛇自己动的代码
switch (keyboard) {
case D:
y += 1;
break;
case U:
y -= 1;
break;
case L:
x -= 1;
break;
case R:
x += 1;
break;
}
if (x == px && y == py) {
createegg();
grade += 10;
if (length <= max)
length += 1;
}
repaint();
System.out.println(c + “ x:” + cc[c][0] + “ y:” + cc[c][1]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.black);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.white);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height); // 画矩形外框
g2d.drawString(“分数:” + grade + “ X:” + x + “ Y:” + y, 10, 45);
g2d.setColor(Color.green);
for (int i = c; i > c - length; i–) {
if (i < 0) {
int r = max + i;
g2d.fillRect(RX + cc[r][0] * A, RY + cc[r][1] * A, A, A);
} else {
g2d.fillRect(RX + cc[i][0] * A, RY + cc[i][1] * A, A, A);
}
}
g2d.setColor(Color.white);
g2d.fillRect(RX + x * A, RY + y * A, A, A);

g2d.setColor(Color.yellow);
g2d.fillRect(RX + px * A, RY + py * A, A, A);
g.drawImage(offersetImage, 0, 0, null);
}

public void createegg() {
px = CC.nextInt(AX);
py = CC.nextInt(AY);
}

public static void main(String[] args) {
new AIEatsnake();
}
}

还是挺有意思的东东😁

卡mc服务器的bug

发表于 2021-01-25 |

这几天没少玩服务器,用着指令就很方便(/back /home什么的),在地狱冒险和其他容易暴毙的环境时/back就很有用,快掉进岩浆时传送一下,只要手速够快就能救下一背包东东。

传送走之后,再用/back传送回去,系统就会把你传送到之前你传走的那个地方的附近(避开岩浆,免得传回来直接挂掉),但是寻找安全的落脚点的机制貌似不太聪明,找片岩浆海,直接往里跳,传走传回,直接就可以传到地狱上基岩的上面。就免去了破基岩的步骤,直接上去了。应该算是个小bug了吧,嘻嘻嘻。

<--1…151617…31-->

CC2001

93 日志
GitHub BiliBili
© 2025 CC2001
由 Hexo 强力驱动
|
主题 — NexT.Pisces