贪吃蛇系列二

《Java小游戏实现》:贪吃蛇 《Java小游戏实现》:贪吃蛇在完成坦克大战之后,就想到了贪吃蛇这个小游戏,因为这两个游戏太像了,因此,就决定把这个游戏来尝试的写下。接下来的几篇博文就是来记录这个小游戏实现的全过程。突然,想起,一年前(时间是2015年7月3日),我刚学习Java的时候看过别人写的这个游戏源代码,还专门写了篇博文,连接如下:http://blog.csdn.net/u010412719/article/detail 阅读详情

一、包和类关系:

二、源码

Game.class

import java.awt.BorderLayout;
import java.awt.Color;

import controller.Controller;
import snake.Food;
import snake.Ground;
import snake.Snake;
import snake.Thorn;
import util.Constant;
import view.GamePanel;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Game {
	public static void main(String[] args) {
			// TODO Auto-generated method stub
			 Snake snake = new Snake();
			 Food food = new Food();
			 GamePanel gamePanel = new GamePanel();
			 Ground ground = new Ground();
			 Thorn thorn = new Thorn();
			 Controller controller = new Controller(snake, food, ground, gamePanel, thorn);
			 
			 //创建一个新窗口
			 JFrame frame = new JFrame("贪吃蛇游戏");
			 //将画板嵌入窗口中
			 frame.add(gamePanel);
			 //设置窗口背景色
			 frame.setBackground(Color.magenta);
			 //设置窗口大小
			 frame.setSize(Constant.WIDTH*Constant.CELL_SIZE+6, 
			 Constant.HEIGHT*Constant.CELL_SIZE+40);
			 //设置画板大小
			 gamePanel.setSize(Constant.WIDTH*Constant.CELL_SIZE, 
			 Constant.HEIGHT*Constant.CELL_SIZE);
			 frame.add(gamePanel);
			 //不可改变窗口大小
			 frame.setResizable(false);
			 //设置窗口可见
			 frame.setVisible(true);
			 //关闭窗口
			 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			  
			 gamePanel.addKeyListener(controller);
			 snake.addSnakeListener(controller);
			 frame.addKeyListener(controller);
			  
			 JLabel label1 = new JLabel();
			 label1.setBounds(0, 400, 400, 100);
			 label1.setText("     ENTER=>>PAUSE or AGAIN;   "
			 + " L=>DRAWGRID");
			 label1.setForeground(Color.BLACK);
			 frame.add(label1, BorderLayout.SOUTH);
			  
			 controller.startGame();
		 }
	}

SnakeListener.class

import snake.Snake;

public interface SnakeListener {
	public void snakeMove(Snake snake);

}
Constant.class
public class Constant {
	public static int CELL_SIZE = 20;
	public static int WIDTH = 20;
	public static int HEIGHT = 20;
}

GamePanel.class

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
import snake.Food;
import snake.Ground;
import snake.Snake;
import snake.Thorn;
import util.Constant;

public class GamePanel extends JPanel{
	 private static final long serialVersionUID = 1L;
	  
	 Snake snake;
	 Food food;
	 Ground ground;
	 Thorn thorn;
	  
	 public void display(Snake snake, Food food, Ground ground, Thorn thorn){
		 this.snake = snake;
		 this.food = food;
		 this.ground = ground;
		 this.thorn = thorn;
		  
		 System.out.println("display gamePanel");
		 this.repaint();
	 }
	  
	 @Override
	 protected void paintComponent(Graphics g) {
		 if(snake != null && food != null && ground != null){
			 g.setColor(Color.lightGray);
			 g.fillRect(0, 0, Constant.WIDTH*Constant.CELL_SIZE, Constant.HEIGHT*Constant.CELL_SIZE);
			 snake.drawMe(g);
			 food.drawMe(g);
			 ground.drawMe(g);
			 thorn.drawMe(g);
		 }else{
			 System.out.println("snake = null || food = null || ground = null");
		 }
	 }
}

Food.class

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import util.Constant;

public class Food {
	private int x = 0;
	private int y = 0;
	
	//food is red
	private Color color = Color.red;
	
	public void newFood(Point point){
		x = point.x;
		y = point.y;
	}
	
	public boolean isAte(Snake snake){
		if(snake.getHead().equals(new Point(x, y))){
			System.out.println("food isAte");
			return true;
		}
		return false;
	}
	
