Do you mean a set of blocks? The “Motion” category is for 2D movement, and the “3D Action” category is for 3D movement. Are you referring to some smaller subset of blocks?
Posts made by info-creaticode
-
RE: Code block presets?
-
RE: Video Permissions
Currently all users can only upload images, not files of any other type. How about sharing it on Youtube and then post the URL?
-
RE: Something in this script is crashing
If you are not ready to publish the project, you can also email the URL to info@creaticode.com. Our admin account can open private projects as well.
-
RE: color sensing
In that case, it is easier to get the value of the color component and check if it is within a range. For example, if the color component is between 30 and 38, it is some kind of green:
You can go further by checking saturation and brightness as well if you need it to be more precise.
-
RE: Quick Question
You can call it that, but the real reason is that the Scratch Cat is copyrighted, and it is not part of the open-source Scratch project. So we can not reuse that cat in our platform as the default sprite.
-
RE: color sensing
Maybe you can try to use “OR” to combine multiple color sensing blocks?
-
Colored Map of the 50 States in US (Difficulty: 3)
Introduction
The map of all 50 states in the US is a handy tool for creating interactive projects for social studies or geography. In this tutorial, you will learn to build a very basic demo that shows all 50 states in different colors. You will practice using table variables and clones along the way.
Step 1 - Remix the Template
Please open the following project and remix it as your own project.
play.creaticode.com/projects/6787f4c3b71b8505f221326c
This project has only one sprite called “states”. It contains the costumes of all 50 states, in pure white color. It also includes a table with these columns about each state: state, x, y, shortname, color, saturation. You will learn how to use the costumes and this table in the steps below.
Step 2 - Use Clone to Display One State
Next, to keep it simple, we will first try to display one state. We will need to use a clone to represent that state, and hide the original sprite itself. This way, to show more states later, we just need to add more clones.
You can pick the costume of any state, such as “Florida”. When you run the project, you will see the map of that state at the center:
Step 3 - Specify the State Using Clone ID
In CreatiCode, when you create a clone, you can also specify a “clone ID”, which can be any text or number. This makes it easy to tell each clone to do something differently. In this step, we will set the clone ID to be 1. And when we select the costume, we will use the clone ID as the row number to read the state name from the “stateinfo” table. Since the clone ID is set to 1, we will get the first state in the table, which is “Alabama”:
The program will show the map of Alamaba now when we run it:
Step 4 - Move the clone to the given position
To show each state at its correct position, we need to read the x and y positions of that state from the table, then make the clone go there. Again, we are still using the “clone ID” as the row number to index into the table.
Now we see the Alabama state in the correct position:
Step 5 - Add Color to the State
We can also use color effects to change the “color” and “saturation” of the state, so that it is no longer white. We need to read these 2 columns from the table in a similar way, using clone ID as the row number:
And now the Alabama state has a nice color:
Step 6 - Print the Short name (Abbreviation) of the state
Next, we can read the “shortname” column to get the 2-letter abbreviation of the state, and then “print” them at the same x and y positions. Note that this block is too wide so it is shown as 2 rows below:
This is what we get now:
Step 7 - Make 50 Clones Using a For-loop
To add all 50 states, we just need to make 50 clones with clone ID going from 1 to 50. An easy way to do it is to use a for-loop like this:
This will give us a complete map:
Step 8 - Random Coloring
If you don’t like the default color/saturation that is given, you can color the states in other ways. For example, you can use 2 random numbers for the color and saturation effects. Note that the color effect takes any number between 1 and 200 (not 100), and the saturation is a number between 1 and 100. If you don’t want to use colors that are too “strong” or “light”, you can limit the saturation between 20 and 80 like this:
Now every time you run the project, you will get a new random color set:
Step 9 - Faster Drawing (Advanced)
You might have noticed that it takes a few seconds to draw all 50 states. This is because after adding each clone, the playground will update the stage to reflect that. If we just want to draw all 50 states quickly, we can use a common trick that disables “screen refresh”:
Define a new custom block named “add states”, and check “Run without screen refresh” on the left:
Next, move the for-loop inside the definition of this block:
Essentially, the program is running the same tasks, but the playground will not update the stage until all 50 states are added, so it is much faster:
Additional Challenges
You can build many interesting projects based on this template. Here are some ideas for you to try:
-
Shift the short name: Currently the 2-letter abbreviation is printed at the center of each state. However, it does not look good for some states, such as Hawaii, Michigan, New York, Idaho, etc. You can add 2 new columns of “xshift” and “yshift” to the “stateinfo” table, and fill in how much you want to shift the 2 letters from the center of the state. For example, if you want the “HI” to be printed below the Hawaii map, you can set the yshift for the row of Hawaii to be -30, and when you print the “HI” onto the map, add the yshift to the y position of the letters.
-
Interactive Map: You can make a state show a highlight whenever it touches the mouse pointer by changing its “brightness” color effect.
-
Zoom-in: When a user clicks any state, you can show an enlarged version of that state and other states near by. You will not only need to change the “size” of the clone, but also scale its x and y positions.
-
-
RE: Block Feature Request
Can you be more specific? Which block you plan to use with the moderation block? Usually an image is either a URL or a costume in our playground.
-
RE: Block Feature Request
Thank you for the suggestion. Would the image be a costume of the sprite? In that case, how about a block that looks like this?
get moderation result for costume [COSTUME_NAME]
-
RE: Sheets API Not Working
Reading range A1:Z999999 is definitely too large. How about trying to read a few rows at a time?
-
RE: I need help with my chatting system
That’s a good idea. We will provide a new block that can fetch the user’s profile picture as a new costume, then you can use that costume as the icon in the chat window.
-
RE: Army Games
Thanks for checking with us. In general, if it is acceptable on MIT Scratch, then we are fine with it, but we prefer the death scene to be not so violent. If the game is fun, the players should not care much about whether the death animation is very realistic, right?
-
RE: Search engine
If the problem persists, please share the project URL so we can investigate more.
-
A Web Search App (Difficulty: 3)
Introduction
The world wide web contains a huge amount of information, and you can almost find anything you would like to learn about if you know how to search the web. In this tutorial, we will build a small web search app, where the user can run a web search on a few keywords, then open any of the websites in the search result.
Note that this project only takes about 15 blocks for all the tasks above, and it demonstrates how to use widgets, tables, and variables in a very efficient way.
Step 1 - Add a Dark Background
Create a new project, remove the dog sprite, then switch to the stage. You can search or create a dark background image from the AI image library so that it is not very distracting. For example, if you search for “dark”, you can find a background like this one:
Step 2 - Add Input Textbox and Search Button
When the green flag is clicked, we will add 2 widgets onto the stage. The textbox allows the user to input a query, and the button will trigger a search:
You can add these 2 widgets like this:
Step 3 - Handle the Search Button Click
After the user input some query, and then click the “Search” button, we can run a web search. As an example, we will ask for the top 5 most relevant websites, and store their information in a table named “result_table”:
To review the search results, you can temporarily enable the “result_table” display, and you will see that the table is populated with 5 rows of search results, and each row has 3 columns: title, link and snippet.
Step 4 - Display the First Result as a Button
Next, we need to display all 5 results. However, to start simple, let’s try to only display the first result as a new button like this:
To do that, we need to read the content of row 1 and column “title” from the result_table. We will also simply name this button as “1”, which will be useful in the next few steps:
Step 5 - Display All Results Using a For-Loop
Now we can modify our code so it iterates through all the rows in the result_table.
First, we can use a for-loop to go through all rows in the table like this:
Next, we will use the “row” variable to specify which row to read, and the name of the new buttons will be 1 to 5:
Lastly, the y position of the buttons need to be different. Suppose we want them to be 50 units apart, so the y position will be: 80, 30, -20, -70, -120. This sequence can be expressed using the “row” variable like this: y position = 130 - (50 * row).
The result of this step is like this:
Step 6 - Click the First Result
Lastly, we need to allow the user to click any button to open the corresponding website. To start simple, let’s ONLY handle the first button, which is named “1”.
When the “1” button is clicked, we can read its URL from the table, at row 1 and column “link”. Then we can open a new browser tab using that URL:
You can try to click the first result button:
Step 7 - Handle the Other 4 Buttons
It should be fairly easy to duplicate the above code 4 times, and make them handle the other 4 buttons:
Step 8 - A More Elegant Solution
Although the code above works, it is regarded “ugly”, because it repeat the same code. Imagine we want to change the program to show 10 results, then we have to add more of such blocks.
A more elegant but also advanced solution is like this: we can use a variable “button index” to represent which button is clicked, and then use that variable to determine which link to read out from the table:
Essentailly these 2 rows of blocks will serve the same function as the blocks from step 6 and 7.
Challenges
Here are some suggestions on how you can further improve this program:
-
Display snippets: instead of only showing the title of each website in the search result, we can also display the “snippet”, which is a preview of that website’s content.
-
Use AI to summarize the results: Instead of displaying the results one by one, you can feed the snippets from all of them into chatGPT, which can summarize them or generate an answer for the user based on these snippets.
-
-
RE: Current error with accessing the website
Hi all,
Sorry there was an outage on our platform earlier this morning. Sorry about the inconvenience. Now we are back online.
CreatiCode
-
ChatGPT 人工智能:利用网页内容准备知识数据(难度:4)
简介
在之前的教程中,你学习了如何通过语义搜索来教 ChatGPT 新知识(搜索与用户问题含义相似的问题)。
这种聊天机器人的性能主要取决于我们提供给模型的知识数据的质量。这个过程通常非常耗时,涉及收集、清理和格式化数据。
在本教程中,你将学习如何为一个新的聊天机器人准备知识数据,该机器人将回答有关 VISIONS 组织 的问题。基本思路是从其网站下载数据并使用该数据生成问题/答案。这是一个常见的用例:大多数企业和组织已经拥有网站,但需要构建他们的聊天机器人以提供更好的用户体验。
步骤 1 - 启动项目
你首先需要完成此教程:ChatGPT AI: QA Bot Using Semantic Search (RAG) (Difficulty: 4)
保存该项目的副本并将其重命名为“Chatbot Using Web Data”。
步骤 2 - 对 VISIONS 组织的基准测试
作为基准,我们必须测试 ChatGPT 对 VISIONS 组织的了解程度。如果它可以在没有帮助的情况下回答大多数问题,则无需注入额外的知识。
要运行测试,我们可以使用此项目中的普通 ChatGPT 助手:
https://play.creaticode.com/projects/6531b7e60fdce080a4481c1d
例如,我们可以看到 ChatGPT 已经了解 VISIONS 组织:
然而,如果我们尝试获取更多具体信息,它会失败:
这证明了 ChatGPT 需要我们的帮助来回答有关 VISIONS 组织的更具体问题,即使这些信息在其网站上很容易获得。[高级] 为什么 ChatGPT 不知道答案?
ChatGPT 不会记住任何句子。相反,它会记住下一个单词的概率。 如果某些单词在训练数据中经常一起出现,则该模式将存储在模型中。例如,如果许多网站包含类似“VISIONS 的电话号码是 1.888.245.8333”的句子,那么下次 ChatGPT 看到“VISIONS 的电话号码是”时,它将预测正确的电话号码作为下一个单词。
但是,由于该句子在训练数据中不常见,因此具有最高概率的下一个单词可能是“sorry”或“I”,而实际电话号码的概率要低得多。
步骤 3 - 从网站获取数据
现在,让我们看看 VISIONS 组织的网站。在新标签页中打开此 URL https://visionsvcb.org,你应该会看到以下内容:
此网页包含大量信息和指向其他网页的链接。要下载信息,我们可以运行以下代码块(单击左下角的绿色“添加扩展”块并选择“云”类别):
请注意,此代码块为你执行两件事:- 下载页面的完整内容;
- 将内容转换为 Markdown 格式。
Markdown 格式非常简单。它几乎与你在网页上看到的文本相同,但包括了其他信息,例如网页上链接的 URL。这在下一步中将非常有用。请注意,URL 的内容会被缓存,因此如果你在同一天重复从同一 URL 获取内容,则在第一次之后速度会非常快。
此外,网站的内容将经过审核过程,因此如果发现任何不适当的内容,此代码块将拒绝获取请求。
步骤 4 - 了解网页和链接
与大多数网站一样,我们下载的 VISIONS 页面包含许多链接,例如:
... [首页](https://visionsvcb.org) [关于我们](#) [年度报告和财务](https://visionsvcb.org/about/annual-report) [董事会](https://visionsvcb.org/about/board-of-directors) [管理团队](https://visionsvcb.org/about/management-team) [使命宣言](https://visionsvcb.org/about/mission-statement) [VISIONS 历史](https://visionsvcb.org/about/visions-history) ...
每个链接都指向一个新页面,该页面可能链接到其他页面。 其中一些链接也可能是重复的。例如,页面 1 可能包含指向页面 2 的链接,而页面 2 可能包含指向页面 1 和页面 3 的链接。随着页面数量的增加,它们将形成一个具有许多链接之间链接的网络:
在接下来的几个步骤中,我们将编写代码来解析每个页面上的链接,并将这些链接放入一个没有重复的队列中。我们将访问此队列中的每个链接以获取更多内容并提取更多链接。
步骤 5 - URLs 列表
要存储我们将访问的所有链接,请创建一个名为“URLs”的新列表。第一个 URL 将是该站点的主 URL:“https://visionsvcb.org”。请注意,我们首先删除列表中的所有项目,这将确保我们始终从主 URL 开始。
步骤 6 - 遍历每个 URL
接下来,我们使用 for 循环访问列表中的每个 URL。由于列表会随着我们在访问的页面上发现更多链接而增长,因此我们不知道会有多少个 URL。我们现在将使用 1 来确保我们的代码适用于 1 个 URL。
我们还将添加一个保护措施,以确保 URL 索引永远不会大于列表的长度,这样我们将始终获得有效的 URL。
步骤 7 - 获取一个 URL 的内容
接下来,我们将从当前索引处的 URL 获取内容并将其存储在“result”变量中:
步骤 8 - 定义“extract links”块
由于从页面内容中提取所有链接的逻辑相当独立,因此最好定义一个专用的新块:“extract links”。它将获取内容的结果并将该页面上的所有 URL 添加到“URLs”列表中。
步骤 9 - 查找所有链接
要查找页面内容中的所有链接,我们需要查找特定的模式。在 markdown 格式中,所有链接都包含在以“https://”开头的一对 ( ) 中。 因此,我们可以使用正则表达式来查找与此模式匹配的所有文本,并将它们存储在一个名为“links”的新列表中。
你可以从此处复制确切的正则表达式:\(https?:\/\/[^\)]+\)
现在,如果我们运行程序,它将从主站点获取内容并将该页面上的所有 60 个链接提取到“links”列表中:
步骤 10 - 遍历链接列表
要清理此链接列表,我们需要另一个 for 循环来处理每个链接。我们将每个链接存储在“link”变量中:
步骤 11 - 删除括号
每个链接都包含一对括号。要删除它们,我们需要提取从链接文本的第二个字母到倒数第二个字母的子字符串。结果将存储在一个名为“URL”的变量中。
步骤 12 - 存储 URL 而不重复
现在,我们可以将新的 URL 添加到 URL 列表中,但我们需要确保该列表不包含此新的 URL。
步骤 13 - 限制为主站点
还有一个小问题。页面上的某些链接不是来自同一域,例如“(https://accessibility-helper.co.il)”。请注意,我们应该只从同一主站点下载数据。否则,当我们访问越来越多的网站时,URL 列表可能会呈指数级增长。因此,我们需要添加另一个条件:如果 URL 包含“visionsvcb.org”,我们才将其添加到列表中。(请注意,当你将此项目用于其他网站时,也需要更改此主 URL。)
在此之后,再次运行程序,“URLs”列表将增长到 42 个项目:
步骤 14 - 测试:从前 3 个 URL 获取
为了进行测试,让我们尝试从列表中的前 3 个 URL 获取:
在我们再次运行此程序后,我们发现“URLs”列表增长到 61 个项目:
我们还发现了一个新问题。很多 URL 是 PDF 文件。如果我们正在创建一个文档检索应用程序,这可能很有用,但对于此项目,我们应该排除它们,因为我们只需要 Web 内容。我们可以在“extract links”块中添加一个附加条件,如下所示:
现在,如果我们重新运行程序,URLs 列表总共只有 42 个项目。这意味着当我们访问第二个和第三个 URL 时,没有发现新的链接。
步骤 15 - 添加“Generate QA”块
现在我们可以遍历网站中的所有页面,下一步是从每个页面生成问题和答案。让我们专注于使用第一页生成它们。请定义一个名为“generate QA”的新块并在重复循环中调用它。我们将传入“result”变量,它是当前页面的文本。
步骤 16 - 将页面内容切分成块
接下来,我们将把页面内容提供给 ChatGPT 以生成问题和答案对。请注意,我们不能简单地在一个请求中将所有内容提供给 ChatGPT,因为这可能会超过 ChatGPT 对请求长度的限制。相反,我们将不得不将内容切分成块。
例如,假设我们将每个块限制为最多 5000 个字符。如果内容总共有 12000 个字符,我们将向 ChatGPT 发送 3 个请求:字符 1 到 5000,字符 5001 到 10000,以及字符 10001 到 12000。
这个想法可以使用如下所示的 for 循环来实现:
“start index”是每个块的第一个字符的位置,最后一个字符的位置将是“start index + 4999”。因此,“chunk”变量将包含每个块的页面内容。
步骤 17 - 让 ChatGPT 生成问题和答案
让 ChatGPT 使用每个块生成一些问题和答案相当简单。但是,为了更容易解析 ChatGPT 的响应,我们还需要指定输出格式。例如,我们可以使用如下所示的提示:
你将根据网页内容生成问题和答案。每个问题以“--QUESTION:”开头,每个答案以“--ANSWER:”开头。以下是网页内容:
以下是组成和发送请求的代码:
请注意,每个请求都是一个新的聊天,这样 ChatGPT 就不需要担心以前的消息。否则,ChatGPt 可能不会专注于它正在处理的当前块。
步骤 18 - 将响应拆分成列表
我们从 ChatGPT 获得的响应将如下所示:
我们的下一个任务是将问题和答案放入表格格式,以便我们以后可以使用它们来构建语义数据库。首先,我们需要按特殊符号“--”拆分响应并将各个部分放入名为“qa”的列表中:
该列表将如下所示,问题和答案作为单独的项目:
步骤 19 - 清空数据表
由于我们将累积问题和答案并将它们存储在“data”表中,因此我们需要在开始时清空表的内容。
步骤 20 - 遍历“QA”列表
要将“qa”列表中的所有问题和答案添加到“data”表中,我们可以使用 for 循环遍历“qa”列表中的每个项目。我们已经知道列表的第一项始终为空,因此我们应该从第二项开始。此外,我们将一次使用 2 个项目,一个用于问题,一个用于答案,因此我们应该每次将索引“i”增加 2:
步骤 21 - 添加一对问题和答案
现在我们可以读取索引“i”处的项目的问题,以及索引“i+1”处的项目的答案。然后我们将它们都作为新行添加到“data”表中:
例如,如果有 3 对问题和答案,我们将在“data”表中获得 3 行:
步骤 22 - 删除前缀
有一个小问题:问题包含前缀“QUESTION:”,答案包含前缀“ANSWER:”。我们可以使用“replace”运算符删除它们:
现在如果我们清空数据表(手动删除现有项目)并再次单独运行 for 循环,我们将获得干净的问题和答案:
步骤 23 - 测试运行
现在我们的程序已准备就绪。让我们用前 3 个 URL 测试它:
这将需要一些时间来运行,因为我们需要使用 ChatGPT 从每个页面生成问题和答案。运行完成后,我们将在“data”表中获得一些问题。当你运行它时,确切的问题数量可能会有所不同。
其余过程与之前相同:我们可以使用“data”表创建语义数据库(如果数据保持不变,则无需重复执行此操作),然后我们可以在用户提出新问题时查询此数据库,并将查询结果作为参考提供给 ChatGPT。
下一步
你现在可以尝试更改程序以从任何其他网站获取数据,然后使用该数据发布聊天机器人。请注意,你需要在 2 个位置指定新网站:
- 在开始时,当你指定初始 URL 时:
- 在“extract links”块的定义中,你删除与目标网站无关的 URL 的位置:
-
ChatGPT 人工智能:基于语义搜索(RAG)的问答机器人(难度:4)
简介
到目前为止,我们在项目中一直使用 ChatGPT 现有的知识和推理能力。例如,当我们向 ChatGPT 提出一个医学问题时,我们不需要教 ChatGPT 任何东西,因为它已经被大量医学知识和问题训练过了。然而,在许多应用中,ChatGPT 的知识可能不够。
- 首先,ChatGPT 不知道在其知识截止日期(其最新训练数据的时间)之后发生的事件。
- 此外,ChatGPT 只记住下一个单词出现的概率,而不记住任何来源的确切内容。假设我们希望 ChatGPT 仅根据特定的医学书籍回答问题,那么它很可能会失败或产生幻觉(进行猜测)。
在本教程中,您将学习一项非常有用的技能:如何教 ChatGPT 一些新知识。具体来说,您将构建一个可以回答有关 CreatiCode 问题的聊天机器人。由于 CreatiCode 在撰写本文时(2023 年 11 月)还相当新,因此 ChatGPT 对 CreatiCode 一无所知。我们将教 ChatGPT 一些关于 CreatiCode 的新知识,以便它可以根据这些知识帮助回答有关 CreatiCode 的问题。
语义搜索
在开始编码之前,让我解释一下我们将使用的关键方法:语义搜索。“语义”的意思是“含义”,因此“语义搜索”的意思是“按含义搜索”。例如,假设我有一个关于一本书的 5 个问题的列表:
- 这本书叫什么名字?
- 这本书有多少页?
- 这本书叫什么名字?
- 这本书多少钱?
- 我在哪里可以买到这本书?
现在我有一个新问题“这本书的价格是多少?”,我想找出这 5 个问题中哪个与这个新问题相似。
如果我们使用传统的搜索方法,我们需要找出哪个现有问题与新问题具有最多的共同词。显然,这两个问题具有最多的共同词(6 个中的 5 个):
- 这本书的 名字 是什么?
- 这本书的 价格 是多少?
然而,由于大型语言模型的发展,现在我们有了一个全新的工具,称为“语义搜索”,它允许我们这样搜索:这 5 个已知问题中哪个与新问题的含义最相似?使用语义搜索,我们将得到一个更好的答案:“这本书多少钱?”本质上,“语义搜索”允许我们找到含义最相似的句子,即使这些句子中的单词非常不同。正如您将在下面看到的,这将对我们的项目非常有用。
[高级主题] 语义搜索如何工作?
如果您对语义搜索的工作原理感到好奇,这里有一个简单的解释。让我们仍然使用上面的例子。对于这 5 个问题中的每一个,我们将首先将它们转换为一个向量,就像 XY 轴上的一个箭头:
- 这本书叫什么名字? -> (x = 0.9, y = 0.1)
- 这本书有多少页? -> (x = 0.3, y = 0.8)
- 这本书叫什么名字? -> (x = 0.4, y = 0.2)
- 这本书多少钱? -> (x = 0.5, y = 0.5)
- 我在哪里可以买到这本书? -> (x = 0.15, y = 0.9)
我们可以像这样说明这 5 个箭头:
现在,当我们得到一个查询问题“这本书的价格是多少?”时,它也将被映射到一个向量,例如 (x=0.45, y=0.4)。我们也可以将这个新向量绘制成一个箭头:
接下来,我们只需要比较所有 5 个蓝色箭头,并找到与红色箭头夹角最小的那个。如图所示,“这本书多少钱?”的箭头与红色箭头夹角最小,这意味着这两个箭头的方向最相似。因此我们可以将该问题作为搜索结果。
将句子映射到向量的过程称为“嵌入”,因为它就像将每个句子作为一块石头放置在墙上的正确位置。实际上,向量通常具有数千个维度,最好的嵌入模型可以很好地衡量两段文本之间的相似性。
步骤 1 - 启动项目
现在让我们开始我们的 QA 机器人项目。我们将使用以下项目作为起点。请在您的帐户中打开它并重新混合它:
https://play.creaticode.com/projects/65544f377f7509db74c436c7
步骤 2 - 填充“数据”表
在项目中,已经定义了一个名为“数据”的表。它有 2 个名为“键”和“答案”的列。我们的第一个任务是用一些问题和答案填充此表。我们的想法是,我们将向 ChatGPT 提供一些标准问题和答案作为新知识,以便它可以根据这些答案回答其他问题。
为了节省时间,我们准备了一个包含问题和答案的 CSV 文件。请在此处下载:https://ccdn.creaticode.com/public/sampledata.csv
下载 sampledata.csv 文件后,将其导入到您的数据表中。您可以在舞台上的数据表上单击鼠标右键,选择“导入”,然后在您的计算机上找到 sampledata.csv 文件。
导入数据后,您可以将鼠标悬停在任何单元格上以查看其内容。对于每一行,“键”列是一个问题,“答案”列是相应的答案。
如果您正在构建另一个项目,您可以使用 Google 表格或 Excel 准备问题和答案,然后将表格导出为 CSV 文件。然后您可以将文件上传到“数据”表中。请注意,重要的是第一列名为“键”,因为这将是我们搜索的列。您可以在“键”列之后拥有任意数量的列。
步骤 3 - 创建语义数据库
接下来,我们将使用表中的数据构建一个“语义数据库”。请将此块单独拖到编辑器中,确保从下拉列表中选择“数据”表,然后单击它以运行它。
您不会注意到任何变化,但在幕后,发生了以下情况:- 表中的数据已发送到 CreatiCode 服务器。
- 已根据数据创建了一个“语义数据库”,该数据库将用于语义搜索。
请注意,在撰写本文时,每个项目只能有一个语义数据库。如果您多次运行“创建语义数据库”块,则后续运行将首先删除任何现有的语义数据库。这对于大多数应用程序来说应该足够了。
此外,**对于所有没有订阅的用户,目前有一个限制,“数据”表最多可以有 100 行数据。对于有订阅的用户,限制为 1000 行。**如果您正在构建需要更高限制的应用程序,请联系 info@creaticode.com
步骤 4 - 查看聊天精灵
现在我们将构建一个利用此语义数据库的聊天机器人。在开始编码之前,请快速查看“聊天”精灵中的现有块。它们提供以下 2 个基本功能:
- 当项目开始时,向 ChatGPT 发送初始请求并显示其响应;
- 每当用户输入一些输入时,显示该输入,然后将其发送给 ChatGPT,然后也显示响应。
步骤 5 - 测试问题
现在我们将通过一个问题来验证 ChatGPT 对 CreatiCode 了解不多:creaticode 多少钱?
如图所示,ChatGPT 不知道答案。我们需要“教”它,然后我们将再次提出相同的问题。
步骤 6 - 运行语义搜索
为了教 ChatGPT 更多关于 CreatiCode 的知识,基本思想如下:给定一个用户问题,我们首先在我们准备的问题中搜索,以找到一些相似的问题,然后我们告诉 ChatGPT 根据搜索结果回答用户问题。
您可能想知道:为什么我们不直接将我们准备的所有问题和答案提供给 ChatGPT?这种方法可能有效,但有几个原因说明这不是一个好主意:
- 当我们有很多 QA 对时,它们可能会占用大量的令牌。它可能会超过 ChatGPT 的令牌限制,并且还会花费很多钱。
- 当我们向 ChatGPT 提供大量信息时,它可能需要更长的时间来阅读所有信息,并且也可能找不到相关信息。
因此,我们将使用语义搜索仅查找与用户问题具有相似含义的问题,因此它们的答案将提供与回答用户问题最相关的信息。我们需要在获得用户问题时添加“搜索语义数据库”块。现在让我们先单独添加此块以对其进行测试。
在这个新块中,指定了前 3 个输入:- 查询:第一个输入指定我们要搜索的内容。在这种情况下,我们正在搜索测试问题“Creaticode 多少钱?”。
- 结果数:第二个输入指定搜索将返回多少项,例如 3。搜索结果将根据它们与查询的相似程度进行排名,因此我们将获得与用户输入最相似的前 3 个问题
- 结果表:第三个输入指定用于存储结果项的表。返回的每个项都将作为一行存储在此表中。
现在让我们通过单击单独运行此块。要查看结果,我们需要查看“结果”表。由于舞台窗口被聊天小部件占用,我们还需要使用“删除所有小部件”块删除该小部件:
在我们运行“搜索语义数据库”和“删除所有小部件”块之后,将“结果”表添加到舞台,并隐藏“数据”表:
您现在应该看到“结果”表包含 3 行。第一列“分数”表示该项与查询的相似程度。它通常介于 0 和 1 之间。第二列和第三列是“键”和“答案”,这是我们之前添加到语义数据库中的问题和答案。这很有效,因为第一行是问题“CreatiCode 可以免费使用吗?”,这与我们的查询“Creaticode 多少钱?”密切相关。
注意:如果您得到一个空的“结果”表,这意味着您在步骤 3 中没有成功创建语义数据库,因此请再次尝试该步骤。
步骤 7 - 使用用户输入进行搜索
现在让我们将“搜索语义数据库”块添加到我们的程序中,以便它使用用户输入作为查询。我们还分离了它下面的 ChatGPT 块,因为我们需要在将其发送给 ChatGPT 之前改进我们的提示。
在此更改之后,无论用户说什么,都将用于运行搜索,并且结果将存储在“结果”表中。
步骤 8 - 从“结果”表中读取第一行
接下来,我们将从“结果”表中提取数据,并将它们嵌入到我们发送给 ChatGPT 的请求中。首先,创建 2 个名为“键”和“答案”的变量,并尝试从结果表中读取第一行的内容,如下所示:
单击这两个块以运行它们,您可以在舞台上查看这两个变量的值:
步骤 9 - 从“结果”表中读取所有行
接下来,让我们从结果表中读取所有行。我们可以使用“for 循环”,它将索引变量设置为从 1 到总行数,如下所示:
在我们的例子中,“结果”表的行数为 3,因此这个 for 循环将运行 3 次迭代。
步骤 10 - 将所有问题和答案连接到一个参考中
当我们遍历结果表的每一行时,我们可以使用“连接”块将该行的内容连接到一个“参考”变量中。参考变量将以“”开头,我们将每行的新内容附加到此变量中。我们将使用“\n”字符连接问题和答案,这将在它们之间添加一个新行。循环完成后,我们可以打印出参考以查看其值。
如果您运行这组块,参考应该在控制台面板中打印出来,如下所示:
步骤 11 - 使用参考向 ChatGPT 组成一个新的请求
现在我们准备使用此新的参考信息向 ChatGPT 创建一个新的请求。基本思想是向 ChatGPT 说以下内容:嘿,ChatGPT,我们需要你回答这个问题,顺便说一下,这里有一些你可以用作参考的信息。
更具体地说,我们需要使用 3 个部分组成一个“请求”:用户输入、一个“[参考]”标签来指示参考部分,以及我们上面检索到的参考。
现在如果我们运行该程序,我们可以在控制台面板中看到打印出的以下请求:
步骤 12 - 获取 ChatGPT 的响应
现在让我们将**“请求”变量的值**发送给 ChatGPT 并显示其响应:
这是您应该从 ChatGPT 获得的内容:
与我们在步骤 5 中的初始测试结果相比,这显然是一个显着的改进。ChatGPT 似乎对 CreatiCode 非常了解。
步骤 13 - 使 ChatGPT 的响应更具体。
目前,我们只是使用一个非常简单的请求,还有很大的改进空间。当前响应最明显的问题是它不够具体。显然,ChatGPT 正在使用我们参考中的所有 3 个问题/答案对来为用户撰写答案。
您能否尝试更改我们在请求中的说明,以便 ChatGPT 仅提供如下所示的具体和直接答案?
在您花一些时间在这个挑战上之前,不要查看下面的答案。这是关于如何微调提示以从 ChatGPT 获得所需响应的一个非常好的练习。
你找到解决方案了吗?如果没有,请不要查看答案!
步骤 14 - 使 ChatGPT 的响应更具体的解决方案
好的。如果您已经弄清楚在提示中要说什么,那就太好了!这并非易事,因为 ChatGPT 可能非常“固执”,并且会坚持使用参考中的所有信息。
以下是使 ChatGPT 更具体的一种解决方案。我们将像这样撰写请求:
用户输入: creaticode 多少钱? 说明:以下是一些常见问题/答案,但它们可能不是用户要问的内容。您能否撰写一个只回应用户问题的简明答案? CreatiCode 可以免费使用吗? 大多数功能都是免费的 CreatiCode 的目标用户是谁? CreatiCode 是一种适合所有年龄段学习者的简单语言 我可以在 CreatiCode 上编写 3D 程序吗? 可以
如您所见,我们正在进行以下 2 项更改:- 我们将请求分为两个部分“用户输入”与“说明”。
- 在说明中,我们明确告诉 ChatGPT 一些问题/答案可能不是用户要问的内容,我们要求它撰写一个只回应用户问题的答案。
要撰写此新请求,我们可以按以下方式修改代码:
具体来说,这是您可以复制到代码中的请求的第三部分:\n说明:以下是一些常见问题/答案,但它们可能不是用户要问的内容。您能否撰写一个只回应用户问题的简明答案?
现在请再次尝试测试您的程序。
步骤 15 - 改进我们的参考问题/答案
除了更新提示之外,我们还可以改进语义数据库中的问题/答案。
例如,目前在我们的数据库中,我们有这样一对问题/答案:
问:CreatiCode 可以免费使用吗? 答:大多数功能都是免费的
答案有点模糊,ChatGPT 将无法提供超出我们提供的答案的更好答案。例如,让我们尝试将答案改进为以下内容:
大多数功能都是免费使用的。但是,对于非付费用户,某些高级块(例如 ChatGPT 块或文本到语音块)存在速率限制。
要进行此更改,您可以从舞台中删除所有小部件,更新“数据”表的内容(不是“结果”表),然后再次单独运行“创建语义数据库”块。
现在我们可以再次测试它。您将看到 ChatGPT 根据我们的新答案提供了更新后的答案:
此外,我们可以验证我们提供给 ChatGPT 的参考信息确实包含更新后的答案:
检索增强生成 (RAG)
现在您已经学习了一项非常强大的技术:我们首先使用语义搜索检索一些参考信息,然后在我们对 ChatGPT 的请求中使用该信息。这通常被称为“检索增强生成”,或简称为 RAG。那是因为我们正在使用我们检索到的信息来增强 ChatGPT 的响应生成。
这个项目只是一个关于如何使用 RAG 来增强 ChatGPT 响应的简单示例。您可以使用此技术实现更多目标。
构建您自己的 QA 机器人
现在尝试为您非常了解但 ChatGPT 不了解的内容构建另一个 QA 机器人。
例如,您可以创建一个关于您非常了解的人的 QA 机器人,或者关于特定地点(如餐厅或公园)的 QA 机器人,或者关于组织(如学校俱乐部或非营利组织(例如 https://visionsvcb.org/))的 QA 机器人,或者关于对象(如书籍或电子设备)的 QA 机器人。
您应该首先测试它以确保 ChatGPT 尚不了解该主题,否则不容易显示您教给 ChatGPT 多少新知识。
您可能已经猜到,成功的 QA 机器人最重要的因素是高质量的输入数据。准备此类数据需要大量工作。在这个项目上团队合作可能是一个好主意。
-
ChatGPT 人工智能 - 产品评论摘要(难度:4)
介绍
ChatGPT 可以阅读、编写和理解自然语言,因此它可以用来构建非常有用的文本处理工具。
文本摘要就是一个例子。如今,我们被网站、书籍和博客文章等数据淹没。如果 ChatGPT 可以为人们生成摘要以供阅读,这将节省人们大量的时间。
在本教程中,你将使用 ChatGPT 来总结产品评论。例如,亚马逊上的一个热门产品可能有数千条评论,而且通常使用不同的语言。没有人有时间浏览所有评论。我们的解决方案是让 ChatGPT 阅读所有评论并为我们生成摘要。
当这个工具运行时,ChatGPT 将在阅读更多用户评论时不断更新其摘要:
步骤 1 - 创建一个初始项目
我们将使用这个项目作为起点,所以请先 remix 它:
https://play.creaticode.com/projects/ca4bbe666a1934bab795661b
这个项目包含一个名为“reviews”的表格,其中包含 100 条玩具产品的评论,包括星级评分、评论主题和评论详情。
收集此类评论数据的方法有很多,但它们不在本教程的讨论范围内,因为我们希望专注于如何使用 ChatGPT 处理这些评论。
步骤 2 - 核心思想
在开始编码之前,让我们先讨论一下我们需要解决的核心问题是什么。我们已经知道 ChatGPT 可以总结我们提供给它的任何文本。但问题是有太多的评论无法一次性全部提供给 ChatGPT。想象一个产品有 1000 条评论,每条评论平均 20 个单词,那么总共有 20000 个单词。但是我们正在使用的 ChatGPT API 只能处理多达 4000 个 token,大约 3000 个单词。
所以关键问题是如何让 ChatGPT 阅读所有评论,并将它们总结成一个摘要。
想象一下,我们需要将 1000 个数字相加以得到总和,但每次我们只能添加 2 个数字。在这种情况下,我们会先将前 2 个数字相加,然后逐个添加下一个数字。
我们可以将相同的想法应用于总结评论。
- 我们首先获得前几条评论的摘要;
- 我们给 ChatGPT 一些新的评论,同时也给它第 1 步中的摘要,然后我们要求 ChatGPT 根据新的信息更新此摘要。
- 我们继续这个过程,根据新信息反复更新摘要。
我们可以将此解决方案称为“增量摘要”。现在让我们来实现它。
步骤 3 - 打印第一条评论
为了简单起见,让我们尝试读取“reviews”表格中的第一条评论,并将其打印出来。我们将忽略“rating stars”,而专注于“subject”和“details”列。以下是我们可以用来将主题和详情读入 2 个变量,然后将它们连接到“reviews”变量中,并在控制台面板中打印出来的块:
步骤 4 - 打印前 20 条评论
接下来,我们可以使用 for 循环来逐条重复读取 20 行评论。我们需要首先将“reviews”变量设置为空,然后反复将每条评论附加到其中:
请注意,我们在每条评论的末尾添加了一个“\n”,以便下一条评论将在新的一行中开始。以下是我们在控制台面板中得到的内容:
正如你所看到的,只有 20 条评论,我们自己逐一阅读所有评论就已经开始感到困难了。
步骤 5 - 获取任意行的评论
由于我们需要反复从表格中读取更多评论,我们应该将代码包装成一个新的块“get reviews”。它应该获取第一行和最后一行行号,并使用这些行的内容设置变量“reviews”。
步骤 6 - 从 ChatGPT 获取初始摘要
现在我们有了评论,我们可以让 ChatGPT 为我们提供它们的第一个摘要:
请注意,我们现在只是使用“waiting”模式,以保持代码简单。以下是我们得到的一个示例摘要:
步骤 7 - 改进摘要格式
在我们处理更多评论之前,现在是改进 ChatGPT 输出格式的好时机。长段落仍然难以阅读。如果 ChatGPT 可以将其分解为优点和缺点,并为每个方面提供一些要点,那就更好了。我们可以通过稍微修改我们的提示来轻松实现这一点:
现在你应该得到类似这样的内容:
步骤 8 - 避免重复
我们可以立即看到另一个问题:一些要点是重复的。例如,“易碎且不是由坚固的塑料制成”类似于“不像旧的变形金刚那样坚固”。
我们可以尝试要求 ChatGPT 像这样改进答案:
将这些产品评论总结为要点,包括优点和缺点。跳过类似的要点。
不幸的是,输出仍然不是很简洁:
看来 ChatGPT 在删除类似要点方面训练得不是很好。我们能做什么?
另一种方法是简单地限制要点的数量,这将迫使 ChatGPT 选择最常见的要点:
将这些产品评论总结为要点,包括前 3 个优点和缺点。
这一次,我们得到了一个很好的摘要,没有太多重复:
步骤 9 - 获取接下来的 20 条评论
现在让我们提取第 21 行到第 40 行的评论,并打印出来看看:
它们在控制台面板中看起来像这样:
步骤 10 - 更新摘要
现在我们既有之前评论的“summary”,也有新评论的“reviews”变量,我们只需要让 ChatGPT 将它们组合成一个更新的摘要。
我们提示的基本结构如下:
- 这是一个摘要:摘要
- 这里有一些新的评论:评论
- 将它们组合起来
因此,我们需要使用几个变量来组成这个长提示:
第 1 部分:
以下是一些客户评论的产品摘要:
第 2 部分:
以下是一些新的客户评论:
第 3 部分:
现在请根据上面的新客户评论更新上面的摘要。使用相同的要点格式,列出前 3 个优点和缺点。
以下是将所有变量组合成一个提示,并打印出更新后的摘要的代码:以下是我们得到的更新后的摘要:
步骤 11 - 对所有行重复此过程
现在我们只需要重复获取更多评论并使用它们更新摘要。我们可以使用一个 for 循环,该循环将变量“start row”更改为 21、41、61 和 81。对于每个“start row”,我们获取接下来的 20 行评论。
步骤 12 - 在文本框中显示摘要
对于我们的最后一步,让我们在舞台上使用一个文本框显示摘要,而不是打印出来。为此,我们首先需要在程序开始时添加文本框,然后反复将其值设置为变量“summary”:
以下是我们运行程序时将得到的内容:
更多创意
现在是时候尝试扩展这个项目来练习你所学到的内容了。以下是一些供你参考的想法:
-
限制评论类型:不同的用户可能对产品不同方面的评论感兴趣。尝试添加一个下拉菜单以允许用户选择一个类别,例如“适用性”、“易用性”、“产品质量”等。用户将首先选择一个类别,然后单击一个按钮以获取该类别中评论的摘要。
-
其他内容:本项目中使用的技术可以应用于总结其他内容,例如关于 AI 使用的全校调查的答案。再举一个例子,这种方法可以用来总结一篇长文章甚至一本书。
-
ChatGPT 人工智能:让ChatGPT 学会网页搜索(难度:4)
简介
像 ChatGPT 这样的大型语言模型从训练数据中学习所有知识,因此它们不知道训练数据截止日期之后的任何新信息。
例如,如果我们问 ChatGPT 这个问题:“哪支球队赢得了 2024 年美洲杯?” 它将无法回答,因为在撰写本文时,ChatGPT 的截止日期是 2023 年 10 月。
对 ChatGPT 的增强
为了解决这个问题,我们可以“教” ChatGPT 寻求帮助。为了说明这个想法,我们可以将 ChatGPT、用户和我们的程序想象成 3 个角色,他们的对话可能如下所示:
- 用户对程序:谁赢得了 2024 年美洲杯?
- 程序对 ChatGPT:嘿 ChatGPT,你能尝试回答这个问题吗:谁赢得了 2024 年美洲杯?顺便说一句,如果你发现你需要搜索网络以获取一些新信息,我可以提供帮助。
- ChatGPT 对程序:这个问题超出了我的截止日期。请在 Google 上搜索“谁赢得了 2024 年美洲杯?”
- 程序对 ChatGPT:好的。让我用 Google 搜索一下……好的,我明白了,这是研究结果:阿根廷
- ChatGPT 对程序:谢谢。根据搜索结果,以下是给用户的答案:阿根廷
- 程序对用户:阿根廷
现在,让我们一步一步地构建这个工作流程。
步骤 1 - Remix “Helpful Assistant” 项目
play.creaticode.com/projects/6531b7e60fdce080a4481c1d
步骤 2 - 更新初始提示
由于我们将编写一个相当长的提示,让我们仍然使用“注释”区域来编写提示。
首先,通过右键单击绿旗块来添加注释区域:
接下来,将以下提示复制到注释区域:你是一个友好的助手,而我是一个可以帮助你的代理。确保你的回应简洁易懂。不要说任何不恰当的话。 当你需要在回答用户问题之前进行网络搜索时,你应该使用特殊标签“WEB:”后跟要搜索的查询来回应我,而不是回应用户。我会把答案提供给你,然后你可以生成对用户的回应。 现在说“嗨”
此提示包含 3 部分:- 它首先介绍了上下文,其中 ChatGPT 扮演友好助手的角色,而我们(我们的程序)是帮助它的代理。
- 然后,向 ChatGPT 发出特殊指令,以便它在需要在线获取一些新信息时要求我们进行网络搜索。还指定了它应该使用的特殊语法,即“WEB:”标签。
- 最后,我们要求 ChatGPT 说“嗨”并等待用户输入。
接下来,您可以将整个提示从注释区域复制到请求块中,然后按 Enter 键确认:
现在让我们再次用同样的问题进行测试,我们将从 ChatGPT 获得“WEB:”响应:
这是一个很大的改进:ChatGPT 已经学会了它可以使用网络搜索工具来帮助它回答问题。 当然,我们不应该向用户展示这一点,因为最终答案尚未给出。让我们在下面更改它。
步骤 5 - 强制输出格式
ChatGPT 可能不会每次都使用相同的格式。例如,它可能会这样回应:
这种回应的问题在于,我们的程序将很难提取用于网络搜索的确切查询。为了强制 ChatGPT 使用正确的格式,我们可以对提示进行 2 处更改:- 添加注释,强调我们期望的格式。
- 举一个例子,演示正确的回应方式。
以下是更新后的提示:
你是一个友好的助手,而我是一个可以帮助你的代理。确保你的回应简洁易懂。不要说任何不恰当的话。 当你需要在回答用户问题之前进行网络搜索时,你应该使用特殊标签“WEB:”后跟要搜索的查询来回应我,而不是回应用户。我会把答案提供给你,然后你可以生成对用户的回应。请注意,当你需要进行网络搜索时,你必须以“WEB:”开头,除了查询之外什么也不要说。避免询问用户你是否应该进行网络搜索,因为用户不知道网络搜索工具。 例如: 用户:谁赢得了 2024 年奥运会男子 100 米短跑冠军? 你:WEB: 2024 年奥运会男子 100 米短跑冠军 系统:在 2024 年巴黎奥运会上,美国短跑运动员诺亚·莱尔斯在男子 100 米决赛中获胜 你:美国短跑运动员诺亚·莱尔斯 现在说“嗨”
现在请将此新提示复制到您的注释区域,然后将其复制到系统请求块中。这将有助于确保 ChatGPT 坚持我们指定的格式。
步骤 6 - 检查响应是否以“WEB:”开头
接下来,我们将根据 ChatGPT 的响应是否以“WEB:”的特殊标签开头来以不同的方式处理它的响应。我们只会在 ChatGPT 的响应以“WEB:”开头时添加一些额外的步骤。
步骤 7 - 运行网络搜索
当我们发现 ChatGPT 要求我们进行网络搜索时,我们可以从 ChatGPT 的响应中提取提取查询语句,然后使用该查询语句运行网络搜索。
逻辑如下:- ChatGPT 的响应以“WEB:”开头,我们只需要后面的表达式。因此,我们可以使用“substring”块来获取从第 5 个字母开始的响应的子字符串。例如,如果响应变量为“WEB: 2024 年奥运会男子 100 米短跑冠军”,则子字符串将为“ 2024 年奥运会男子 100 米短跑冠军”。
- 我们可以使用 AI 类别中的“web search”块来搜索网络并将前 3 个结果存储在“result_table”中。
现在,让我们尝试通过再次运行程序来获得一些搜索结果。要查看“result_table”,我们必须从舞台上删除聊天窗口。我们可以单独运行“remove all widgets”块。
之后,通过选中其复选框在舞台上显示“result_table”:您将看到 result_table 包含 3 列:标题、链接和摘要。摘要只是该网页的简短摘要。
步骤 8 - 聚合搜索结果
要将搜索结果返回给 ChatGPT,我们首先必须将 result_table 中的内容聚合到一个名为“answer”的变量中。例如,我们可以使用几个连接块来组成答案,如下所示,以包含排名第一的搜索结果:
请注意,“\n”表示换行符,这有助于更好地格式化答案文本。因此,“answer”变量将变为:
我们可以使用相同的代码来连接第二个和第三个搜索结果。最后,我们将告诉 ChatGPT 为用户生成响应:
步骤 9 - 将搜索结果提供给 ChatGPT
现在我们将结果传递回 ChatGPT。请注意,我们应该使用 “system request”块发送答案,这向 ChatGPT 表明此答案来自系统,而不是用户。我们仍然会要求 ChatGPT 将响应存储在“response”变量中,这将覆盖之前的响应。
在此步骤之后,“response”变量包含基于网络搜索结果的新响应,我们可以继续将其附加到聊天记录中。如果您再次使用相同的请求进行测试,ChatGPT 将产生正确的答案!
进一步改进
在本教程中,您已经学习了如何使用网络搜索工具增强 ChatGPT。您可以做些什么来使其更好?以下是一些值得尝试的想法:
-
改进提示:如果您更多地测试程序,您可能仍然会发现有时它无法运行网络搜索。如果您可以在提示中添加另一个示例对话,那将会很有帮助。您还可以尝试改进提示中的说明,以告诉 ChatGPT 预期的行为是什么。
-
获取页面内容:当前程序仅向 ChatGPT 提供搜索结果中每个网页的标题和摘要。对于更复杂的问题,这可能不包含用户所要求的信息。进一步的增强是为 ChatGPT 提供另一个工具:获取网页。 为此,您需要对提示进行一些更改:
- 为 ChatGPT 提供每个搜索结果的链接 URL
- 告诉 ChatGPT 如果它需要任何页面的完整内容,它可以发出另一个特殊命令“FETCH:页面的 URL”。
- 当我们收到 FETCH 请求时,使用 Cloud 扩展中的“fetch web page as markdown”块获取该页面的内容,然后将内容发送回 ChatGPT。
-
ChatGPT 人工智能 - 填空游戏(难度:4)
简介
在“完形填空游戏”(也称为“完形填空测试”)中,你需要填补句子中缺失的单词。 这是学习相似单词之间差异的一个很好的练习。
在本教程中,你将构建一个应用程序,该应用程序使用 ChatGPT 为用户输入的任何单词生成完形填空游戏。 你将学习如何设计对 ChatGPT 的请求(提示),以便在代码中轻松处理响应。
完成的项目将如下所示:
步骤 1 - 一个新项目
在 CreatiCode 游乐场中,创建一个名为“完形填空游戏”的新项目。 删除“Sprite1”,因为我们只需要“Empty1”块。
步骤 2 - 发送提示并打印响应
在前几个步骤中,我们将专注于为 ChatGPT 设计一个好的提示。 之后,我们将添加用于处理 ChatGPT 响应的块。由于我们的用户不会直接与 ChatGPT 对话,因此我们不需要发送任何系统请求。 我们只需要一个普通的请求块,如下所示:
回想一下,在“等待”模式下,我们等待整个响应存储在“响应”变量中,然后运行下一个块,该块在控制台中打印出来。
步骤 3 - 从一个简单的提示开始
由于完形填空游戏(或完形填空测试)是一种非常常见的学习方法,ChatGPT 已经看到了很多这方面的例子。 我们可以先直接要求 ChatGPT 为我们创建完形填空游戏。 我们稍后将根据我们得到的内容改进我们的提示。对于这一步,我们可以自己简单地“硬编码”3 个单词,例如“run, runs, ran”。 我们稍后将处理用户输入。
请尝试多次运行你的项目。 观察 ChatGPT 输出中的问题,并思考如何通过改进提示来解决这些问题。
步骤 4 - 分析 ChatGPT 的响应
以下是 ChatGPT 的一些示例输出:
以下是关键问题的总结:- 响应可能太长。 这不仅会超过字数限制,还会让用户等待太久。
- 问题数量不固定,有时会给出一个段落而不是问题列表。 这使得我们以后更难创建用户界面。
- 有时没有给出答案,有时给出答案。 我们不想向用户显示答案,但我们的程序确实需要从 ChatGPT 获取答案。
前两个问题相当容易解决。 在进入下一步之前,你能试一试吗?
步骤 5 - 解决标记计数和问题计数问题
我们可以使用以下请求来相当容易地解决一些问题:
用 60 个单词,为这些单词创建一个包含 3 个问题的完形填空游戏:run, ran, runs
以下是一些新的示例输出:
步骤 6 - 指定响应格式
为了使我们的程序易于处理响应,我们需要使响应严格遵循一些预定义的格式。 为此,最好的解决方案是我们自己指定格式。 例如,这是一个更新后的请求。 请注意,你可以在项目中使用注释作为文本编辑器,以便可以使用多行来格式化输出格式。
用 60 个单词,为这些单词创建一个包含 3 个问题的完形填空游戏:run, ran, runs 使用此输出格式: 问题: 1. 2. 3. 答案: 1. 2. 3.
现在输出看起来更好(仍然不完美):
为了简单起见,我们需要答案是隐藏的单词本身,而不是句子。 此外,较短的答案会缩短 ChatGPT 的响应时间。 你能尝试进行此更改吗?
步骤 7 - 答案格式
至少有两种方法可以告诉 ChatGPT 我们需要的答案格式。
首先,我们可以这样描述:对于每个答案,只显示隐藏的单词。
其次,我们可以修改输出格式示例以向 ChatGPT 显示我们需要的内容。
这是一个更新后的请求,其中包含两项更改:
用 60 个单词,为这些单词创建一个包含 3 个问题的完形填空游戏:run, ran, runs 使用此输出格式(对于每个答案,只显示隐藏的单词): 问题: 1. 2. 3. 答案: 1. 隐藏的单词 2. 隐藏的单词 3. 隐藏的单词
有了这个新请求,ChatGPT 的响应将相当一致地格式化为如下所示:
现在我们已经完成了优化 ChatGPT 请求,因此我们可以开始处理用户界面。
步骤 8 - 单词输入
首先,我们需要允许用户输入 3 个单词。 这可以使用“文本框”小部件完成。 我们还将使用标签小部件将这些单词标记为“A”、“B”和“C”。 因此,稍后用户在尝试猜测隐藏的单词时只需要从 A/B/C 中进行选择。
为了使主程序简短,我们将定义一个名为“单词输入”的新块。 请注意,你现在应该分离 ChatGPT 块,因为我们在构建用户界面时不需要运行 ChatGPT。 这会太慢。
步骤 9 - 添加问题
在用户输入 3 个单词后,他/她将单击“创建”按钮来创建完形填空游戏。 当我们收到 ChatGPT 的问题时,我们将在一个多行只读文本框中显示它们。
我们将定义一个新的自定义块“添加问题”:
步骤 10 - “选项”列表
舞台底部将包含供用户选择哪个单词对应哪个问题的下拉列表。 我们需要创建一个名为“选项”的新列表,并将字母“A”、“B”和“C”添加到其中。
你可能会遇到的一个问题是舞台已经被小部件覆盖,因此你将看不到该列表。 要清理舞台,技巧是在不运行任何块的情况下单击绿旗按钮,如下所示:
步骤 11 - 添加答案
现在我们可以为 3 个问题添加答案下拉列表和一个“提交”按钮:
我们可以为此步骤使用一个新的自定义块“添加答案”:
到目前为止,我们已经完成了游戏界面。 对于最后几个步骤,我们需要在 ChatGPT 的帮助下处理用户操作。
步骤 12 - 编写 ChatGPT 请求
在前几个步骤中,我们将 3 个单词“硬编码”为“run, runs, ran”。 现在我们需要使我们的请求“动态化”:无论用户输入什么单词,我们都将它们包含在请求中。 为了使我们的代码易于阅读,我们将创建 3 个变量并将它们连接在一起:任务、单词和格式。 我们将最终请求存储在另一个名为“请求”的新变量中。
- 任务将是 3 个单词之前的请求部分。 它描述了我们需要的内容:
用 60 个单词,为这些单词创建一个包含 3 个问题的完形填空游戏:
- 单词将包含来自用户输入的 3 个单词,用逗号分隔。
- 格式将描述 ChatGPT 的输出格式:
使用此输出格式(对于每个答案,只显示隐藏的单词): 问题: 1. 2. 3. 答案: 1. 隐藏的单词 2. 隐藏的单词 3. 隐藏的单词
以下是当用户单击“创建”按钮时编写请求的块:
步骤 13 - 从 ChatGPT 获取响应
现在我们可以使用 ChatGPT 块发送请求,然后我们将在“问题”文本框中显示响应以进行查看:
尝试用一些新单词进行测试:
步骤 14 - 删除“问题:”标题
让我们先解决响应中的一个小问题。 它总是以“问题:”开头,这使得我们的问题编号不对齐。 虽然我们可以调整对 ChatGPT 的请求来解决这个问题,但使用“替换”运算符块也很容易解决,如下所示:
请注意,你可以将这些块与 ChatGPT 请求分离,这样我们就不需要重新运行请求。 现在我们得到了一个格式更好的问题列表:
步骤 15 - 提取问题和答案
由于响应同时包含问题和答案,我们需要将其分成两部分,并且只向用户显示问题。 我们可以使用“拆分”运算符,并使用“答案:”作为分隔符。 “答案:”之前的所有单词都将存储在“问题”变量中,“答案:”之后的所有单词都将存储在“答案”变量中。
现在我们只在文本框中显示“问题”变量:
步骤 16 - 编写问题 1 的用户答案
当用户单击“提交”按钮时,我们需要根据 ChatGPT 提供的正确答案检查底部 3 个下拉列表中的选项。 我们可以定义一个新块“检查答案 1”,该块检查第一个问题的答案。 它首先需要根据用户的选择将用户的答案编写成一个短语,并将其存储在名为“用户答案”的变量中:
例如,假设 3 个单词是 A) “word1”,B) “word2”和 C) “word3”。 如果用户为第一个问题选择了“B”,则“用户答案”将被设置为“1. word2”。 请注意,点后面有一个空格。
步骤 17 - 验证用户的答案
现在我们可以检查此用户的答案是否是 ChatGPT 提供的答案的一部分。 根据用户是否回答正确,我们可以将下拉列表设置为不同的颜色:
以下是如何实现这一点:
步骤 19 - 检查其他 2 个答案
最后,我们只需要以类似的方式检查答案 2 和答案 3。
以下是该项目的最终演示:
增强功能
本教程仅涵盖项目的核心逻辑以使其简短。 你可以在很多方面对其进行改进或调整。 以下是一些供你尝试的想法:
- 你可能会发现 ChatGPT 倾向于以与 3 个输入单词相同的顺序对 3 个问题进行排序,因此正确答案始终是 A/B/C。 你能否修改提示以使 3 个问题随机化? 或者,你是否可以在发送给 ChatGPT 的提示中更改这 3 个输入单词的顺序?
- 不让用户选择 3 个单词,而是使用预定义的单词列表。 例如,定义一个包含 30 个单词的列表,并按 3 个单词为一组运行它们。 这对于想要测试学生某些特定单词的教师来说很有用。
- 对 ChatGPT 使用“流式”模式,以便用户可以在生成问题时看到它们。 这将大大减少等待时间。
- 为小部件添加颜色以使其看起来更好。
- 确保 ChatGPT 的问题格式正确。 例如,你需要避免遇到这样的问题:
- 修正“run”与“runs”:有时用户输入的一个单词包含另一个单词。 例如,假设单词是“run, ran and runs”,并且一个答案是“1. runs”。 然后当我们检查正确答案是否包含“1. run”时,我们会得到匹配,尽管那是错误的答案。
-
ChatGPT 人工智能:自动写书(难度:3)
简介
在本教程中,你将学习构建一个简单但实用的应用程序:书籍作者。用户可以指定任何主题,然后程序将使用 ChatGPT 自动编写整本书。
我们将首先添加一些小部件,允许用户指定他/她想要什么类型的书,然后使用 ChatGPT 块相应地编写这本书。
步骤 0 - 编写书籍策略讨论
在开始编写任何代码之前,我们需要讨论如何使用 ChatGPT 编写书籍的基本思路。众所周知,ChatGPT 的响应存在字数限制:我们的输入加上它的输出不能超过 4096 个标记,大约是 3000 个单词。因此,如果我们的书长度超过 3000 个单词,我们无法在单个请求中从 ChatGPT 获得完整的书。
为了解决这个问题,有一个简单而巧妙的解决方案。我们将把这个过程分解成 2 个步骤:
- 我们将首先要求 ChatGPT 编写一个目录,其中包括每个章节的标题
- 然后我们反复要求 ChatGPT 编写每个章节。
现在让我们开始吧。
步骤 1 - 一个空项目
创建一个新项目,并将其命名为“ChatGPT- Book Writer”。删除带有狗的精灵,我们将只使用“Empty1”精灵进行编码。
步骤 2 - 标题标签
首先,我们将添加一个标签,上面写着“标题:”。它将告诉用户在哪里输入书的标题。如下图所示,确保将标签的背景设置为 100% 透明,并将其边框宽度设置为 0。你将在舞台的中心获得一个标签。
步骤 3 - 移动标题标签
我们需要将标签移动到左上角。最简单的方法是使用“小部件位置”工具,它允许我们更改小部件的大小并将其拖动到新位置。新位置和大小将直接存储在块中,因此下次程序运行时,小部件将自动出现在新位置。
步骤 4 - 添加标题输入文本框
接下来,我们将添加一个文本框供用户输入书名。我们将采取相同的 2 个步骤:添加小部件,然后调整其大小和位置。
步骤 5 - 添加章节数标签
接下来,我们需要允许用户从下拉菜单中选择章节数。它不仅可以让用户控制书的长度,还可以让我们轻松地逐个浏览每个章节。
我们将首先添加一个如下所示的标签:
以下是执行此操作的块:
步骤 6 - 添加下拉菜单
接下来,我们将添加一个下拉菜单,允许用户选择 3 到 10 之间的数字:
为此,我们首先需要添加一个名为“numbers”的新列表,并将数字 3 到 10 插入其中:
接下来,我们可以添加使用“numbers”列表的“下拉菜单”小部件,并将其移动到所需位置:
步骤 7 - 添加“目录”按钮和“内容”按钮
接下来,我们需要再添加 2 个按钮:
- “目录”按钮将生成目录。
- “内容”按钮将根据目录生成书的章节。
它们将如下所示:
以下是添加按钮并更新其样式的新块:
步骤 8 - 添加用于输出的文本框
最后,我们需要的小部件是另一个用于显示书籍的文本框。它需要有多行并允许滚动。
以下是添加文本框的新块:
步骤 9 - 将标题添加到书中
在用户输入书名(随意选择任何标题)和章节数后,他/她将首先单击“目录”按钮。当发生这种情况时,我们首先需要将书名从输入文本框复制到输出文本框:
为此,我们需要使用“当小部件被点击时”块来检测用户何时单击“目录”按钮。当发生这种情况时,我们需要将输出文本框(“booktextbox”)的值设置为输入文本框(“textbox1”)的值。为了表明这是标题,我们可以使用连接块将“<”和“>”添加到标题:
步骤 10 - 要求 ChatGPT 生成目录
现在我们终于准备好使用 ChatGPT API 了。为了让它编写目录,我们只需要告诉它书名和章节数。例如,这是我们的第一个版本的提示:
你正在帮我写一本书。标题是 <时间旅行 101>。它将有 4 个章节。现在编写目录。
现在让我们将此提示放入名为“request”的变量中,然后将此请求发送给 ChatGPT,并将响应存储在名为“response”的变量中。然后我们可以将此响应“追加”到输出文本框:
这是我们将得到的:
这是一个好的开始。我们将逐一修复这些问题。
步骤 11 - 让 ChatGPT 只返回目录
显然,最大的问题是 ChatGPT 的响应不“干净”。由于它被训练为“聊天”,它自然会在目录之前和之后添加一些句子。
现在让我们尝试改进我们的请求,以便它只返回目录。例如,我们可以尝试这样说:
你正在帮我写一本书。标题是 <时间旅行 101>。它将有 4 个章节。现在只返回目录,不要在它之前或之后添加任何内容。除了目录,我不想要任何其他内容!
不幸的是,我们总是得到一个“健谈”的响应:
你能找到一个总是有效的好的提示吗?
步骤 12 - 标记目录的开头和结尾
坏消息是,对于当前版本的 ChatGPT 来说,几乎不可能找到一个能让我们得到干净目录的提示。所以我们必须找到另一种解决方案。我们的想法是,我们接受在目录之前和之后可能存在不需要的句子,并且我们要求 ChatGPT 告诉我们目录在哪里。具体来说,我们可以要求 ChatGPT 在目录之前和之后添加 ```,如下所示:
你正在帮我写一本书。标题是 <时间旅行 101>。它将有 4 个章节。现在编写目录。在它之前和之后添加 ```。
现在我们发现 ChatGPT 几乎总是在一对 ``` 之间给出目录:
现在我们只需要提取响应中 2 个 ``` 标记之间的部分。我们可以使用“part N of T by X”块轻松地做到这一点:
它的工作方式是,它将首先通过 ``` 标记拆分响应。由于响应中有 2 个标记,此步骤会将响应拆分为 3 个部分,中间部分(第 2 部分)将是目录本身。
这是更改后你应该得到的:
步骤 13 - 使用用户输入组成请求
另一个小问题是我们的提示是“硬编码的”。它根本没有使用用户的输入。要更改这一点,我们需要使用“连接”块来使用文本框和下拉菜单的值组成请求:
之后,我们将始终获取用户指定的标题和章节数:
步骤 14 - 编写第一章
现在让我们尝试要求 ChatGPT 编写第一章。我们只需要告诉它书名和目录,这恰好是输出文本框的当前值。所以我们只需要将它保存到一个名为“toc”的新变量中,然后像这样组成请求:
请注意,由于我们正在开发程序,我们可以将字数限制为一个较小的数字,例如 100,这样我们就不必等待太长时间才能得到响应。如果我们将 request2 变量打印到控制台面板,它将如下所示:
由于它看起来不错,现在我们只需要将此 request2 发送给 ChatGPT,并将新的响应追加到书籍文本框。
现在我们可以成功生成第 1 章:
步骤 15 - 使用循环编写所有章节
对于最后一步,我们需要使用循环逐个编写所有章节。我们可以使用 for 循环使变量“chapter”从 1 到章节总数,然后在循环中使用“chapter”变量组成对 ChatGPT 的请求:
这是该程序的最终演示:
增强功能
这个版本的书籍作者非常粗糙。有很多地方可以增强它。以下是一些示例:
- 有时 ChatGPT 无法正确生成目录。我们如何改进请求以避免这种情况?
-
输出文本框中的书籍格式不正确。尝试在书的不同部分之间添加一些空行。
-
有时目录在给定的章节数之后包含一个“结论”,但我们的程序尚未生成任何结论。你可以尝试在最后添加它。
-
ChatGPT 人工智能 - 提示挑战游戏(难度:3)
简介
当我们使用 ChatGPT 来帮助我们完成各种任务时,我们经常需要微调我们的提示,以获得 ChatGPT 的预期响应。事实上,提示工程的一项核心技能是让 ChatGPT 按照我们想要的格式说出我们想让它说的话。在本教程中,我们将构建一个简单的“提示挑战”游戏:玩家需要对 ChatGPT 说一些话,使其回应“this is easy”。当然,如果玩家可以说任何话,这个游戏就太简单了,所以我们将对玩家可以说的话添加 2 个限制:玩家不能在他的提示中使用“this”、“is”和“easy”这三个词。
步骤 1 - 从一个空项目开始
在 CreatiCode 游乐场上,登录您的帐户,然后创建一个名为“prompt challenge”的新项目。删除带有狗的“Sprite1”,我们将在“Empty1”角色中编写代码。
步骤 2 - 添加一个聊天窗口
这个游戏将以玩家和 ChatGPT 之间的聊天形式进行。所以让我们添加一个占据整个舞台的聊天窗口:
请注意,“输入行数”为 2,这将在底部显示 2 行用户输入。
步骤 3 - 说明要求
接下来,我们将告诉玩家所需的输出和对输入的限制。我们将把它添加到聊天记录中,并假装它来自 ChatGPT。具体内容如下:
Make me say 'this is easy', but do not use any of these 3 words
我们可以使用“追加到聊天”块来添加此内容:
现在,如果我们点击绿旗,这个要求将立即显示出来:
步骤 4 - 显示玩家输入
当玩家在聊天窗口中输入一些文字并按下回车键时,我们会将其存储在一个名为“input”的变量中,并将该输入添加到聊天窗口中。
这是您现在应该得到的结果:
当然,由于我们还没有将其发送给 ChatGPT,我们还不会收到任何回应。
步骤 5 - 检查玩家输入
在我们将玩家输入发送给 ChatGPT 之前,我们应该验证该输入是否有效。我们的规则是该输入不应包含这 3 个词:“this”、“is”和“easy”。因此,如果输入包含其中任何一个,则该输入无效。我们可以使用 2 个“或”块来组合 3 个条件,其中每个条件检查输入是否包含 3 个词中的一个:
步骤 6 - 拒绝玩家输入
如果这 3 个条件中的任何一个为真,我们只需要告诉玩家再试一次,我们不需要做任何其他事情:
您可以通过输入包含这些词之一的无效输入来测试它。请注意,您可以尝试多次,因为每次都会再次触发“当组件 chat1 被点击”块。
步骤 7 - 将玩家输入发送给 ChatGPT
当玩家输入不包含这 3 个词时,我们会将其发送给 ChatGPT,看看我们是否能得到所需的输出:
我们会将 ChatGPT 的响应存储在“response”变量中。由于响应将相当简短,我们将简单地使用“等待”模式等待整个响应返回。每次玩家说话时,我们都会将其设为“新的聊天”会话,因为我们不需要 ChatGPT 记住玩家之前说过的话。它只需要回应玩家当前所说的话。
步骤 8 - 显示 ChatGPT 的响应
一旦我们收到 ChatGPT 的响应,我们也可以将其追加到聊天记录中:
步骤 9 - 检查 ChatGPT 的响应
现在是时候检查 ChatGPT 是否准确地说出了“this is easy”:
请注意,我们可以简单地使用等于运算符。即使两边的字母大小写不同,它也会报告为真。此外,这个 if-else 块应该添加到前一个 if-else 块的“else”分支中,因为只有当玩家输入有效时,我们才需要测试响应。
步骤 10 - 告诉玩家结果
最后,我们可以祝贺玩家通过测试或要求玩家再试一次:
现在游戏可以玩了。请自己尝试玩一下并找到解决方案。有很多方法可以解决这个难题。提示一下,一种解决方案是利用“反义词”。
创建您自己的提示挑战游戏
如果您想玩更多游戏,请在探索页面上搜索“提示挑战”。它们将帮助您练习如何控制 ChatGPT 的输出。
此外,尝试自己想出一个新的挑战。您需要指定 ChatGPT 的预期输出以及对玩家输入的任何限制。请注意,输出和要求都需要易于验证。理想情况下,您应该考虑并防止玩家可能“破解”您的挑战的所有可能方式。
-
ChatGPT 人工智能:MBTI 性格测试(难度:3)
简介
在之前的教程中,你学习了如何使用 ChatGPT 构建一个简单的聊天应用程序。在本教程中,我们将构建一个有趣的应用程序,它可以通过问几个问题来确定用户的 MBTI 类型。
MBTI 类型
MBTI,即迈尔斯-布里格斯类型指标,是一种帮助你更好地了解自己的测试。它通过将你归类为 16 种类型之一来告诉你你的性格。每种类型都有四个字母,例如“INTJ”或“ESFP”,这些字母代表了你的思维、感觉和行为方式。
第一个字母,“E”或“I”,代表外向或内向:“E”表示你外向且喜欢社交,而“I”表示你更内敛且喜欢独处。
第二个字母是“S”或“N”,代表感觉或直觉:“S”型人关注事实和细节,而“N”型人更关注想法和可能性。
第三个字母是“T”或“F”,代表思考或感觉:“T”表示你根据逻辑做出决策,而“F”表示你会考虑人们的感受。
第四个字母是“J”或“P”,代表判断或感知:“J”型人喜欢计划和有条理,而“P”型人更随性且灵活。
ChatGPT 如何提供帮助
传统上,要准确地找出你的 MBTI 类型,你必须回答一份包含大量问题的问卷,而且许多问题都很抽象且难以理解。例如:你觉得最终做出决定还是保持选择开放更令人满意?
现在我们可以使用 ChatGPT 来设计问题,使问题更加有趣和易于理解。
以下是该应用程序的界面:
步骤 1 - 初始项目
你可以改编以下项目以将其用作起点:
https://play.creaticode.com/projects/6519f719fc9a5a6d14882a11
该项目允许我们在开始时使用系统请求来解释我们想要做什么,然后在用户和 ChatGPT 之间进行聊天。我们为你准备了一个**“草稿区”**,用于编写你的系统提示的草稿,然后将其复制到“系统请求”块中。
步骤 2 - 我们的第一个提示版本
我们只需做一件事就可以构建这个应用程序:设计一个很棒的提示(请求)。这将需要几次修改。首先,这是我们的第一个版本,它只是告诉 ChatGPT 它应该做什么:
通过问一些问题来确定用户的 MBTI 类型。
将该提示放入系统请求块中:
当你运行程序时,你有时会得到这样的陈述:
显然,ChatGPT 很谨慎,但这在这里没有必要,因为用户已经知道这是一个 MBTI 测试。如何改进我们的提示?
步骤 3 - 让 ChatGPT 提出第一个问题
为了确保 ChatGPT 直接进入问题,我们可以简单地要求它开始提出第一个问题,如下所示:
通过问一些问题来确定用户的 MBTI 类型。现在问候用户并提出第一个问题。
现在 ChatGPT 确实会开始提出第一个问题:
步骤 4 - 更改第一个问题
ChatGPT 的第一个问题几乎总是:“你更喜欢独处还是与他人相处?”。问题是每个人都会得到相同的问题,这对用户来说不是很感兴趣。
为了解决这个问题,我们可以让 ChatGPT 首先询问用户的最喜欢的活动。假设用户回答“阅读书籍”,那么 ChatGPT 将跟进与阅读书籍相关的其他问题。这将使用户更喜欢该测试。
我们可以像这样更改提示:
通过问一些问题来确定用户的 MBTI 类型。现在问候用户并询问用户他/她最喜欢的活动
这是 ChatGPT 更新后的问题:
步骤 5 - 控制后续问题
在用户回答第一个问题后,你可能会发现 ChatGPT 会继续关注该活动,并“忘记”MBTI 测试的任务。这主要是由于 ChatGPT 的训练,因此它觉得它应该继续谈论用户感兴趣的内容。
为了解决这个问题并将 ChatGPT 重新集中到主要任务上,我们需要添加一个额外的说明:
通过问一些问题来确定用户的 MBTI 类型。现在问候用户并询问用户他/她最喜欢的活动。然后,询问有关该活动的后续问题,以找出用户的 MBTI 类型。
现在我们设法让 ChatGPT 回到 MBTI 问题:
但是,一次问所有问题太多了。你能尝试将 ChatGPT 更改为一次问一个问题吗?
步骤 6 - 一次一个问题
要让 ChatGPT 每次问一个问题,你可以添加一些额外的说明“每次只有一个问题”:
通过问一些问题来确定用户的 MBTI 类型。现在问候用户并询问用户他/她最喜欢的活动。然后,每次只询问一个有关该活动的后续问题,以找出用户的 MBTI 类型。
现在我们只会得到一个问题:
另一个例子:
步骤 7 - 多项选择题
目前,所有问题都是开放式的。用户需要输入几个单词才能进行测试。为了更轻松,我们可以让 ChatGPT 提供多个选项,因此用户只需输入一个字母即可回答每个问题。
我们可以通过此更改来实现这一点:
通过问一些问题来确定用户的 MBTI 类型。现在问候用户并询问用户他/她最喜欢的活动。然后,每次只询问一个有关该活动的后续问题,以找出用户的 MBTI 类型。问题应该有多个选项。
现在问题将如下所示:
但是,有时甚至第一个问题也会变成一个多项选择题,如下所示:
这不是 ChatGPT 的错。在我们的提示中,我们说“问题应该有多个选项”,这确实包括第一个问题。为了解决这个问题,我们需要排除第一个问题:通过问一些问题来确定用户的 MBTI 类型。现在问候用户并询问用户他/她最喜欢的活动。然后,每次只询问一个有关该活动的后续问题,以找出用户的 MBTI 类型。问题应该有多个选项,但第一个问题是开放式的。
步骤 8 - 测试结果
最后但同样重要的是,我们将要求 ChatGPT 在几个问题后报告测试结果。为了保持测试快速,我们可以将其限制为最多 5 个问题,如下所示:
通过问一些问题来确定用户的 MBTI 类型。现在问候用户并询问用户他/她最喜欢的活动。然后,每次只询问一个有关该活动的后续问题,以找出用户的 MBTI 类型。问题应该有多个选项,但第一个问题是开放式的。在最多提出 5 个问题后,报告你对用户 MBTI 类型的预测并提供详细解释。
这是我们应用程序的最终演示:
增强功能
虽然这个应用程序可以运行,但它的许多方面都可以改进。以下是一些供你探索的想法:
- 添加文本转语音和语音转文本,以便用户可以在不键入或在屏幕上阅读的情况下使用它。
- 删除不必要的单词:ChatGPT 通常非常“健谈”,它会说一些额外的东西来使聊天流畅。例如,此处的最后一个句子是不必要的。你能尝试让 ChatGPT 更简洁吗?
- 除了“最喜欢的活动”,你还能想到其他有趣的方式来开始对话吗?如何让你的用户在使用你的应用程序时更投入?
-
ChatGPT 人工智能:增强 ChatGPT 进行数学计算的能力(难度:3)
简介
像 ChatGPT 这样的大型语言模型非常擅长处理文本和解决问题,这使得它们看起来几乎聪明得可怕。然而,随着你使用它们越来越频繁,你会发现它们在许多其他任务上表现得很糟糕。
其中一项任务就是数学计算。例如,假设我们用一个乘法问题测试 ChatGPT:
使用任何计算器,我们都可以轻松算出 3516 乘以 357 等于 1255212。ChatGPT 犯这个错误是因为它实际上并没有计算结果。相反,它在其训练数据中见过许多类似的乘法,所以它试图猜测输出数字应该是什么样子。由于数学计算在许多任务中都至关重要,我们必须找到一种方法来帮助 ChatGPT 正确计算。在本教程中,你将学习一个简单的解决方案。基本思想是,我们将教会 ChatGPT 在计算方面寻求帮助,我们将在代码中帮助它计算出正确的答案。
第 1 步 - 初始项目
我们将使用以下项目作为起点。请将其改编为你自己的项目,并将项目命名为“ChatGPT with Calculation Help”:play.creaticode.com/projects/6531b7e60fdce080a4481c1d
第 2 步 - 验证问题
在我们进行任何改进之前,请尝试在这个项目中使用数学问题来验证 ChatGPT 在没有我们的帮助下无法正确计算:
第 3 步 - 序列图
在我们进行任何更改之前,让我们使用序列图来讨论这个项目的设计。
我们的项目中有 3 个实体:
- 用户:输入问题的用户
- ChatGPT:回答用户问题的 AI 模型
- 系统:这是我们的代码
目前,系统只是在用户和 ChatGPT 之间转发消息,如下所示:
为了帮助 ChatGPT 进行数学计算,我们可以更改图表,以便有时 ChatGPT 可以与我们的系统对话并获得答案,如下面 2 个额外的蓝色箭头所示:
这种设计的美妙之处在于,系统和 ChatGPT 之间的新消息可以对用户隐藏,因此在用户看来,ChatGPT 正在正确回答。
第 4 步 - 更新初始提示
由于我们将编写一个相当长的提示,让我们仍然使用“注释”区域来编写提示。首先,通过右键单击绿旗块添加注释区域:
接下来,将以下提示复制到注释区域:你是一个友好的助手。 当你需要进行数学计算时,你可以使用特殊的标签“CALC:”后跟要计算的表达式来响应系统,而不是响应用户。系统将向你提供答案,然后你可以生成对用户的响应。 现在说“你好”
此提示包含 3 个部分:- 它首先介绍了上下文,其中 ChatGPT 扮演友好助手的角色。
- 然后,向 ChatGPT 发出特殊指令,以便在需要进行数学计算时响应系统。还指定了确切的语法。
- 最后,我们让 ChatGPT 说“你好”并等待用户输入。
接下来,你可以将整个提示从注释区域复制到请求块中,然后按 Enter 键确认:
现在让我们再次测试相同的问题,我们将从 ChatGPT 获得“CALC:”响应:
这是一个很大的进步:ChatGPT 承认它需要帮助! 它没有猜测答案,而是谦虚地询问系统如何进行此计算。
第 5 步 - 控制输出格式
由于 ChatGPT 根据概率生成每个输出词,因此它有时可能会决定更改响应格式。这不好,因为我们的代码假定了一个固定的格式。
例如,如果你尝试运行该程序几次,你可能会得到如下响应:
同样,ChatGPT 可能会决定在表达式之后说些什么。现在,你能想想如何解决这个问题吗?理想情况下,我们希望 ChatGPT 始终以“CALC:3516 * 357”的固定格式生成响应。请在查看下面的解决方案之前尝试一下。
有很多方法可以控制 ChatGPT 的响应格式,但在大多数情况下,最好的解决方案是给出一个示例。ChatGPT 在从示例中学习方面训练有素。
对于这个特定问题,我们可以给出用户、ChatGPT 和我们的系统之间的示例对话,如下所示:
你是一位友好的助手,帮助一名 K-12 学生进行一些计算。你的回答简洁明了。不要说任何不恰当的话。
当你需要进行计算时,你可以使用特殊的标签“CALC:”后跟要计算的表达式来响应系统管理员,而不是响应用户。系统管理员将向你提供该表达式的答案,然后你可以生成对用户的响应。
例如:
用户:2345 乘以 3456 是多少?
助手:CALC:2345*3456
系统:8104320
助手:2345 乘以 3456 的答案是 8104320现在说“你好”
现在请将这个新提示复制到你的注释区域,然后将其复制到系统请求块中。
现在如果你尝试再次提出问题,它几乎总是使用正确的格式:
第 6 步 - 检查响应是否以“CALC:”开头
接下来,我们将根据 ChatGPT 的响应是否包含特殊标签“CALC:”来不同地处理 ChatGPT 的响应。只有当 ChatGPT 的响应以“CALC:”开头时,我们才会添加一些额外的步骤。
第 7 步 - 进行计算
当我们发现 ChatGPT 要求我们进行计算时,我们可以计算答案并将其存储在一个变量中。
逻辑如下:- ChatGPT 的响应以“CALC:”开头,我们只需要后面的表达式。因此,我们可以使用“substring”块来获取从第 6 个字母开始的响应的子字符串。例如,如果响应变量为“CALC:3516 * 357”,则子字符串将为“3516 * 357”。
- 我们可以使用“计算表达式”块来计算此表达式,这将产生一个数字,如 1255212
- 我们可以将该数字存储在一个名为“答案”的新变量中。
第 8 步 - 告诉 ChatGPT 答案
现在我们已经完成了计算,我们需要将其返回给 ChatGPT。请注意,我们应该使用**“系统请求”块发送答案,这使 ChatGPT 清楚地知道此答案来自系统,而不是用户**。我们仍然会要求 ChatGPT 将响应存储在“响应”变量中,这将覆盖先前的响应。
在此步骤之后,“响应”变量包含基于我们计算的新响应,我们可以继续将其追加到聊天记录中。如果你再次测试相同的问题,你将得到正确的答案!
创意点子
在本教程中,你学习了一种非常有用的技术来增强 ChatGPT 的新能力。你能尝试一些其他方法来帮助 ChatGPT 吗?以下是一些供你参考的想法:
今天的日期:
信不信由你,如果用户询问 ChatGPT 今天的日期,它会给出一个随机且错误的日期。你可以使用“当前 [年/月/日]”块帮助获取答案。
最长公共子串:
ChatGPT 也不擅长执行算法。例如,它错误地回答了这个问题:
你可以使用“最长公共子串”块提供帮助,正确答案应该是“1357911”。 -
AI - 会看和说的AI助手(难度:2)
简介
像 ChatGPT 这样的大型语言模型通常是“多模态”的,这意味着它们不仅可以用文字与我们聊天,还可以理解图像。这非常有用,因为在许多情况下,用图片描述我们的需求比用文字更容易。
在本教程中,你将构建一个能看能说的 AI 助手。要使用它,用户只需使用相机拍照,然后就可以向 AI 助手询问有关该图片的任何问题。
步骤 1 - 创建一个新项目
在 CreatiCode.com 上,登录并创建一个新项目。删除小狗角色,并将项目重命名为“AI 助手”。
步骤 2 - 搜索或生成一个背景
当项目开始时,我们将向用户展示一个漂亮的背景,以表明这是一个 AI 助手。
切换到舞台并尝试添加一个新的背景。例如,如果你搜索“一个乐于助人的 AI 助手”,你可以找到许多有趣的背景可供选择:
你还可以根据自己的想法生成一个新的背景。例如,假设我们希望这个助手被用作导游,那么我们可以使用一个详细的描述来生成背景,例如:一个机器人导游面向观众,双臂张开,站在一个历史遗迹前,卡通风格
我们将得到一个像这样的新背景:
步骤 3 - 当绿旗被点击时显示 2 个按钮
现在切换到空的角色并添加代码以显示 2 个按钮,这将允许用户选择一个摄像头。前置摄像头通常在触摸板或 Chromebook 上可用,而后置摄像头通常在 iPad 或智能手机上可用。
你可以使用以下代码:
步骤 4 - 显示摄像头预览
当任一按钮被点击时,我们需要显示来自摄像头的视图,以便用户可以瞄准物体或地点。唯一的区别是显示“前置”还是“后置”摄像头。由于只会点击其中一个按钮,因此在两种情况下我们都可以将摄像头小组件称为“camera1”。
步骤 5 - 准备拍照
除了显示摄像头预览之外,我们还需要做一些其他工作来准备拍照。由于无论使用哪个摄像头,工作都是相同的,因此我们可以在一个新的自定义积木“准备拍照”中定义常见的工作:
在该新积木的定义中,我们将添加更多积木来删除现有的按钮(button1 和 button2),并添加第三个按钮来拍照:
它将看起来像这样(假设我们要拍一张 U 盘的照片):
步骤 6 - 拍照并显示它
当用户点击“拍照”按钮时,我们将把当前的摄像头视图保存为名为“c”的造型图像并将其显示给用户:
这样,摄像头预览和 button3 都将被删除,我们将只显示新捕获的造型图像。
步骤 7 - 为用户提问做准备
接下来,在下面添加更多的新积木。它们将添加一个新按钮,该按钮将启用语音识别,以便用户可以提问。这比要求用户输入问题要方便得多,尤其是在移动设备上。我们还将添加一个文本框来显示我们识别的问题。文本框的背景透明度为 30%,以便用户仍然可以看到他们拍摄的照片。
例如,它将看起来像这样:
步骤 8 - 识别用户问题
当用户点击“提问”时,我们将启用语音识别并允许用户说话最多 8 秒钟。这对于大多数问题来说应该足够长了,但你可以将时间长度更改为更短或更长。然后,我们将在文本框中将识别的文本显示为一个问题:
你还可以使用“连续语音识别”,并在用户说完一整句话时停止识别。为了简单起见,我们将只使用基于时间的截止时间。要测试它,请点击“提问”按钮,然后说出你的问题,例如“这是什么?”,然后它将被识别并显示在文本框中:
步骤 9 - 向 ChatGPT 询问有关此图片的问题
现在我们终于准备好让 ChatGPT 根据图片回答用户的问题了。它实际上需要 2 个协同工作的积木:
-
将造型图像附加到聊天:此步骤不会将图像发送到 ChatGPT。它只将图像存储为聊天的一部分。你可以将多个图像附加到一个聊天会话,但对于这个项目,我们只需要附加一个图像。
-
向 ChatGPT 发送聊天消息:此积木会将提示与上面附加的图像一起发送出去。我们将使用一个简单的提示:“口头回答,50 字以内:\n”。关键字“口头”确保 ChatGPT 的回答是对话式的,而不是太正式。我们还将它限制在 50 字以内,以避免冗长的回答。
在这 2 个积木运行后,ChatGPT 的回答将存储在变量“结果”中。
步骤 10 - 显示并说出答案
我们不仅会在文本框中显示答案,还会将其转换为语音。这样,用户大部分时间都可以听答案,如果他们错过了一些细节,他们只需要阅读文本。
答案将看起来像这样:
额外挑战
这个项目演示了如何将许多有用的 AI 工具组合到一个简单的应用程序中,但它被有意地保持简单。以下是一些你可以探索以进一步增强此工具的想法:
-
处理后续问题:允许用户提出更多问题。你需要确保每次都不会再次添加造型图像。此外,请确保 ChatGPT 处于“继续”模式,以便它具有之前问题的上下文。
-
避免固定的等待时间:你可以自动检测用户是否已完成提问,而不是总是等待 8 秒钟。或者,你也可以使用 2 个按钮:点击一个按钮开始语音识别,点击另一个按钮停止它。
-
将其翻译成另一种语言:如果你的母语不是英语,你可以将该工具更改为你的母语。
-
自定义提示:当前的提示非常简短且通用。假设你想将此工具更改为“家庭作业助手”,那么你可能需要在提示中添加更多说明。例如,你可能想告诉 ChatGPT 它应该只提供提示,而绝不直接透露答案。
-
-
AI - 一个水滴的旅途 (难度: 1)
介绍
利用 CreatiCode 游乐场中的 AI 图像生成工具,现在可以更轻松地使用自定义造型和背景来创建故事。在本教程中,你将学习如何构建一个关于水滴生命的简单动画:
步骤 1 - 创建一个新项目
前往 CreatiCode 游乐场,并创建一个新项目。将其命名为“水滴之旅”,并删除现有的精灵。
步骤 2 - 添加水滴精灵
点击 AI 按钮搜索或生成精灵图像:
在弹出的库窗口中,输入你想要的水滴外观的简短描述,例如“一个面向观众的水滴角色,卡通风格”。然后点击“生成”按钮生成一个新的精灵图像,如下所示:
你可以随意重新生成图像或改进你的描述。当你对图像满意时,选择它以将其添加到你的项目中。
步骤 3 - 生成海洋背景
第一个背景将是一片海洋。你可以打开 AI 工具搜索或生成背景,然后使用如下描述生成一个新的背景:广阔的海洋表面,卡通风格。你将得到一个类似这样的背景:
如果你对它满意,选择它以将其添加为舞台的背景。你也可以将其名称更改为“海洋”以保持简洁:
步骤 4 - 添加代码以显示海洋背景
现在切换到水滴精灵,并添加以下代码,当用户点击绿旗按钮时,将显示海洋背景:
步骤 5 - 说一句话
接下来,我们将让水滴精灵通过说一句话来解释这个场景,例如:我是一滴大海中的水滴。
我们可以使用新的带有彩色文本和背景的“说”积木:
现在,当我们点击绿旗按钮时,我们会得到以下结果:
步骤 6 - 添加云背景
对于下一个场景,我们将展示一些云。使用如下描述生成一个新的背景:天空中的几朵云,卡通风格。背景将如下所示:
选择这个新背景,并将其重命名为“云”。
步骤 7 - 添加代码以显示云
现在我们可以添加更多代码来显示和解释第二个背景,并使用如下描述:当天气变暖时,我上升到云中。
现在当我们运行项目时,我们会得到以下结果:
步骤 8 - 添加“雨”和“河流”背景
接下来,尝试使用以下描述生成另外 2 个背景:
- 湖面上的小雨,卡通风格
- 一条流入大海的河流,卡通风格
记住将这些背景重命名为“雨”和“河流”。
步骤 9 - 添加代码以显示和解释“雨”和“河流”
与之前的步骤类似,我们可以让水滴像这样解释这两个场景:
这样就完成了这个程序,总共有 4 个背景。
创意想法
本教程向你展示了一种利用新的 AI 图像生成工具创建新故事和插图的简单方法。请尝试创建一个类似的程序。以下是一些建议:
-
树的故事:在晴天、阴天、雨天和雪天的背景下展示一棵树,解释天气如何影响树木。
-
太阳系之旅:在地球、火星、土星等行星的背景下展示一艘宇宙飞船。解释每个行星的独特之处。
-
麦哲伦的航行:在麦哲伦访问过的关键地点的背景下展示一艘船的精灵,例如西班牙的一个港口,然后是关岛的一个热带岛屿,以及菲律宾的海岸线。
-
双人在线 3D《毁灭战士》(难度:6)
简介
在本教程中,您将学习如何构建一个类似于经典游戏“毁灭战士”的3D多人射击游戏。两个玩家(在两台不同的计算机上)可以相互对战。
由于这个项目相当复杂,下面分享了已完成的项目:play.creaticode.com/projects/66e823b5a634f8ee7d92cc88
本教程将逐步介绍此项目的所有关键组件,以便您彻底理解它。
请注意,我们的多人游戏服务器只知道2D游戏世界,但我们可以使用它来支持我们的3D游戏,只要所有对象都在同一地面上。一个简单的思考方式是:如果我们从3D世界的上方俯视,那么游戏世界看起来像2D,而3D世界中的3D盒子在我们从上方看时将看起来像2D正方形。
1 - 角色概览
这个项目包含六个角色:
- Start:此角色包含显示游戏开始界面的代码,以便主机玩家可以创建新游戏供访客玩家加入。它还初始化3D世界。
- Player:此角色允许玩家(用户)控制3D世界中的两个化身,包括处理关键事件和管理玩家的生命值/火力。这是此项目中最复杂的角色。
- Bullet:此角色代表玩家发射的子弹。
- Wall:此角色用于在3D世界中创建墙壁。玩家或子弹不能穿过这些墙壁。
- Powerup:此角色用于生成“生命值”或“火力”的新道具。它们会定期随机出现在游戏世界中,如果没有任何玩家收集,它们会在一段时间后消失。
- Winner:当任一玩家获胜时,此角色将显示游戏的结束画面。
2 - “Start”角色:初始界面
当用户点击绿旗时,我们将显示一个初始界面,其中包含一个标签、一个输入文本框和两个按钮:
以下是在“Start”角色中创建此界面的代码:
请注意,每个游戏只能在2个用户(主机和访客)之间进行,并且由其名称唯一标识。默认名称为“3D Shooter”。如果名称已被占用,则主机需要在创建游戏时选择不同的游戏名称,访客需要使用相同的名称才能加入该游戏。
3 - “Start”角色:创建新游戏
在主机用户指定游戏名称后,他/她将点击“创建新游戏”按钮。我们将读取游戏名称,并将此用户的ID设置为“A”,这代表主机玩家。如果游戏名称为空,我们将显示错误消息,否则我们将尝试创建游戏。
4 - “Start”角色:创建游戏
要创建游戏,我们需要执行以下操作:
- 在此计算机上初始化3D场景;
- 要求游戏服务器使用给定的游戏名称创建一个新游戏。
- 为简单起见,我们将使用默认密码“123”,并假定主机用户为“玩家A”。
- 游戏容量为2,这意味着在一个主机和一个访客加入后,它将不再接受任何加入请求。
- 游戏世界设置为2000 x 2000。请注意,这是一个2D游戏世界,因此它只有宽度和高度。我们假设每个对象都处于地面水平,因此我们不需要在Z维度上指定世界大小。
- 如果游戏世界创建成功,则此计算机将连接到游戏。然后我们可以将主机玩家添加到游戏中(稍后讨论),然后等待其他玩家(访客)加入。
- 如果在短暂等待后我们仍未连接到游戏,则表示我们失败了,最可能的原因是游戏名称已被占用,或者游戏服务器太忙。无论哪种情况,我们都可以要求用户更改游戏名称并重试。
5 - “Start”角色:初始化3D场景
为了设置3D世界,我们创建了一个简单的“草地”场景,然后添加一个没有顶盖的“矩形立方体”,使其成为世界4个边界上的墙壁。世界的大小为2000 x 2000。我们将边界墙的高度设置为100,因此其中一半(50)在地面以上。化身将高100,因此墙壁不会阻挡我们跟随化身的摄像机。创建世界后,我们还使用“添加条形”块在顶部添加生命条和火力条。
6 - “Start”角色:添加生命和火力条
每个玩家开始时有3条生命,因此他/她被子弹击中3次就会失败,但可以通过收集生命奖励来获得生命。每个玩家的起始火力为1,可以通过收集火力奖励将其增加到5。火力控制每发射2颗子弹之间的最小间隔:间隔 = 2秒/火力。因此,当火力为1时,玩家可以每2秒发射一次,不能更快;但是当火力为5时,玩家可以每0.4秒发射一次。
两个玩家当前的生命值和火力值显示在舞台顶部,如下所示:
添加玩家名称和生命条的代码如下。生命条由3个绿色的方形标签表示,它们的名称以“health”开头,然后是玩家的ID“A”或“B”,最后以序列号1/2/3结尾。
添加火力标签的代码非常相似:
7 - “Start”角色:等待访客玩家加入
在主机玩家创建游戏后,他/她需要等待访客玩家成功加入游戏。我们可以重复将玩家信息获取到一个表格中,然后检查玩家数量是否为2。如果是,则我们显示一个“开始游戏”按钮,该按钮允许主机玩家开始游戏。
8 - “Start”角色:加入现有游戏
现在,让我们看看访客玩家方面。访客玩家需要输入与主机玩家相同的游戏名称,然后单击“加入现有游戏”按钮。
单击该按钮时,我们将执行以下操作:
- 将本地玩家保存为“玩家B”,这代表访客玩家。
- 确保用户指定的游戏名称不为空
- 加入游戏
9 - “Start”角色:加入游戏
要加入游戏,我们首先在访客玩家的计算机上创建3D场景,然后向游戏服务器发送一个请求,以使用给定的名称加入游戏。此玩家将是“玩家B”,这代表访客玩家。
等待一段时间后,我们检查是否已连接到游戏。如果是,我们将创建访客玩家(稍后讨论);否则,我们将显示错误消息。
10 - “Start”角色:开始游戏
在访客玩家加入游戏后,“开始游戏”按钮将出现在主机计算机上。当主机用户单击它时,我们将发送一条新消息“开始游戏”:
请注意,此消息将发送到两台计算机,但只有“原始”角色才能接收到它。例如,主机计算机上的玩家A角色将收到它,但访客计算机上的它的克隆将不会收到。这样,“开始游戏”消息在每台计算机上只被接收和处理一次。
11 - “Player”角色:添加玩家
现在,让我们切换到“Player”角色。此角色代表游戏世界中玩家的化身。
要添加主机或访客玩家,我们只需创建“Player”角色的克隆,并使用不同的克隆ID:“A”代表主机,“B”代表访客。这样,我们重用了大部分代码来添加玩家。
克隆创建后,我们将执行以下操作:
- 我们初始化一个变量“上次开火时间”来跟踪上次开火的时间,这有助于我们确定玩家何时可以再次射击
- 我们使用两个变量“生命值”和“火力”来跟踪每个玩家的生命数量和火力等级,起始值分别为3和1。请注意,这些变量对于Player角色的每个克隆都是“私有的”,因此两个玩家可以拥有自己的“生命值”和“火力”值。
- 我们将两个玩家放置在游戏世界的两个相对侧:x为0,y为800或-800。请注意,我们使用它们的克隆ID来区分这是主机玩家还是访客玩家。
- 我们将玩家添加到游戏中,这意味着我们在游戏服务器上注册此玩家。玩家是“动态的”,这意味着它的移动将被跟踪并在两台计算机上复制。
- 我们使用“圆形”形状来表示每个玩家。尽管每个玩家在3D世界中都是3D化身,但在我们的游戏服务器看来,它们都由直径为30的2D圆形表示。
- 我们将阻止玩家化身穿过墙壁对象
- 我们将允许玩家收集道具,这将触发“收集道具”消息。
幕后
当我们将玩家注册到游戏服务器时,幕后发生了什么?游戏服务器模拟了我们在玩游戏时游戏世界中发生的事情。在游戏开始时,当我们注册一个新玩家时,游戏服务器会在其模拟的游戏世界中添加一个新的圆形形状。
此外,该玩家的副本将在另一台用户的计算机上创建。例如,当主机用户创建游戏时,他/她的代码将创建主机玩家“A”,然后在访客用户的计算机上创建玩家“A”的克隆。类似地,当访客用户加入游戏并创建玩家“B”时,它将在主机用户的计算机上复制。因此,在每台计算机上,都有两个“Player”角色的克隆在运行。
12 - “Player”角色:当玩家添加到游戏时
在我们运行“将此角色添加到游戏”块之后,如果成功,将触发另一个块:“添加到游戏时”。这是一个重要的“隐藏”事件,因为它让我们有机会完全初始化玩家。
此块在每台计算机上被调用两次。在主机用户的计算机上,创建主机玩家后,将为此玩家(玩家A)触发此块。稍后,当访客用户加入游戏时,将在主机用户的计算机上创建玩家B的克隆,并且再次触发此块。
触发此块时,我们将执行以下操作:
- 创建一个3D化身来表示此玩家。当前主机是超人,访客是蝙蝠侠。化身将被移动到我们之前指定的初始位置:x为0,y为800或-800。
- 尽管此块在每台计算机上被触发两次,但我们只会添加一次“跟随摄像机”,仅针对代表本地玩家的化身。例如,对于主机用户,他的玩家ID为“A”,因此只有当克隆ID也为“A”时,我们才会添加跟随摄像机。请注意,跟随摄像机的方向锁定为“自由”,这意味着用户可以使用鼠标将摄像机转向任何方向。如果您正在调试游戏,则可以跳过添加跟随摄像机,这样您可以使用默认摄像机轻松查看整个游戏世界。
- 最后,我们将向3D化身添加“奔跑”动画,以便它知道以后如何播放该动画。
13 - “Player”角色:处理游戏开始
如上所述,每台计算机上的“原始”玩家角色将收到“开始游戏”消息。以下是我们收到该消息时执行的操作:
- 删除“开始游戏”按钮
- 如果这是主机玩家(玩家“A”),那么我们还需要触发2个事件:添加墙壁和添加道具。墙壁和道具对象将在访客计算机上复制,因此我们不需要在访客计算机上单独创建它们。此外,“添加道具”消息由一个永远循环处理,该循环定期添加一个新道具,因此我们没有对该消息使用“广播并等待”。
- 我们将化身的当前动画设置为“空闲”,因此当它稍后更改时,我们需要通知另一台计算机。
- 最后,我们启动“处理按键”块,这是一个处理按键输入的永远循环。请注意,只有在此步骤,用户才能开始使用键盘玩游戏。
14 - “Player”角色:处理按键
这是游戏逻辑的主循环,我们不断检查用户按下的按键,并相应地更新玩家化身。具体来说,我们在一个永远循环中执行以下操作:
- 检查我们是否已与游戏服务器断开连接,如果是,则显示错误消息。如果在过去5分钟内未收到任何玩家的更新,则玩家将自动与服务器断开连接。这将帮助游戏服务器回收分配给游戏的资源,以防玩家离开游戏。
- 如果我们仍在游戏中,我们检查空格键并在经过足够的时间后开火。
- 我们还检查移动键以确定移动速度、方向和动画。
- 最后,我们在进入循环之前等待很短的时间。这有助于减少我们在网络上发送的消息数量,并避免过多的“网络流量”减慢游戏服务器的速度。
15 - “Player”角色:处理开火
当我们检测到空格键被按下时,我们检查当前时间是否大于我们上次开火的时间加上等待时间。此等待时间计算为(2 / 火力)。例如,如果火力为2,则最小等待时间为2/2 = 1秒。
如果我们被允许开火,我们将发送“开火”消息,该消息将由“Bullet”角色处理(稍后讨论)。在此消息中,我们需要指定此角色的克隆ID(“A”或“B”)、x/y位置和此玩家的朝向,以便Bullet角色可以在相同的位置和方向创建子弹。
16 - “Player”角色:获取预期速度和动画
为了创造一个有趣的体验,让用户完全控制化身的移动,我们将允许用户同时使用鼠标和键盘。鼠标将用于控制摄像机,所有移动都将相对于摄像机的方向。例如,如果我们将摄像机拖动到右侧,化身将立即转向相同的方向。因此,当我们按下“W”向前移动时,化身将沿着与摄像机相同的方向移动:
为了实现此效果并保持我们的代码简短而整洁,我们将把它分为3种情况:
- 当按下“a”键时,表示用户想要向左移动。
- 当按下“d”键时,表示用户想要向右移动
- 当既没有按下“a”键也没有按下“d”键时,用户想要向前/向后移动或保持静止。
默认假设是预期速度为300,预期动画为“奔跑”,我们可以根据按键情况更改它们。
17 - “Player”角色:处理向左或向右移动
当仅按下“a”键时,用户想要水平向左移动。如果同时按下“w”或“s”键,则用户打算向左前方或左后方对角移动。请注意,我们现在只是设置“预期方向”和“预期速度”,然后我们将使用它们稍后更新化身。
此外,所有方向都相对于摄像机的“水平角度”,即跟随摄像机朝向的方向。此外,当用户同时按下“a”和“s”时,我们将方向设置为向右前方,并将速度设置为负数。
对于“d”键,逻辑完全相同,只是角度相反:
18 - “Player”角色:处理向前或向后移动
如果既没有按下“a”键也没有按下“d”键,化身将在“w”键下向前奔跑,在“s”键下向后奔跑,并且在两个键都没有按下时保持静止。
19 - “Player”角色:更新玩家速度/动画/方向
至此,我们已经计算了预期的移动速度、移动方向和动画,我们需要为3个实体更新它:他/她自己计算机上玩家的化身、游戏服务器上的它的2D表示以及另一台用户计算机上的它的副本。
这分3个步骤完成:
-
我们首先比较本地摄像机的朝向和化身的朝向。如果它们不够(至少相差0.1度),那么我们需要更新化身的朝向。例如,当用户将摄像机旋转到不同的方向时,可能会发生这种情况。我们正在使用“同步设置方向”块,它不仅更新他/她自己计算机上此玩家化身的方向,还更新游戏服务器和另一台用户计算机上的方向。
-
如果预期的移动速度或方向已更改,我们将使用“同步设置速度和方向”块来更新所有3个表示的这些值。请注意,“预期方向”是化身移动的位置,它可能与摄像机的方向不同。例如,当用户按下“a”时,摄像机可能仍然朝前,但预期的移动方向是向左。
-
最后,如果预期的动画已更改,我们需要更新此玩家化身在此计算机和另一台用户计算机上的动画。这可以通过向所有角色广播“更新动画”消息,并将克隆ID和预期动画附加到该消息来完成。我们将接下来讨论如何处理该消息。
20 - “Player”角色:处理“更新动画”消息
当任何角色收到此消息时,我们将拆分附加的信息并提取克隆ID。如果该ID与此克隆的ID匹配,那么我们将更新此角色的动画。回想一下第19步,附加到消息的“animation_info”有两个部分,由“_”连接:“克隆ID”和“预期动画”,例如“A_Run”。
21 - “Wall”角色:添加4个克隆
“Wall”角色相当简单。您可以修改它以设计边界内的任何地图。例如,我们可以在世界的四个边上有四堵墙,如下所示:
为了保持代码简单,所有墙壁对象都是相同的形状,只是其中两个旋转了90度。它们都是“Wall”角色的克隆,克隆ID分别为1、2、3和4:
创建每个克隆时,我们需要根据其克隆ID将其放置在所需的位置和方向。然后,我们需要将其添加到游戏中,以便游戏服务器可以创建一个400 x 50的矩形来表示服务器上模拟的2D世界中的它。相同的克隆也将在访客用户的计算机上创建。
22 - “Wall”角色:创建3D墙壁对象
当我们将Wall角色添加到游戏时,它尚未添加到3D场景中。如前所述,添加角色后,游戏服务器将触发一个新事件“添加到游戏时”,这是我们应该添加表示3D场景中墙壁的3D盒子的位置。这样做的原因是此事件在主机计算机和访客计算机上都会触发,这确保两个玩家都可以在其3D场景中看到墙壁。
3D盒子的x和y大小应与我们之前指定的矩形形状相匹配:400 x 50。墙壁的高度无关紧要,因为游戏服务器只将墙壁视为2D矩形。但是,为了确保玩家看不到墙壁上方,我们应该使墙壁高于玩家100的高度。因此,我们可以将z大小设置为300,因此上半部分为150。根据克隆ID,我们将每个盒子放置在所需的位置和方向。
这就是我们需要对墙壁做的所有事情。我们已经指定,当玩家触摸任何墙壁角色时,它将被停止。您还可以添加3D圆柱体作为墙壁,您只需要确保它们像这样添加为圆形形状:
23 - “Bullet”角色:处理“开火”消息
接下来,让我们看看Bullet角色。它比Wall角色稍微复杂一些。当收到“开火”消息时,会创建一颗子弹。请注意,墙壁仅在主机计算机上添加,但子弹可以在两台计算机上发射。
收到“开火”消息时,我们首先需要确保只有原始的Bullet角色才能处理它。我们检查克隆ID以确保它是“originalsprite”。否则,Bullet角色的克隆也可能会收到“开火”消息,这可能会生成一个新的重复克隆。
附加到“开火”消息的“射击信息”包含有关已开火的玩家的四条信息:玩家ID(“A”或“B”)、x位置、y位置和方向。我们将此信息存储在四个变量中,然后将角色移动到给定的位置/方向。然后,我们制作此角色的克隆。每个克隆都被赋予一个唯一的ID,该ID由两部分组成:玩家ID(“A”或“B”)和一个不断增加1的子弹ID。
24 - “Bullet”角色:将克隆添加到游戏
创建Bullet角色的克隆时,我们首先需要将其添加到游戏中。它将是动态的,因为它将沿直线向前移动。它将被添加为直径为40的圆形,因此游戏服务器将使用2D圆形在模拟的游戏世界中表示它。
之后,我们需要使子弹只击中对手玩家。例如,如果克隆ID以“A”开头,那么我们将子弹设置为仅与克隆ID为“B”的玩家角色碰撞。当发生这种情况时,子弹将摧毁自身,并发送一条新消息“子弹击中玩家”。此消息将由玩家角色处理以减少其生命值(将在下面讨论)。
最后,当子弹击中墙壁或世界边缘时,它将简单地摧毁自身。
25 - “Bullet”角色:添加到游戏时
当我们从游戏服务器收到已将新的Bullet克隆添加到游戏的通知时,我们添加表示3D场景中子弹的3D球体。我们需要采取一些步骤:
- 我们将播放爆炸声。
- 根据克隆ID以“A”还是“B”开头,我们将红色或黑色的球体添加到场景中。它的直径应为40,这与我们在游戏服务器上用来表示它的大小相匹配。同样,您可以这样想:如果我们从顶部俯视,球体看起来像地面上直径为40的圆形。
- 我们将球体移动到起始位置,这是开火的玩家的位置。
- 我们为此子弹设置600的速度以沿起始方向移动。
26 - “Player”角色:处理“子弹击中玩家”
当对手的子弹击中玩家时,该玩家将收到“子弹击中玩家”消息。只有用户自己计算机上的主Player角色会收到此消息,而不是另一台计算机上的它的副本。例如,当玩家A被击中时,只有主机计算机上的Player会收到此消息。这避免了处理两次消息。
如果玩家的生命值仍然大于0,我们将该玩家的生命值减少1。然后我们广播“更新生命值”消息,并附加该玩家的克隆ID和生命值。
27 - “Player”角色:处理“更新生命值”
当Player收到“更新生命值”消息时,我们将确保只有原始角色会处理它,而不是克隆。我们执行以下步骤:
- 提取玩家ID和更新后的生命值
- 使用重复循环遍历表示该玩家生命值的3个矩形标签,并根据生命值将它们设置为绿色或黑色
- 如果生命值已经为0,那么我们发送“游戏结束”消息,参数为对手玩家的ID。请注意,这是结束游戏的唯一方式。
28 - “Winner”角色:处理“游戏结束”
收到“游戏结束”消息时,我们在“Winner”角色中执行以下操作:
- 隐藏3D场景,因为我们将使用2D服装来显示结束画面;
- 播放“Success 7”的声音
- 切换到显示获胜者姓名的服装:A或B
- 3秒后,我们停止整个程序。
29 - “Powerup”角色:处理“添加道具”消息
当Powerup角色收到“添加道具”消息时,它将首先确保只有克隆ID为“originalsprite”的原始角色才会处理此消息。请注意,这仅在主机计算机上完成,并且每当添加新的道具角色时,它都将在访客计算机上复制。
道具可以是获得一个生命值或将火力提高1。您可以根据自己的喜好微调控制新道具类型和频率的参数。显然,如果有太多的“生命值”道具,那么游戏可能永远不会结束,因为两个玩家都可以从命中中快速恢复。
以下是Powerup当前的工作方式:
- 在添加每个新道具之前,我们等待30到60秒之间的随机时间段。您可以延长此时间以减少可用道具的数量。
- 我们在世界范围内选择一个随机位置
- 我们在“生命值”或“火力”之间随机选择一个类型,每个类型的概率为50%。您可以更改概率以生成更多“生命值”或“火力”奖励。
- 我们将角色移动到给定位置,然后创建一个克隆。
- 每个克隆都有一个唯一的ID,由两部分组成:道具类型和序列号。
30 - “Powerup”角色:在主机上创建克隆时
创建新克隆时,我们将其作为静态圆圈(直径为40)添加到游戏服务器上的游戏中。在10到20秒之间的随机超时时间段后,我们从游戏中删除此项目。这样,如果两个玩家不尝试快速收集道具,它将很快消失,使游戏更加精彩。当然,如果您将此超时时间段更改得更长,则两个玩家都将更容易获得能量。
31 - “Powerup”角色:添加到游戏时
与其他角色类似,我们在“添加到游戏时”块下添加表示道具的3D对象。当主机计算机将新道具添加到游戏时,此块在两台计算机上都会触发。
当道具添加到游戏时,我们执行以下操作来添加道具:
- 我们播放声音以通知用户已添加新项目;
- 我们将项目的位置存储在2个变量“我的x”和“我的y”中。我们需要这样做,因为当我们运行“添加模型”块时,它会将角色的x和y位置重置为0。
- 我们根据道具类型添加医疗箱或雷电图标的模型。请注意,它被添加为隐藏的,因为否则模型将在我们移动它之前显示在原点;
- 我们将设置z旋转以使其永远连续旋转。
- 我们将模型移动到保存的位置;
- 最后,我们显示对象。
32 - “Player”角色:处理“收集道具”
当Player角色触摸Powerup对象时,它将触发“收集道具”消息。只有由用户控制的Player克隆才会收到此消息。为了处理它,我们首先播放声音以确认收集了道具。如果是“生命值”类型,并且此玩家的生命值仍然小于3,我们将生命值增加1,并广播“更新生命值”消息,该消息更新顶部的生命值显示。类似地,如果此玩家的火力小于5,我们将其增加1,并发出“更新火力”消息。
33 - “Player”角色:处理“更新火力”
我们处理“更新火力”的方式与处理“更新生命值”的方式非常相似。我们从消息的参数中提取更新后的火力值,然后遍历该玩家的所有5个标签,并根据火力值将每个标签设置为红色或黑色。
总结
我们已经解释了此项目中的所有块。随时尝试重新混合和修改游戏。以下是一些想法:
-
调整游戏参数:您可以对游戏进行许多简单的更改,例如玩家化身、使用的3D模型/纹理、最大生命值/火力值、生成每个新道具之前的时间间隔及其持续时间、玩家和子弹的移动速度、玩家移动的键盘控制、墙壁的大小/数量/位置、世界的大小等。请根据您的喜好随意更改它们。
-
新的道具类型:您可以通过添加新的道具类型来扩展游戏,例如玩家或子弹加速、新型子弹(双发或三发子弹)、允许玩家穿过墙壁或透视墙壁的道具等。
-
2对2游戏:您可以尝试允许四个用户一起玩。您需要在创建游戏时增加游戏容量,并添加新的玩家ID,如“C”和“D”等。
-
AI玩家:您可以创建一个AI机器人来控制一个玩家,以便一个用户可以与AI对战,而不是寻找另一个玩家,或者您可以让2个人类玩家组队与2个AI玩家对战。
-
云计算/AI - 带1对1聊天室(配有内容审核) (难度:5)
简介
在本教程中,你将学习如何在用户各自的计算机上构建一个简单的 1:1 聊天,即两个用户之间的聊天。所有聊天消息都将受到审核(审查),任何不当消息都将被拒绝。所有实现聊天室的 CreatiCode 项目都必须使用与本项目相同的审核机制。
关于云数据
MIT Scratch 提供了“云变量”,允许所有在自己计算机上运行相同项目的用户读取或写入相同的变量。但是,这些变量仅限于数字(不能在其中存储文本),并且最多只能存储 256 位数字。
CreatiCode 游乐场提供了一种更强大的方式来在计算机之间存储和共享数据。它被称为“云数据变量”。您可以存储在这些云数据变量中的内容没有限制,并且可以动态定义新的云数据变量。
演示项目
已完成的项目共享在此链接:
play.creaticode.com/projects/66ef784557566f00396e83ae
请对此进行改编。本教程将帮助您快速了解其工作原理,然后您可以基于此构建新的聊天项目。
如何使用云数据建立新的聊天
在深入细节之前,解释一下我们如何使用云数据变量在两台用户计算机之间进行通信的基本思路会很有帮助。
首先,当主机用户开始新的聊天时,我们会生成一个随机数用作“房间 ID”。当访客用户加入聊天时,他们必须指定完全相同的 ID。这样,每个新的聊天都会有不同的 ID,并且此聊天会话的所有消息都将使用此 ID。
假设房间 ID 为 123。然后主计算机将创建一个新的云数据变量“host-123”,其值将是主机用户的名称。它还将创建另一个云数据变量“guest-123”,该变量将为“pending”。然后,当访客用户加入房间时,他们将“guest-123”变量设置为访客用户的全名。
如何使用云数据建立新的聊天
为了在两台计算机之间传递消息,使用了另外两个云数据变量:“host-msg-123”和“guest-msg-123”。
对于主机用户,每次他们输入新消息时,它将追加到“host-msg-123”云数据变量中,并带有一个递增的 ID 和分隔符“&&”。
例如,如果主机用户说“hi”,则该变量变为“&&1–hi”。如果主机说“good”,则该变量变为“&&1–hi&&2–good”。当访客计算机看到该变量的更新值时,该消息将添加到聊天中。
请注意,云数据变量每 0.5 秒更新一次,因此在其他计算机获取更新值之前会有很小的延迟。
现在,让我们看看程序。
第 1 部分 - 启动屏幕
当点击绿旗时,我们将显示一个带有 2 个按钮和一个文本框的启动屏幕。
顶部按钮供主机用户使用随机 ID 开始新的聊天。对于访客用户,他们需要输入相同的随机 ID,然后单击底部按钮加入该聊天。以下是添加这 3 个小部件的代码:
第 2 部分 - 初始化变量
主机和访客计算机都将使用一些变量。在开始时初始化它们是一个好习惯:
- other msg ID: 来自另一台计算机的最后一条已处理消息的 ID。任何带有新 ID 的消息都需要添加到聊天中。
- my msg ID: 将从此计算机存储的下一条消息的 ID。
- my message: 消息云数据变量的内容,随着此用户输入更多聊天内容,该变量将不断变长。
- messages: 消息列表
第 3 部分 - 处理聊天创建
当单击顶部按钮时,主机会执行以下操作:
主机现在将看到此屏幕:
显示此屏幕后,主计算机继续等待访客加入。
第 4 部分 - 等待访客加入
为了等待访客用户加入,主计算机将其主机名变量的值设置为他们的全名,并将访客名变量设置为“pending”。然后它将进入一个永久循环,直到访客名不再是“pending”。之后,主机将运行“检查消息”块以重复检查来自访客的新消息。
第 5 部分 - 访客用户加入
在访客用户的计算机上,我们读取用户输入的房间 ID,然后检查云变量“guest-房间 ID”是否为“pending”。如果它为空,则该房间不存在;或者如果是另一个人的名字,则表示另一个访客已经加入。因此,只有当访客名变量仍然是“pending”时,我们才能继续。
加入聊天后,我们显示聊天窗口,然后使用此用户的全名更新访客名变量,以便主计算机将检测到有新用户加入。
最后,我们还启动“检查消息”块以重复检查来自主机的新消息。
第 6 部分 - 检查和发送新消息
当主机或访客输入新的聊天消息时,我们使用“获取审核结果”块来检查该消息是否合适。如果结果为“Pass”(而不是“Fail”),我们将使用它;否则,我们将告诉用户该消息已被拒绝。请注意,所有聊天项目都需要执行此步骤。
对于批准的消息,我们使用每次递增的 ID(“my msg ID”)将其追加到“my message”中。然后我们将此消息作为主机或访客添加到本地聊天窗口,并将其存储在云数据变量“host-msg-房间 ID”或“guest-msg-房间 ID”中。
第 7 部分 - 检查来自另一台计算机的消息
当聊天运行时,主机和访客计算机都将持续检查包含来自对方的消息列表的云数据变量。
例如,对于主计算机,如果房间 ID 为 123,则它将每 0.5 秒检查一次“guest-msg-123”的内容。
第 8 部分 - 解析其他用户的消息
由于云数据变量包含来自另一个用户的所有消息的列表,我们需要对其进行解析。我们首先用“&&”分割它,并将各部分存储在“messages”列表中。这样,我们可以逐个查看每条消息。请注意,由于变量以“&&”开头,因此实际消息仅从“messages”列表的索引 2 开始。
对于每条消息,我们可以用“–”分割它,然后第一部分是该消息的 ID。
第 9 部分 - 显示新消息
现在,我们只需要检查每条消息的 ID 是否不小于我们已经处理过的最大 ID(存储在“other msg ID”中)。如果是,我们将此新消息添加到聊天中,并将“other msg ID”加 1。
增强功能
本项目仅显示在线聊天的基本构建块。您可以通过多种方式尝试改进它。以下是一些有趣的想法:
-
支持 2 个以上的用户:您可以尝试将其扩展为允许任意数量的用户加入聊天。
-
AI 参与者:您可以向聊天中添加 ChatGPT AI 助手,该助手将读取所有聊天消息并在被要求执行某些任务时做出响应。
-
在线游戏:您可以使用类似的方式使用云数据变量来创建在线游戏,其中 2 个或更多用户可以一起探索虚拟世界。
-
使用AI搜索或者生成角色造型
在之前的教程中,你学习了如何搜索人工智能生成的背景或生成你自己的背景。在本教程中,你可以遵循一些简单的步骤来学习一个类似但更强大的工具来生成角色造型。
请注意,系统会进行强有力的审核,以确保所有图片都适合 K-12 学生。如果任何用户试图生成不适当的图片,该请求将被拒绝。请负责任地使用这个强大的工具。此外,CreatiCode 有权在未经创作者批准的情况下从库中删除任何不适当的图片。
请注意,你可以使用人工智能生成背景或角色。**主要区别在于背景始终是与整个舞台大小相同的矩形图片,而角色是具有透明背景的单个角色或对象。**在本教程中,我们将重点介绍角色。要生成背景,请阅读这篇文章。
步骤 1 - 打开 AI 图片库窗口
首先,将鼠标指针悬停在游乐场右下角用于添加角色的圆形按钮上,然后选择“AI”选项:
步骤 2 - 从社区搜索角色图片
在生成新的角色造型之前,你应该首先在社区生成的现有角色图片中进行搜索。这比你自己生成新图片要快得多。
请注意,有 2 种不同的模型用于生成角色:
- 人物:在搜索或生成类似人物的角色或任何带有手/腿/眼睛/嘴巴等的角色时,应选择此选项。
- 非人物:对于所有其他类型的对象,例如椅子、汽车、动物等,应选择此选项。
例如,你可以在文本框中输入“穿蓝色衬衫的男孩”,选择“人物”选项,然后单击“搜索”按钮。系统将显示一些与“穿蓝色衬衫的男孩”最相关的现有角色图片。然后,你可以单击其中任何一个将其添加到你的项目中:
再举一个例子,你可以搜索“一辆红色汽车”,并确保选择“非人物”:
你可能会注意到,有些图片不是汽车,例如“红狐狸”。这是因为“搜索”按钮会按图片描述进行搜索,因此红狐狸被视为与红色汽车有些相关,因为它们都是红色的。当然,真正的红色汽车在结果列表中排名更高。
步骤 3 - 优化你的查询
当有许多相关图片时,你可以优化查询以缩小列表范围。例如,当我们搜索“穿蓝色衬衫的男孩”时,有几张图片是金发男孩。如果我们在查询中添加“黑发”,那么排名靠前的结果都是穿蓝色衬衫、黑头发的男孩:
步骤 4 - 按名称搜索
如上所述,“搜索”按钮按图片描述进行搜索。例如,当我们之前搜索“穿蓝色衬衫的男孩”时,结果图片可能有不同的名称。
另一种搜索方式是尝试将图片名称与关键字直接匹配。如果你已经知道你要查找的图片的名称,这尤其有用。例如,如果你只想查找名称中包含“虎克船长”的图片,则可以使用“按名称搜索”按钮:
步骤 5 - 生成你自己的角色
如果你找不到需要的角色,可以使用“生成”按钮创建一个新的角色。有 2 个模型可供选择:
- 模型 1 速度更快,并且可以更好地理解你的描述。但是,你无法从模型 1 生成图片的变体(请参阅下面的“高级主题 2”)。
- 模型 2 速度较慢,有时可能会误解你的描述。此外,你可以使用模型 2 中的图片作为参考来生成其变体。
请注意,为角色提供详细描述至关重要,而不要只使用一两个词。例如,假设你需要一个挥手的穿蓝色衬衫的男孩,你可能在现有库中找不到它。你可以将描述设置为“一个男孩,蓝色衬衫,向观众挥手”,然后单击“生成”按钮。你不需要指定“人物”或“非人物”,因为我们的模型将根据你的描述确定其类型。稍等片刻,将显示新角色:
再举一个例子,假设我们需要一辆红色汽车用于一个新的游戏项目,但现有的红色汽车都不是水平的,那么我们可以使用以下描述生成一个新的:“一辆红色汽车,面向右侧,游戏图标”:
请注意,你可以在描述中提供更多详细信息,我们的人工智能模型将尝试将所有这些信息都纳入图片中。例如,这里有一个更详细的男孩描述:一个穿蓝色衬衫、黄色牛仔裤、黑色鞋子、短发、南亚人、深色皮肤的男孩。结果如下:
一般来说,**强烈建议在描述中使用至少 10 个单词。**这将迫使你提供有关你要查找的角色类型的信息。
步骤 6 - 搜索你生成的图片
由于你生成的所有内容都与社区共享,因此你可以以相同的方式搜索你生成的图片:
但是,如果你只想查找你生成的图片,则可以选择“由我创建”选项,并且只会搜索你的图片:
步骤 7 - 重新生成你的图片
如果你对已生成的图片不满意,可以使用不同的描述生成另一个图片,或者你可以简单地“重新生成”此图片:将使用相同的描述,但将使用不同的随机“种子”,因此新图片将有所不同。当你认为你的描述没问题但人工智能模型运行不佳时,此功能最有用。
例如,为“一辆小型校车”生成了一张图片,但结果并不理想。如下所示,当你单击“重新生成”并确认后,现有图片将被删除。一段时间后,你可以再次搜索你的图片,你将找到新生成的图片:
步骤 8 - 优化你的图片描述
尽管当前的角色生成模型已经可以生成漂亮而有趣的图片,但它们仍然远非完美。它们有时无法理解请求或遗漏关键细节。因此,我们经常不得不优化我们的描述并多次重新生成图片。
以下是一些有关如何使角色 AI 模型更好地理解我们的描述的有用提示:
-
使用几个简短的短语:我们当前的图片生成模型无法很好地理解复杂的句子,并且它们主要是使用由简短关键字组成的请求进行训练的。例如,与其说“画一个穿蓝色衬衫的男孩,他正在向我们挥手”,不如使用“一个男孩,蓝色衬衫,向观众挥手”这种更好的格式。
-
从示例中学习:当你在社区库中找到你喜欢的任何图片时,你可以通过将鼠标指针悬停在该图片的名称上来了解用于生成该图片的描述。随着时间的推移,你将发现哪些关键字可以用来实现特定的结果:
步骤 9 - 删除你的图片
如果你对已生成的图片不满意,还可以将其从库中删除:
步骤 10 - 检查图片生成请求状态
与生成背景图片不同,生成角色图片的过程要慢得多,并且请求也多得多。因此,你的请求可能排在其他用户的请求之后。此外,有时,生成的图片可能存在问题并被删除。例如,它可能不合适,或者它可能模糊或畸形。
因此,要了解你的请求的进度,你可以单击“请求状态”按钮,该按钮将显示你最近的请求列表。你可以查看它们的描述、图片名称、创建时间和当前状态。此外,如果你想取消排队的请求,可以单击“取消”按钮:
订阅与免费帐户
基于 AI 的角色生成工具对所有用户免费提供。但是,对于订阅用户,有一些优势:
- 当队列中有许多请求时,高级用户的等待时间要短得多。
- 在需求高峰期,免费用户可能会受到每小时可以生成多少图片的速率限制。
高级主题 1 - 不同的生成样式
到目前为止,你已经学习了使用 AI 生成角色的基本操作。你可能想要探索的一项附加技术是在生成图片时指定不同的样式。
默认情况下,将使用 2D 卡通风格来生成背景。但是,你可以在描述中指定任何其他样式。有很多有趣的风格,以下是一些你可以尝试的有趣示例:
- 2D 平面绘图
描述:一架蓝色飞机,2D 平面绘图
描述:一位穿着粉色连衣裙的公主,看着观众,2D 平面绘图
- 动漫风格
描述:一架蓝色飞机,动漫风格
描述:一位穿着粉色连衣裙的公主,看着观众,动漫风格
- 风格化卡通绘图
描述:一架蓝色飞机,风格化卡通绘图
描述:一位穿着粉色连衣裙的公主,看着观众,风格化卡通绘图
- 3D 卡通风格
描述:一架蓝色飞机,3D 卡通风格
描述:一位穿着粉色连衣裙的公主,看着观众,3D 卡通风格
- 我的世界风格
描述:一架蓝色飞机,我的世界风格
描述:一位穿着粉色连衣裙的公主,看着观众,方头,我的世界游戏角色
- 低多边形风格
描述:一架蓝色飞机,低多边形风格
描述:一位穿着粉色连衣裙的公主,看着观众,低多边形风格
- 橡皮泥风格
描述:一架蓝色飞机,橡皮泥风格
描述:一位穿着粉色连衣裙的公主,看着观众,橡皮泥风格
- 胶片摄影
描述:一架蓝色飞机,柯达 Portra 400,胶片摄影
描述:一位穿着粉色连衣裙的公主,看着观众,柯达 Portra 400,胶片摄影
- 漫画书风格
描述:一架蓝色飞机,漫画书风格
描述:一位穿着粉色连衣裙的公主,看着观众,漫画书风格
- 像素艺术风格
描述:一架蓝色飞机,像素艺术风格
描述:一位穿着粉色连衣裙的公主,看着观众,像素艺术风格
- 复古游戏风格
描述:一架蓝色飞机,复古游戏风格
描述:一位穿着粉色连衣裙的公主,看着观众,复古游戏风格
- 蒸汽朋克风格
描述:一架蓝色飞机,蒸汽朋克风格
描述:一位穿着粉色连衣裙的公主,看着观众,蒸汽朋克风格
高级主题 2 - 武器作为游戏资产
默认情况下,你不能创建任何与暴力相关的图片。例如,如果你尝试生成坦克的图片,你将收到如下错误消息:
但是,我们经常在游戏中需要武器角色,例如坦克或剑。因此,如果你在请求中包含关键字游戏资产,则会有一个例外。例如,如果你的请求是“一辆坦克,游戏资产”,那么它将不会被审核过程拒绝:
请注意,你只能在游戏项目中使用此类图片。如果它们被用于任何其他与暴力相关的项目,该项目将被删除,你的帐户可能会被封禁。 -
使用AI搜索或者生成背景图片
介绍
标准的 MIT Scratch 游乐场只有大约 85 个背景,这使得创建不同类型的项目变得困难,尤其是游戏和故事。选择一个看起来不错并且与你的故事或游戏的主题或想法相匹配的图片,可以让其他人享受你的项目时更有趣和引人入胜。
为了充分释放你的创造力,CreatiCode 游乐场提供了一个基于 AI 的图片生成器。你可以描述你需要的背景,然后使用 AI 来生成它。你还可以搜索社区中其他用户生成的大量背景。
请注意,我们采取了强有力的审核措施,以确保所有图片都适合 K-12 学生。如果任何用户试图生成不适当的图片,请求将被拒绝。请负责任地使用这个强大的工具。此外,CreatiCode 有权在未经创建者批准的情况下从库中删除任何不适当的图片。
在本教程中,请按照几个简单的步骤学习如何使用 AI 生成背景图片。
步骤 1 - 打开 AI 图片库窗口
首先,将鼠标指针悬停在游乐场右下角的圆形按钮上,然后选择“AI”选项:请注意,你可以使用 AI 生成背景或精灵。**关键区别在于背景始终是与整个舞台大小相同的矩形图片,而精灵是在透明背景上的单个角色或对象。**在本教程中,我们将重点介绍背景。有关生成精灵的信息,请参阅这篇文章。
步骤 2 - 从社区中搜索背景图片
在生成新背景之前,你应该首先搜索社区生成的现有背景。这比自己生成新图片要快得多。
例如,你可以在文本框中输入“parking lot”,然后单击“搜索”按钮,系统将根据描述显示一些与“parking lot”最相关的现有背景。然后,你可以单击其中任何一个将其添加到你的项目中:
步骤 3 - 优化你的查询
当有许多相关图片时,你可以优化你的查询以缩小列表范围。例如,假设我们需要一个深色背景的停车场背景,我们可以将查询更改为“parking lot dark”,我们将获得主要显示深色停车场的图片:
步骤 4 - 按名称搜索
如上所述,“搜索”按钮按图片的描述进行搜索。例如,当我们之前搜索“parking lot”时,其中一个结果图片名为“neon cinema street life”。尽管这个名称根本没有说“parking lot”,但它包含一个停车场。
有时,如果你已经知道你要查找的背景的确切名称,你可以使用“按名称搜索”按钮。例如,如果我们仍然搜索“parking lot”,但使用“按名称搜索”按钮,则所有结果图片的名称中都将包含“parking lot”:
步骤 5 - 生成你自己的背景
如果你找不到你需要的背景,你可以使用“生成”按钮创建一个新背景。请注意,至关重要的是,你要详细描述你需要的背景,而不仅仅是使用一两个单词。一般来说,**强烈建议在你的描述中使用至少10个单词。**这将迫使你提供有关你正在寻找的背景类型的信息。
例如,假设你需要一个大型且空的停车场,但社区中没有现有的背景符合此描述。你可以输入描述“a large and empty parking lot”,然后单击“生成”按钮。等待片刻后,将显示新背景:
请注意,你生成的所有背景图片都与社区共享。使用 CreatiCode 平台的任何人都可以使用它们。但是,它们不能在 CreatiCode 平台之外使用。
此外,你的描述应该针对背景图片。如果你尝试生成对象或人物的图片,效果会不佳。你可以使用精灵 AI 生成器代替。
步骤 6 - 搜索你生成的背景
由于你生成的所有内容都与社区共享,你可以以相同的方式搜索你生成的图片:
但是,如果你只想查找你生成的图片,你可以选择“由我创建”选项,并且只会搜索你的图片:
步骤 7 - 重新生成你的图片
如果你对生成的图片不满意,你可以使用不同的描述生成新图片,或者你可以简单地“重新生成”此图片:将使用相同的描述,但将使用不同的随机“种子”,因此新图片将不同。
如下所示,当你单击“重新生成”时,现有图片将被删除。一段时间后,你可以再次搜索你的图片,你会发现新生成的图片:
步骤 8 - 优化你的描述
图片生成是一个随机过程,通常需要进行几次迭代才能优化你的描述。通常,图片生成模型可以“理解”你的需求,因此你应该在描述中包含重要细节。
例如,假设你需要在停车场中放置一辆冰淇淋车,你可以将描述修改为:“一个大型且空的停车场,中间有一辆冰淇淋车”。以下是你将获得的结果:
现在,假设我们想添加一些等待购买冰淇淋的孩子,我们将描述更改为:“一个大型且空的停车场,中间有一辆冰淇淋车,有几个孩子在等待”。更新后的图片将如下所示:
如你所见,当我们添加更多细节时,图片生成器将尝试将它们包含在图片中,但它可能会失败,因此我们需要反复重新生成图片或更改描述。尽管当前的背景生成模型已经可以生成漂亮而有趣的图片,但它仍然远非完美。它有时无法理解请求或遗漏关键细节。因此,我们必须耐心地优化我们的描述并多次重新生成图片。
步骤 9 - 删除你的图片
如果你对生成的图片不满意,你也可以从库中删除它:
订阅与免费帐户
基于 AI 的背景生成工具对所有用户免费提供。但是,对于订阅用户,有一些优势:
- 高级用户在生成每个背景时等待时间更短。
- 高级用户生成的图片具有更多细节,并且更准确地遵循描述。
- 在需求高峰时,免费用户可能会受到每小时可以生成的图片数量的限制。
高级主题 - 不同的生成风格
到目前为止,你已经学习了使用 AI 生成背景的基本操作。你可能想要探索的另一项技术是在生成图片时指定不同的风格。
默认情况下,将使用 2D 卡通风格生成背景。但是,你可以在描述中指定任何其他风格。有大量有趣的风格,以下是一些你可以尝试的有趣示例:
3D 卡通
描述:一个大型且空的停车场,3D 卡通风格
3D 等距
描述:一个大型且空的停车场,3D 等距
我的世界风格
描述:一个大型且空的停车场,我的世界风格
Supercell 游戏风格
描述:一个大型且空的停车场,Supercell 游戏的卡通风格
漫画书风格
描述:一个大型且空的停车场,漫画书风格
复古未来主义
描述:一个大型且空的停车场,复古未来主义
橡皮泥风格
描述:一个大型且空的停车场,橡皮泥风格
梵高风格(或你喜欢的任何其他艺术家)
描述:一个大型且空的停车场,梵高风格
线描,无颜色
描述:一个大型且空的停车场,线描,无颜色
幻想艺术
描述:一个大型且空的停车场,幻想艺术
照片写实
描述:一个大型且空的停车场,照片写实
广告海报风格
描述:一个大型且空的停车场,广告海报风格
水彩
描述:一个大型且空的停车场,水彩
-
AI编程学习路径
简介
CreatiCode Playground 提供了一整套用于创建基于 AI 的项目(包括游戏和应用程序)的工具。它提供了一个安全且引人入胜的环境,让 K-12 学生可以学习和试验先进的 AI 技术,例如 ChatGPT 和面部追踪。
对于初学者,这里有分步教程和项目,介绍 AI 编程的基础知识。这些资源旨在帮助学生打下坚实的基础,让他们更容易创建有趣且实用的 AI 项目。
教师还可以使用这些教程来设计入门课程,使学生能够获得 AI 编程的实践经验并建立技能信心。
教程的第一部分重点介绍 CreatiCode Playground 上可用于生成图像和编程助手的 AI 工具。第二部分将重点介绍生成式 AI 模块(例如 ChatGPT)。第三部分涵盖预测性 AI 模块(例如分类模型)。
第 1 部分 - CreatiCode Playground 中的 AI 工具
主题 1 - 使用 AI 搜索或生成背景图像
-
教程链接:使用 AI 搜索或生成背景图像
-
概述:与 MIT Scratch 非常有限的背景库不同,CreatiCode 提供了一个庞大的 AI 生成背景图像库,您可以浏览或搜索。它们都经过仔细检查,以确保它们适合 K-12 学校环境。如果您找不到任何喜欢的背景,您还可以要求 AI 使用详细描述为您生成新背景。
主题 2 - 使用 AI 搜索或生成角色图像
-
教程链接:使用 AI 搜索或生成角色图像
-
概述:您还可以从由 AI 生成且可在学校安全使用的丰富角色图像集合中进行选择。每个角色图像都在透明背景上呈现一个角色或对象。您还可以使用自己的描述生成新的角色图像。
项目创意 - 水滴之旅(难度:1)
- 教程链接:水滴之旅(难度:1)
- 概述:使用一些 AI 生成的图像创建水滴生命周期的简单插图。
主题 3 - 在 CreatiCode XO 的帮助下学习新事物
-
教程链接:CreatiCode XO - 向我解释
-
概述:CreatiCode XO 是一个 AI 助手,当您在 CreatiCode Playground 中时,您可以与之聊天。您可以使用 XO 通过“向我解释 xyz”或“如何做 xyz”等简单问题来帮助您学习新概念或模块。
主题 4 - 在 CreatiCode XO 的帮助下进行调试
-
教程链接:
-
概述:调试是大多数学生最具挑战性的任务之一,而且我们的老师通常没有时间或专业知识来帮助每个学生进行调试。每个学生都需要学习调试的基础知识。XO 并非旨在代表学生进行调试。相反,XO 可以协助学生进行调试过程,以诊断问题并集思广益解决方案。
主题 5 - 在 CreatiCode XO 的帮助下设计新项目
-
概述:XO 可以帮助我们开始新项目。当我们“大脑一片空白”并需要一些灵感时,它可以提出项目创意。如果您已经知道要构建的项目,XO 可以就如何执行此操作提出计划。
主题 6 - 使用 XO 生成测验
-
概述:XO 可用于生成多种格式的测验问题,例如简答题、选择题或代码补全题。学生可以使用它进行自我评估,教师也可以使用它来设计评估问题。
主题 7 - 使用 XO 生成反馈
-
教程链接:CreatiCode XO - 自动反馈
-
概述:XO 可用于自动生成有关我们项目的反馈。这使学生可以在处理项目时获得实时反馈,而无需等待老师。
第 2 部分 - 使用生成式 AI 编程
主题 8 - ChatGPT 模块简介
-
教程链接:
-
概述:了解使用 ChatGPT 的基础知识,以及如何使用聊天窗口小部件构建一个简单的聊天应用程序。所有 ChatGPT 请求都经过审核,以确保它们适合 K-12 学校。
项目创意 - 与爱因斯坦聊天(难度:3)
- 教程链接:与爱因斯坦聊天
- 概述:创建一个简单的聊天应用程序,用户可以与假装成爱因斯坦的 ChatGPT 聊天。
项目创意 - 改进的聊天应用程序(难度:3)
- 教程链接:改进的聊天应用程序
- 概述:改进之前的聊天应用程序,使其具有流式响应,并确保 ChatGPT 保持其分配的角色。
主题 8 - 基于聊天的应用程序
- 教程链接:遵命,大臣!
- 概述:上面改进的聊天可以修改成许多不同类型的基于聊天的应用程序,唯一需要更改的是 ChatGPT 的提示。这与传统的应用程序开发非常不同,传统的应用程序开发中每个新应用程序都需要新的逻辑和代码。在这个例子中,我们可以将其更改为一个游戏,其中玩家是英国首相,ChatGPT AI 将要求玩家做出一些重要决定并在最后对这些决定进行评分。
项目创意 - MBTI 人格测试(难度:3)
- 教程链接:MBTI 人格测试
- 概述:这是通过更改 ChatGPT 提示来构建新应用程序的另一个示例。在这个应用程序中,ChatGPT 将询问用户几个问题,然后确定用户的 MBTI 人格。
主题 9 - 简单小部件:标签、按钮、文本区域
项目创意 - 基于 AI 的故事作家(难度:3)
- 教程链接:基于 AI 的故事作家
- 概述:除了聊天之外,ChatGPT 还有许多其他用例。在本教程中,您将学习如何使用它根据用户输入编写故事。
项目创意 - 测验编写器(难度:3)
- 教程链接:测验编写器
- 概述:在这个项目中,我们要求 ChatGPT 根据用户请求生成一个多项选择测验问题,然后评估用户的答案。
项目创意 - 完形填空游戏(难度:4)
- 教程链接:完形填空游戏(难度:4)
- 概述:在这个项目中,我们要求 ChatGPT 创建一个完形填空游戏,这需要一些更高级的提示技巧。
主题 10 - 基于语音的应用程序
- 教程链接:
- 概述:对于许多用户来说,说话比在键盘上打字更容易,因此我们可以使用语音识别将用户所说的内容转换为文本并将其发送给 ChatGPT。当我们收到 ChatGPT 的响应时,我们可以使用文本转语音将其转换回音频。
主题 11 - 基于视觉的应用程序
- 教程链接:ChatGPT AI - 一个能看会说的助手(难度:2)
- 概述:像 ChatGPT 这样的大型语言模型通常是“多模态的”,这意味着它们不仅可以用文字与我们聊天,还可以理解图像。这非常有用,因为在许多情况下,用图片描述我们的需求比用文字更容易。在本教程中,您将构建一个能看会说的 AI 助手。要使用它,用户只需使用相机拍照,然后向 AI 助手询问有关该图片的任何问题。
主题 12 - AI 驱动的游戏
- 教程链接:谁是间谍?
- 概述:ChatGPT 还可以用作“推理引擎”来创建以前不可能实现的有趣游戏。在本教程中,您将构建一个游戏,玩家需要审问几个角色以找出谁是间谍,所有响应都使用 ChatGPT 生成。
主题 13 - 使用 ChatGPT 作为文本处理工具
- 教程链接:产品评论摘要
- 概述:ChatGPT 非常擅长处理大量文本。在本教程中,您将学习如何使用它来处理许多产品评论并对其进行总结。
主题 14 - 教 ChatGPT 使用工具
- 教程链接:增强 ChatGPT 以进行数学计算(难度:3)
- 概述:ChatGPT 在许多任务中都有局限性,例如数学计算。在本教程中,您将教 ChatGPT 进行“工具使用”:您将为 ChatGPT 提供一个计算器工具,并且您将指示 ChatGPT 在需要进行计算时使用此工具。
主题 15 - 使用语义搜索增强 ChatGPT
- 教程链接:
- 概述:ChatGPT 的知识有限,因此当我们创建问答聊天机器人时,我们需要根据用户的问题向其提供额外的知识。这可以使用“语义搜索”来实现,它允许我们根据含义而不是匹配单词来搜索文本。
主题 16 - 使用 ChatGPT 从网络创建知识库
- 教程链接:使用 Web 内容准备知识数据(难度:4)
- 概述:在本教程中,您将学习为新的聊天机器人准备知识数据,该聊天机器人将根据任何组织的网站回答有关该组织的问题。基本思路是从其网站下载数据,并使用 ChatGPT 根据该数据生成问题/答案。
第 3 部分 - 使用预测性 AI 编程
主题 17 - AI 运动传感器
-
教程链接:
-
概述:视频感应模块允许我们检测摄像机视频中物体运动的量。此信息可用于创建简单的游戏,其中玩家的身体控制游戏中的角色。
主题 18 - 手部追踪
-
教程链接:使用手部检测数手指(难度:3)
-
概述:AI 模型允许我们实时跟踪摄像机视频中的人手并检测手/手指的关键点。在本教程中,您将构建一个计算伸出多少根手指的小项目。
主题 19 - 身体姿势追踪
-
教程链接:
-
概述:运动感应仅向我们提供有关摄像机视频中运动量的非常有限的信息。为了实时跟踪玩家在摄像机视频中的确切姿势,我们可以使用身体姿势检测模块。这使我们能够构建游戏,其中玩家的身体姿势用于控制游戏中的角色。
主题 20 - 初级图像分析
-
教程链接:识别 0 和 1(难度:4)
-
概述:图像分析需要遍历图像中的所有像素(分量)并对其进行分析。在本教程中,您将构建一个智能程序,该程序可以识别手写数字是 0 还是 1,这显示了图像分析的基本方法。
主题 21 - 数据分类
-
教程链接:
-
概述:AI 分类器允许我们将数据分类到不同的类别中。我们需要首先使用训练数据训练这样的分类器模型,然后我们可以使用它来分类新数据。在本教程中,我们将构建一个使用 KNN 分类器模型预测一个人是否患有糖尿病的分类器。
主题 22 - 神经网络模型
-
概述:神经网络模型由许多“层”的“神经元”组成。每个神经元都是一个小计算器,它接受一些输入值并根据输入值计算输出值。我们可以根据一些训练数据训练这些神经元,然后使用该模型对新数据进行预测。在本教程中,我们将训练一个简单的神经网络模型来进行简单的计算,以说明基本工作流程。
-
-
3D编程学习路径
介绍
CreatiCode.com提供了一套专为 3D 项目设计的强大且直观的代码块。这些代码块基于 Babylon.js 构建,Babylon.js 是由微软开发的尖端 3D 引擎,使学生可以更轻松地创建和试验 3D 环境。
尽管 CreatiCode 简化了 3D 编程的过程,但由于以下几个因素,它仍然比 2D 编程复杂:- 广阔的场景: 与 2D 中物体被限制在平面上不同,3D 项目在广阔的三维空间中运行。这意味着需要管理更多元素,并且理解如何在这个空间中导航和定位物体至关重要。
- 高级渲染: CreatiCode 中使用的 3D 渲染引擎非常强大,但要掌握它需要更深入地了解光照、纹理和摄像机角度等概念。
- 复杂的碰撞处理: 在 3D 中管理物体之间的碰撞要复杂得多,因为它涉及考虑所有三个轴 (x, y, z) 并处理更复杂的形状和运动。
- 附加功能: 物理引擎和粒子发射器等工具可以通过逼真的运动和效果增强项目。但是,有效地使用它们需要额外的技能和学习。
对于 3D 编程新手,我们建议探索一系列旨在引导您了解基础知识的教程和项目。这些资源将帮助您逐步构建基础技能,从而更容易地应对 3D 环境的复杂性。教师还可以使用这些教程来开发入门课程,让学生获得 3D 编程的实践经验并建立他们对自身能力的信心。
主题 1 - 初始化 3D 场景
-
教程链接: 初始化 3D 场景
-
概述: 每个 3D 项目都从一个 3D 场景开始,这是一个所有物体所在的虚拟世界。有许多预制的 3D 场景可以使用,例如城市或草原。
主题 2 - 使用轨道摄像机查看场景
- 概述: 每个 3D 场景都是无限大的,因此我们只能使用摄像机查看其中的一部分,就像我们观看足球比赛的电视转播一样。您需要学习如何使用摄像机手动或通过代码查看场景的任何部分,以及如何配置摄像机的参数。“轨道摄像机”是一种非常简单的摄像机,就像一颗围绕物体运行的卫星。
项目创意 - 环游地球 (难度: 1)
- 教程链接: 环游地球 (难度: 1)
- 概述: 控制摄像机绕地球轨道运行
主题 3 - 创建您自己的 3D 虚拟形象
- 概述: 大多数 3D 游戏或故事都需要 3D 虚拟形象来代表 3D 世界中的玩家。您可以使用免费工具创建自己的虚拟形象并自定义其外观 (可选)。之后,您可以将自己的虚拟形象或 CreatiCode 库中的任何虚拟形象加载到 3D 场景中。
主题 4 - 让虚拟形象播放动画
-
教程链接: 虚拟形象动画
-
概述: 将虚拟形象添加到 3D 场景后,您可以“教”它新的动画,例如“奔跑”或“飞行”,然后它可以播放这些动画。
主题 5 - 3D 轴和 3D 盒子
- 概述: 除了虚拟形象之外,您还可以在 3D 场景中添加各种 3D 形状,最简单的形状是 3D 盒子。您还将学习使用 3D 轴来确定 X/Y/Z 维度。请注意,在 3D 场景中,Z 轴指向上方。
项目创意 - 创建金字塔 (难度: 2)
- 概述: 使用一个大的旗帜盒子作为沙地,然后在重复循环中添加 20 层盒子。盒子的下半部分将隐藏在沙地下方。
主题 6 - 3D 位置
- 教程链接: 3D 坐标和位置
- 概述: 要将 3D 物体放置在 3D 场景中的任何位置,您需要知道它的 3D 位置,该位置指定为其 (X, Y, Z) 坐标。
项目创意 - 魔方 (难度: 2)
- 教程链接: 魔方 (难度: 2)
- 概述: 使用盒子创建一个 5x5x5 的魔方
项目创意 - 随机盒子的 3D 艺术 (难度: 2)
- 教程链接: 随机盒子的 3D 艺术 (难度: 2)
- 概述: 创建一个由许多具有随机位置、大小和颜色的盒子组成的彩色场景。
项目创意 - 建造一张简单的桌子 (难度: 2)
- 教程链接: 建造一张简单的桌子 (难度: 2)
- 概述: 使用 5 个盒子组成一张简单的桌子,包括桌面和 4 条桌腿。我们需要准确地调整每个盒子的大小和位置。
主题 7 - 3D 旋转
-
教程链接: 3D 旋转
-
概述: 您可以通过绕 X/Y/Z 轴旋转 3D 物体,使其面向 3D 场景中的任何方向。
项目创意 - 建造一个小房子 (难度: 3)
- 概述: 用几个盒子组成一个简单的房子。屋顶由 2 个倾斜的盒子组成,为了填补屋顶下的空间,您还需要一个旋转的盒子。
主题 8 - 3D 球体
-
教程链接: 使用球体
-
概述: 与盒子类似,球体形状对于构建简单场景非常有用。此外,3D 球体不必是完整的,这允许您使用球体的一部分创建有趣的形状
项目创意 - 精灵球 (难度: 1)
- 教程链接: 精灵球 (难度:1)
- 概述: 使用几个球体组成一个精灵球。
项目创意 - 创建航天器 (难度: 3)
- 概述: 使用几个不同形状的球体组成一个航天器,并巧妙地使用“弧度”参数。
主题 9 - 3D 模型
-
教程链接: 添加模型
-
概述: 对于更复杂的物体,很难使用简单的形状来表示它们。相反,您可以使用看起来更逼真的 3D 模型。CreatiCode 库中有数千个模型供您选择,例如飞机、汽车、球等。
项目创意 - 用家具装饰简单的房子 (难度: 3)
- 概述: 将各种家具模型添加到简单的房子中,并移动/旋转它们以使其很好地融入房间。
项目创意 - 海底世界 (难度: 3)
- 概述: 将各种海洋动物模型添加到“水下”场景中。
主题 10 - 跟随摄像机
-
教程链接: 跟随摄像机
-
概述: 您之前使用的轨道摄像机非常适合查看静态物体/场景。但是,当我们有一个在 3D 场景中移动的虚拟形象或飞机时,我们需要使用“跟随摄像机”,它会跟随目标物体移动或转弯,以便我们获得场景的第一人称视角。
项目创意 - 飞行无人机 (难度: 1)
- 教程链接: 飞行无人机 (难度: 1)
- 概述: 控制无人机在城市场景中飞行,并使用跟随摄像机获得无人机的视角。
主题 11 - 移动或旋转物体
-
教程链接: 3D 物体的速度
-
概述: 要移动或旋转 3D 物体,一种简单且推荐的方法是设置其速度。有许多类型的速度,例如移动、旋转、加速度、重力等。正如后面所讨论的,当我们设置物体的速度而不是直接更改其位置时,物体会在遇到障碍物时自然停止。
项目创意 - 奔跑的虚拟形象 (难度: 3)
- 概述: 在场景中添加一个虚拟形象并控制它奔跑、转弯、飞行、滑翔等。
项目创意 - 飞行宇宙飞船 (难度: 3)
- 概述: 创建一个充满随机障碍物的宇宙,并控制一艘宇宙飞船在其中飞行。
主题 12 - 缩放物体
-
教程链接: 缩放物体
-
概述: 您可以在 X/Y/Z 维度上调整物体的大小。
项目创意 - 地毯 (难度: 2)
- 教程链接: 地毯 (难度: 2)
- 概述: 使用 3 个沿一个维度缩放的圆柱体组成一条地毯
主题 13 - 照亮场景
-
教程链接: 使用灯光
-
概述: 每个 3D 场景都必须有一个或多个光源,否则我们将无法通过摄像机看到任何东西。有 4 种类型的光源可供选择:环境光 (例如日光)、方向光 (例如阳光)、点光源 (例如灯泡) 和聚光灯 (例如汽车前灯)。
项目创意 - 警车的灯光 (难度: 2)
- 概述: 为警车模型添加地面、墙壁和一些光源。
主题 14 - 更新物体颜色
-
教程链接: 更新物体颜色
-
概述: 您可以使用不同的颜色设置使物体看起来像由不同类型的材料制成。此外,您可以更新形状或模型的颜色。
项目创意 - 不同粗糙度和亮度的球 (难度: 2)
- 概述: 使用 2 个重复循环添加球体并将它们设置为增加的粗糙度和亮度。
主题 15 - 更新物体纹理
-
教程链接: 更新物体纹理
-
概述: 要使一个简单的形状看起来像一个真实的物体,例如由盒子制成的墙壁,您需要设置物体的纹理。
项目创意 - 不明飞行物 (难度: 1)
- 教程链接: 不明飞行物 (难度: 1)
- 概述: 使用具有不同纹理的球体组成一个简单的不明飞行物
项目创意 - 创建一个 Minecraft 风格的岛屿 (难度: 2)
- 概述: 使用具有各种形状和纹理的盒子创建一个 Minecraft 风格的岛屿。
主题 16 - 物体名称和精灵对象
-
教程链接: 物体名称和精灵对象
-
概述: 很多时候,您需要从同一个精灵创建和管理多个 3D 物体,例如使用一个精灵的代码块创建多个虚拟形象。在这种情况下,如果您运行“移动”代码块,您需要一种方法来告诉系统您要移动哪个盒子。这是 2D 和 3D 编程之间的关键区别之一,因为在 2D Scratch 中,每个精灵对应于舞台上的一个单一对象。
为了解决这个问题,CreatiCode 发明了一个新的“精灵对象”概念,它指的是从当前“选定”的精灵创建的 3D 对象之一。要对 3D 对象应用任何操作,您需要先选择该对象,然后所有后续代码块都将应用于该对象,直到选择一个新对象作为“精灵对象”。
项目创意 - 创建移动人行道 (难度: 2)
- 概述: 使用 3 个盒子组成一条人行道,并重复选择最后一个盒子并将其移动到前面。
主题 17 - 其他简单形状
项目创意 - 框架中的一幅画 (难度: 2)
- 教程链接: 框架中的一幅画 (难度: 2)
- 概述: 创建一个程序,在框架中显示一幅著名的画作
项目创意 - 创建巧克力蛋糕 (难度: 3)
- 概述: 使用圆柱体和管子创建一个巧克力蛋糕。
项目创意 - 使用自定义代码块建造塔和城堡 (难度: 4)
- 教程链接: 使用自定义代码块建造塔和城堡 (难度: 4)
- 概述: 创建一个可以构建不同大小的塔的自定义代码块并重复使用它
主题 18 - 3D 文本
-
教程链接: 3D 文本
-
概述: 您可以使用 3D 文本在场景中显示信息。它们可以非常薄或具有一定的厚度,也可以具有不同的字体类型和弯曲样式。
项目创意 - 文字艺术 (难度: 2)
- 教程链接: 文字艺术 (难度: 2)
- 概述: 使用一些 3D 文本创建出色的视觉效果
项目创意 - 停车标志 (难度: 2)
- 教程链接: 停车标志 (难度: 2)
- 概述: 使用圆柱体和 3D 文本创建一个停车标志
项目创意 - 创建电影院 (难度: 4)
- 概述: 使用具有纹理的简单形状和 3D 文本创建一个电影院
主题 19 - 拉伸
-
教程链接: 拉伸
-
概述: 您可以通过增加厚度将任何 2D 图像“拉伸”成一个扁平的 3D 物体。巧妙地使用此技术可以产生许多有趣的用例,例如绘制地图然后将其拉伸成 3D 迷宫。
项目创意 - 创建迷宫 (难度: 2)
- 概述: 使用服装编辑器绘制迷宫,然后将其拉伸成 3D 迷宫。您需要旋转它、放大它并添加纹理。
主题 20 - 物体碰撞
-
教程链接:
-
概述:物体碰撞允许您在两个 3D 物体相互碰撞时触发事件,例如当虚拟形象撞到墙壁或收集到能量提升时。这是一种基本技术,允许玩家控制他们的虚拟形象并与 3D 世界中的物体进行交互。有两种检测物体碰撞的方法:使用两个物体之间的距离,或从一个物体投射射线(箭头)并查看它是否接触到另一个物体。
项目创意 - 迷宫游戏 (难度:3)
- 教程链接:迷宫游戏 (难度:3)
- 概述:控制虚拟形象穿过 3D 迷宫。
项目创意 - 防止虚拟形象穿墙 (难度:4)
- 教程链接:防止虚拟形象穿墙 (难度:4)
- 概述:当虚拟形象在预定义的场景(如城市街道)中奔跑时,它可能会穿过建筑物,因为启用虚拟形象与场景中每个物体之间的碰撞检测太慢了。相反,我们可以使用一个透明的盒子将虚拟形象挡在建筑物外。
项目创意 - 虚拟形象与物体交互 (难度:4)
- 教程链接:虚拟形象与物体交互 (难度:4)
- 概述:在许多游戏中,玩家控制虚拟形象与场景中的其他物体进行交互,例如与墙壁碰撞或捡起奖励物品。在本教程中,我们将介绍您可以在下一个游戏中应用的 3 种方法:射线投射、边界框和距离测量。
项目创意 - 跳跃游戏 (难度:5)
- 教程链接:跳跃游戏 (难度:5)
- 概述:创建一个游戏,玩家跳过平台到达目标区域,最后将显示最快玩家的排行榜。
项目创意 - 疯狂高速公路游戏 (难度:6)
- 教程链接:疯狂高速公路游戏 (难度:6)
- 概述:学习构建一个名为“疯狂高速公路”的令人兴奋的赛车游戏。玩家将驾驶一辆汽车在高速公路上快速行驶的汽车中穿梭,并尝试尽快到达终点线
主题 21 - 复制物体
-
教程链接:复制物体
-
概述:当您需要制作许多相同类型的物体时,复制单个物体通常更快、更有效。这些副本可以共享相同的模型和动画数据,但具有自己的运动或颜色。
项目创意 - 外星人舞会 (难度:1)
- 教程链接:外星人舞会 (难度:1)
- 概述:创建外星人虚拟形象的 3 个副本并让他们跳舞
主题 21 - 高亮和发光效果
项目创意 - 旋转的地球 (难度:1)
- 教程链接:旋转的地球 (难度:1)
- 概述:使用纹理创建一个旋转的地球并在其周围添加高亮效果
项目创意 - 人体模型 (难度:3)
- 概述:加载人体模型,并使用下拉菜单允许用户选择一个器官,然后加载带有高亮显示的该器官。
项目创意 - 花园中的不明飞行物 (难度:3)
- 概述:在花园场景中加载一个不明飞行物模型,然后使其发光并更新其发光颜色。
主题 22 - 悬停事件
-
教程链接:悬停事件
-
概述:您可以通过将鼠标指针悬停在任何物体上来允许玩家与场景中的物体进行交互。这称为“悬停”事件。您将获得有关指针下哪个物体的信息,因此您可以使该物体对该事件做出反应。
项目创意 - 高亮药水 (难度:2)
- 概述:添加一些药水模型,将它们更新为不同的颜色,然后当用户将鼠标悬停在任何药水上时,将其高亮显示。
主题 23 - 拾取事件
-
教程链接:拾取事件
-
概述:您还可以允许玩家通过单击场景中的物体来拾取它。这称为“拾取”事件。您将获得有关指针单击哪个物体的信息,因此您可以使该物体对该事件做出反应。
项目创意 - 选择字母 (难度:2)
- 教程链接:选择字母 (难度:2)
- 概述:允许用户选择一个字母并显示一些反应
项目创意 - 用石头射击外星人 (难度:3)
- 概述:重复添加向我们跑来的外星人,当用户单击草原上的任何一点时,向该点扔一块石头,当它击中外星人时,移除外星人。
项目创意 - 钢琴 (难度:3)
- 概述:用白色和黑色盒子创建一个钢琴键盘,当用户选择任何琴键时,播放其音符。
项目创意 - 可玩的魔方 (难度:6)
- 教程链接:可玩的魔方 (难度:6)
- 概述:创建一个可玩的魔方,玩家可以使用滑动手势和按钮来控制立方体。
项目创意 - Minecraft 风格的世界 (难度:6)
- 概述:创建一个由不同类型的立方体组成的 Minecraft 风格的世界。用户可以在具有锁定指针的世界中奔跑或飞行,并单击以添加或移除立方体。
- 演示项目:play.creaticode.com/projects/660aa865b57a3da838c387bc
主题 24 - 拖动事件
-
教程链接:拖动物体
-
概述:您还可以允许玩家用指针拖动物体。这称为“拾取”事件。您还将获得有关正在拖动哪个物体的信息。
主题 25 - 直线、箭头和曲线
项目创意 - 房屋测量 (难度:3)
- 概述:选择任何物体,如房子,然后添加一些直线/箭头和 3D 文本以显示一些测量数字。
项目创意 - 分子结构 (难度:3)
- 概述:使用直线、曲线、球体和 3D 文本为分子(如碳酸 (H2CO3))创建“球棒”模型。
主题 26 - 父子关系
-
教程链接:父子关系
-
概述:“父子关系”是 3D 编程中的另一个独特概念。它意味着将一个对象设置为另一个对象的父对象,因此当父对象移动或转动时,子对象会相对于父对象移动或转动。这是使多个对象表现为一个复合对象的好方法,当您熟悉它时,它有许多有趣和巧妙的用例。
项目创意 - 太阳系 (难度:3)
- 概述:加载“太阳系”场景,然后使行星/卫星自转和公转。用户可以从下拉菜单中选择任何行星来仔细观察它。
主题 27 - 运动轨迹
-
教程链接:为网格添加轨迹
-
概述:您可以为运动物体添加漂亮的轨迹,以清晰地显示其运动方式。
项目创意 - 烟花 (难度:3)
- 概述:创建一些烟花,首先将一个小火球射向天空,然后它会爆炸成许多不同颜色和方向的彩色火球。提示:您可以使用“上升速度”、“前进速度”和“重力”来控制每个火球的运动。
项目创意 - 碳原子模型 (难度:4)
- 概述:使用几个球体作为中心的原子核来创建碳原子模型,然后添加围绕原子核运行的电子,并为它们附加运动轨迹。请注意,要使电子围绕多个轴旋转,您需要为其添加一个变换父对象,这样旋转父对象将使电子旋转。
主题 28 - 雕刻物体
-
教程链接:雕刻物体
-
概述:当两个物体重叠时,您可以使用一个物体从另一个物体上雕刻出一个孔。这允许您创建有趣的新形状。
项目创意 - 带窗户的空间站 (难度:3)
- 概述:使用简单的形状创建一个空间站,然后雕刻出一些孔作为窗户,并用透明玻璃覆盖它们。
项目创意 - 公共汽车 (难度:5)
- 概述:使用简单的形状创建一辆公共汽车,并雕刻出它的门/窗。添加轮子和座椅。
主题 29 - 社区模型
-
教程链接:
-
概述:虽然 CreatiCode 库提供了数千个 3D 模型,但有时您可能需要一个不在库中的特殊模型。在这种情况下,您可以在 CreatiCode 用户社区共享的模型库中进行搜索。如果您仍然在那里找不到任何合适的模型,您可以尝试从外部网站(如 Tinkercad、Sketchfab 或 CGTrader)中找到具有宽松许可的免费模型,并将该模型作为新的社区模型上传。
项目创意 - 使用您的不明飞行物作为模型 (难度:2)
- 教程链接:使用您的不明飞行物作为模型 (难度:2)
- 概述:使用父子关系将不明飞行物的 3 个球体链接为一个对象,并将其导出为 GLB 模型。
主题 30 - 批量复制
-
教程链接:
-
概述:如果您需要制作同一物体的许多副本,有 3 种方法可以一次创建多个副本,这比逐个创建副本更有效:
- 您可以制作在 3D 空间中形成“矩阵”的副本
- 您可以制作围绕给定轴旋转的副本
- 您可以制作位于原始物体镜像位置的副本。
项目创意 - 桥梁跑酷 (难度:4)
- 教程链接:桥梁跑酷 (难度:4)
- 概述:创建一个动画,其中一个虚拟形象在无限长的桥梁上奔跑和跳跃
项目创意 - 跑酷游戏 (难度:5)
- 教程链接:跑酷游戏 (难度:5)
- 概述:扩展上面的桥梁跑酷项目,添加虚拟形象可以沿途拾取的游戏物品
项目创意 - 火星车 (难度:6)
- 概述:使用简单的形状创建火星车;添加一个带轮子的腿,然后使用“镜像复制”来复制它。
- 演示项目:play.creaticode.com/projects/b3e25d457d8961e8da9b51c9
主题 31 - 距离传感器
-
教程链接:距离传感器
-
概述:您可以从一个物体向所有 6 个方向投射射线(箭头),这允许您检查它与这些箭头接触的其他物体的距离。
项目创意 - 带有距离传感器的自动驾驶汽车 (难度:3)
- 教程链接:带有距离传感器的自动驾驶汽车 (难度:3)
- 概述:使用距离传感器使汽车避开障碍物。
项目创意 - 带有距离传感器的灯光控制 (难度:2)
- 教程链接:带有距离传感器的灯光控制 (难度:2)
- 概述:使用距离传感器检测汽车是否靠近隧道的入口或出口,然后相应地打开或关闭隧道中的灯。
主题 32 - 附着到身体部位
-
教程链接:附着到身体部位
-
概述:您可以将一个物体(例如帽子)附着到另一个物体(虚拟形象或动物模型)的身体部位(例如头部),这样当该物体播放动画时,附着的物体将表现得好像它是该物体的一部分。
项目创意 - 带翅膀的长颈鹿 (难度:2)
- 概述:加载长颈鹿模型,并将“翅膀 12”模型附着到其“脊柱”身体部位。
- 演示项目:play.creaticode.com/projects/ab4f94592232a3706993b204
主题 33 - 第一人称视角摄像机
-
教程链接:
-
概述:您可以将“跟随摄像机”移动到物体或虚拟形象的正前方,这样您就可以获得第一人称视角而无需显示该物体或虚拟形象。您还可以从摄像机的位置射出物体,这对于第一人称射击游戏很有用。
项目创意 - 射击盒子 (难度:4)
- 概述:在天空中添加一些随机移动的盒子,然后每当玩家单击时,射出一个球,如果该球与任何盒子碰撞,则删除该盒子。
- 演示项目:play.creaticode.com/projects/488f7d22f257913f41a8cf31
项目创意 - 扔球 (难度:5)
- 概述:在天空中添加一个环,然后当玩家单击任何点时,扔一个球(处理重力),看看该球是否可以飞过环。
主题 34 - 为简单形状启用 3D 物理引擎
-
教程链接:
-
概述:您可以使用 3D 物理引擎来帮助管理场景中的 3D 物体。例如,您无需编写代码来直接移动物体,只需告诉物理引擎“使该物体表现得像一个球”,然后引擎将完全控制该物体,包括它如何移动以及与其他物体碰撞。这是通过使用像盒子/球体/圆柱体这样的简单形状作为物体的“物理体”,并模拟该简单形状的行为方式来完成的。物理引擎允许您创建非常复杂和逼真的 3D 世界,而无需编写太多代码。
项目创意 - 弹球游戏 (难度 3)
- 教程链接:弹球游戏 (难度 3)
- 概述:一个基于物理的游戏,我们移动和倾斜一个板,使球落到一个平台上
项目创意 - 物理益智游戏 (难度:3)
- 教程链接:物理益智游戏 (难度:3)
- 概述:一个基于物理的游戏,我们点击移除盒子,使球落入篮子中
项目创意 - 推箱子游戏 (难度 6)
- 教程链接:推箱子游戏 (难度 6)
- 概述:学习再现一个名为“推箱子”的经典益智游戏。在这个游戏中,玩家在平台上旋转一个盒子以到达目标洞:
主题 35 - 为复合形状启用物理引擎
-
教程链接:复合物理体
-
概述:有时,像盒子或球体这样的简单形状不能准确地模拟物体的行为,您可能需要创建一个由几个简单形状组成的“复合”形状。
项目创意 - 椅子的复合体 (难度 4)
- 概述:创建一个简单的物体,如椅子或桌子,然后为其创建一个复合物理体。
主题 36 - 设置物理体的运动速度
-
教程链接:设置物理体的运动速度
-
概述:将物体“移交”给物理引擎后,您不能直接移动它或设置它的位置,因为它将绑定到分配给它的物理体。相反,您可以要求物理引擎为您设置该物体的运动速度。
项目创意 - 迷你台球游戏 (难度:4)
- 教程链接:迷你台球游戏 (难度:4)
- 概述:使用物理引擎创建迷你台球游戏
项目创意 - 水模拟器 (难度:2)
- 教程链接:3D 物理 - 水模拟器 (难度:2)
- 概述:使用物理引擎创建大量水滴(球体)
主题 37 - 对物理体施加力
-
教程链接:对物理体施加力
-
概述:使物体移动的另一种方法是对其施加一些“力”。例如,重力是一种力。物理引擎将模拟施加该力时物体的行为方式。
项目创意 - 跳球游戏 (难度:4)
- 概述:创建一个简单的游戏,将一个球放在斜坡上。当用户按下向上箭头时,对球施加推力。当用户松开按键时,停止施力。看看球是否可以落入篮子中。
主题 38 - 处理物理体之间的碰撞
-
教程链接:处理物理体之间的碰撞
-
概述:当两个具有物理体的物体碰撞时,物理引擎将广播一条消息,这允许您添加额外的代码来处理此类事件。例如,当球击中目标时,将球从场景中移除。
项目创意 - 弹球游戏 (难度:5)
- 教程链接:弹球游戏 (难度:5)
- 概述:使用物理引擎创建弹球游戏
主题 39 - 带有物理模拟的汽车
-
教程链接:
-
概述:物理引擎可以准确地模拟汽车及其 4 个车轮的运动,这对于创建逼真的汽车游戏非常有用。您甚至可以使用简单的形状构建自己的汽车,然后让物理引擎控制它。
项目创意 - 用汽车砸箱子 (难度:3)
- 教程链接:用汽车砸箱子 (难度:3)
- 概述:一个基于物理的游戏,我们驾驶汽车驶上坡道撞击一堆箱子。
主题 40 - 两个物理对象之间的约束
-
教程链接:
-
概述:物理引擎可以模拟各种“约束”,这些约束是动态施加到物体上的力,以保持两个启用物理的对象之间的相对位置。
- 距离约束:即使两个物体移动,也保持它们之间的距离恒定
- 固定约束:保持两个物体之间的相对位置不变
- 铰链约束:使两个物体看起来像通过旋转铰链连接(例如门和框架)
项目创意 - 蜘蛛侠篮球 (难度:5)
- 教程链接:蜘蛛侠篮球 (难度:5)
- 概述:使用物理引擎创建一个将球摆动到目标篮筐的游戏
主题 41 - 预制粒子发射器
-
教程链接:使用预制粒子发射器
-
概述:“粒子发射器”可以发射(生成)粒子,粒子只是具有透明背景的 2D 图像。通常,粒子发射器可以连续发射数百甚至数千个粒子,从而产生美丽而逼真的视觉效果。有一些预制发射器可以轻松添加到您的场景中并进行自定义:火焰、烟雾、火花、光环和光球。
项目创意 - 发射火球 (难度:5)
- 概述:添加一个虚拟形象和其他一些物体。当用户单击任何物体时,虚拟形象将向该物体发射一个火球。
- 演示项目:play.creaticode.com/projects/2df80414e8d8d5f0356c65fe
主题 42 - 单点粒子发射器
-
教程链接:单点粒子发射器
-
概述:要产生更多自定义的视觉效果,您可以使用单点粒子发射器而不是使用预制的发射器。这些发射器从场景中的单个点生成粒子,您可以自定义粒子的许多参数,例如它们的图像图案、大小、移动速度、旋转速度和寿命。
项目创意 - 点击产生火花 (难度:3)
- 概述:每当用户单击一个盒子时,在该点添加一个火花。
- 演示项目:play.creaticode.com/projects/5eb000b67c2db4d312d2f71d
主题 43 - 移动和旋转粒子
-
教程链接:移动和旋转粒子
-
概述:就像任何 3D 物体一样,您可以移动或旋转粒子发射器,这将导致在新的位置和角度生成新的粒子。
主题 44 - 基于形状的粒子发射器
-
教程链接:基于形状的粒子发射器
-
概述:除了单点发射器之外,还有其他粒子发射器可以从透明的 3D 形状(如盒子或球体)生成粒子。
主题 45 - 使用面部摄像头的增强现实
-
教程链接:
-
概述:增强现实 (AR) 是指在摄像机视频中实时叠加 2D/3D 内容。使用增强现实面部摄像头代码块,我们可以检测和跟踪摄像机视频中用户面部并添加其他 3D 物体。
项目创意 - 虚拟面部彩绘 (难度:2)
- 教程链接:虚拟面部彩绘 (难度:2)
- 概述:在本教程中,您将构建一个程序,允许用户通过增强摄像机视频中检测到的用户面部来尝试不同的面部彩绘。
项目创意 - 喷火效果 (难度:3)
- 教程链接:喷火效果 (难度:3)
- 概述:在本教程中,您将学习使用面部跟踪数据检测事件,例如张开嘴巴,并将火焰粒子发射器附着到嘴巴上。
项目创意 - 带有遮挡的虚拟服装 (难度:3)
- 教程链接:带有遮挡的虚拟服装 (难度:3)
- 概述:在本教程中,您将学习使用透明物体遮挡(阻挡)部分虚拟物体,使其看起来更逼真。
主题 46 - 使用世界摄像头的增强现实
-
教程链接:
-
概述:使用增强现实世界摄像头代码块,我们可以检测和跟踪我们周围的 3D 世界,并将新的 3D 物体放置在这个世界中,这些物体将覆盖在摄像机视频上。当我们四处走动时,这些物体将保持在相同的位置,就好像它们是现实世界的一部分。
-
RE: more security-related account control
No need to worry. When someone else runs your project or remix it, we also treat it as “updated”, and it would bring the project higher in the “My Stuff” project list.
-
RE: more security-related account control
Sure. We will make some improvements on these issues. thanks.
-
RE: Issue with copy table to table and append table to table
This issue has been fixed.
-
RE: Issue with copy table to table and append table to table
We are able to reproduce the issue now. It will be fixed soon. Thank you.
-
RE: Issue with copy table to table and append table to table
When you say you “set row 1 column hi of table a to ‘test’”, which block did you use? Is it “replace item at row [] column []”? We can’t seem to reproduce this issue using that block.
-
ChatGPT blocks no long requires sign-in
We have removed the sign-in requirement for the ChatGPT blocks, so that anyone can run ChatGPT-based projects without logging in, such as this project: play.creaticode.com/projects/1ca634e4193e2b27500be13e
This allows you to build AI projects and share them to anyone to try out, and they won’t have to sign up or log in to try them
Enjoy!
-
How to record and share screen recordings as gifs
Introduction
When you need to explain how a project should work, the best way is to make a screen recording of the stage. This short article will explain which tools you can use to record the screen, and also how to share the gif file to get a URL for it.
Screen Recording on Windows
If you are using a Windows computer, we recommend a free tool named “ScreenToGif”, which you can download here: https://www.screentogif.com/
Here is a short video explaining how to use it: https://www.yo utube.com/watch?v=ELfCBzN1Mtc
Screen Recording on Macbook
If you are using a Macbook, you can use a free tool called “Giphy Capture”: https://giphy.com/apps/giphycapture
Here is a short video showing how to use it: https://www.yo utube.com/watch?v=m-4cJMBGfS4
Share your gif file
Once your gif file is ready, you can share it this way:
-
Go to the “My Stuff” page at https://play.creaticode.com/mystuff, and make sure you are logged in.
-
Select “My Files” tab on the bottom left
-
Click the “+Share a New File” button on the top right
-
In the pop up window, click “Click to upload file”, and then select the gif file from your computer.
-
Click the green button that says “upload and share with the CC Attribution license” at the bottom.
After that, you will see the new file in the list of files, and then you can click “Copy file URL” button for that file, which will copy the URL to the clipboard, which would look like this: https://ccdn.creaticode.com/user-files/BfemEPCxatY6MMAPs/castfireball.gif
-
-
RE: Overlap object detection is bugged or not working
Please refer to this example:
play.creaticode.com/projects/675378ad977fa780536fd819
The idea is that we already know the position of the rope, then we just need to know the position of the player, then calculate the direct distance between these 2 2D coordinates.