	public void setFoodColor(Color color){
		this.color = color;
	}
	
	public Color getFoodColor(){
		return this.color;
	}
	
	public void drawMe(Graphics g){
		System.out.println("draw food");
		g.setColor(this.getFoodColor());
		g.fill3DRect(x * Constant.CELL_SIZE, y * Constant.CELL_SIZE, Constant.CELL_SIZE, Constant.CELL_SIZE, true);
	}
}

Ground.class

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.LinkedList;
import java.util.Random;
import util.Constant;

public class Ground {
	//在二维数组中,当为1,表示是砖块
	 private int[][] rock = new int[Constant.WIDTH][Constant.HEIGHT];
	  
	 private boolean drawLine = true;
	  
	 public boolean isDrawLine() {
		 return drawLine;
	 }
	 
	 public void setDrawLine(boolean drawLine) {
		 this.drawLine = drawLine;
	 } 
	 public Ground(){
		 for(int x = 0; x < Constant.WIDTH; x++){
			 for(int y = 0; y < Constant.HEIGHT; y++){
				 rock[0][y] = 1;
				 rock[x][0] = 1;
				 rock[Constant.WIDTH-1][y] = 1;
				 rock[y][Constant.HEIGHT-1] = 1;
			 }
		 }
	 }
	  
	 //打印游戏的网格
	 public void drawGrid(Graphics g){
		 for(int x = 2; x < Constant.WIDTH; x++){
			 g.drawLine(x * Constant.CELL_SIZE, 0, x*Constant.CELL_SIZE,
			 Constant.CELL_SIZE * Constant.HEIGHT);
		 }
		 for(int y = 2; y < Constant.HEIGHT; y++){
			 g.drawLine(0, y * Constant.CELL_SIZE, 
			 Constant.WIDTH*Constant.CELL_SIZE, y*Constant.CELL_SIZE);
		 }
	 }
	 public void drawMe(Graphics g){
		 System.out.println("draw ground");
		  
		 //打印围墙
		 g.setColor(Color.pink);
		 for(int x = 0; x < Constant.WIDTH; x++){
			 for(int y = 0; y < Constant.HEIGHT; y++){
				 if(rock[x][y] == 1){
				  g.fill3DRect(x * Constant.WIDTH, y * Constant.HEIGHT,
				  Constant.CELL_SIZE, Constant.CELL_SIZE, true);
				 }
			 }
		 }
		 if(isDrawLine()){
			 g.setColor(Color.yellow);
			 this.drawGrid(g);
		 }
	 }
	  
	 //得到一个随机点
	 public Point getRandomPoint(Snake snake, Thorn thorn){
		 Random random = new Random();
		 boolean isUnderSnakebody = false;
		 boolean isUnderThorn = false;
		 int x,y = 0;
		 LinkedList<Point> snakeBody = snake.getSnakeBody();
		 LinkedList<Point> thorns = thorn.getThorns();
		 do{
			 x = random.nextInt(Constant.WIDTH);
			 y = random.nextInt(Constant.HEIGHT);
			 for(Point p:snakeBody){
				 if(x == p.x && y == p.y){
					 isUnderSnakebody = true;
				 }
			 }
			 for(Point point : thorns){
				 if(x == point.x && y == point.y){
					 isUnderThorn = true;
				 }
			 }
		 }while(rock[x][y] == 1 && !isUnderSnakebody && !isUnderThorn);
		 
		 return new Point(x, y);
	 }
	  
	 public boolean isSnakeHitRock(Snake snake){
		 System.out.println("snake hit rock");
		  
		 for(int i = 0; i < Constant.WIDTH; i++){
			 for(int j = 0; j < Constant.HEIGHT; j++){
				 if(snake.getHead().x == i && snake.getHead().y == j && rock[i][j] == 1){
					 return true;
				 }
			 }
		 }
		 return false;
	 }
	  
}

Snake.class

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

import listener.SnakeListener;
import util.Constant;

public class Snake {
	// 和蛇的监听器有关
	Set<SnakeListener> snakeListener = new HashSet<SnakeListener>();

	// 用链表保存蛇的身体节点
	LinkedList<Point> body = new LinkedList<Point>();

	private boolean life = true;

	// 默认速度为400ms
	private int speed = 400;
	private Point lastTail = null;
	private boolean pause = false;

	// 定义各个方向
	public static final int UP = 1;
	public static final int DOWN = -1;
	public static final int LEFT = 2;
	public static final int RIGHT = -2;
	int newDirection = RIGHT;
	int oldDirection = newDirection;

	public Snake() {
		initial();
	}

	public void initial() {
		// 先清空所有的节点
		body.removeAll(body);

		int x = Constant.WIDTH / 2;
		int y = Constant.HEIGHT / 2;

		// 蛇的默认长度为7
		for (int i = 0; i < 7; i++) {
			body.add(new Point(x--, y));
		}
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

	public void setLife(boolean life) {
		this.life = life;
	}

	public boolean getLife() {
		return this.life;
	}

	public boolean getPause() {
		return this.pause;
	}

	public void setPause(boolean pause) {
		this.pause = pause;
	}

	public void move() {
		// 蛇移动的实现所采用的数据结构为:蛇尾删除一个节点,蛇头增加一个节点。

		System.out.println("snake move");

		if (!(oldDirection + newDirection == 0)) {
			oldDirection = newDirection;
		}
		lastTail = body.removeLast();

		int x = body.getFirst().x;
		int y = body.getFirst().y;

		switch (oldDirection) {
		case UP:
			y--;
			break;
		case DOWN:
			y++;
			break;
		case LEFT:
			x--;
			break;
		case RIGHT:
			x++;
			break;
		}
		Point point = new Point(x, y);
		body.addFirst(point);
	}

	// 当吃到一个食物的时候,把删掉的蛇尾节点增加回来
	public void eatFood() {
		System.out.println("snake eat food");

		body.addLast(lastTail);
	}

	public boolean isEatItself() {
		for (int i = 2; i < body.size(); i++) {
			if (body.getFirst().equals(body.get(i))) {
				return true;
			}
		}
		return false;
	}

	public void drawMe(Graphics g) {
		System.out.println("draw snake");

		// 循环打印蛇的各个身体节点
		for (Point p : body) {
			if (p.equals(body.getFirst())) {
				// 当是蛇头的时候,就设置颜色为橘色
				g.setColor(Color.orange);
			} else {
				g.setColor(Color.pink);
			}
			g.fill3DRect(p.x * Constant.CELL_SIZE, p.y * Constant.CELL_SIZE,
					Constant.CELL_SIZE, Constant.CELL_SIZE, true);
		}
	}

	public void changeDirection(int direction) {
		System.out.println("snake changeDirection");
		this.newDirection = direction;
	}

	// 内部类,新增一个游戏线程
	public class DriveSnake implements Runnable {
		public void run() {
			while (life) {
				if (!pause) {
					// 只要让蛇不动就可以暂停游戏
					move();
				}
				// 监听蛇每次移动的情况
				for (SnakeListener listener : snakeListener) {
					listener.snakeMove(Snake.this);
				}
				try {
					Thread.sleep(speed);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void startMove() {
		new Thread(new DriveSnake()).start();
	}

	// 增加监听器的方法
	public void addSnakeListener(SnakeListener listener) {
		if (listener != null) {
			snakeListener.add(listener);
		}
	}

	// 返回蛇的第一个身体节点
	public Point getHead() {
		return body.getFirst();
	}

	// 返回蛇的所有身体节点
	public LinkedList<Point> getSnakeBody() {
		return this.body;
	}

	public boolean died() {
		this.life = false;
		return true;
	}
}

Thorn.class

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.LinkedList;

import util.Constant;

public class Thorn {
	 int x, y;
	 private LinkedList<Point> thorns = new LinkedList<Point>();
	  
	  
	 //返回所有荆棘的链表
	 public LinkedList<Point> getThorns(){
		 return this.thorns;
	 }
	  
	 public void newThorn(Point point){
		 x = point.x;
		 y = point.y;
		  
		 thorns.add(new Point(x, y));
	 }
	  
	 public void drawMe(Graphics g){
		 System.out.println("draw thorns");
		  
		  
		 for(Point p: thorns){
			 int[] xb = {p.x*Constant.CELL_SIZE, 
				  (p.x*Constant.CELL_SIZE +Constant.CELL_SIZE/2),
				  (p.x*Constant.CELL_SIZE+Constant.CELL_SIZE),
				  (p.x*Constant.CELL_SIZE+Constant.CELL_SIZE/4*3), 
				  (p.x*Constant.CELL_SIZE+Constant.CELL_SIZE),
				  (p.x*Constant.CELL_SIZE+Constant.CELL_SIZE/2), 
				  p.x*Constant.CELL_SIZE,
				  (p.x*Constant.CELL_SIZE+Constant.CELL_SIZE/4), 
				  p.x*Constant.CELL_SIZE};
			 int [] yb = {p.y*Constant.CELL_SIZE, 
				  (p.y*Constant.CELL_SIZE+Constant.CELL_SIZE/4),
				  p.y*Constant.CELL_SIZE,
				  (p.y*Constant.CELL_SIZE+Constant.CELL_SIZE/2),
				  (p.y*Constant.CELL_SIZE+Constant.CELL_SIZE),
				  (int)(p.y*Constant.CELL_SIZE+Constant.CELL_SIZE*0.75),
				  (p.y*Constant.CELL_SIZE+Constant.CELL_SIZE),
				  (p.y*Constant.CELL_SIZE+Constant.CELL_SIZE/2),
				  p.y*Constant.CELL_SIZE};
			  
			 g.setColor(Color.darkGray);
			 g.fillPolygon(xb, yb, 8);
		 }
	  
	 }
	  
	  
	 public boolean isSnakeHitThorn(Snake snake){	  
		 for(Point points : thorns){
			 if(snake.getHead().equals(points)){
				  System.out.println("hit thorn");
				  return true;
			 }
		 }
		 return false;
	 }
}






转自:https://www.jb51.net/article/115616.htm

JAVA贪吃蛇小游戏源代码系列 Java贪吃蛇小游戏元源代码 阅读详情

相关推荐

用Python做贪吃蛇小游戏

用Python做贪吃蛇小游戏简介引言游戏预览结构图代码框架图代码讲解main主函数-开始工作show_start_info()欢迎进入游戏running_game-让我们开始游戏吧draw_snake-画出我们的贪吃蛇draw_food-画出我们的食物 简介 贪吃蛇游戏是一款经典的益智游戏,既简单又耐玩。该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长。 引言 贪吃蛇小游的设计过程,以及这个系...

weixin_44279800的博客 5392

贪吃蛇游戏(java)

1、采用MVC(model、view、control)框架模式    3、包和类的关系树形图为:  4、源码:    package com.huai;import java.awt.Color;import java.awt.Graphics;import java.awt.Point;import java.util.HashSet;import java.util.Li

ChainingBlocks 1316

贪吃蛇系列开篇----设计智能贪吃蛇小游戏

问题描述:贪吃蛇这个游戏已经是大家都非常熟悉的经典游戏了,我用简短的话概述一下,就是用户使用上、下、左、右四个方向键控制贪吃蛇的运动方向,保证蛇在既不撞墙,又不撞到自己身体的前提下,安全的吃到美味的食物。起因:当时无意中我看到了有人做了一个具有一定智能的贪吃蛇,虽然那个贪吃蛇还不够聪明,我当时的想法就是设计完成一个贪吃蛇游戏,让我做出来的这条蛇比我看到的那条更加的聪明。首先必须要做的:为了最终让我的

yi_ming_he的博客 1690

java监听器模式

最近正在写一个小练习,java

克念的blog 989

贪吃蛇系列终章----贪吃蛇专家智能bug修复版

这个版本也是这个贪吃蛇系列的最后一个版本了(虽然蛇长度变得很长之后,食物在某些区域,蛇的行走路线还有优化的空间,但是近期应该不会再进行更新了),下面对之前所有的迭代版本做一个总结:版本一、只有闯关模式和限时模式(主要时间花在贴那个蛇头,蛇转弯,蛇身和蛇尾上面,因为不同的方向状态是不一样的)(整整1天) 版本二、初级智能版,用了简单的BFS搜索,主要针对大食物和小食物(2个小时) 版本三、中级智能

yi_ming_he的博客 1万+

100行系列-Python贪吃蛇小游戏

今天来尝试下用python写一个贪吃小游戏,哈哈哈哈,毕竟贪吃蛇,大家小时候都玩过,但现在却有机会自己实现一个!!! 视频:Python100行系列-贪吃蛇小游戏_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 原文:https://hzeyuan.cn/ 效果图 下面是学习的过程啦! 1.如何画turtle画一个正方形? 其实就是一个点,往右,往下,往左,往上,回到原点… ...

hzeyuan.cn 1210

java 简单版贪吃蛇小游戏

在利用java编程的时候,我们应该用面向对象的编程思想来写。    贪吃蛇游戏中,你应该要知道有几个对象,每个对象中应该有森马方法和属性。 GamePanel类    //显示类  Void display();          //显示 Food类    //食物类 boolean isSnakeEatFood(Snake);  //判断

一个北漂的程序猿 1651

基于单片机的贪吃蛇游戏

<br />绪论<br /> 1.1 研究背景与意义<br /> 随着社会的发展,人们生活的步调日益加快,越来越多的人加入了全球化的世界。<br /> 人们不再拘泥于--,J,块天地,加班,出差成了现代人不可避免的公务。而此时一款可以<br /> 随时随地娱乐的游戏成了必需品。贪吃蛇这一游戏简单易行,操作方便,娱乐性较强,<br /> 吸引了不少人。这一款游戏紧紧地抓住了人们的心理,虽然简单,却其乐无穷,在人们<br /> 不断追求更多的欲望下,该游戏给人们带来了追逐的快感,以及成功后的满足感,

lqs82791847的专栏 1万+

java贪吃蛇系统架构_java贪吃蛇游戏框架搭建

java贪吃蛇游戏框根据面向对象的思想建立蛇类、食物类、周围石头类、面板类、控制中心类、监听器类、组建类。Food.javapublic class Food {//蛇是否吃到了食物方法public boolean isSnakeEatFood(){System.out.println("蛇是否吃到了食物");return false;}//绘制食物方法public void drawFood()...

weixin_31693025的博客 772

强化学习Agent系列(二)——PyGame虚拟环境创建与Python 贪吃蛇Agent制作实战教学

大家好,未来的开发者们请上座随着人工智能的发展,强化学习基本会再次来到人们眼前,遂想制作一下相关的教程。强化学习第一步基本离不开虚拟环境的搭建,下面用大家耳熟能详的贪吃蛇游戏为基础,制作一个Agent,完成对这个游戏的绝杀。万里长城第二步:用python开发贪吃蛇智能体****加粗样式gymnasium(此前称为gym)是一个由 OpenAI 开发的 Python 库,用于开发和比较强化学习算法。它提供了一组丰富的环境,模拟了各种任务,包括但不限于经典的控制问题、像素级游戏、机器人模拟等。

风吹落叶的博客 2639

玩转Docker小游戏项目系列:Docker环境下部署贪吃蛇网页小游戏(二)

【好玩的经典游戏】Docker环境下部署贪吃蛇网页小游戏(二)

jks212454的博客 1337

计算机软件技术实习日志(BDB系列)贪吃蛇二

为了初步了解并掌握和算法设计的方法,使自身具备初步的独立分析和设计能力。初步掌握软件开发过程的问题分析分析、系统设计、程序编码和测试等基本方法和技能。开始尝试编译基于MFC的简易计算器。(水字数专用)

Boat___的博客 136

重回童年的经典系列☀️|【贪吃蛇小游戏】近两万字完整制作过程+解析+源码 【建议收藏学习】

今天给大家带来一款经典的贪吃蛇小游戏,相信大家应该都应该玩过 包时候在经典的诺基亚手机上,也是百玩不厌,算是最经典的游戏之一了! 那今天就来学习一下怎样制作这个经典的贪吃蛇小游戏吧!

努力前行,总会成为自己心中的那道光 10万+

调用链系列(二):解读UAVStack中的贪吃蛇-调用链

前言 上篇文章分享了一下调用链的模型设计及模型时序图。相信大家通过上一篇文章对调用链有了一个整体上的了解,如:调用链是什么、能做什么及整体实现策略。 这篇文章我们继续介绍调用链的服务端信息收集以及服务间上下文传递。 服务端信息收集 服务端信息收集整体流程如下图所示,通过在应用容器(tomcat等)启动过程中植入切点从而实现在应用逻辑执行之前和...

gao2175的博客 445

制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制“大白”颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮,断开后闪烁 l 配网按键 l 云端定时功能 l 云端报警提示功能 l 云端历史数据查看 l 远程升级介绍 视频演示:【开源】制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)_哔哩哔哩_bilibili 一、界面展示 ...

东小东博客 7115

ANSYS Workbench对称分析进阶:手把手教你用Pre-Meshed Cyclic Region处理外部导入的复杂网格模型

本文详细介绍了ANSYS Workbench中Pre-Meshed Cyclic Region功能在处理外部导入复杂网格模型时的应用。通过循环对称分析技术,可显著减少计算资源消耗,特别适用于叶轮机械、齿轮组等周期性结构分析。文章深入解析了该功能的底层逻辑,并提供了从NASTRAN文件导入的离心压缩机叶轮案例,帮助工程师克服网格匹配难题。

weixin_28630185的博客 313

C语言实现贪吃蛇之图形界面篇

这已经是贪吃蛇系列的第五篇了,讲真一直写这个也挺无聊的,所以这一篇博文将是系列的最后一篇。虽然已经介绍了贪吃蛇的几种写法,但说到底我们的游戏还只是在一个黑框框里移动的星号。和我们平时玩的贪吃蛇游戏有不少差距。游戏嘛,画面也是很重要的一环。接下来就是让之前的贪吃蛇游戏脱胎换骨的时候了。话不多说,这就开干吧。   首先,为了摆脱无趣的黑框(控制台),我们这次新建一个win32项目,直接点击完成。

liutong123987的专栏 1万+

生存分析机器学习问题

然而,随着人工智能 (AI) 和机器学习 (ML) 的兴起,科学家现在能够开发更复杂的模型,揭示这些数据集中的模式和特征,从而为癌症的生物学、诊断、预后、治疗和预后提供新的见解。病情更重的患者可能接受更强(或更弱)的治疗,导致治疗方案与不良预后(死亡)强相关。数据集中包含失访或研究结束时仍存活的患者(删失数据),他们的真实生存时间未知,仅知道其存活时间不低于观察到的最后一次随访时间。优先选择参数少、结构简单的模型(如带强正则化的线性模型、简单树模型),避免复杂模型(如深度神经网络)。时刻的状态是未知的。

4AM_明朝百晓生 1223

C语言项目实践——贪吃蛇

C语言与数据结构的第一个项目——贪吃蛇详解!!!

hu_ju_hong的博客 4986

从个体到群体:Cartool实战静息态EEG微状态聚类全解析

本文详细解析了使用Cartool软件进行静息态EEG微状态聚类的完整实战流程。从个体水平聚类到群体模板提取,再到指标量化,文章深入探讨了k-means算法的应用、GFP峰值数据的使用技巧以及关键参数设置,为脑电信号处理研究者提供了从数据准备到结果解读的全方位指南。

weixin_29062671的博客 290

从零搭建一个AF架构项目:基于TIA Portal V19和S7-PLCSIM的仿真调试全流程

本文详细介绍了如何在TIA Portal V19环境中从零搭建西门子Automation Framework(AF架构)项目,包括环境准备、硬件组态、核心组件创建、项目架构分层实现以及仿真调试全流程。通过模块化编程和标准化接口设计,AF架构显著提升工业自动化项目的开发效率和维护便利性,特别适合S7-1500系列PLC的应用开发。

weixin_29313547的博客 674

C语言:【项目实现】贪吃蛇

(3).GetStdHandle函数:用于从一个特定的标准设备(标准输入(例如键盘),标准输出(屏幕),标准错误)中获得一个句柄(换句话说,就是你想要去操作一个设备,你就得去获得这个设备的一些数据,(比如说:你现在想要去使用锅,那么你就得抓住这口锅的手柄,这样你才能去操作这口锅)这里的句柄和锅的手柄是一个道理,当我们得到这个句柄之后,我们就可以去操作这个设备了)。//(HANDLE是句柄的类型,DWORD是GetStdHandle参数的类型,nStdHandle是参数的取值)

2301_81390458的博客 1928

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254
上一篇: 贪吃蛇系列一:Java用JFrame、JPanel、Graphics绘图案例讲解
下一篇: Form表单提交到Web服务器
Isringring
博客等级 码龄10年 7粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值