- 人工智能创作
AI辅助程序设计与开发-202503
- 2025-2-28 14:20:30 @
借助AI辅助创作程序,先说明你想创作程序的功能。运行调试你的作品,不断修改,将作品的最终窗口截图,以及代码提交。
提示:如果需要安装外部库可以使用下面代码在命令行中安装,pip install -i https://mirrors.aliyun.com/pypi/simple 库名
AI工具的选择:可以自选当下通用的AI大模型,也可以选择专门辅助代码生成的AI模型,也可以选择齐洪老师的API:红旗AI助手。
讨论提交可以参考如下格式。
一、作品名称:班级抽奖小程序
二、作品创作者及使用的AI工具:
三、作品主要功能:
(1)
(2)
(3)
......
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
六、你对AI辅助代码编写的思考:
(结合自己实践写不少于100字的思考)
43 条评论
-
student2023009 LV 4 @ 2025-3-11 13:50:08
一、作品名称:中国非遗文化游戏 二、作品创作者及使用的AI工具:海螺ai 三、作品主要功能:
(1)一个大标题标签,显示欢迎信息。 一个“开始游戏”按钮,用户点击后进入主菜单。一个大标题标签,显示欢迎信息。一个“开始游戏”按钮,用户点击后进入主菜单。
(2) 在主菜单中,用户可以选择不同的功能模块。一个标题标签,显示“主菜单”。 “非遗介绍”按钮:点击后进入非遗介绍页面,了解非遗的定义和示例。 “游玩”按钮:点击后进入游玩页面,开始游戏或进行互动。
(3) 向用户详细介绍中国非物质文化遗产的定义、特点和示例。 提供游戏互动功能,目前包含一个简单的问答游戏。
四、作品主要截图
五、作品的代码:
import tkinter as tk from tkinter import messagebox class App(tk.Tk): def __init__(self): super().__init__() self.title("中国非遗文化游戏") self.geometry("800x600") self.create_start_page() def create_start_page(self): for widget in self.winfo_children(): widget.destroy() label = tk.Label(self, text="欢迎来到中国非遗文化游戏", font=("Arial", 24)) label.pack(pady=20) start_button = tk.Button(self, text="开始游戏", font=("Arial", 16), command=self.create_main_menu) start_button.pack(pady=10) def create_main_menu(self): for widget in self.winfo_children(): widget.destroy() label = tk.Label(self, text="主菜单", font=("Arial", 24)) label.pack(pady=20) intro_button = tk.Button(self, text="非遗介绍", font=("Arial", 16), command=self.create_intro_page) intro_button.pack(pady=10) play_button = tk.Button(self, text="游玩", font=("Arial", 16), command=self.create_play_page) play_button.pack(pady=10) def create_intro_page(self): for widget in self.winfo_children(): widget.destroy() label = tk.Label(self, text="非遗介绍", font=("Arial", 24)) label.pack(pady=20) intro_text = ( "中国非物质文化遗产(简称非遗)是指各种传统文化表现形式,\n" "以及与传统文化表现形式相关的实物和场所。\n\n" "例如:京剧、昆曲、剪纸、刺绣、皮影戏等。\n\n" "这些文化遗产承载着中华民族的智慧和创造力。" ) intro_label = tk.Label(self, text=intro_text, font=("Arial", 14), justify="left") intro_label.pack(pady=10) back_button = tk.Button(self, text="返回", font=("Arial", 14), command=self.create_main_menu) back_button.pack(pady=10) def create_play_page(self): for widget in self.winfo_children(): widget.destroy() label = tk.Label(self, text="游玩", font=("Arial", 24)) label.pack(pady=20) game_button = tk.Button(self, text="开始游戏", font=("Arial", 16), command=self.create_game_page) game_button.pack(pady=10) back_button = tk.Button(self, text="返回", font=("Arial", 14), command=self.create_main_menu) back_button.pack(pady=10) def create_game_page(self): for widget in self.winfo_children(): widget.destroy() label = tk.Label(self, text="游戏界面", font=("Arial", 24)) label.pack(pady=20) try: from PIL import Image, ImageTk image = Image.open("非物质文化遗产.jpg") # 确保有一张名为“非物质文化遗产.jpg”的图片 image = image.resize((300, 200), Image.ANTIALIAS) photo = ImageTk.PhotoImage(image) img_label = tk.Label(self, image=photo) img_label.image = photo img_label.pack(pady=10) except Exception as e: messagebox.showerror("错误", "无法加载图片,请确保有一张名为“非物质文化遗产.jpg”的图片。") back_button = tk.Button(self, text="返回", font=("Arial", 14), command=self.create_play_page) back_button.pack(pady=10) # 示例游戏逻辑 # 这里可以添加具体的游戏逻辑,例如问答、拼图等 def start_quiz(): for widget in self.winfo_children(): widget.destroy() label = tk.Label(self, text="问答游戏", font=("Arial", 24)) label.pack(pady=20) question = "京剧的四大行当是什么?" answer = "生、旦、净、丑" question_label = tk.Label(self, text=question, font=("Arial", 16), justify="left") question_label.pack(pady=10) entry = tk.Entry(self, font=("Arial", 16)) entry.pack(pady=10) def check_answer(): user_answer = entry.get() if user_answer == answer: messagebox.showinfo("正确", "回答正确!") else: messagebox.showerror("错误", f"回答错误,正确答案是:{answer}") submit_button = tk.Button(self, text="提交", font=("Arial", 14), command=check_answer) submit_button.pack(pady=10) back_button = tk.Button(self, text="返回", font=("Arial", 14), command=self.create_game_page) back_button.pack(pady=10) start_quiz_button = tk.Button(self, text="开始问答游戏", font=("Arial", 16), command=start_quiz) start_quiz_button.pack(pady=10) if __name__ == "__main__": app = App() app.mainloop()
六、你对AI辅助代码编写的思考: 在编写“中国非遗文化游戏”的过程中,我深刻体会到了AI辅助编程工具带来的巨大便利。AI在代码优化和功能扩展方面也给了我很多启发。它不仅提供了实用的代码示例和建议,还帮助我优化了代码结构和功能实现。通过与AI的互动,我不仅解决了当前的问题,还学到了许多新的编程技巧和最佳实践。
-
2025-3-11 13:34:43@
一、作品名称:分组程序
二、作品创作者及使用的AI工具:kimi.com 罗宇航
三、作品主要功能:
(1)最基础的功能:对用户提供的名单进行分组
(2)决出组长及副组长
(3)可根据用户需要进行调换调整
(4)应用会根据用户的需要提供建议和帮助
四、作品主要截图
五、作品的代码:
import pandas as pd import random import tkinter as tk from tkinter import messagebox, scrolledtext, filedialog import os # 全局变量,用于记录当前置顶的窗口 current_topmost_window = None # 语言资源 lang_resources = { "zh": { "app_title": "分组软件", "select_file": "选择文件", "group": "分组", "adjust_group": "调整分组成员", "stats": "显示分组统计信息", "clear": "清除分组数据", "save": "保存分组结果", "group_type": "选择小组类型", "group_type_suggestion": "小组类型:{}\n建议人数:{}", "file_type_excel": "Excel files", "file_type_csv": "CSV files", "file_type_all": "All files", "select_column": "选择列名", "confirm": "确认", "group_name": "输入小组名", "group_name_prompt": "请输入小组名:", "group_size": "输入小组成员数", "group_size_prompt": "请输入小组成员数:", "min_value": "输入的值必须大于或等于 {}", "error": "错误", "value_error": "请输入一个有效的整数", "no_participants": "请先选择文件并加载参与者名单", "invalid_group": "分组名无效", "invalid_member": "成员无效", "invalid_new_group": "新分组名无效", "no_groups": "没有分组数据可以调整", "no_groups_stats": "没有分组数据可以显示统计信息", "no_groups_save": "没有分组数据可以保存", "groups_cleared": "分组数据已清除,参与者名单已恢复", "saved_excel": "分组结果已保存到文件", "saved_txt": "分组结果已保存到文本文件", "save_error": "保存文件时发生错误:{}", "language": "语言", "language_prompt": "请选择语言", "english": "English", "chinese": "中文", "file_loaded": "文件加载成功", "group_size_exceeded": "分组人数不能超过参与者总数" }, "en": { "app_title": "Grouping Software", "select_file": "Select File", "group": "Group", "adjust_group": "Adjust Group Members", "stats": "Show Group Statistics", "clear": "Clear Group Data", "save": "Save Group Results", "group_type": "Select Group Type", "group_type_suggestion": "Group Type: {}\nSuggested Size: {}", "file_type_excel": "Excel files", "file_type_csv": "CSV files", "file_type_all": "All files", "select_column": "Select Column", "confirm": "Confirm", "group_name": "Enter Group Name", "group_name_prompt": "Please enter the group name:", "group_size": "Enter Group Size", "group_size_prompt": "Please enter the number of members:", "min_value": "The value must be greater than or equal to {}", "error": "Error", "value_error": "Please enter a valid integer", "no_participants": "Please load participants from a file first", "invalid_group": "Invalid group name", "invalid_member": "Invalid member", "invalid_new_group": "Invalid new group name", "no_groups": "No group data to adjust", "no_groups_stats": "No group data to show statistics", "no_groups_save": "No group data to save", "groups_cleared": "Group data cleared, participants restored", "saved_excel": "Group results saved to file", "saved_txt": "Group results saved to text file", "save_error": "Error saving file: {}", "language": "Language", "language_prompt": "Select Language", "english": "English", "chinese": "中文", "file_loaded": "File loaded successfully", "group_size_exceeded": "Group size cannot exceed the total number of participants" } } # 当前语言 current_language = "zh" def set_language(lang): global current_language current_language = lang def set_topmost(window): global current_topmost_window if current_topmost_window: try: current_topmost_window.wm_attributes('-topmost', False) except tk.TclError: pass # 忽略已销毁窗口的错误 window.wm_attributes('-topmost', True) current_topmost_window = window def position_window(window, side='center'): screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() window_width = 600 window_height = 400 x = (screen_width - window_width) // 2 y = (screen_height - window_height) // 2 window.geometry(f"{window_width}x{window_height}+{x}+{y}") def custom_askstring(title, prompt): dialog = tk.Toplevel() dialog.title(title) position_window(dialog, side='center') set_topmost(dialog) label = tk.Label(dialog, text=prompt, font=("Arial", 10)) label.pack(pady=5) entry = tk.Entry(dialog, font=("Arial", 10)) entry.pack(pady=5) result = None def on_ok(): nonlocal result result = entry.get() dialog.destroy() ok_button = tk.Button(dialog, text="确定" if current_language == "zh" else "Confirm", command=on_ok, font=("Arial", 10), bg="#4CAF50", fg="white") ok_button.pack(pady=5) dialog.grab_set() dialog.wait_window() return result def custom_askinteger(title, prompt, minvalue): dialog = tk.Toplevel() dialog.title(title) position_window(dialog, side='center') set_topmost(dialog) label = tk.Label(dialog, text=prompt, font=("Arial", 10)) label.pack(pady=5) entry = tk.Entry(dialog, font=("Arial", 10)) entry.pack(pady=5) result = None def on_ok(): nonlocal result try: value = int(entry.get()) if value >= minvalue: result = value dialog.destroy() else: messagebox.showerror("错误" if current_language == "zh" else "Error", lang_resources[current_language]["min_value"].format(minvalue)) except ValueError: messagebox.showerror("错误" if current_language == "zh" else "Error", lang_resources[current_language]["value_error"]) ok_button = tk.Button(dialog, text="确定" if current_language == "zh" else "Confirm", command=on_ok, font=("Arial", 10), bg="#4CAF50", fg="white") ok_button.pack(pady=5) dialog.grab_set() dialog.wait_window() return result def suggest_group_size(group_type): suggestions = { "学习小组": "建议小组人数为 3-5 人", "工作小组": "建议小组人数为 5-7 人", "项目小组": "建议小组人数为 7-10 人", "其他": "建议小组人数为 3-10 人", "Study Group": "Suggested size: 3-5 members", "Work Group": "Suggested size: 5-7 members", "Project Group": "Suggested size: 7-10 members", "Other": "Suggested size: 3-10 members" } return suggestions.get(group_type, "建议小组人数为 3-10 人" if current_language == "zh" else "Suggested size: 3-10 members") def check_openpyxl_installed(): try: import openpyxl return True except ImportError: return False def initial_checks(root): if not check_openpyxl_installed(): response = messagebox.askyesno( "缺少依赖库" if current_language == "zh" else "Missing Dependency", "程序需要 openpyxl 库来读取 Excel 文件。\n是否安装该库?" if current_language == "zh" else "The program requires the openpyxl library to read Excel files.\nWould you like to install it?" ) if response: os.system("pip install openpyxl") messagebox.showinfo( "安装完成" if current_language == "zh" else "Installation Complete", "openpyxl 库已安装,程序将重新启动。" if current_language == "zh" else "The openpyxl library has been installed. The program will restart." ) root.destroy() exit() else: messagebox.showinfo( "程序结束" if current_language == "zh" else "Program Terminated", "缺少必要的库,程序无法继续运行。" if current_language == "zh" else "The program cannot continue without the required library." ) root.destroy() exit() response = messagebox.askyesno( "确认列名" if current_language == "zh" else "Confirm Column Name", "请确保您的 Excel 文件中有‘姓名’列。\n是否继续?" if current_language == "zh" else "Please ensure your Excel file contains a 'Name' column.\nWould you like to continue?" ) if not response: messagebox.showinfo( "程序结束" if current_language == "zh" else "Program Terminated", "用户取消操作,程序已结束。" if current_language == "zh" else "The user cancelled the operation. The program has terminated." ) root.destroy() exit() class LotteryApp: def __init__(self, root, group_type, group_size_suggestion): self.root = root self.root.title(lang_resources[current_language]["app_title"]) position_window(self.root, side='center') # 确保主窗口在屏幕正中央 set_topmost(self.root) self.root.configure(bg="#f0f0f0") if os.path.exists("icon.ico"): # 确保图标文件存在 self.root.iconbitmap("icon.ico") # 设置图标 self.participants = [] self.groups = {} self.selected_file_paths = [] # 支持多个文件 self.data_processed = False self.group_type = group_type self.group_size_suggestion = group_size_suggestion # 创建左右布局的框架 left_frame = tk.Frame(self.root, bg="#f0f0f0", width=200) left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=5, pady=5) right_frame = tk.Frame(self.root, bg="#f0f0f0") right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5) # 创建获奖者名单显示框 self.winners_list = scrolledtext.ScrolledText(right_frame, width=40, height=15, font=("Arial", 10)) self.winners_list.pack(fill=tk.BOTH, expand=True) # 创建按钮 button_font = ("Arial", 10, "bold") button_bg = "#4CAF50" button_fg = "white" self.select_file_button = tk.Button(left_frame, text=lang_resources[current_language]["select_file"], command=self.select_files, font=button_font, bg=button_bg, fg=button_fg) self.select_file_button.pack(fill=tk.X, pady=5, anchor=tk.CENTER) self.draw_button = tk.Button(left_frame, text=lang_resources[current_language]["group"], command=self.draw_groups, font=button_font, bg=button_bg, fg=button_fg) self.draw_button.pack(fill=tk.X, pady=5, anchor=tk.CENTER) self.adjust_button = tk.Button(left_frame, text=lang_resources[current_language]["adjust_group"], command=self.adjust_group, font=button_font, bg=button_bg, fg=button_fg) self.adjust_button.pack(fill=tk.X, pady=5, anchor=tk.CENTER) self.stats_button = tk.Button(left_frame, text=lang_resources[current_language]["stats"], command=self.show_group_statistics, font=button_font, bg=button_bg, fg=button_fg) self.stats_button.pack(fill=tk.X, pady=5, anchor=tk.CENTER) self.clear_button = tk.Button(left_frame, text=lang_resources[current_language]["clear"], command=self.clear_groups, font=button_font, bg=button_bg, fg=button_fg) self.clear_button.pack(fill=tk.X, pady=5, anchor=tk.CENTER) self.save_button = tk.Button(left_frame, text=lang_resources[current_language]["save"], command=self.save_groups, font=button_font, bg=button_bg, fg=button_fg) self.save_button.pack(fill=tk.X, pady=5, anchor=tk.CENTER) # 创建语言选择下拉菜单 tk.Label(left_frame, text=lang_resources[current_language]["language"], font=("Arial", 10), bg="#f0f0f0").pack(pady=5) self.language_var = tk.StringVar(value=lang_resources[current_language]["chinese"]) language_menu = tk.OptionMenu(left_frame, self.language_var, lang_resources["zh"]["chinese"], lang_resources["en"]["english"], command=self.change_language) language_menu.config(font=("Arial", 10), bg="#f0f0f0") language_menu.pack(fill=tk.X) # 创建小组类型选择下拉菜单 self.group_type_var = tk.StringVar(value=self.group_type) tk.Label(left_frame, text=lang_resources[current_language]["group_type"], font=("Arial", 10), bg="#f0f0f0").pack(pady=5) self.group_type_menu = tk.OptionMenu(left_frame, self.group_type_var, *self.get_group_types(), command=self.update_group_type) self.group_type_menu.config(font=("Arial", 10), bg="#f0f0f0") self.group_type_menu.pack(fill=tk.X) # 显示小组类型和人数建议 self.suggestion_label = tk.Label(left_frame, text=self.group_size_suggestion, font=("Arial", 10), bg="#f0f0f0") self.suggestion_label.pack(pady=5) def get_group_types(self): group_types = { "zh": ["学习小组", "工作小组", "项目小组", "其他"], "en": ["Study Group", "Work Group", "Project Group", "Other"] } return group_types[current_language] def change_language(self, lang): if lang == lang_resources["en"]["english"]: set_language("en") else: set_language("zh") self.update_language() self.update_group_type_menu() def update_language(self): self.root.title(lang_resources[current_language]["app_title"]) self.select_file_button.config(text=lang_resources[current_language]["select_file"]) self.draw_button.config(text=lang_resources[current_language]["group"]) self.adjust_button.config(text=lang_resources[current_language]["adjust_group"]) self.stats_button.config(text=lang_resources[current_language]["stats"]) self.clear_button.config(text=lang_resources[current_language]["clear"]) self.save_button.config(text=lang_resources[current_language]["save"]) self.suggestion_label.config(text=suggest_group_size(self.group_type)) self.language_var.set(lang_resources[current_language]["chinese"] if current_language == "zh" else lang_resources[current_language]["english"]) def update_group_type_menu(self): group_types = self.get_group_types() self.group_type_menu['menu'].delete(0, 'end') for group_type in group_types: self.group_type_menu['menu'].add_command(label=group_type, command=lambda value=group_type: self.group_type_var.set(value)) self.group_type_var.set(group_types[0]) self.group_type = group_types[0] self.group_size_suggestion = suggest_group_size(self.group_type) self.suggestion_label.config(text=self.group_size_suggestion) def update_group_type(self, new_group_type): if new_group_type != self.group_type: response = messagebox.askyesno( "切换类型" if current_language == "zh" else "Change Type", "切换小组类型将清除当前分组数据,是否继续?" if current_language == "zh" else "Changing the group type will clear the current group data. Do you want to continue?" ) if response: self.clear_groups() self.group_type = new_group_type self.group_size_suggestion = suggest_group_size(self.group_type) self.suggestion_label.config(text=self.group_size_suggestion) else: self.group_type_var.set(self.group_type) # 恢复原来的值 def read_file(self, file_paths): self.participants = [] # 清空当前参与者列表 for file_path in file_paths: try: if file_path.endswith('.xlsx'): df = pd.read_excel(file_path, engine='openpyxl') elif file_path.endswith('.csv'): df = pd.read_csv(file_path) else: raise ValueError("不支持的文件类型" if current_language == "zh" else "Unsupported file type") columns = df.columns.tolist() if "姓名" in columns or "Name" in columns: self.participants.extend(df['姓名'].dropna().tolist() if "姓名" in columns else df['Name'].dropna().tolist()) else: column_name = self.select_column_name(columns) if column_name: self.participants.extend(df[column_name].dropna().tolist()) except Exception as e: messagebox.showerror(lang_resources[current_language]["error"], f"{str(e)}") if self.participants: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["file_loaded"]) self.data_processed = False def select_files(self): file_paths = filedialog.askopenfilenames(filetypes=[(lang_resources[current_language]["file_type_excel"], "*.xlsx"), (lang_resources[current_language]["file_type_csv"], "*.csv")]) if file_paths: self.selected_file_paths = file_paths self.read_file(self.selected_file_paths) def select_column_name(self, columns): column_window = tk.Toplevel(self.root) column_window.title(lang_resources[current_language]["select_column"]) position_window(column_window, side='center') set_topmost(column_window) column_listbox = tk.Listbox(column_window, font=("Arial", 10)) for column in columns: column_listbox.insert(tk.END, column) column_listbox.pack(pady=5) def confirm_selection(): selected_index = column_listbox.curselection() if selected_index: selected_column = columns[selected_index[0]] column_window.destroy() return selected_column else: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["select_column"]) confirm_button = tk.Button(column_window, text=lang_resources[current_language]["confirm"], command=confirm_selection, font=("Arial", 10), bg="#4CAF50", fg="white") confirm_button.pack(pady=5) column_window.wait_window() return confirm_selection() def draw_groups(self): if not self.participants: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["no_participants"]) return group_name = custom_askstring(lang_resources[current_language]["group_name"], lang_resources[current_language]["group_name_prompt"]) if not group_name: return num_members = custom_askinteger(lang_resources[current_language]["group_size"], lang_resources[current_language]["group_size_prompt"], minvalue=1) if not num_members: return if num_members > len(self.participants): messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["group_size_exceeded"]) return self.groups[group_name] = [] for _ in range(num_members): winner = random.choice(self.participants) while winner in self.groups[group_name]: winner = random.choice(self.participants) self.groups[group_name].append(winner) self.participants.remove(winner) leader = random.choice(self.groups[group_name]) deputy_leader = None if "工作小组" in self.group_type or "Work Group" in self.group_type: deputy_leader = random.choice(self.groups[group_name]) while deputy_leader == leader: deputy_leader = random.choice(self.groups[group_name]) self.update_winners_list(group_name, leader, deputy_leader) if not self.participants: self.data_processed = True def update_winners_list(self, group_name, leader, deputy_leader=None): self.winners_list.insert(tk.END, f"{group_name}\n", "group_name") self.winners_list.tag_configure("group_name", font=("Arial", 12, "bold")) self.winners_list.insert(tk.END, f"{leader} (组长)\n" if current_language == "zh" else f"{leader} (Leader)\n", "leader") self.winners_list.tag_configure("leader", font=("Arial", 10, "bold")) if deputy_leader: self.winners_list.insert(tk.END, f"{deputy_leader} (副组长)\n" if current_language == "zh" else f"{deputy_leader} (Deputy Leader)\n", "deputy_leader") self.winners_list.tag_configure("deputy_leader", font=("Arial", 10, "italic")) for member in self.groups[group_name]: if member != leader and member != deputy_leader: self.winners_list.insert(tk.END, f"{member}\n") self.winners_list.insert(tk.END, "\n") self.winners_list.see(tk.END) def adjust_group(self): if not self.groups: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["no_groups"]) return group_name = custom_askstring("选择分组" if current_language == "zh" else "Select Group", "请输入要调整的分组名:" if current_language == "zh" else "Enter the group name to adjust:") if not group_name or group_name not in self.groups: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["invalid_group"]) return # 询问进行哪种操作:两组调换还是组内更改 operation = custom_askstring("选择操作" if current_language == "zh" else "Select Operation", "请输入操作类型(两组调换/组内更改):" if current_language == "zh" else "Enter operation type (Swap Between Groups/Change Within Group):") if not operation: return if operation.lower() in ["两组调换", "swap between groups"]: # 两组调换逻辑 member = custom_askstring("选择成员" if current_language == "zh" else "Select Member", "请输入要调换的成员姓名:" if current_language == "zh" else "Enter the member's name to swap:") if not member or member not in self.groups[group_name]: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["invalid_member"]) return new_group_name = custom_askstring("选择新分组" if current_language == "zh" else "Select New Group", "请输入目标分组名:" if current_language == "zh" else "Enter the target group name:") if not new_group_name or new_group_name not in self.groups: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["invalid_new_group"]) return # 询问对调还是仅插入 swap_type = custom_askstring("选择调换方式" if current_language == "zh" else "Select Swap Type", "请输入调换方式(对调/仅插入):" if current_language == "zh" else "Enter swap type (Swap/Insert):") if not swap_type: return if swap_type.lower() in ["对调", "swap"]: # 对调逻辑 target_member = custom_askstring("选择目标成员" if current_language == "zh" else "Select Target Member", "请输入目标分组中要对调的成员姓名:" if current_language == "zh" else "Enter the member's name to swap in the target group:") if not target_member or target_member not in self.groups[new_group_name]: messagebox.showinfo("提示" if current_language == "zh" else "Info", "无效的目标成员") return # 执行对调 self.groups[group_name].remove(member) self.groups[new_group_name].remove(target_member) self.groups[group_name].append(target_member) self.groups[new_group_name].append(member) # 询问是否将调换的成员定为组长 set_leader = messagebox.askyesno("设置组长" if current_language == "zh" else "Set Leader", f"是否将 {member} 设为 {new_group_name} 的组长?" if current_language == "zh" else f"Set {member} as the leader of {new_group_name}?") if set_leader: self.groups[new_group_name].remove(member) # 先移除成员 self.groups[new_group_name].insert(0, member) # 将成员设为组长(放在列表首位) elif swap_type.lower() in ["仅插入", "insert"]: # 仅插入逻辑 self.groups[group_name].remove(member) self.groups[new_group_name].append(member) # 询问是否将插入的成员定为组长 set_leader = messagebox.askyesno("设置组长" if current_language == "zh" else "Set Leader", f"是否将 {member} 设为 {new_group_name} 的组长?" if current_language == "zh" else f"Set {member} as the leader of {new_group_name}?") if set_leader: self.groups[new_group_name].remove(member) # 先移除成员 self.groups[new_group_name].insert(0, member) # 将成员设为组长(放在列表首位) elif operation.lower() in ["组内更改", "change within group"]: # 组内更改逻辑 member = custom_askstring("选择成员" if current_language == "zh" else "Select Member", "请输入要更改的成员姓名:" if current_language == "zh" else "Enter the member's name to change:") if not member or member not in self.groups[group_name]: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["invalid_member"]) return # 询问是否将指定成员设为组长 set_leader = messagebox.askyesno("设置组长" if current_language == "zh" else "Set Leader", f"是否将 {member} 设为 {group_name} 的组长?" if current_language == "zh" else f"Set {member} as the leader of {group_name}?") if set_leader: # 将指定成员设为组长(放在列表首位) self.groups[group_name].remove(member) # 先移除成员 self.groups[group_name].insert(0, member) # 将成员设为组长(放在列表首位) else: # 如果不设为组长,直接返回 messagebox.showinfo("提示" if current_language == "zh" else "Info", f"{member} 已被保留在 {group_name} 中,但未被设为组长。" if current_language == "zh" else f"{member} has been retained in {group_name} but not set as the leader.") return self.winners_list.delete(1.0, tk.END) for group_name, members in self.groups.items(): self.update_winners_list(group_name, members[0] if members else None) def show_group_statistics(self): if not self.groups: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["no_groups_stats"]) return stats_window = tk.Toplevel(self.root) stats_window.title("分组统计信息" if current_language == "zh" else "Group Statistics") position_window(stats_window, side='center') set_topmost(stats_window) stats_text = scrolledtext.ScrolledText(stats_window, width=40, height=15, font=("Arial", 10)) stats_text.pack(fill=tk.BOTH, expand=True) total_groups = len(self.groups) total_members = sum(len(members) for members in self.groups.values()) avg_members = total_members / total_groups if total_groups else 0 stats_text.insert(tk.END, f"总分组数:{total_groups}\n" if current_language == "zh" else f"Total Groups: {total_groups}\n") stats_text.insert(tk.END, f"总成员数:{total_members}\n" if current_language == "zh" else f"Total Members: {total_members}\n") stats_text.insert(tk.END, f"平均每个分组的成员数:{avg_members:.2f}\n\n" if current_language == "zh" else f"Average Members per Group: {avg_members:.2f}\n\n") for group_name, members in self.groups.items(): stats_text.insert(tk.END, f"{group_name}:{len(members)}人\n" if current_language == "zh" else f"{group_name}: {len(members)} members\n") stats_text.config(state=tk.DISABLED) def clear_groups(self): self.groups = {} self.participants = [] # 清空参与者列表 self.selected_file_paths = [] # 清空文件路径列表 self.winners_list.delete(1.0, tk.END) self.data_processed = False messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["groups_cleared"]) def save_groups(self): if not self.groups: messagebox.showinfo("提示" if current_language == "zh" else "Info", lang_resources[current_language]["no_groups_save"]) return save_path = filedialog.asksaveasfilename(defaultextension=".xlsx", filetypes=[(lang_resources[current_language]["file_type_excel"], "*.xlsx"), (lang_resources[current_language]["file_type_all"], "*.*")]) if save_path: try: if save_path.endswith('.txt'): with open(save_path, 'w', encoding='utf-8') as f: for group_name, members in self.groups.items(): f.write(f"{group_name}:\n") for member in members: f.write(f"{member}\n") f.write("\n") messagebox.showinfo("保存成功" if current_language == "zh" else "Save Successful", lang_resources[current_language]["saved_txt"]) else: with pd.ExcelWriter(save_path, engine='openpyxl') as writer: for group_name, members in self.groups.items(): df = pd.DataFrame(members, columns=["成员" if current_language == "zh" else "Member"]) df.to_excel(writer, sheet_name=group_name, index=False) messagebox.showinfo("保存成功" if current_language == "zh" else "Save Successful", lang_resources[current_language]["saved_excel"]) except Exception as e: messagebox.showerror("保存失败" if current_language == "zh" else "Save Failed", lang_resources[current_language]["save_error"].format(str(e))) def main(): root = tk.Tk() root.geometry("800x600") # 设置窗口大小 root.title(lang_resources[current_language]["app_title"]) root.configure(bg="#f0f0f0") # 确保主窗口在屏幕正中央 position_window(root, side='center') group_type = "学习小组" if current_language == "zh" else "Study Group" group_size_suggestion = suggest_group_size(group_type) initial_checks(root) app = LotteryApp(root, group_type, group_size_suggestion) root.mainloop() if __name__ == "__main__": main()
六、你对AI辅助代码编写的思考:
AI的帮助满足了我对一些程序功能的幻想,但与此同时我也发现AI给予的程序是具有一定的局限性,很难为我提供一些更好的想法以及功能,所以最后需要我自己去升级优化程序结构,刨除一部分无意义的程序达到优化的目的。
-
2025-3-8 16:33:47@
一、作品名称:Markdown解析器
二、作品创作者及使用的AI工具:吴思辰;deepseek,豆包
三、作品主要功能:
(1)使用tkinter创建了一个图形用户界面(GUI)应用程序,用于解析 Markdown 文本并显示为 HTML 格式。 (2)定义了一个自定义的 Markdown 扩展CodeBlockExtension,用于处理 Markdown 中的代码块,支持语法高亮显示,并为代码块添加交替的背景颜色。 (3)在Text组件中输入 Markdown 文本,点击 “解析 Markdown” 按钮,解析后的 HTML 文本会显示在HTMLLabel组件中。 (4)绑定了鼠标释放事件,用于高亮显示HTMLLabel中选中的文本。
四、作品主要截图
五、作品的代码:
import tkinter as tk import markdown from tkhtmlview import HTMLLabel from markdown.extensions import Extension from markdown.preprocessors import Preprocessor from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter import re class CodeBlockExtension(Extension): def extendMarkdown(self, md): md.preprocessors.register(CodeBlockPreprocessor(md), 'code_block', 175) class CodeBlockPreprocessor(Preprocessor): def run(self, lines): new_lines = [] in_code_block = False code_lines = [] lang = "" counter = 0 for line in lines: if line.startswith("```"): if in_code_block: code = '\n'.join(code_lines) try: lexer = get_lexer_by_name(lang) formatter = HtmlFormatter(style='default', noclasses=True) highlighted_code = highlight(code, lexer, formatter) except ValueError: highlighted_code = f'<pre><code class="{lang}">{code}</code></pre>' # 交替设置代码块背景颜色 bg_color = '#f8f8f8' if counter % 2 == 0 else '#e8e8e8' title_bg_color = '#d8d8d8' if counter % 2 == 0 else '#c8c8c8' html = f'<div class="code-block" style="background-color: {bg_color}; border: 1px solid #ccc; padding: 0; margin: 10px;">' \ f'<div style="background-color: {title_bg_color}; padding: 5px;">' \ f'<span class="lang">{lang}</span></div>' \ f'{highlighted_code}</div>' new_lines.append(html) in_code_block = False code_lines = [] lang = "" counter += 1 else: in_code_block = True lang = line[3:].strip() elif in_code_block: code_lines.append(line) else: new_lines.append(line) return new_lines def convert_and_display(): md_text = md_input.get("1.0", tk.END) html_text = markdown.markdown(md_text, extensions=[CodeBlockExtension()]) html_label.set_html(html_text) def show_selected_text(event): try: # 获取选中的文本范围 start = html_label.index(tk.SEL_FIRST) end = html_label.index(tk.SEL_LAST) # 修改选中范围的背景颜色 html_label.tag_add("selected", start, end) html_label.tag_config("selected", background="yellow") except tk.TclError: # 如果没有选中任何文本,忽略错误 pass root = tk.Tk() root.title("解析Markdown") root.geometry("800x600") md_input = tk.Text(root) md_input.pack(pady=10, fill=tk.BOTH, expand=True) convert_button = tk.Button(root, text="解析Markdown", command=convert_and_display) convert_button.pack(pady=5) html_label = HTMLLabel(root, html="") html_label.pack(pady=10, fill=tk.BOTH, expand=True) # 绑定鼠标释放事件 html_label.bind("<ButtonRelease-1>", show_selected_text) root.mainloop()
六、你对AI辅助代码编写的思考:
AI辅助代码编写优势显著,能大幅提升效率,快速生成常规代码片段,让开发者专注核心逻辑。还降低编程门槛,助力新手入门。但它也存在问题,复杂场景下生成代码准确性欠佳,可能有逻辑错误,且存在安全隐患,比如引入漏洞或引发版权纠纷。过度依赖还会削弱开发者自身能力。因此,需合理运用AI,让其成为编程的得力助手而非主导 。
-
2025-3-3 23:46:55@
一、作品名称:语文互动测验程序
二、作品创作者及使用的AI工具:左恺宸/DeepSeek
三、作品主要功能:
(1)20道随机初二上语文古诗词题目
(2)每题1个正确选项+3个错误选项
(3)答对1题加5分,答错1题减2分
(4)输出最终分数,设置重新开始或结束使用的按钮
四、作品主要截图
五、作品的代码:
import tkinter as tk from tkinter import messagebox, font import random class ChineseQuizApp: def __init__(self): self.window = tk.Tk() self.window.title("古诗文填空小测验") self.window.geometry("800x600") self.window.configure(bg="#E6F3FF") # 自定义字体 self.title_font = font.Font(family="微软雅黑", size=24, weight="bold") self.question_font = font.Font(family="宋体", size=18) self.button_font = font.Font(family="微软雅黑", size=12) # 题目数据 self.questions = [ { "question": "山随 野 ,江入大荒流", "answer": "平野尽", "wrong": ["原野阔", "平野阔", "荒野尽"] }, { "question": "晴川历历汉阳树, 萋萋 洲", "answer": "芳草鹦鹉", "wrong": ["青草黄鹤", "荒草鹦鹉", "草木烟波"] }, { "question": " 烟波江上使人愁", "answer": "日暮乡关何处是", "wrong": ["朝辞白帝彩云间", "孤帆远影碧空尽", "烟笼寒水月笼沙"] }, { "question": "大漠孤烟直, 落日 圆", "answer": "长河", "wrong": ["黄河", "长江", "孤城"] }, { "question": "乱花渐欲迷人眼, 才能 蹄", "answer": "浅草没马", "wrong": ["青草没牛", "深草遮羊", "杂草掩兔"] }, { "question": " 家书抵万金", "answer": "烽火连三月", "wrong": ["战事逾半载", "家国经年别", "乱世无音讯"] }, { "question": "感时花溅泪, 鸟 心", "answer": "恨别惊", "wrong": ["离愁伤", "哀鸣碎", "孤飞痛"] }, { "question": " 浑欲不胜簪", "answer": "白头搔更短", "wrong": ["青丝日渐稀", "朱颜已憔悴", "衣带渐觉宽"] }, { "question": "月下飞天镜, 结 楼", "answer": "云生海", "wrong": ["雾起山", "霞映水", "烟笼阁"] }, { "question": " 铜雀春深锁二乔", "answer": "东风不与周郎便", "wrong": ["若非赤壁东风劲", "假使当年天不助", "若无诸葛借箭谋"] }, { "question": "庭下如积水空明,水中 交横", "answer": "藻荇", "wrong": ["萍藻", "荷叶", "浮萍"] }, { "question": " 猿鸟乱鸣;夕日欲颓, 竞跃", "answer": "晓雾将歇沉鳞", "wrong": ["晨雾初散游鱼", "朝霞未起潜蛟", "薄暮将至飞鸟"] }, { "question": "岂不罹凝寒? 有本性", "answer": "松柏", "wrong": ["竹梅", "柏杨", "青松"] }, { "question": "妻子象禽兽, 行止依 阻", "answer": "衣冠林", "wrong": ["举止山", "起居水", "出入草"] }, { "question": "剧哉边海民, 寄身于 野", "answer": "托身草", "wrong": ["置身荒", "栖身林", "藏身山"] }, { "question": " 路远莫致之", "answer": "馨香盈怀袖", "wrong": ["芳香满衣襟", "幽香绕指柔", "清香透心脾"] }, { "question": "老骥伏枥, 在千里", "answer": "志", "wrong": ["心", "愿", "思"] }, { "question": " 终为土灰", "answer": "腾蛇乘雾", "wrong": ["蛟龙入海", "猛虎归山", "凤凰涅槃"] }, { "question": " 猎马带禽归", "answer": "牧人驱犊返", "wrong": ["农夫荷锄至", "渔翁垂钓回", "樵夫负薪还"] }, { "question": "相顾无相识, 怀 吟", "answer": "长歌采薇", "wrong": ["高歌伐檀", "低唱采葛", "轻咏采苓"] } ] self.current_question = 0 self.score = 0 self.create_welcome_screen() def create_welcome_screen(self): self.clear_window() welcome_frame = tk.Frame(self.window, bg="#E6F3FF") welcome_frame.pack(expand=True) lbl_welcome = tk.Label(welcome_frame, text="欢迎参加古诗文填空测验!", font=self.title_font, bg="#E6F3FF", fg="#2E5984") lbl_welcome.pack(pady=50) btn_start = tk.Button(welcome_frame, text="开始答题", command=self.start_quiz, font=self.button_font, bg="#4A90E2", fg="white", width=15, height=2) btn_start.pack(pady=20) def start_quiz(self): random.shuffle(self.questions) self.current_question = 0 self.score = 0 self.create_quiz_interface() def create_quiz_interface(self): self.clear_window() # 题目显示 question_frame = tk.Frame(self.window, bg="#E6F3FF") question_frame.pack(pady=30) self.lbl_question = tk.Label(question_frame, text=self.questions[self.current_question]["question"], font=self.question_font, bg="#E6F3FF") self.lbl_question.pack() # 选项按钮 options = self.questions[self.current_question]["wrong"] + [self.questions[self.current_question]["answer"]] random.shuffle(options) option_frame = tk.Frame(self.window, bg="#E6F3FF") option_frame.pack(pady=30) self.option_buttons = [] for i, option in enumerate(options): btn = tk.Button(option_frame, text=option, font=self.button_font, width=20, height=2, command=lambda x=option: self.check_answer(x)) btn.grid(row=i//2, column=i%2, padx=10, pady=10) self.option_buttons.append(btn) # 分数显示 self.lbl_score = tk.Label(self.window, text=f"当前得分:{self.score}", font=self.button_font, bg="#E6F3FF") self.lbl_score.pack(pady=20) def check_answer(self, selected): correct = self.questions[self.current_question]["answer"] if selected == correct: self.score += 5 messagebox.showinfo("结果", "回答正确!+5分") else: self.score = max(0, self.score-2) messagebox.showinfo("结果", f"回答错误!-2分\n正确答案:{correct}") self.current_question += 1 if self.current_question < len(self.questions): self.create_quiz_interface() else: self.show_result() def show_result(self): self.clear_window() result_frame = tk.Frame(self.window, bg="#E6F3FF") result_frame.pack(expand=True) lbl_result = tk.Label(result_frame, text=f"测验结束!最终得分:{self.score}/100", font=self.title_font, bg="#E6F3FF") lbl_result.pack(pady=50) btn_restart = tk.Button(result_frame, text="重新开始", command=self.start_quiz, bg="#4A90E2", fg="white", font=self.button_font, width=15) btn_restart.pack(pady=20) btn_quit = tk.Button(result_frame, text="退出程序", command=self.exit_app, bg="#FF6B6B", fg="white", font=self.button_font, width=15) btn_quit.pack(pady=20) def exit_app(self): messagebox.showinfo("感谢", "谢谢使用本程序!") self.window.destroy() def clear_window(self): for widget in self.window.winfo_children(): widget.destroy() def run(self): self.window.mainloop() if __name__ == "__main__": app = ChineseQuizApp() app.run()
六、你对AI辅助代码编写的思考:
AI辅助编程就像智能导航系统,可以帮助我们更快到达目的地。它能自动补全代码、查找错误,甚至生成简单程序,让编写代码更高效。但就像依赖导航可能削弱认路能力,过度依靠AI可能影响编程思维的培养。合理使用应做到:1. 先自己思考再参考AI建议;2. 逐行理解生成代码的逻辑;3. 保持质疑态度,验证结果的正确性。AI是工具而非替代品,就像计算器不能代替数学思维,真正学会编程仍需扎实的基础训练。
-
2025-3-2 23:18:12@
一、作品名称:四字词语消消乐
二、作品创作者及使用的AI工具:李明泽 Kimi
三、作品主要功能:
(1)游玩消消乐,左右移动,上键切换方向,下键加速
(2)每个方块上有一个成语通过这些可以在游玩中认识成语
四、作品主要截图:
五、作品的代码:
import tkinter as tk from tkinter import messagebox import random # 游戏常量 WIDTH = 10 HEIGHT = 20 CELL_SIZE = 30 SHAPES = [ [[1, 1, 1], [0, 1, 0]], [[0, 2, 2], [2, 2, 0]], [[3, 3, 0], [0, 3, 3]], [[4, 0, 0], [4, 4, 4]], [[0, 0, 5], [5, 5, 5]], [[6, 6, 6, 6]], [[7, 7], [7, 7]] ] # 四字词语列表 PHRASES = [ "一帆风顺", "二龙戏珠", "三阳开泰", "四季平安", "五福临门", "六六大顺", "七星高照", "八方来财", "九九归一", "十全十美", "百事可乐", "千秋万代", "万事如意", "心想事成", "恭喜发财", "福星高照" ] class Tetris: def __init__(self, root): self.root = root self.root.title("俄罗斯方块") self.canvas = tk.Canvas(root, width=WIDTH * CELL_SIZE, height=HEIGHT * CELL_SIZE, bg='black') self.canvas.pack() self.board = [[0] * WIDTH for _ in range(HEIGHT)] self.board_text = [["" for _ in range(WIDTH)] for _ in range(HEIGHT)] self.current_shape = None self.next_shape = None self.shape_x = 0 self.shape_y = 0 self.game_over = False self.score = 0 self.phrase_map = self.create_phrase_map() self.spawn_shape() self.spawn_next_shape() self.draw_next_shape() self.root.bind('<Key>', self.handle_key_press) self.game_loop() def create_phrase_map(self): phrase_map = {} for shape in SHAPES: phrase = random.choice(PHRASES) for _ in range(4): shape_tuple = tuple(map(tuple, shape)) phrase_map[shape_tuple] = phrase shape = list(zip(*shape[::-1])) return phrase_map def spawn_shape(self): self.current_shape = self.next_shape if self.next_shape else random.choice(SHAPES) self.next_shape = random.choice(SHAPES) self.shape_x = WIDTH // 2 - len(self.current_shape[0]) // 2 self.shape_y = 0 if self.check_collision(): self.game_over = True messagebox.showinfo("游戏结束", f"你的得分是:{self.score}") self.root.destroy() self.draw_board() def spawn_next_shape(self): self.next_shape = random.choice(SHAPES) def draw_next_shape(self): next_canvas = tk.Canvas(self.root, width=4 * CELL_SIZE, height=4 * CELL_SIZE, bg='black') next_canvas.place(x=WIDTH * CELL_SIZE + 20, y=20) phrase = self.phrase_map[tuple(map(tuple, self.next_shape))] for y, row in enumerate(self.next_shape): for x, cell in enumerate(row): if cell: color = ['black', 'red', 'green', 'blue', 'cyan', 'yellow', 'magenta', 'orange'][cell] next_canvas.create_rectangle(x * CELL_SIZE, y * CELL_SIZE, (x + 1) * CELL_SIZE, (y + 1) * CELL_SIZE, fill=color, outline='white') if len(phrase) > 0: next_canvas.create_text(x * CELL_SIZE + CELL_SIZE // 2, y * CELL_SIZE + CELL_SIZE // 2, text=phrase[0], fill='white', font=('Arial', 10)) phrase = phrase[1:] def game_loop(self): if not self.game_over: self.move_shape(0, 1) self.root.after(500, self.game_loop) def handle_key_press(self, event): if event.keysym == 'Left': self.move_shape(-1, 0) elif event.keysym == 'Right': self.move_shape(1, 0) elif event.keysym == 'Down': self.move_shape(0, 1) elif event.keysym == 'Up': self.rotate_shape() def move_shape(self, dx, dy): if not self.check_collision(dx, dy): self.shape_x += dx self.shape_y += dy self.draw_board() elif dy == 1: self.lock_shape() def rotate_shape(self): rotated_shape = list(zip(*self.current_shape[::-1])) if not self.check_collision(0, 0, rotated_shape): self.current_shape = [list(row) for row in rotated_shape] self.draw_board() def check_collision(self, dx=0, dy=0, shape=None): shape = shape or self.current_shape for y, row in enumerate(shape): for x, cell in enumerate(row): try: if cell and (self.shape_y + y + dy >= HEIGHT or self.shape_x + x + dx < 0 or self.shape_x + x + dx >= WIDTH or self.board[self.shape_y + y + dy][self.shape_x + x + dx]): return True except IndexError: return True return False def draw_board(self): self.canvas.delete('all') for y, row in enumerate(self.board): for x, cell in enumerate(row): if cell: self.draw_cell(x, y, cell, self.board_text[y][x]) phrase = self.phrase_map[tuple(map(tuple, self.current_shape))] for y, row in enumerate(self.current_shape): for x, cell in enumerate(row): if cell: self.draw_cell(self.shape_x + x, self.shape_y + y, cell, phrase[0]) phrase = phrase[1:] def draw_cell(self, x, y, color_id, text=""): color = ['black', 'red', 'green', 'blue', 'cyan', 'yellow', 'magenta', 'orange'][color_id] self.canvas.create_rectangle(x * CELL_SIZE, y * CELL_SIZE, (x + 1) * CELL_SIZE, (y + 1) * CELL_SIZE, fill=color, outline='white') if text: self.canvas.create_text(x * CELL_SIZE + CELL_SIZE // 2, y * CELL_SIZE + CELL_SIZE // 2, text=text, fill='white', font=('Arial', 10)) def lock_shape(self): phrase = self.phrase_map[tuple(map(tuple, self.current_shape))] for y, row in enumerate(self.current_shape): for x, cell in enumerate(row): if cell: self.board[self.shape_y + y][self.shape_x + x] = cell self.board_text[self.shape_y + y][self.shape_x + x] = phrase[0] phrase = phrase[1:] self.clear_lines() self.spawn_shape() self.draw_next_shape() def clear_lines(self): lines_to_clear = [] # 用于记录需要清除的行索引 for i in range(HEIGHT - 1, -1, -1): if 0 not in self.board[i]: lines_to_clear.append(i) lines_cleared = len(lines_to_clear) if lines_cleared: # 根据记录的满行索引,从下往上删除满行 for index in sorted(lines_to_clear, reverse=True): del self.board[index] del self.board_text[index] # 在棋盘顶部插入相应数量的空白行 for _ in range(lines_cleared): self.board.insert(0, [0] * WIDTH) self.board_text.insert(0, [""] * WIDTH) self.score += lines_cleared * 100 self.draw_board() if __name__ == "__main__": root = tk.Tk() game = Tetris(root) root.mainloop()
六、你对AI辅助代码编写的思考:
AI是辅助人们办公的工具,通过这次的AI辅助编写程序我发现AI不但可以帮助我们完成一些我们不会的简单工作,还提高了我们的工作效率,是我们可靠的助手,未来AI的功能还会继续完善,我们的学习和工作将会越来越方便。
-
2025-3-2 17:02:26@
一、作品名称:生日烟花祝贺
二、作品创作者及使用的AI工具: deepseek 三、作品主要功能:
(1)庆祝生日
(2)祝福寿星
(3)烟花秀
四、作品主要截图 (alt+PrtScreen键) 五、作品的代码:
import pygame as pg import random as ra import math import tkinter as tk import random def generate_blessing(): blessings = [ "生日快乐!", "恭喜发财!", "身体健康!", "万事如意!", "心想事成!", "岁岁平安!" ] return random.choice(blessings) def create_popup(blessing): window = tk.Tk() window.title("新年祝福") window.geometry("300x150") label = tk.Label(text=blessing) label.pack() button = tk.Button(text="关闭(点击有惊喜,等10秒!)", command=window.destroy) button.pack() window.mainloop() blessing = generate_blessing() create_popup(blessing) pg.init() pg.display.set_caption("o") winScreen = pg.display.Info() screenWidth = winScreen.current_w screenHeight = winScreen.current_h vector = pg.math.Vector2 trail_colors = [(45, 45, 45), (60, 60, 60), (75, 75, 75), (125, 125, 125), (150, 150, 150)] class Firework: def __init__(self): self.colour = (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)) self.colours = ( (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)), (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)), (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)) ) self.firework = Particle(ra.randint(0,screenWidth), screenHeight, True, self.colour) self.exploded = False self.particles = [] self.min_max_particles = vector(666, 999) def update(self, win): g = vector(0, ra.uniform(0.15, 0.4)) if not self.exploded: self.firework.apply_force(g) self.firework.move() for tf in self.firework.trails: tf.show(win) self.show(win) if self.firework.vel.y >= 0: self.exploded = True self.explode() else: for particle in self.particles: particle.apply_force(vector(g.x + ra.uniform(-1, 1) / 20, g.y / 2 + (ra.randint(1, 8) / 100))) particle.move() for t in particle.trails: t.show(win) particle.show(win) def explode(self): amount = ra.randint(int(self.min_max_particles.x), int(self.min_max_particles.y)) for i in range(amount): self.particles.append(Particle(self.firework.pos.x, self.firework.pos.y, False, self.colours)) def show(self, win): pg.draw.circle(win, self.colour, (int(self.firework.pos.x), int(self.firework.pos.y)), self.firework.size) def remove(self): if self.exploded: for p in self.particles: if p.remove is True: self.particles.remove(p) if len(self.particles) == 0: return True else: return False class Particle: def __init__(self, x, y, firework, colour): self.firework = firework self.pos = vector(x, y) self.origin = vector(x, y) self.radius = 25 self.remove = False self.explosion_radius = ra.randint(15, 25) self.life = 0 self.acc = vector(0, 0) self.trails = [] self.prev_posx = [-10] * 10 self.prev_posy = [-10] * 10 if self.firework: self.vel = vector(0, -ra.randint(17, 20)) self.size = 5 self.colour = colour for i in range(5): self.trails.append(Trail(i, self.size, True)) else: self.vel = vector(ra.uniform(-1, 1), ra.uniform(-1, 1)) self.vel.x *= ra.randint(7, self.explosion_radius + 2) self.vel.y *= ra.randint(7, self.explosion_radius + 2) self.size = ra.randint(2, 4) self.colour = ra.choice(colour) for i in range(5): self.trails.append(Trail(i, self.size, False)) def apply_force(self, force): self.acc += force def move(self): if not self.firework: self.vel.x *= 0.8 self.vel.y *= 0.8 self.vel += self.acc self.pos += self.vel self.acc *= 0 if self.life == 0 and not self.firework: distance = math.sqrt((self.pos.x - self.origin.x) ** 2 + (self.pos.y - self.origin.y) ** 2) if distance > self.explosion_radius: self.remove = True self.decay() self.trail_update() self.life += 1 def show(self, win): pg.draw.circle(win, (self.colour[0], self.colour[1], self.colour[2], 0), (int(self.pos.x), int(self.pos.y)), self.size) def decay(self): if 50 > self.life > 10: ran = ra.randint(0, 30) if ran == 0: self.remove = True elif self.life > 50: ran = ra.randint(0, 5) if ran == 0: self.remove = True def trail_update(self): self.prev_posx.pop() self.prev_posx.insert(0, int(self.pos.x)) self.prev_posy.pop() self.prev_posy.insert(0, int(self.pos.y)) for n, t in enumerate(self.trails): if t.dynamic: t.get_pos(self.prev_posx[n + 1], self.prev_posy[n + 1]) else: t.get_pos(self.prev_posx[n + 5], self.prev_posy[n + 5]) class Trail: def __init__(self, n, size, dynamic): self.pos_in_line = n self.pos = vector(-10, -10) self.dynamic = dynamic if self.dynamic: self.colour = trail_colors[n] self.size = int(size - n / 2) else: self.colour = (255, 255, 200) self.size = size - 2 if self.size < 0: self.size = 0 def get_pos(self, x, y): self.pos = vector(x, y) def show(self, win): pg.draw.circle(win, self.colour, (int(self.pos.x), int(self.pos.y)), self.size) def update(win, fireworks): for fw in fireworks: fw.update(win) if fw.remove(): fireworks.remove(fw) pg.display.update() def fire(): screen = pg.display.set_mode((screenWidth, screenHeight - 66)) clock = pg.time.Clock() fireworks = [Firework() for i in range(2)] running = True font = pg.font.SysFont("comicsansms", 99) text = "Happy Birthday!" text_color = (255, 255, 255) # 字体颜色 rendered_text = font.render(text, True, text_color) while running: clock.tick(99) for event in pg.event.get(): if event.type == pg.QUIT: running = False text_width = rendered_text.get_width() text_height = rendered_text.get_height() text_x = (screenWidth - text_width) // 2 text_y = (screenHeight - text_height) // 2 - 99 screen.fill((20, 20, 30)) screen.blit(rendered_text, (text_x, text_y)) if ra.randint(0, 10) == 1: fireworks.append(Firework()) update(screen, fireworks) pg.quit() quit() if __name__ == "__main__": fire()
六、你对AI辅助代码编写的思考: ai辅助写代码有好有坏,好处是能快速生成代码,弊端是如果提示词不够准确的话生成出的与预期不符,总之,要合理利用。
-
2025-3-2 15:01:50@
一、作品名称:趣味英语挑战程序
二、作品创作者及使用的AI工具:张景智;豆包AI
三、作品主要功能:
(1)难度选择:提供简单、中等、困难三种难度,分别对应 10 对、18 对、25 对单词及释义。 (2)单词随机选取:根据所选难度,从 100 个单词及释义的字典中随机挑选对应数量的单词对,打乱后生成按钮。 (3)游戏玩法:玩家点击两个按钮,若单词与释义匹配,按钮变绿禁用;不匹配则提示错误。 (4)计分计时:匹配成功加 10 分,失败扣 2 分;记录游戏用时,完成所有配对后显示得分和用时。
四、作品主要截图 (alt+PrtScreen键)
**五、作品的代码: **
import tkinter as tk from tkinter import messagebox import random import timeclass WordMatchingGame: def init(self, root): self.root = root self.root.title("英语单词连连看") self.root.geometry("800x600") self.root.configure(bg="#F0F8FF")
self.word_dict = { "apple": "苹果", "banana": "香蕉", "cherry": "樱桃", "dog": "狗", "elephant": "大象", "fish": "鱼", "grape": "葡萄", "horse": "马", "iguana": "鬣蜥", "jaguar": "美洲豹", "kangaroo": "袋鼠", "lion": "狮子", "monkey": "猴子", "nut": "坚果", "owl": "猫头鹰", "pear": "梨", "quail": "鹌鹑", "rabbit": "兔子", "snake": "蛇", "tiger": "老虎", "umbrella": "雨伞", "violin": "小提琴", "whale": "鲸鱼", "xylophone": "木琴", "yak": "牦牛", "zebra": "斑马", "ant": "蚂蚁", "bee": "蜜蜂", "cat": "猫", "duck": "鸭子", "eagle": "鹰", "flamingo": "火烈鸟", "goat": "山羊", "hen": "母鸡", "ibis": "朱鹭", "jellyfish": "水母", "koala": "树袋熊", "lizard": "蜥蜴", "mouse": "老鼠", "newt": "蝾螈", "ostrich": "鸵鸟", "penguin": "企鹅", "quokka": "短尾矮袋鼠", "rat": "老鼠", "seal": "海豹", "turtle": "乌龟", "unicorn": "独角兽", "vulture": "秃鹫", "walrus": "海象", "xerus": "地松鼠", "yeti": "雪人", "zebu": "瘤牛", "ball": "球", "car": "汽车", "desk": "桌子", "egg": "鸡蛋", "fan": "扇子", "guitar": "吉他", "hat": "帽子", "ice cream": "冰淇淋", "jacket": "夹克", "kite": "风筝", "lamp": "灯", "map": "地图", "nest": "鸟巢", "oar": "桨", "pencil": "铅笔", "quilt": "被子", "rope": "绳子", "ship": "船", "train": "火车", "umbrella stand": "伞架", "vest": "背心", "window": "窗户", "xylophone mallet": "木琴槌", "yarn": "纱线", "zoo": "动物园", "book": "书", "chair": "椅子", "door": "门", "eraser": "橡皮擦", "fork": "叉子", "glasses": "眼镜", "hammer": "锤子", "island": "岛屿", "jar": "罐子", "key": "钥匙", "lemon": "柠檬", "mirror": "镜子", "nose": "鼻子", "onion": "洋葱", "piano": "钢琴", "queen": "女王", "ring": "戒指", "sock": "袜子", "truck": "卡车", "underwear": "内衣", "volcano": "火山", "watch": "手表", "xylophone bar": "木琴键", "yogurt": "酸奶", "zipper": "拉链" } # 初始化变量 self.first_click = True self.first_button = None self.matched_pairs = 0 self.num_pairs = 0 self.buttons = [] self.start_time = None self.score = 0 # 创建标题标签 self.title_label = tk.Label(self.root, text="英语单词连连看", font=("Arial", 24), bg="#F0F8FF") self.title_label.pack(pady=20) # 创建难度选择框架 self.difficulty_frame = tk.Frame(self.root, bg="#F0F8FF") self.difficulty_frame.pack(pady=20) # 创建难度选择按钮 self.create_difficulty_buttons() # 创建游戏区域框架 self.game_frame = tk.Frame(self.root, bg="#F0F8FF") self.game_frame.pack(pady=20) # 创建计分和计时标签 self.score_label = tk.Label(self.root, text=f"得分: {self.score}", font=("Arial", 14), bg="#F0F8FF") self.score_label.pack(pady=10) self.time_label = tk.Label(self.root, text="时间: 0 秒", font=("Arial", 14), bg="#F0F8FF") self.time_label.pack(pady=10) def create_difficulty_buttons(self): easy_button = tk.Button(self.difficulty_frame, text="简单", width=10, height=2, command=lambda: self.start_game(10), bg="#98FB98", font=("Arial", 12)) easy_button.pack(side=tk.LEFT, padx=10) medium_button = tk.Button(self.difficulty_frame, text="中等", width=10, height=2, command=lambda: self.start_game(18), bg="#FFFF00", font=("Arial", 12)) medium_button.pack(side=tk.LEFT, padx=10) hard_button = tk.Button(self.difficulty_frame, text="困难", width=10, height=2, command=lambda: self.start_game(25), bg="#FF6347", font=("Arial", 12)) hard_button.pack(side=tk.LEFT, padx=10) def select_words(self, num): # 检查传入的单词数量是否合法 if num <= 0 or num * 2 > len(self.word_dict): raise ValueError("无效的单词数量") all_items = list(self.word_dict.items()) random.shuffle(all_items) selected = all_items[:num] words = [item[0] for item in selected] meanings = [item[1] for item in selected] combined = words + meanings random.shuffle(combined) return combined def check_match(self, button1, button2): text1 = button1.cget("text") text2 = button2.cget("text") if (text1 in self.word_dict and self.word_dict[text1] == text2) or (text2 in self.word_dict and self.word_dict[text2] == text1): button1.config(state=tk.DISABLED, bg="green") button2.config(state=tk.DISABLED, bg="green") self.matched_pairs += 1 self.score += 10 # 匹配成功加 10 分 self.score_label.config(text=f"得分: {self.score}") if self.matched_pairs == self.num_pairs: elapsed_time = time.time() - self.start_time self.time_label.config(text=f"时间: {elapsed_time:.2f} 秒") messagebox.showinfo("恭喜", f"你成功完成了所有配对!得分: {self.score},用时: {elapsed_time:.2f} 秒") else: button1.config(state=tk.NORMAL, bg="SystemButtonFace") button2.config(state=tk.NORMAL, bg="SystemButtonFace") self.score -= 2 # 匹配失败扣 2 分 if self.score < 0: self.score = 0 self.score_label.config(text=f"得分: {self.score}") messagebox.showinfo("错误", "这两个不匹配,请再试一次。") self.first_click = True self.first_button = None def button_click(self, button): if self.first_click: self.first_button = button button.config(state=tk.DISABLED) self.first_click = False else: self.check_match(self.first_button, button) def start_game(self, num): self.num_pairs = num items = self.select_words(num) # 销毁之前的按钮 for btn in self.buttons: btn.destroy() self.buttons = [] rows = (num * 2 + 2) // 4 # 调整为 4 列布局 for i in range(rows): for j in range(4): index = i * 4 + j if index < num * 2: button = tk.Button(self.game_frame, text=items[index], width=20, height=3, command=lambda b=index: self.button_click(self.buttons[b]), font=("Arial", 12)) button.grid(row=i, column=j, padx=5, pady=5) self.buttons.append(button) self.matched_pairs = 0 self.first_click = True self.first_button = None self.score = 0 self.score_label.config(text=f"得分: {self.score}") self.start_time = time.time() self.update_time() def update_time(self): if self.matched_pairs < self.num_pairs: elapsed_time = time.time() - self.start_time self.time_label.config(text=f"时间: {elapsed_time:.2f} 秒") self.root.after(100, self.update_time)
if name == "main": root = tk.Tk() game = WordMatchingGame(root) root.mainloop()
六、你对AI辅助代码编写的思考: 作为一名初二学生,我觉得AI辅助代码编写有利有弊。它能快速找出语法错误,快速根据要求生成代码,还能给出代码思路,帮我节省很多时间。但过度依赖,也会导致问题的出现。我认为AI是好帮手,但我们不能失去自己思考和实践的能力。这样才能让AI更好地让AI为我们服务 。 (结合自己实践写不少于100字的思考)
-
2025-3-2 14:46:54@
**一、作品名称:**走迷宫
**二、作品创作者及使用的AI工具:**deepseek
三、作品主要功能:
(1)完成三关走迷宫
(2)在每一关中,每走一步有30%的几率生成一道计算题,答对向前走一步,答错回答原点
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import tkinter as tk from tkinter import messagebox, simpledialog import random import math class MazeEscapeGame: def __init__(self, root): self.root = root self.root.title("迷宫逃脱游戏 - 多关卡版") self.root.geometry("500x550") # 关卡数据 self.levels = [ { "maze": [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 0, 1], [1, 0, 1, 0, 1, 0, 1, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 1, 1, 1, 0, 1, 0, 1, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 0, 2, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ], "question_difficulty": "easy" # 简单加减乘除 }, { "maze": [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 1, 1, 1, 1, 0, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ], "question_difficulty": "medium" # 平方根、简单代数 }, { "maze": [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 0, 1], [1, 0, 1, 0, 1, 0, 1, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 1, 1, 1, 0, 1, 0, 1, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 0, 2, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ], "question_difficulty": "hard" # 一元一次方程 } ] self.current_level = 0 # 当前关卡 self.maze = self.levels[self.current_level]["maze"] self.question_difficulty = self.levels[self.current_level]["question_difficulty"] # 画布大小 self.canvas = tk.Canvas(root, bg="white", width=500, height=500) self.canvas.pack() # 初始化小球 self.ball = None self.ball_pos = [1, 1] # 小球初始位置 self.draw_maze() self.draw_ball() # 绑定键盘事件 self.root.bind("<KeyPress>", self.move_ball) def draw_maze(self): """绘制迷宫""" self.canvas.delete("all") # 清空画布 for y in range(len(self.maze)): for x in range(len(self.maze[y])): if self.maze[y][x] == 1: # 墙壁 self.canvas.create_rectangle(x * 50, y * 50, (x + 1) * 50, (y + 1) * 50, fill="black") elif self.maze[y][x] == 2: # 出口 self.canvas.create_rectangle(x * 50, y * 50, (x + 1) * 50, (y + 1) * 50, fill="green") def draw_ball(self): """绘制小球""" x, y = self.ball_pos self.ball = self.canvas.create_oval(x * 50 + 10, y * 50 + 10, (x + 1) * 50 - 10, (y + 1) * 50 - 10, fill="blue") def move_ball(self, event): """根据键盘输入移动小球""" x, y = self.ball_pos if event.keysym == "Up" and y > 0 and self.maze[y - 1][x] != 1: self.ball_pos[1] -= 1 elif event.keysym == "Down" and y < len(self.maze) - 1 and self.maze[y + 1][x] != 1: self.ball_pos[1] += 1 elif event.keysym == "Left" and x > 0 and self.maze[y][x - 1] != 1: self.ball_pos[0] -= 1 elif event.keysym == "Right" and x < len(self.maze[0]) - 1 and self.maze[y][x + 1] != 1: self.ball_pos[0] += 1 # 检查是否到达出口 if self.maze[self.ball_pos[1]][self.ball_pos[0]] == 2: if self.current_level < len(self.levels) - 1: self.current_level += 1 # 进入下一关 self.maze = self.levels[self.current_level]["maze"] self.question_difficulty = self.levels[self.current_level]["question_difficulty"] self.ball_pos = [1, 1] # 重置小球位置 self.draw_maze() self.draw_ball() messagebox.showinfo("恭喜", f"通过第 {self.current_level} 关!进入下一关!") else: messagebox.showinfo("胜利", "恭喜你通过了所有关卡!") self.root.quit() # 检查是否需要回答问题 if random.random() < 0.3: # 30% 的概率触发问题 self.ask_question() # 更新小球位置 self.canvas.delete(self.ball) self.draw_ball() def ask_question(self): """根据难度生成数学问题""" if self.question_difficulty == "easy": num1 = random.randint(1, 10) num2 = random.randint(1, 10) operator = random.choice(["+", "-", "*"]) question = f"{num1} {operator} {num2} = ?" answer = str(eval(f"{num1} {operator} {num2}")) elif self.question_difficulty == "medium": if random.random() < 0.5: num = random.randint(1, 20) question = f"√{num * num} = ?" answer = str(num) else: x = random.randint(1, 10) a = random.randint(1, 5) b = random.randint(1, 5) question = f"如果 {a}x + {b} = {a * x + b},x = ?" answer = str(x) elif self.question_difficulty == "hard": a = random.randint(1, 5) b = random.randint(1, 10) c = random.randint(1, 10) question = f"解方程:{a}x + {b} = {c},x = ?" answer = str(round((c - b) / a, 1)) # 弹出对话框让玩家输入答案 user_answer = simpledialog.askstring("问题", question) if user_answer == answer: messagebox.showinfo("正确", "回答正确!") else: messagebox.showinfo("错误", f"回答错误。正确答案是 {answer}") self.ball_pos = [1, 1] # 回答错误,回到起点 self.canvas.delete(self.ball) self.draw_ball() if __name__ == "__main__": root = tk.Tk() game = MazeEscapeGame(root) root.mainloop()
六、你对AI辅助代码编写的思考:
在AI辅助代码开发的过程中,我深刻感受到人机协作的独特价值。AI能在短时间内构建出可运行的基础代码,这相当于为开发者搭建好了脚手架,能快速的完成我们的要求。
-
2025-3-2 14:32:04@
一、作品名称:数学问答
二、作品创作者及使用的AI工具:
三、作品主要功能:
回答数学问题锻炼数学能力
四、作品主要截图
五、作品的代码:
import tkinter as tk from tkinter import messagebox import random import time class MathQuizApp: def __init__(self, root): self.root = root self.root.title("数学小游戏") self.root.geometry("400x300") self.score = 0 self.total_questions = 5 self.time_limit = 10 self.current_question = 0 self.start_time = 0 self.difficulty = tk.StringVar(value="easy") self.setup_widgets() def setup_widgets(self): self.label = tk.Label(self.root, text="欢迎来到数学小游戏!", font=("Arial", 16)) self.label.pack(pady=20) self.difficulty_frame = tk.Frame(self.root) self.difficulty_frame.pack() tk.Radiobutton(self.difficulty_frame, text="简单", variable=self.difficulty, value="easy").pack(side=tk.LEFT) tk.Radiobutton(self.difficulty_frame, text="中等", variable=self.difficulty, value="medium").pack(side=tk.LEFT) tk.Radiobutton(self.difficulty_frame, text="困难", variable=self.difficulty, value="hard").pack(side=tk.LEFT) self.start_button = tk.Button(self.root, text="开始游戏", command=self.start_game) self.start_button.pack(pady=10) self.question_label = tk.Label(self.root, text="", font=("Arial", 14)) self.question_label.pack(pady=20) self.answer_entry = tk.Entry(self.root, font=("Arial", 14)) self.answer_entry.pack(pady=10) self.submit_button = tk.Button(self.root, text="提交答案", command=self.check_answer) self.submit_button.pack(pady=10) self.score_label = tk.Label(self.root, text="得分: 0", font=("Arial", 14)) self.score_label.pack(pady=20) self.timer_label = tk.Label(self.root, text="时间: 10", font=("Arial", 14)) self.timer_label.pack(pady=10) self.hint_button = tk.Button(self.root, text="提示", command=self.give_hint) self.hint_button.pack(pady=10) def start_game(self): self.score = 0 self.current_question = 0 self.score_label.config(text="得分: 0") self.next_question() def next_question(self): if self.current_question < self.total_questions: self.current_question += 1 self.question, self.correct_answer = self.generate_question() self.question_label.config(text=self.question) self.answer_entry.delete(0, tk.END) self.start_time = time.time() self.update_timer() else: self.end_game() def generate_question(self): difficulty = self.difficulty.get() if difficulty == "easy": num1 = random.randint(1, 10) num2 = random.randint(1, 10) operator = random.choice(['+', '-']) elif difficulty == "medium": num1 = random.randint(1, 20) num2 = random.randint(1, 20) operator = random.choice(['+', '-', '*']) elif difficulty == "hard": num1 = random.randint(1, 50) num2 = random.randint(1, 50) operator = random.choice(['+', '-', '*', '/', '**']) if operator == '+': answer = num1 + num2 elif operator == '-': answer = num1 - num2 elif operator == '*': answer = num1 * num2 elif operator == '/': answer = num1 / num2 answer = round(answer, 2) elif operator == '**': answer = num1 ** 2 question = f"{num1} 的平方 = ?" return question, answer question = f"{num1} {operator} {num2} = ?" return question, answer def check_answer(self): user_answer = self.answer_entry.get() try: user_answer = float(user_answer) if user_answer == self.correct_answer: self.score += 1 self.score_label.config(text=f"得分: {self.score}") messagebox.showinfo("正确!", "你的答案是正确的!") else: messagebox.showinfo("错误!", f"正确答案是 {self.correct_answer}") self.next_question() except ValueError: messagebox.showerror("错误", "请输入一个有效的数字!") def update_timer(self): elapsed_time = time.time() - self.start_time remaining_time = max(0, self.time_limit - int(elapsed_time)) self.timer_label.config(text=f"时间: {remaining_time}") if remaining_time > 0: self.root.after(1000, self.update_timer) else: messagebox.showinfo("时间到!", "时间到了!") self.next_question() def give_hint(self): hint = f"提示: 答案是 {self.correct_answer}" messagebox.showinfo("提示", hint) self.score = max(0, self.score - 1) self.score_label.config(text=f"得分: {self.score}") def end_game(self): messagebox.showinfo("游戏结束", f"你的最终得分是 {self.score}/{self.total_questions}") self.start_button.config(state=tk.NORMAL) if __name__ == "__main__": root = tk.Tk() app = MathQuizApp(root) root.mainloop()
六、你对AI辅助代码编写的思考:
AI辅助代码编写能显著提高开发效率和代码质量,通过代码补全、错误检测和自动化测试等功能帮助开发者。尽管AI在理解复杂逻辑和特定领域知识上仍有局限,且可能影响基础编程技能的培养。未来AI工具将更加智能,可能改变编程教育。
-
2025-3-2 14:28:42@
一、作品名称:物理跑酷小游戏
二、作品创作者及使用的AI工具:豆包
三、作品主要功能: 有ui界面,有开始游戏,返回,结束功能 设定积分系统,玩家存活时间达到一定时增加积分 加入四个技能,结合八年级上学期物理知识 获得技能时增加提示和介绍 四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:```python
import random import time # 初始化pygame pygame.init() # 定义常量 WIDTH, HEIGHT = 800, 600 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) PURPLE = (128, 0, 128) # 创建窗口 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("跑酷小游戏") # 字体设置 font = pygame.font.Font(None, 36) # 按钮类 class Button: def __init__(self, x, y, width, height, text, color, hover_color): self.rect = pygame.Rect(x, y, width, height) self.text = text self.color = color self.hover_color = hover_color self.hovered = False def draw(self, screen): current_color = self.hover_color if self.hovered else self.color pygame.draw.rect(screen, current_color, self.rect) text_surface = font.render(self.text, True, WHITE) text_rect = text_surface.get_rect(center=self.rect.center) screen.blit(text_surface, text_rect) def is_clicked(self, pos): return self.rect.collidepoint(pos) def update_hover(self, pos): self.hovered = self.rect.collidepoint(pos) # 技能类 class Skill: def __init__(self, name, description): self.name = name self.description = description def show_info(self): print(f"获得技能: {self.name} - {self.description}") # 定义四个技能 skills = [ Skill("惯性冲刺", "利用惯性原理,短时间内加速冲刺,躲避障碍物"), Skill("浮力漂浮", "借助浮力,暂时漂浮在空中,避开地面障碍物"), Skill("摩擦力减速", "增大摩擦力,使前方障碍物减速,争取更多反应时间"), Skill("弹力反弹", "利用弹力,反弹前方障碍物,清除障碍") ] # 粒子类 class Particle: def __init__(self, x, y, color): self.x = x self.y = y self.color = color self.size = random.randint(1, 3) self.vx = random.uniform(-2, 2) self.vy = random.uniform(-2, 2) self.lifetime = random.randint(10, 30) def update(self): self.x += self.vx self.y += self.vy self.lifetime -= 1 def draw(self, screen): pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.size) def is_dead(self): return self.lifetime <= 0 # 玩家类 class Player: def __init__(self): self.x = 50 self.y = HEIGHT - 50 self.speed = 5 self.score = 0 self.skill = None self.particles = [] def draw(self): pygame.draw.rect(screen, RED, (self.x, self.y, 20, 20)) for particle in self.particles[:]: particle.draw(screen) def move(self): keys = pygame.key.get_pressed() moved = False if keys[pygame.K_UP] and self.y > 0: self.y -= self.speed moved = True if keys[pygame.K_DOWN] and self.y < HEIGHT - 20: self.y += self.speed moved = True if moved: for _ in range(3): self.particles.append(Particle(self.x + 10, self.y + 10, (255, 128, 0))) for particle in self.particles[:]: particle.update() if particle.is_dead(): self.particles.remove(particle) def gain_skill(self): self.skill = random.choice(skills) self.skill.show_info() # 基础障碍物类 class BaseObstacle: def __init__(self): self.x = WIDTH self.y = random.randint(0, HEIGHT - 20) self.speed = 3 self.particles = [] self.color = BLUE def draw(self): pygame.draw.rect(screen, self.color, (self.x, self.y, 20, 20)) for particle in self.particles[:]: particle.draw(screen) def move(self): self.x -= self.speed for _ in range(2): self.particles.append(Particle(self.x + 10, self.y + 10, self.color)) for particle in self.particles[:]: particle.update() if particle.is_dead(): self.particles.remove(particle) # 快速障碍物类 class FastObstacle(BaseObstacle): def __init__(self): super().__init__() self.speed = 5 self.color = YELLOW # 上下移动障碍物类 class VerticalMovingObstacle(BaseObstacle): def __init__(self): super().__init__() self.vy = random.choice([-2, 2]) self.color = PURPLE def move(self): self.x -= self.speed self.y += self.vy if self.y < 0 or self.y > HEIGHT - 20: self.vy = -self.vy for _ in range(2): self.particles.append(Particle(self.x + 10, self.y + 10, self.color)) for particle in self.particles[:]: particle.update() if particle.is_dead(): self.particles.remove(particle) # 游戏主循环 def game_loop(): player = Player() obstacles = [] start_time = time.time() clock = pygame.time.Clock() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() # 生成障碍物 if random.randint(1, 100) < 2: obstacle_type = random.choice([BaseObstacle, FastObstacle, VerticalMovingObstacle]) obstacles.append(obstacle_type()) # 玩家移动 player.move() # 障碍物移动 for obstacle in obstacles[:]: obstacle.move() if obstacle.x < 0: obstacles.remove(obstacle) if (player.x < obstacle.x + 20 and player.x + 20 > obstacle.x and player.y < obstacle.y + 20 and player.y + 20 > obstacle.y): return player.score # 随机获得技能 if random.randint(1, 1000) < 2: player.gain_skill() # 更新积分 elapsed_time = time.time() - start_time player.score = int(elapsed_time) # 绘制背景 screen.fill(WHITE) # 绘制玩家 player.draw() # 绘制障碍物 for obstacle in obstacles: obstacle.draw() # 绘制积分 score_text = font.render(f"积分: {player.score}", True, BLACK) screen.blit(score_text, (10, 10)) pygame.display.flip() clock.tick(60) # UI界面 def ui_menu(): start_button = Button(300, 200, 200, 50, "开始游戏", GREEN, (0, 200, 0)) exit_button = Button(300, 300, 200, 50, "结束", RED, (200, 0, 0)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.MOUSEBUTTONDOWN: if start_button.is_clicked(event.pos): score = game_loop() print(f"游戏结束,你的积分是: {score}") elif exit_button.is_clicked(event.pos): pygame.quit() quit() mouse_pos = pygame.mouse.get_pos() start_button.update_hover(mouse_pos) exit_button.update_hover(mouse_pos) screen.fill(WHITE) start_button.draw(screen) exit_button.draw(screen) pygame.display.flip() # 启动UI界面 ui_menu() 六、你对AI辅助代码编写的思考:我们利用AI写代码的优势是,AI给我们提供了简单输入解决复杂问题的方式,同时让我们写代码变的更迅捷,也为我们提供了灵感,帮助我们解决难题, 但是我们业因对其本质有着深入理解,合理运用AI,我们才能跟好的预判未来的科技发展,和技术进步
-
2025-3-2 13:05:01@
一、作品名称:知识游戏
二、作品创作者及使用的AI工具:Deepseek,kikm
三、作品主要功能:
(1)可以通过游戏来学习知识
(2)移动方块来攻击敌人
(3)有界面
四、作品主要截图
五、作品的代码:
import pygame import random import os
初始化Pygame
pygame.init()
屏幕尺寸
SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600
颜色定义
WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) PURPLE = (128, 0, 128)
创建屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("学科知识大冒险")
时钟
clock = pygame.time.Clock()
加载音效和背景音乐
pygame.mixer.init() sound_folder = "sounds" # 音效文件夹路径
检查音效文件是否存在
def load_sound(file): path = os.path.join(sound_folder, file) if os.path.exists(path): return pygame.mixer.Sound(path) else: print(f"Warning: Sound file '{file}' not found in '{sound_folder}'.") return None
shoot_sound = load_sound("shoot.wav") hit_sound = load_sound("hit.wav") explosion_sound = load_sound("explosion.wav")
加载背景音乐
if os.path.exists(os.path.join(sound_folder, "background.mp3")): pygame.mixer.music.load(os.path.join(sound_folder, "background.mp3")) pygame.mixer.music.play(-1) # 循环播放背景音乐 else: print(f"Warning: Background music 'background.mp3' not found in '{sound_folder}'.")
玩家类
class Player(pygame.sprite.Sprite): def init(self): super().init() self.image = pygame.Surface((50, 50)) self.image.fill(GREEN) self.rect = self.image.get_rect() self.rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT - 50) self.speed = 5 self.weapon = "bullet" # 默认武器 self.lives = 3 # 玩家生命值
def update(self): keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: self.rect.x -= self.speed if keys[pygame.K_RIGHT]: self.rect.x += self.speed if keys[pygame.K_UP]: self.rect.y -= self.speed if keys[pygame.K_DOWN]: self.rect.y += self.speed # 边界检测 if self.rect.left < 0: self.rect.left = 0 if self.rect.right > SCREEN_WIDTH: self.rect.right = SCREEN_WIDTH if self.rect.top < 0: self.rect.top = 0 if self.rect.bottom > SCREEN_HEIGHT: self.rect.bottom = SCREEN_HEIGHT def shoot(self): if self.weapon == "bullet": bullet = Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet) bullets.add(bullet) elif self.weapon == "laser": laser = Laser(self.rect.centerx, self.rect.top) all_sprites.add(laser) bullets.add(laser) elif self.weapon == "bomb": bomb = Bomb(self.rect.centerx, self.rect.top) all_sprites.add(bomb) bullets.add(bomb) elif self.weapon == "missile": missile = Missile(self.rect.centerx, self.rect.top) all_sprites.add(missile) bullets.add(missile) if shoot_sound: shoot_sound.play()
子弹类
class Bullet(pygame.sprite.Sprite): def init(self, x, y): super().init() self.image = pygame.Surface((10, 20)) self.image.fill(RED) self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -10
def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill()
激光类
class Laser(pygame.sprite.Sprite): def init(self, x, y): super().init() self.image = pygame.Surface((20, 40)) self.image.fill(BLUE) self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -15
def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill()
炸弹类
class Bomb(pygame.sprite.Sprite): def init(self, x, y): super().init() self.image = pygame.Surface((20, 20)) self.image.fill(PURPLE) self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -5
def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill()
导弹类
class Missile(pygame.sprite.Sprite): def init(self, x, y): super().init() self.image = pygame.Surface((15, 30)) self.image.fill(YELLOW) self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -12
def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill()
敌人类
class Enemy(pygame.sprite.Sprite): def init(self, speed=3, health=1): super().init() self.image = pygame.Surface((30, 30)) self.image.fill(RED) self.rect = self.image.get_rect() self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width) self.rect.y = random.randint(-100, -40) self.speed = speed self.health = health
def update(self): self.rect.y += self.speed if self.rect.top > SCREEN_HEIGHT + 10: self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width) self.rect.y = random.randint(-100, -40) self.speed = random.randint(1, 4)
快速敌人类
class FastEnemy(Enemy): def init(self): super().init(speed=6, health=1) self.image.fill(YELLOW)
高生命值敌人类
class StrongEnemy(Enemy): def init(self): super().init(speed=2, health=3) self.image.fill(BLUE)
BOSS敌人类
class BossEnemy(pygame.sprite.Sprite): def init(self): super().init() self.image = pygame.Surface((80, 80)) self.image.fill(PURPLE) self.rect = self.image.get_rect() self.rect.centerx = SCREEN_WIDTH // 2 self.rect.y = -80 self.speed = 1 self.health = 10
def update(self): self.rect.y += self.speed if self.rect.top > SCREEN_HEIGHT + 10: self.kill()
问题列表
questions = [ {"question": "What is the capital of France?", "answer": "Paris"}, {"question": "What is 2 + 2?", "answer": "4"}, {"question": "What is the chemical symbol for water?", "answer": "H2O"}, {"question": "Who wrote 'Romeo and Juliet'?", "answer": "Shakespeare"}, {"question": "What is the largest planet in the solar system?", "answer": "Jupiter"}, {"question": "What is the square root of 64?", "answer": "8"}, {"question": "What is the atomic number of oxygen?", "answer": "8"}, {"question": "What year did the Titanic sink?", "answer": "1912"}, ]
创建精灵组
all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() bullets = pygame.sprite.Group()
创建玩家
player = Player() all_sprites.add(player)
初始敌人
for i in range(8): enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy)
分数和关卡
score = 0 level = 1 boss_spawned = False
游戏循环
running = True while running: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player.shoot() elif event.key == pygame.K_1: player.weapon = "bullet" elif event.key == pygame.K_2: player.weapon = "laser" elif event.key == pygame.K_3: player.weapon = "bomb" elif event.key == pygame.K_4: player.weapon = "missile"
# 更新 all_sprites.update() # 检测子弹和敌人的碰撞 hits = pygame.sprite.groupcollide(enemies, bullets, False, True) for enemy, bullet_list in hits.items(): enemy.health -= 1 if enemy.health <= 0: enemy.kill() score += 1 if hit_sound: hit_sound.play() # 随机选择一个问题 q = random.choice(questions) print(q["question"]) user_answer = input("Your answer: ") if user_answer.strip().lower() == q["answer"].lower(): print("Correct!") else: print("Wrong! The correct answer is:", q["answer"]) # 生成新的敌人 if random.random() < 0.3: # 30% 概率生成快速敌人 new_enemy = FastEnemy() elif random.random() < 0.1: # 10% 概率生成高生命值敌人 new_enemy = StrongEnemy() else: new_enemy = Enemy() all_sprites.add(new_enemy) enemies.add(new_enemy) # 检测玩家和敌人的碰撞 hits = pygame.sprite.spritecollide(player, enemies, False) if hits: player.lives -= 1 if player.lives <= 0: print("Game Over! Final Score:", score) running = False else: print(f"Player hit! Lives left: {player.lives}") for enemy in hits: enemy.kill() # 关卡系统 if score >= level * 10 and not boss_spawned: level += 1 print(f"Level Up! Current Level: {level}") boss = BossEnemy() all_sprites.add(boss) enemies.add(boss) boss_spawned = True if boss_spawned and not enemies: boss_spawned = False for _ in range(level * 2): # 每关增加敌人数量 if random.random() < 0.5: new_enemy = FastEnemy() else: new_enemy = Enemy() all_sprites.add(new_enemy) enemies.add(new_enemy) # 渲染 screen.fill(BLACK) all_sprites.draw(screen) # 显示分数、关卡和生命值 font = pygame.font.Font(None, 36) score_text = font.render(f"Score: {score}", True, WHITE) level_text = font.render(f"Level: {level}", True, WHITE) lives_text = font.render(f"Lives: {player.lives}", True, WHITE) screen.blit(score_text, (10, 10)) screen.blit(level_text, (10, 50)) screen.blit(lives_text, (10, 90)) # 刷新屏幕 pygame.display.flip()
pygame.quit()>
六、你对AI辅助代码编写的思考:
- AI辅助代码编写的优势 代码自动补全:AI工具可以根据上下文自动补全代码,减少开发者的输入量。 代码生成:通过自然语言描述需求,AI可以生成基础代码框架或特定功能的代码片段。 快速原型开发:AI可以帮助开发者快速搭建原型,缩短开发周期。 初学者友好:AI工具可以为初学者提供代码示例和解释,帮助他们更快理解编程概念。 多语言支持:AI可以跨多种编程语言提供支持,帮助开发者快速切换技术栈。 代码检查:AI可以实时分析代码,检测潜在的错误、漏洞或不符合最佳实践的地方。 代码优化:AI可以建议更高效的算法或代码结构,提升代码性能。
-
2025-3-2 11:31:09@
一、作品名称:小鸟飞飞
二、作品创作者及使用的AI工具: 游荞和 豆包
三、作品主要功能:
(1)控制小鸟进行游戏
(2)每过一个管道就在屏幕下方生成一句诗中的一个字,当小鸟通过14个管道后刚好生成完一句诗(可以帮助我们学习古诗) 四、作品主要截图 :
五、作品的代码:
import pygame import random # 初始化 pygame pygame.init() # 游戏窗口的宽度和高度 WIDTH = 800 HEIGHT = 600 # 创建游戏窗口 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("小鸟飞飞") # 定义颜色 SKY_BLUE = (135, 206, 250) GRASS_GREEN = (34, 139, 34) BIRD_YELLOW = (255, 255, 0) BIRD_ORANGE = (255, 165, 0) PIPE_BROWN = (139, 69, 19) TEXT_WHITE = (255, 255, 255) # 小鸟相关属性 bird_radius = 20 # 小鸟身体的半径(以圆形示意身体部分) bird_x = 100 bird_y = HEIGHT // 2 # 定义字体,用于显示分数等文字信息 font = pygame.font.Font(None, 36) poem_font = pygame.font.Font(None, 48) # 定义管道类 class Pipe: def __init__(self, speed, gap, score): self.gap = gap # 管道间隙 # 根据分数动态调整管道高度 self.pipe_top_height = random.randint(50, 300 - score // 5) self.pipe_top = pygame.Rect(WIDTH, 0, 80, self.pipe_top_height) # 从屏幕右侧开始生成 self.pipe_bottom = pygame.Rect(self.pipe_top.x, self.pipe_top_height + self.gap, 80, HEIGHT - self.pipe_top_height - self.gap) # 根据分数动态调整管道速度 self.speed = speed + score // 10 def move(self): self.pipe_top.x -= self.speed self.pipe_bottom.x -= self.speed def draw(self): # 绘制顶部管道 pygame.draw.rect(screen, PIPE_BROWN, self.pipe_top) # 绘制顶部管道的顶部装饰 pygame.draw.rect(screen, PIPE_BROWN, (self.pipe_top.x, self.pipe_top.height - 10, self.pipe_top.width, 10)) # 绘制底部管道 pygame.draw.rect(screen, PIPE_BROWN, self.pipe_bottom) # 绘制底部管道的顶部装饰 pygame.draw.rect(screen, PIPE_BROWN, (self.pipe_bottom.x, self.pipe_bottom.y, self.pipe_bottom.width, 10)) def draw_background(): # 绘制天空 screen.fill(SKY_BLUE) # 绘制草地 pygame.draw.rect(screen, GRASS_GREEN, (0, HEIGHT - 50, WIDTH, 50)) # 绘制云朵 cloud_colors = [(255, 255, 255), (240, 240, 240), (230, 230, 230)] cloud_positions = [(100, 50), (300, 100), (600, 80)] for pos, color in zip(cloud_positions, cloud_colors): pygame.draw.ellipse(screen, color, (pos[0], pos[1], 80, 30)) def draw_bird(): # 绘制小鸟身体 pygame.draw.circle(screen, BIRD_YELLOW, (bird_x, bird_y), bird_radius) # 绘制小鸟眼睛 pygame.draw.circle(screen, (0, 0, 0), (bird_x + 10, bird_y - 5), 3) # 绘制小鸟嘴巴 pygame.draw.polygon(screen, BIRD_ORANGE, [(bird_x + bird_radius, bird_y), (bird_x + bird_radius + 10, bird_y - 5), (bird_x + bird_radius + 10, bird_y + 5)]) # 绘制小鸟翅膀 pygame.draw.polygon(screen, BIRD_ORANGE, [(bird_x - 10, bird_y), (bird_x - 20, bird_y - 10), (bird_x - 20, bird_y + 10)]) def game_loop(bird_speed_y, gravity, pipe_speed, pipe_gap, pipe_frequency): global bird_y # 声明使用外部定义的 bird_y 变量 score = 0 pipes = [] last_pipe_spawn_time = pygame.time.get_ticks() # 记录上一次生成管道的时间 clock = pygame.time.Clock() running = True start_time = pygame.time.get_ticks() # 获取游戏开始的时间 poem = "两个黄鹂鸣翠柳" # 要显示的诗句 poem_chars = [] while running: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: bird_speed_y = -8 # 小鸟的移动(应用重力) bird_speed_y += gravity bird_y += bird_speed_y # 绘制背景 draw_background() # 管道的移动、绘制和分数更新逻辑 new_pipes = [] for pipe in pipes: if pygame.time.get_ticks() - start_time >= 3000: # 3000 毫秒(3秒)后管道开始移动和绘制 pipe.move() pipe.draw() if pipe.pipe_top.x > -80: new_pipes.append(pipe) # 判断小鸟是否通过管道,更新分数 if bird_x > pipe.pipe_top.x + pipe.pipe_top.width and pipe not in [p for p in pipes if hasattr(p, 'scored')]: score += 1 pipe.scored = True if score <= len(poem): poem_chars.append(poem[score - 1]) pipes = new_pipes # 检查碰撞(小鸟与管道、边界) bird_rect = pygame.Rect(bird_x - bird_radius, bird_y - bird_radius, bird_radius * 2, bird_radius * 2) for pipe in pipes: if pygame.time.get_ticks() - start_time >= 3000: # 3000 毫秒(3秒)后进行碰撞检测 if bird_rect.colliderect(pipe.pipe_top) or bird_rect.colliderect(pipe.pipe_bottom): return bird_speed_y, score, False if bird_y - bird_radius < 0: bird_y = bird_radius elif bird_y + bird_radius > HEIGHT - 50: return bird_speed_y, score, False # 生成新的管道 current_time = pygame.time.get_ticks() if len(pipes) == 0 or (current_time - last_pipe_spawn_time > pipe_frequency): # 根据难度调整管道生成频率 pipes.append(Pipe(pipe_speed, pipe_gap, score)) last_pipe_spawn_time = current_time # 绘制小鸟 draw_bird() # 绘制分数 score_text = font.render("Score: " + str(score), True, TEXT_WHITE) screen.blit(score_text, (10, 10)) # 绘制诗句 poem_text = "" for char in poem_chars: poem_text += char poem_surface = poem_font.render(poem_text, True, TEXT_WHITE) poem_rect = poem_surface.get_rect(center=(WIDTH // 2, HEIGHT - 25)) screen.blit(poem_surface, poem_rect) pygame.display.flip() return bird_speed_y, score, True def start_screen(): start_font = pygame.font.Font(None, 60) start_text = start_font.render("Press any key to start", True, TEXT_WHITE) text_rect = start_text.get_rect(center=(WIDTH // 2, HEIGHT // 2)) while True: draw_background() screen.blit(start_text, text_rect) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() return elif event.type == pygame.KEYDOWN: return def difficulty_screen(): diff_font = pygame.font.Font(None, 48) diff_text = diff_font.render("Select Difficulty:", True, TEXT_WHITE) easy_text = diff_font.render("Easy", True, TEXT_WHITE) medium_text = diff_font.render("Medium", True, TEXT_WHITE) hard_text = diff_font.render("Hard", True, TEXT_WHITE) diff_text_rect = diff_text.get_rect(center=(WIDTH // 2, HEIGHT // 3)) easy_text_rect = easy_text.get_rect(center=(WIDTH // 2, HEIGHT // 2 - 50)) medium_text_rect = medium_text.get_rect(center=(WIDTH // 2, HEIGHT // 2)) hard_text_rect = hard_text.get_rect(center=(WIDTH // 2, HEIGHT // 2 + 50)) selected_difficulty = None while True: draw_background() screen.blit(diff_text, diff_text_rect) screen.blit(easy_text, easy_text_rect) screen.blit(medium_text, medium_text_rect) screen.blit(hard_text, hard_text_rect) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() return elif event.type == pygame.MOUSEBUTTONDOWN: mouse_pos = pygame.mouse.get_pos() if easy_text_rect.collidepoint(mouse_pos): selected_difficulty = "easy" return 0.3, 3, 400, 2000 # 低难度:重力加速度,管道速度,管道间隙,管道生成频率 elif medium_text_rect.collidepoint(mouse_pos): selected_difficulty = "medium" return 0.5, 5, 300, 1500 # 中难度:重力加速度,管道速度,管道间隙,管道生成频率 elif hard_text_rect.collidepoint(mouse_pos): selected_difficulty = "hard" return 0.7, 7, 200, 1000 # 高难度:重力加速度,管道速度,管道间隙,管道生成频率 def game_over(score): over_font = pygame.font.Font(None, 60) over_text = over_font.render("Game Over! Score: " + str(score), True, TEXT_WHITE) text_rect = over_text.get_rect(center=(WIDTH // 2, HEIGHT // 2)) while True: draw_background() screen.blit(over_text, text_rect) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() return if __name__ == "__main__": start_screen() gravity, pipe_speed, pipe_gap, pipe_frequency = difficulty_screen() bird_speed_y = 0 while True: bird_speed_y, score, running = game_loop(bird_speed_y, gravity, pipe_speed, pipe_gap, pipe_frequency) if not running: game_over(score) break
六、我对AI辅助代码编写的思考: AI辅助代码编写可提高效率、提供知识、激发创新,但存在代码质量、适用性等局限,还可能致能力退化。我们应合理运用,结合自身能力,持续学习提升,积极反馈推动其发展。
-
2025-3-2 11:28:10@
一、作品名称:
医院挂号系统
二、作品创作者及使用的 AI 工具
使用的 AI 工具为 豆包。在创作过程中,借助 豆包 快速了解 Tkinter 库的使用方法,优化代码;利用 豆包 对 SQLite 数据库操作的知识,完善数据库连接等功能;
三、作品主要功能
1.挂号信息录入:用户可以在界面上选择挂号科室,输入姓名、性别、年龄,并选择挂号日期。程序会对输入信息进行验证,确保信息的有效性和完整性。
2.号源管理:模拟了每个科室的号源数量,在用户提交挂号信息时,会检查所选科室在指定日期的号源是否充足。若号源不足,会给出相应提示。
3.防止重复挂号:通过查询数据库,检查用户是否已经在同一科室、同一日期挂过号。若已挂号,会提示用户请勿重复挂号。
4,挂号信息存储:将用户的挂号信息(姓名、性别、年龄、科室、日期)存储到 SQLite 数据库中,方便后续管理和查询。 5.科室知识展示:根据用户选择的科室,在界面上显示该科室的相关知识,帮助用户了解科室的诊治范围和特点。
6.查找功能:用户可以输入关键词进行查找,目前查找功能仅显示输入的关键词,可进一步扩展为在挂号信息或科室知识中进行搜索。
五、作品的代码
import tkinter as tk from tkinter import ttk from tkinter import messagebox from tkcalendar import Calendar import sqlite3 import re # 定义科室知识字典,避免大量的 if - elif 语句,提高代码的可维护性 department_info = { "内科": "内科主要负责诊治各种内脏器官的疾病,包括呼吸内科、心血管内科、消化内科、神经内科、内分泌科、血液内科、肾内科、风湿免疫科等。内科医生通过病史询问、理学检查、实验诊断和影像检查等方法进行诊断和治疗。", "外科": "外科专注于需要手术治疗的疾病,包括普外科、骨科、泌尿外科、肝胆外科、胃肠外科、心脏大血管外科、胸外科、神经外科、烧伤整形科等。外科治疗通常需要更精确的诊断和更高的技术要求。", "妇产科": "妇产科负责女性生殖系统和孕期的医疗保健,包括妇科和产科。妇产科处理女性泌尿、生殖系统疾病以及孕产妇的产前检查和分娩服务。", "儿科": "儿科处理儿童的各种疾病,包括小儿内科和小儿外科。有些综合医院可能没有儿科。", "急诊科": "急诊科处理急性病症,包括急诊内科和急诊外科。急诊内科处理发热、食物中毒、急性心肌梗死等疾病,急诊外科处理车祸、外伤等较大损伤。" } # 模拟号源数据库,每个科室初始号源为 20 个 ticket_source = { "内科": 20, "外科": 20, "妇产科": 20, "儿科": 20, "急诊科": 20 } # 连接数据库 conn = sqlite3.connect('hospital_registration.db') c = conn.cursor() # 创建表 c.execute('''CREATE TABLE IF NOT EXISTS registrations (name TEXT, gender TEXT, age INTEGER, department TEXT, date TEXT)''') def submit_info(): name = name_entry.get().strip() gender = gender_var.get() age = age_entry.get().strip() department = department_var.get() date = cal.get_date() # 输入验证 if not name: messagebox.showerror("错误", "姓名不能为空,请输入姓名。") return if not re.match(r'^[\u4e00-\u9fa5a-zA-Z]+$', name): messagebox.showerror("错误", "姓名只能包含中文或英文字母,请重新输入。") return if not gender: messagebox.showerror("错误", "请选择性别。") return if not age: messagebox.showerror("错误", "年龄不能为空,请输入年龄。") return try: age = int(age) if age < 0: raise ValueError except ValueError: messagebox.showerror("错误", "年龄必须是有效的正整数,请重新输入。") return # 检查号源 if ticket_source[department] <= 0: messagebox.showerror("错误", f"{department} 科室 {date} 号源已售罄,请选择其他科室或其他日期。") return # 检查是否重复挂号 c.execute("SELECT * FROM registrations WHERE name =? AND department =? AND date =?", (name, department, date)) if c.fetchone(): messagebox.showerror("错误", f"您已经在 {date} 为 {department} 科室挂过号,请勿重复挂号。") return # 减少号源 ticket_source[department] -= 1 # 插入数据 c.execute("INSERT INTO registrations VALUES (?,?,?,?,?)", (name, gender, age, department, date)) conn.commit() result_text.delete(1.0, tk.END) result_text.insert(tk.END, f"姓名: {name}\n性别: {gender}\n年龄: {age}\n科室: {department}\n日期: {date}") # 根据选择的科室显示相应的知识 if department in department_info: info_text.delete(1.0, tk.END) info_text.insert(tk.END, department_info[department]) def search_info(): keyword = search_entry.get().strip() if not keyword: messagebox.showerror("错误", "请输入要查找的关键词。") return result_text.delete(1.0, tk.END) result_text.insert(tk.END, f"查找关键词: {keyword}") root = tk.Tk() root.title("医院挂号系统") # 创建一个 Frame 来包含科室选择、姓名输入、性别选择和年龄输入 input_frame = tk.Frame(root) input_frame.grid(row=0, column=0, padx=10, pady=10) # 科室选择 department_label = tk.Label(input_frame, text="科室:") department_label.pack(side=tk.LEFT, padx=5, pady=5) department_var = tk.StringVar() department_combobox = ttk.Combobox(input_frame, textvariable=department_var) department_combobox['values'] = ('内科', '外科', '妇产科', '儿科', '急诊科') department_combobox.pack(side=tk.LEFT, padx=5, pady=5) # 姓名输入 name_label = tk.Label(input_frame, text="姓名:") name_label.pack(side=tk.LEFT, padx=5, pady=5) name_entry = tk.Entry(input_frame) name_entry.insert(0, "请输入姓名") name_entry.bind("<FocusIn>", lambda event: name_entry.delete(0, tk.END) if name_entry.get() == "请输入姓名" else None) name_entry.bind("<FocusOut>", lambda event: name_entry.insert(0, "请输入姓名") if not name_entry.get() else None) name_entry.pack(side=tk.LEFT, padx=5, pady=5) # 性别选择 gender_label = tk.Label(input_frame, text="性别:") gender_label.pack(side=tk.LEFT, padx=5, pady=5) gender_var = tk.StringVar() gender_radiobutton1 = tk.Radiobutton(input_frame, text="男", variable=gender_var, value="男") gender_radiobutton1.pack(side=tk.LEFT, padx=5, pady=5) gender_radiobutton2 = tk.Radiobutton(input_frame, text="女", variable=gender_var, value="女") gender_radiobutton2.pack(side=tk.LEFT, padx=5, pady=5) # 年龄输入 age_label = tk.Label(input_frame, text="年龄:") age_label.pack(side=tk.LEFT, padx=5, pady=5) age_entry = tk.Entry(input_frame) age_entry.insert(0, "请输入年龄") age_entry.bind("<FocusIn>", lambda event: age_entry.delete(0, tk.END) if age_entry.get() == "请输入年龄" else None) age_entry.bind("<FocusOut>", lambda event: age_entry.insert(0, "请输入年龄") if not age_entry.get() else None) age_entry.pack(side=tk.LEFT, padx=5, pady=5) # 日期选择 date_label = tk.Label(root, text="挂号日期:") date_label.grid(row=1, column=0, padx=10, pady=10) cal = Calendar(root, selectmode='day') cal.grid(row=1, column=1, padx=10, pady=10) # 提交按钮 submit_button = tk.Button(root, text="提交", command=submit_info) submit_button.grid(row=2, column=0, columnspan=2, padx=10, pady=10) # 查找功能 search_label = tk.Label(root, text="查找:") search_label.grid(row=3, column=0, padx=10, pady=10) search_entry = tk.Entry(root) search_entry.grid(row=3, column=1, padx=10, pady=10) search_button = tk.Button(root, text="查找", command=search_info) search_button.grid(row=3, column=2, padx=10, pady=10) # 结果显示文本框 result_text = tk.Text(root, height=5, width=40) result_text.grid(row=4, column=0, columnspan=3, padx=10, pady=10) # 科室知识显示 info_label = tk.Label(root, text="科室知识:") info_label.grid(row=5, column=0, padx=10, pady=10) info_text = tk.Text(root, height=5, width=40) info_text.grid(row=5, column=1, columnspan=2, padx=10, pady=10) root.mainloop() # 关闭数据库连接 conn.close()
六、对 AI 辅助代码编写的思考 在使用 AI 辅助编写医院挂号系统的过程中,我深刻体会到了其带来的诸多便利和显著优势。AI 就像是一个知识渊博的助手,能够快速响应并提供所需的代码片段和实现思路。
-
2025-3-2 11:26:43@
一、作品名称:旅游景点推荐
二、作品创作者及使用的AI工具:时舒雅,豆包MarsCode
三、作品主要功能:
(1)填写表格中想要去的省份和日期
(2)就会给你一个当天适合去的旅游景点,或者告诉你当天没有合适的景点
四、作品主要截图 :
五、作品的代码:```language
import requests from bs4 import BeautifulSoup import tkinter as tk from tkinter import messagebox import datetime # 定义一个函数来读取文本文件中的景点信息 def read_spots_file(file_path): with open(file_path, 'r', encoding='utf-8') as f: spots = [line.strip().split(',') for line in f.readlines()] return spots # 定义一个函数来获取天气信息 def get_weather(city): url = f"https://www.weather.com.cn/weather/{city}.shtml" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 添加错误检查 weather_info_tag = soup.find('p', class_='wea') if weather_info_tag is None: print(f"Warning: Could not find weather information for city: {city}") return "N/A" weather_info = weather_info_tag.text return weather_info # 获取多个城市的天气信息 cities = ["北京", "杭州", "上海", "东北", "云南", "西藏", "成都", "贵州", "湖南", "西安", "新疆", "山东", "黑龙江", "湖北", "江西", "四川"] for city in cities: weather = get_weather(city) print(f"The weather in {city} is: {weather}") # 定义一个函数来获取降水信息 def get_precipitation(city): url = f"https://www.weather.com.cn/weather/{city}.shtml" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 添加错误检查 precipitation_info_tag = soup.find('p', class_='wea') if precipitation_info_tag is None: print(f"Warning: Could not find precipitation information for city: {city}") return "N/A" precipitation_info = precipitation_info_tag.text return precipitation_info # 获取多个城市的降水信息 cities = ["北京", "杭州", "上海", "东北", "云南", "西藏", "成都", "贵州", "湖南", "西安", "新疆", "山东", "黑龙江", "湖北", "江西", "四川"] for city in cities: precipitation = get_precipitation(city) print(f"The precipitation in {city} is: {precipitation}") import requests from bs4 import BeautifulSoup def get_crowd_level(city): url = f"https://www.baidu.com/s?wd={city} 人流量" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 这里需要根据实际网页结构来定位人流量信息的位置 # 假设人流量信息在一个class为"crowd-level"的div标签中 crowd_level_tag = soup.find('div', class_='crowd-level') if crowd_level_tag is None: return "N/A" return crowd_level_tag.text # 获取多个城市的人流量信息 cities = ["北京", "杭州", "上海", "东北", "云南", "西藏", "成都", "贵州", "湖南", "西安", "新疆", "山东", "黑龙江", "湖北", "江西", "四川"] for city in cities: crowd_level = get_crowd_level(city) print(f"The crowd level in {city} is: {crowd_level}") import requests from bs4 import BeautifulSoup def get_spot_features(city): url = f"https://www.baidu.com/s?wd={city} 景点特色" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 这里需要根据实际网页结构来定位景点特色信息的位置 # 假设景点特色信息在一个class为"spot-features"的div标签中 spot_features_tag = soup.find('div', class_='spot-features') if spot_features_tag is None: return "N/A" return spot_features_tag.text # 获取多个城市的景点特色信息 cities = ["北京", "杭州", "上海", "东北", "云南", "西藏", "成都", "贵州", "湖南", "西安", "新疆", "山东", "黑龙江", "湖北", "江西", "四川"] for city in cities: spot_features = get_spot_features(city) print(f"The spot features in {city} is: {spot_features}") # 定义一个函数来根据条件推荐景点 def recommend_spot(spots, province, date): suitable_spots = [] for spot in spots: # 检查spot列表的长度 if len(spot) < 2: print(f"Warning: Invalid spot entry: {spot}") continue spot_name = spot[0] city = spot[1] if province not in city: continue weather = get_weather(city) crowd_level = get_crowd_level(spot_name) precipitation = get_precipitation(city) features = get_spot_features(spot_name) # 判断天气条件是否符合要求 if "晴" in weather and "少" in crowd_level and "无降水" in precipitation: suitable_spots.append((spot_name, weather, crowd_level, precipitation, features)) if suitable_spots: # 对合适的景点进行评分并推荐得分最高的景点 recommended_spot = max(suitable_spots, key=lambda x: score_spot(x)) return recommended_spot else: return None # 定义一个函数来对景点进行评分 def score_spot(spot): # 这里可以根据你的需求定义评分规则 # 例如,根据天气、人流量、降水和景点特色的权重来评分 score = 0 if "晴" in spot[1]: score += 10 if "少" in spot[2]: score += 8 if "无降水" in spot[3]: score += 7 if "历史悠久" in spot[4]: score += 5 if "风景优美" in spot[4]: score += 5 return score # 定义一个函数来更新GUI上的景点信息 def update_spot_info(): province = entry_province.get() date_str = entry_date.get() try: date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() except ValueError: messagebox.showerror("错误", "请输入正确的日期格式(YYYY-MM-DD)") return spot = recommend_spot(spots, province, date) if spot: spot_name, weather, crowd_level, precipitation, features = spot # 在Tkinter界面上显示推荐的景点信息 label_spot_name.config(text=f"景点名称:{spot_name}") label_weather.config(text=f"{weather}") label_crowd_level.config(text=f"{crowd_level}") label_precipitation.config(text=f"{precipitation}") label_features.config(text=f"{features}") else: label_spot_name.config(text="没有适合的景点推荐") label_weather.config(text="") label_crowd_level.config(text="") label_precipitation.config(text="") label_features.config(text="") # 创建Tkinter窗口 window = tk.Tk() window.title("旅游景点推荐") # 读取景点信息 spots = read_spots_file('旅行筛选.txt') # 创建标签和输入框来显示和输入省份 label_province = tk.Label(window, text="请输入省份:") label_province.pack() entry_province = tk.Entry(window) entry_province.pack() # 创建标签和输入框来显示和输入日期 label_date = tk.Label(window, text="请输入日期(YYYY-MM-DD):") label_date.pack() entry_date = tk.Entry(window) entry_date.pack() # 创建标签来显示景点信息 label_spot_name = tk.Label(window, text="", font=("Arial", 16)) label_spot_name.pack() label_weather = tk.Label(window, text="", font=("Arial", 12)) label_weather.pack() label_crowd_level = tk.Label(window, text="", font=("Arial", 12)) label_crowd_level.pack() label_precipitation = tk.Label(window, text="", font=("Arial", 12)) label_precipitation.pack() label_features = tk.Label(window, text="", font=("Arial", 12)) label_features.pack() # 创建一个按钮来触发景点信息的更新 button = tk.Button(window, text="推荐景点", command=update_spot_info) button.pack() # 运行Tkinter事件循环 window.mainloop()
六、你对AI辅助代码编写的思考:
AI辅助的效率是比自己写的会快,它能够显著提升开发效率,减少重复劳动。且代码质量会有提高,降低错误率。但是AI所写的不容易理解
-
2025-3-2 11:05:02@
一、作品名称:免疫系统保卫战 - 知识防御系统
二、作品创作者及使用的AI工具:
李牧阳,DeepSeek
三、作品主要功能:
(1)有一个基础的用户界面,可以根据用户选择达成不同目的,如:玩游戏、了解病毒知识、知识测验等。
(2)可以在玩游戏的同时,了解并学习有关生物学中的免疫系统的知识。
四、作品主要截图
五、作品的代码:
import pygame import random import sys # 初始化 pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("免疫系统保卫战 - 知识防御系统") clock = pygame.time.Clock() # 颜色常量 COLORS = { "WHITE": (255, 255, 255), "BLACK": (0, 0, 0), "RED": (255, 0, 0), "GREEN": (0, 255, 0), "BLUE": (0, 0, 255), "GRAY": (200, 200, 200), "DARK_GRAY": (100, 100, 100) } # 游戏精灵类 class Antibody(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((30, 30)) self.image.fill(COLORS["GREEN"]) self.rect = self.image.get_rect(center=(400, 500)) def update(self, keys): if keys[pygame.K_LEFT] and self.rect.left > 0: self.rect.x -= 5 if keys[pygame.K_RIGHT] and self.rect.right < 800: self.rect.x += 5 class Virus(pygame.sprite.Sprite): def __init__(self, virus_type): super().__init__() self.type = virus_type colors = {"流感病毒": (255,0,0), "HIV": (139,0,139), "新冠病毒": (255,165,0)} self.image = pygame.Surface((30, 30)) self.image.fill(colors[virus_type]) self.rect = self.image.get_rect(center=(random.randint(0,800), -50)) self.speed = random.randint(2,4) self.knowledge = { "流感病毒": "通过飞沫传播,疫苗每年更新", "HIV": "攻击免疫细胞,通过血液传播", "新冠病毒": "表面有刺突蛋白,可用mRNA疫苗预防" } def update(self): self.rect.y += self.speed if self.rect.top > 600: self.kill() class Bullet(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = pygame.Surface((5, 10)) self.image.fill(COLORS["WHITE"]) self.rect = self.image.get_rect(center=pos) def update(self): self.rect.y -= 7 if self.rect.bottom < 0: self.kill() # 问答系统 class Quiz: def __init__(self): self.questions = [ {"q": "哪种病毒攻击免疫细胞?", "a": ["HIV", "流感病毒", "新冠病毒"], "correct": 0}, {"q": "mRNA疫苗用于预防?", "a": ["流感病毒", "HIV", "新冠病毒"], "correct": 2}, {"q": "通过飞沫传播的是?", "a": ["HIV", "流感病毒", "埃博拉病毒"], "correct": 1} ] def get_question(self): return random.choice(self.questions) if self.questions else None # 按钮类 class Button: def __init__(self, text, pos, size, callback): self.rect = pygame.Rect(pos, size) self.text = text self.callback = callback self.color = COLORS["GRAY"] self.hover_color = COLORS["DARK_GRAY"] def draw(self, surface): mouse_pos = pygame.mouse.get_pos() color = self.hover_color if self.rect.collidepoint(mouse_pos) else self.color pygame.draw.rect(surface, color, self.rect) font = pygame.font.SysFont("simhei", 24) text_surf = font.render(self.text, True, COLORS["BLACK"]) text_rect = text_surf.get_rect(center=self.rect.center) surface.blit(text_surf, text_rect) def handle_event(self, event): if event.type == pygame.MOUSEBUTTONDOWN and self.rect.collidepoint(event.pos): self.callback() # 游戏状态管理 class GameState: def __init__(self): self.current_state = "main_menu" self.reset_game_state() self.quiz = Quiz() self.quiz_question = None self.quiz_score = 0 def reset_game_state(self): self.score = 0 self.viruses = pygame.sprite.Group() self.bullets = pygame.sprite.Group() self.antibody = pygame.sprite.GroupSingle(Antibody()) self.virus_timer = 0 def change_state(self, new_state): if new_state == "playing": self.reset_game_state() self.current_state = new_state def main_menu(self): screen.fill(COLORS["BLACK"]) title_font = pygame.font.SysFont("simhei", 48) title_text = title_font.render("免疫系统保卫战", True, COLORS["GREEN"]) screen.blit(title_text, (250, 100)) buttons = [ Button("开始游戏", (300, 200), (200, 50), lambda: self.change_state("playing")), Button("病毒图鉴", (300, 270), (200, 50), lambda: self.change_state("knowledge_base")), Button("知识测验", (300, 340), (200, 50), lambda: self.change_state("quiz_mode")), Button("退出游戏", (300, 410), (200, 50), pygame.quit) ] for btn in buttons: btn.draw(screen) return buttons def knowledge_base(self): screen.fill(COLORS["BLACK"]) back_btn = Button("返回", (20, 20), (80, 40), lambda: self.change_state("main_menu")) back_btn.draw(screen) virus_info = [ ("流感病毒", "传播方式: 飞沫传播", "特征: 变异性强", "预防: 每年接种疫苗"), ("HIV病毒", "传播方式: 血液/母婴", "特征: 攻击免疫细胞", "预防: 安全性行为"), ("新冠病毒", "传播方式: 空气传播", "特征: 刺突蛋白", "预防: mRNA疫苗") ] y = 100 for name, *details in virus_info: font = pygame.font.SysFont("simhei", 24) text = font.render(f"{name}: {' | '.join(details)}", True, COLORS["WHITE"]) screen.blit(text, (100, y)) y += 60 return [back_btn] def playing(self): screen.fill(COLORS["BLACK"]) buttons = [Button("返回菜单", (20, 20), (120, 40), lambda: self.change_state("main_menu"))] # 事件处理 for event in pygame.event.get(): if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: self.bullets.add(Bullet(self.antibody.sprite.rect.center)) # 更新游戏状态 self.virus_timer += 1 if self.virus_timer >= 60: self.viruses.add(Virus(random.choice(["流感病毒", "HIV", "新冠病毒"]))) self.virus_timer = 0 keys = pygame.key.get_pressed() self.antibody.update(keys) self.viruses.update() self.bullets.update() # 碰撞检测 for bullet in self.bullets: hit_viruses = pygame.sprite.spritecollide(bullet, self.viruses, True) for virus in hit_viruses: self.score += 10 print(f"知识提示:{virus.knowledge[virus.type]}") if self.score % 100 == 0: q = self.quiz.get_question() print(f"问题:{q['q']}\n选项:{q['a']}") # 绘制游戏元素 self.antibody.draw(screen) self.viruses.draw(screen) self.bullets.draw(screen) # 显示分数 font = pygame.font.SysFont("simhei", 24) score_text = font.render(f"得分: {self.score}", True, COLORS["WHITE"]) screen.blit(score_text, (10, 570)) for btn in buttons: btn.draw(screen) return buttons def quiz_mode(self): screen.fill(COLORS["BLACK"]) buttons = [Button("返回", (20, 20), (80, 40), lambda: self.change_state("main_menu"))] if not self.quiz_question: self.quiz_question = self.quiz.get_question() if self.quiz_question: font = pygame.font.SysFont("simhei", 32) q_text = font.render(self.quiz_question["q"], True, COLORS["WHITE"]) screen.blit(q_text, (100, 100)) y = 200 option_btns = [] for i, ans in enumerate(self.quiz_question["a"]): btn = Button(f"{i+1}. {ans}", (100, y), (600, 40), lambda idx=i: self.check_answer(idx)) btn.draw(screen) option_btns.append(btn) y += 60 buttons.extend(option_btns) for btn in buttons: btn.draw(screen) return buttons def check_answer(self, index): if index == self.quiz_question["correct"]: print("回答正确!") self.quiz_score += 20 else: print(f"错误!正确答案是:{self.quiz_question['a'][self.quiz_question['correct']]}") self.quiz_question = None # 初始化游戏 state = GameState() # 主循环 running = True while running: current_buttons = getattr(state, state.current_state)() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONDOWN: for btn in current_buttons: btn.handle_event(event) pygame.display.flip() clock.tick(60) pygame.quit()
六、你对AI辅助代码编写的思考
我们应该合理使用AI对代码进行辅助编写。在用AI辅助代码编写时,要明确要做什么内容,不能一律听从AI的建议,AI只是用来辅助内容编写的,而不是用来“出主意”的,AI仅只是一个技术手段。在用AI辅助代码编写时,要根据自己想要实现的功能,不断修改提示词,不断完善代码。
-
2025-3-2 10:51:45@
一、作品名称:
数学挑战小游戏
二、作品创作者及使用的AI工具:
李吴昊彤、豆包ai编程
三、作品主要功能:
(1) 随机出题:游戏开始后,系统会随机生成数学题目,题目类型包括加法、减法、乘法和除法运算。例如,可能会出现 “3 + 5 =”、“10 - 4 = ”、“6 × 2 = ”、“12 ÷ 3 = ” 等题目。 (2) 限时答题:为每道题目设置答题时间限制,如 10 秒。当玩家开始答题时,计时器开始倒计时,若在规定时间内未完成答题,则判定该题答错。 (3) 计分统计:根据玩家答题的正确与否进行计分,答对一题得 10 分,答错不得分。游戏结束后,显示玩家的总得分。 (4) 难度递增:随着玩家答对题目的数量增加,题目难度逐渐增大。例如,最初的题目可能是个位数的运算,后续会出现两位数甚至三位数的运算。
四、作品主要截图
五、作品的代码:
import tkinter as tk import random import time # 定义题目类型和范围 operators = ['+', '-', '*', '/'] easy_range = (1, 10) medium_range = (10, 50) hard_range = (50, 100) # 初始化得分 score = 0 difficulty = 1 correct_count = 0 question = "" answer = 0 start_time = 0 def generate_question(): global question, answer, difficulty if difficulty == 1: num1 = random.randint(*easy_range) num2 = random.randint(*easy_range) elif difficulty == 2: num1 = random.randint(*medium_range) num2 = random.randint(*medium_range) else: num1 = random.randint(*hard_range) num2 = random.randint(*hard_range) operator = random.choice(operators) question = f"{num1} {operator} {num2} = " if operator == '+': answer = num1 + num2 elif operator == '-': answer = num1 - num2 elif operator == '*': answer = num1 * num2 else: answer = num1 / num2 question_label.config(text=question) return question, answer def start_game(): global start_time start_time = time.time() generate_question() start_button.config(state=tk.DISABLED) answer_entry.config(state=tk.NORMAL) submit_button.config(state=tk.NORMAL) def check_answer(): global score, correct_count, difficulty, start_time try: user_answer = float(answer_entry.get()) elapsed_time = time.time() - start_time if elapsed_time > 10: result_label.config(text="答题超时,本题答错。", fg="red") elif user_answer == answer: result_label.config(text="回答正确!", fg="green") score += 10 correct_count += 1 if correct_count % 3 == 0 and difficulty < 3: difficulty += 1 difficulty_label.config(text=f"当前难度: {difficulty}") else: result_label.config(text=f"回答错误,正确答案是: {answer}", fg="red") score_label.config(text=f"当前得分: {score}") answer_entry.delete(0, tk.END) start_time = time.time() generate_question() except ValueError: result_label.config(text="输入无效,请输入数字。", fg="red") # 创建主窗口 root = tk.Tk() root.title("数学挑战小游戏") # 题目标签 question_label = tk.Label(root, text="点击开始游戏", font=("Arial", 20)) question_label.pack(pady=20) # 难度标签 difficulty_label = tk.Label(root, text=f"当前难度: {difficulty}", font=("Arial", 14)) difficulty_label.pack(pady=10) # 得分标签 score_label = tk.Label(root, text=f"当前得分: {score}", font=("Arial", 14)) score_label.pack(pady=10) # 答案输入框 answer_entry = tk.Entry(root, font=("Arial", 16), state=tk.DISABLED) answer_entry.pack(pady=10) # 开始按钮 start_button = tk.Button(root, text="开始游戏", font=("Arial", 14), command=start_game) start_button.pack(pady=10) # 提交按钮 submit_button = tk.Button(root, text="提交答案", font=("Arial", 14), state=tk.DISABLED, command=check_answer) submit_button.pack(pady=10) # 结果标签 result_label = tk.Label(root, text="", font=("Arial", 14)) result_label.pack(pady=10) # 运行主循环 root.mainloop()
六、你对AI辅助代码编写的思考:
在本次使用 AI 辅助编写数学挑战小游戏代码的过程中,我深刻体会到了 AI 在编程领域的巨大价值。AI 工具能够快速提供代码示例,为我搭建起了游戏的基本框架,节省了大量的时间和精力。当遇到代码错误时,AI 可以帮助我分析错误原因,提供解决思路,让我能够迅速定位并修复问题。 然而,AI 辅助编程也并非完美无缺。它给出的代码可能并不完全符合实际需求,需要我根据具体情况进行调整和优化。而且,过度依赖 AI 可能会导致自身编程能力的提升受限。因此,在使用 AI 辅助编程时,我们应该将其作为一种辅助工具,而不是完全依赖它。同时,要不断学习和思考,提高自己的编程水平,这样才能更好地利用 AI 工具,创造出高质量的代码。 此外,AI 辅助编程还能激发我们的创造力。它可以提供一些新颖的算法和思路,让我们在编程过程中不断探索和尝试,从而开发出更具创新性的作品。总之,AI 辅助编程是一把双刃剑,我们要合理利用它,让它成为我们编程道路上的有力助手。
-
2025-3-2 10:41:52@
一、作品名称:简洁小画版
二、作品创作者及使用的AI工具:Kimi
三、作品主要功能:
(1)可以从txt中选择画笔;
(2)可以设置画笔粗细、颜色,画板大小;
(3)开始绘画后可以使用鼠标进行绘画;
(4)结束绘画后可以将其保存至本地;
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import tkinter as tk from tkinter import ttk, colorchooser, filedialog, simpledialog, messagebox from PIL import ImageGrab, Image, ImageTk class PaintApp: def __init__(self, root): self.root = root self.root.title("绘画小画板") self.root.geometry("1000x700") # 设置初始窗口大小 # 初始化画笔参数 self.brush_size = 5 self.brush_color = "black" self.old_x = None self.old_y = None self.drawing_tool = "brush" # 默认为画笔模式 self.shape_type = None # 当前选择的图形类型 self.temp_shape_id = None # 临时图形的ID self.eraser_size = 10 # 擦头大小 self.lines = [] # 存储绘制的线条 self.image_id = None # 导入图片的ID self.image = None # 导入的图片 self.image_tk = None # 导入图片的Tkinter对象 self.image_x = 0 # 图片的x坐标 self.image_y = 0 # 图片的y坐标 self.image_scale = 1.0 # 图片的缩放比例 self.image_alpha = 1.0 # 图片的透明度 # 创建菜单栏 self.menu_bar = tk.Menu(self.root) self.root.config(menu=self.menu_bar) # 添加画笔设置菜单 self.brush_menu = tk.Menu(self.menu_bar, tearoff=0) self.menu_bar.add_cascade(label="画笔", menu=self.brush_menu) self.brush_menu.add_command(label="选择颜色", command=self.choose_color) self.brush_menu.add_command(label="设置粗细", command=self.set_brush_size) # 添加擦头设置菜单 self.eraser_menu = tk.Menu(self.menu_bar, tearoff=0) self.menu_bar.add_cascade(label="擦头", menu=self.eraser_menu) self.eraser_menu.add_command(label="设置大小", command=self.set_eraser_size) # 添加画板设置菜单 self.canvas_menu = tk.Menu(self.menu_bar, tearoff=0) self.menu_bar.add_cascade(label="画板", menu=self.canvas_menu) self.canvas_menu.add_command(label="设置大小", command=self.set_canvas_size) # 添加保存菜单 self.save_menu = tk.Menu(self.menu_bar, tearoff=0) self.menu_bar.add_cascade(label="保存", menu=self.save_menu) self.save_menu.add_command(label="保存图片", command=self.save_image) # 创建工具栏 self.toolbar = ttk.Frame(self.root, padding=5) self.toolbar.pack(side="top", fill="x") # 添加绘制基本图形的按钮 self.create_button = ttk.Button(self.toolbar, text="创建图形", command=self.create_shape) self.create_button.pack(side="left", padx=5, pady=5) # 添加擦头按钮 self.eraser_button = ttk.Button(self.toolbar, text="擦头", command=self.use_eraser) self.eraser_button.pack(side="left", padx=5, pady=5) # 添加画笔按钮 self.brush_button = ttk.Button(self.toolbar, text="画笔", command=self.use_brush) self.brush_button.pack(side="left", padx=5, pady=5) # 添加撤回按钮 self.undo_button = ttk.Button(self.toolbar, text="撤回", command=self.undo) self.undo_button.pack(side="left", padx=5, pady=5) # 添加导入图片按钮 self.import_button = ttk.Button(self.toolbar, text="导入图片", command=self.import_image) self.import_button.pack(side="left", padx=5, pady=5) # 添加调节图片透明度按钮 self.alpha_button = ttk.Button(self.toolbar, text="调节透明度", command=self.adjust_alpha) self.alpha_button.pack(side="left", padx=5, pady=5) # 创建画板 self.canvas_frame = ttk.Frame(self.root) self.canvas_frame.pack(fill="both", expand=True, padx=10, pady=10) self.canvas = tk.Canvas(self.canvas_frame, bg="white", width=800, height=600) self.canvas.pack(fill="both", expand=True) # 绑定鼠标事件 self.canvas.bind("<Button-1>", self.start_drawing) self.canvas.bind("<B1-Motion>", self.paint) self.canvas.bind("<ButtonRelease-1>", self.reset) self.canvas.bind("<Button-3>", self.start_drag_image) self.canvas.bind("<B3-Motion>", self.drag_image) # 创建状态栏 self.status_bar = ttk.Label(self.root, text="当前工具:画笔 | 画笔大小:5 | 颜色:黑色", relief="sunken", anchor="w") self.status_bar.pack(fill="x", side="bottom") # 更新状态栏 self.update_status_bar() def update_status_bar(self): self.status_bar.config(text=f"当前工具:{self.drawing_tool} | 画笔大小:{self.brush_size} | 颜色:{self.brush_color}") def choose_color(self): color_code = colorchooser.askcolor(title="选择画笔颜色") if color_code: self.brush_color = color_code[1] self.update_status_bar() def set_brush_size(self): size = simpledialog.askinteger("输入", "画笔粗细(1-50)", minvalue=1, maxvalue=50) if size: self.brush_size = size self.update_status_bar() def set_eraser_size(self): size = simpledialog.askinteger("输入", "擦头大小(1-50)", minvalue=1, maxvalue=50) if size: self.eraser_size = size def set_canvas_size(self): width = simpledialog.askinteger("输入", "画板宽度(100-1920)", minvalue=100, maxvalue=1920) height = simpledialog.askinteger("输入", "画板高度(100-1080)", minvalue=100, maxvalue=1080) if width and height: self.canvas.config(width=width, height=height) def start_drawing(self, event): self.old_x = event.x self.old_y = event.y def paint(self, event): if self.drawing_tool == "brush": if self.old_x and self.old_y: line_id = self.canvas.create_line(self.old_x, self.old_y, event.x, event.y, width=self.brush_size, fill=self.brush_color, capstyle=tk.ROUND, smooth=tk.TRUE, splinesteps=36) self.lines.append(line_id) self.old_x = event.x self.old_y = event.y elif self.drawing_tool == "eraser": if self.old_x and self.old_y: self.canvas.create_line(self.old_x, self.old_y, event.x, event.y, width=self.eraser_size, fill="white", capstyle=tk.ROUND, smooth=tk.TRUE, splinesteps=36) self.old_x = event.x self.old_y = event.y elif self.drawing_tool == "shape": if self.temp_shape_id: self.canvas.delete(self.temp_shape_id) if self.shape_type == "circle": self.temp_shape_id = self.canvas.create_oval(self.old_x, self.old_y, event.x, event.y, outline=self.brush_color, width=self.brush_size) elif self.shape_type == "square": side = abs(event.x - self.old_x) self.temp_shape_id = self.canvas.create_rectangle(self.old_x, self.old_y, self.old_x + side, self.old_y + side, outline=self.brush_color, width=self.brush_size) elif self.shape_type == "rectangle": self.temp_shape_id = self.canvas.create_rectangle(self.old_x, self.old_y
六、你对AI辅助代码编写的思考:
AI在不断的自我进化和演化,它虽处于初步阶段,十分检查无创新性,却在如生命科学等方面起辅助和促进和加速作用。 AI在我们的日常生活中为我们提供便利,也在学习方面为我们的提供新途径。但任何事有利必有弊,如果我们在生活中应用于不好的方面,并过于依赖于它,影响成绩,减少了人们在日常生活中的思考。 面对AI我们应当: 理智面对,如面对游戏一般,做到不沉迷,不被其控制,而是去通过合理利用来做到让其帮助自己,成为自己的工具。
-
2025-3-2 10:30:37@
一、作品名称: 英语单词拼写小游戏
二、作品创作者: 韦瑾雯 使用的AI工具: Kimi
三、作品主要功能:
(1)给出英文单词和中文翻译,控制小蛇吃对应的字母,拼写出给出的单词
(2)已背单词中显示在游戏中拼写正确的单词及翻译
(3)能够学习和记忆单词
四,作品主要截图:
五、作品的代码:
import pygame import random # 初始化 Pygame pygame.init() # 设置屏幕大小 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("英语单词拼写游戏 - 贪吃蛇版") # 定义颜色 background_color = (173, 216, 230) # 浅蓝色 text_color = (0, 0, 0) # 黑色 button_color = (100, 100, 100) button_hover_color = (150, 150, 150) button_text_color = (255, 255, 255) # 单词库 word_library = [ ("apple", "苹果"), ("banana", "香蕉"), ("cherry", "樱桃"), ("dog", "狗"), ("elephant", "大象"), ("fish", "鱼"), ("grape", "葡萄"), ("house", "房子"), ("igloo", "冰屋"), ("jacket", "夹克"), ("kangaroo", "袋鼠"), ("lemon", "柠檬"), ("monkey", "猴子"), ("nest", "鸟巢"), ("orange", "橙子"), ("penguin", "企鹅"), ("queen", "女王"), ("rainbow", "彩虹"), ("strawberry", "草莓"), ("tiger", "老虎"), ("umbrella", "伞"), ("violin", "小提琴"), ("watermelon", "西瓜"), ("xylophone", "木琴"), ("yellowstone", "黄石"), ("zebra", "斑马"), ("airplane", "飞机"), ("bicycle", "自行车"), ("cat", "猫"), ("dolphin", "海豚"), ("egg", "蛋"), ("flamingo", "火烈鸟"), ("giraffe", "长颈鹿"), ("hedgehog", "刺猬"), ("iguana", "鬣蜥"), ("jellyfish", "水母"), ("kite", "风筝"), ("lion", "狮子"), ("mango", "芒果"), ("ninja", "忍者"), ("octopus", "章鱼"), ("panda", "熊猫"), ("quokka", "短尾矮袋鼠"), ("rabbit", "兔子"), ("sunflower", "向日葵"), ("turtle", "乌龟"), ("unicorn", "独角兽"), ("vulture", "秃鹫"), ("whale", "鲸鱼"), ("xylophone", "木琴"), ("yacht", "游艇"), ("zeppelin", "飞艇") ] # 随机选择一个单词 def get_random_word(): return random.choice(word_library) # 按钮类 class Button: def __init__(self, text, x, y, width, height, action=None): self.text = text self.rect = pygame.Rect(x, y, width, height) self.action = action self.hovered = False def draw(self): color = button_hover_color if self.hovered else button_color pygame.draw.rect(screen, color, self.rect) font = pygame.font.SysFont('simhei', 24) # 使用中文字体 text_surface = font.render(self.text, True, button_text_color) screen.blit(text_surface, (self.rect.x + (self.rect.width - text_surface.get_width()) // 2, self.rect.y + (self.rect.height - text_surface.get_height()) // 2)) def check_hover(self, pos): self.hovered = self.rect.collidepoint(pos) def check_click(self, pos): if self.rect.collidepoint(pos) and self.action: self.action() # 游戏状态 state = "start" # 游戏初始化 score = 0 snake_pos = [screen_width // 2, screen_height // 2] snake_body = [[screen_width // 2, screen_height // 2]] direction = 'RIGHT' change_to = direction snake_size = 20 snake_speed = 10 current_word = get_random_word() letters = list(current_word[0]) random.shuffle(letters) letter_positions = [(random.randint(0, screen_width - 20), random.randint(0, screen_height - 20)) for _ in letters] learned_words = [] # 已背单词列表 all_words = [current_word] # 记录所有出现过的单词 # 游戏界面 def start_game(): global state state = "game" # 已背单词界面 def show_learned_words(): global state state = "learned_words" # 返回初始界面 def back_to_start(): global state state = "start" # 游戏主逻辑 def game_loop(): global score, snake_pos, snake_body, direction, change_to, current_word, letters, letter_positions # 确保蛇不能反向移动 if change_to == 'UP' and direction != 'DOWN': direction = 'UP' if change_to == 'DOWN' and direction != 'UP': direction = 'DOWN' if change_to == 'LEFT' and direction != 'RIGHT': direction = 'LEFT' if change_to == 'RIGHT' and direction != 'LEFT': direction = 'RIGHT' # 移动蛇头 if direction == 'UP': snake_pos[1] -= snake_speed if direction == 'DOWN': snake_pos[1] += snake_speed if direction == 'LEFT': snake_pos[0] -= snake_speed if direction == 'RIGHT': snake_pos[0] += snake_speed # 蛇身体增长机制 snake_body.insert(0, list(snake_pos)) if len(snake_body) > len(current_word[0]) + 1: # 蛇的长度根据单词长度增长 snake_body.pop() # 检查是否碰到字母 for i, pos in enumerate(letter_positions): if abs(snake_pos[0] - pos[0]) < snake_size and abs(snake_pos[1] - pos[1]) < snake_size: if letters[i] == current_word[0][0]: # 检查是否是单词的第一个字母 score += 10 # 正确字母加分 letters.pop(i) # 移除已拼写的字母 letter_positions.pop(i) # 移除字母位置 current_word = (current_word[0][1:], current_word[1]) # 更新单词 if not current_word[0]: # 如果单词拼写完成 learned_words.append(current_word) # 添加到已背单词 current_word = get_random_word() while current_word in all_words: # 避免重复单词 current_word = get_random_word() all_words.append(current_word) # 记录新单词 letters = list(current_word[0]) random.shuffle(letters) letter_positions = [(random.randint(0, screen_width - 20), random.randint(0, screen_height - 20)) for _ in letters] else: score -= 5 # 错误字母减分 # 重新开始当前单词 current_word = get_random_word() while current_word in all_words: # 避免重复单词 current_word = get_random_word() all_words.append(current_word) # 记录新单词 letters = list(current_word[0]) random.shuffle(letters) letter_positions = [(random.randint(0, screen_width - 20), random.randint(0, screen_height - 20)) for _ in letters] break # 游戏结束条件 if (snake_pos[0] < 0 or snake_pos[0] >= screen_width or snake_pos[1] < 0 or snake_pos[1] >= screen_height or snake_pos in snake_body[1:]): score -= 5 # 撞到边界减分 game_over() # 游戏结束函数(积分清零并重新开始) def game_over(): global score, snake_pos, snake_body, direction, change_to, current_word, letters, letter_positions snake_pos = [screen_width // 2, screen_height // 2] snake_body = [[screen_width // 2, screen_height // 2]] direction = 'RIGHT' change_to = direction current_word = get_random_word() while current_word in all_words: # 避免重复单词 current_word = get_random_word() all_words.append(current_word) # 记录新单词 letters = list(current_word[0]) random.shuffle(letters) letter_positions = [(random.randint(0, screen_width - 20), random.randint(0, screen_height - 20)) for _ in letters] # 显示分数 def show_score(): font = pygame.font.SysFont('simhei', 20) # 使用中文字体 score_text = font.render(f"分数: {score}", True, text_color) screen.blit(score_text, (10, 10)) # 显示单词及其解释 def show_word(word): font = pygame.font.SysFont('simhei', 24) # 使用中文字体 word_text = font.render(f"拼写单词: {word[0]} - {word[1]}", True, text_color) screen.blit(word_text, (screen_width // 2 - 150, 50)) # 显示字母 def show_letters(letters, positions): font = pygame.font.SysFont('simhei', 24) # 使用中文字体 for letter, pos in zip(letters, positions): letter_text = font.render(letter, True, text_color) screen.blit(letter_text, (pos[0] - 20, pos[1] - 10)) # 显示已背单词 def show_learned_words_screen(): font = pygame.font.SysFont('simhei', 24) # 使用中文字体 title_font = pygame.font.SysFont('simhei', 32) # 标题字体稍大 title_text = title_font.render("已背单词", True, text_color) screen.blit(title_text, (screen_width // 2 - 80, 10)) # 标题位置 for i, word in enumerate(all_words): # 显示所有出现过的单词 text_surface = font.render(f"{word[0]} - {word[1]}", True, text_color) screen.blit(text_surface, (screen_width // 2 - 150, 50 + i * 30)) # 显示初始页面 def show_start_screen(): title_font = pygame.font.SysFont('simhei', 48, bold=True) # 标题字体更大且加粗 title_text = title_font.render("英语单词拼写", True, text_color) screen.blit(title_text, (screen_width // 2 - 160, 80)) # 标题位置稍微往下移 start_button.draw() learned_words_button.draw() # 初始化按钮 start_button = Button("开始游戏", screen_width // 2 - 100, screen_height // 2 - 50, 200, 50, start_game) learned_words_button = Button("已背单词", screen_width // 2 - 100, screen_height // 2 + 50, 200, 50, show_learned_words) exit_button = Button("退出", screen_width - 100, 10, 80, 30, back_to_start) # 退出按钮 # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.MOUSEMOTION: start_button.check_hover(event.pos) learned_words_button.check_hover(event.pos) exit_button.check_hover(event.pos) if event.type == pygame.MOUSEBUTTONDOWN: start_button.check_click(event.pos) learned_words_button.check_click(event.pos) exit_button.check_click(event.pos) if event.type == pygame.KEYDOWN and state == "game": if event.key == pygame.K_UP or event.key == ord('w'): change_to = 'UP' if event.key == pygame.K_DOWN or event.key == ord('s'): change_to = 'DOWN' if event.key == pygame.K_LEFT or event.key == ord('a'): change_to = 'LEFT' if event.key == pygame.K_RIGHT or event.key == ord('d'): change_to = 'RIGHT' # 清屏 screen.fill(background_color) # 根据游戏状态显示不同界面 if state == "start": show_start_screen() elif state == "game": game_loop() for pos in snake_body: pygame.draw.rect(screen, text_color, pygame.Rect(pos[0], pos[1], snake_size, snake_size)) show_word(current_word) show_letters(letters, letter_positions) show_score() exit_button.draw() # 显示退出按钮 elif state == "learned_words": show_learned_words_screen() exit_button.draw() # 在已背单词界面也显示退出按钮 # 刷新屏幕 pygame.display.update() # 控制游戏速度 pygame.time.Clock().tick(15) pygame.quit()
六、你对AI辅助代码编写的思考: 使用AI辅助代码编写是一种非常高效和便捷的方式,可以显著提高我们写代码效率和代码质量;用AI写代码前需明确自己的思路,向AI给出提示词时需向AI描述清楚代码要实现的功能有哪些,这样AI才能高效的实现你的需求;此外,AI生成的代码可能在性能和安全性上不是最优的,需要人们多次仔细修改、完善、检查和测试,才能得到自己想要的效果。
-
2025-3-2 10:09:46@
一、作品名称:飞机大战——诗句挑战
二、作品创作者及使用的AI工具:豆包
三、作品主要功能:
(1)控制飞机射击敌机
(2)收集敌机上的字组成诗句
(3)击中携带错误字的敌机受到惩罚
四、作品主要截图
五、作品的代码:
import pygame import random import os import time import math # 初始化pygame pygame.init() # 设置屏幕大小 screen_width = 480 screen_height = 640 screen = pygame.display.set_mode((screen_width, screen_height)) # 设置窗口标题 pygame.display.set_caption("飞机大战") # 加载背景图片 try: background = pygame.image.load("background.png") except pygame.error as e: print(f"无法加载背景图片: {e}") pygame.quit() quit() # 加载飞机图片 try: player_img = pygame.image.load("player.png") player_rect = player_img.get_rect() player_rect.topleft = (screen_width // 2 - player_rect.width // 2, screen_height - player_rect.height - 30) except pygame.error as e: print(f"无法加载飞机图片: {e}") pygame.quit() quit() # 加载子弹图片 try: bullet_img = pygame.image.load("bullet.png") bullet_rect = bullet_img.get_rect() except pygame.error as e: print(f"无法加载子弹图片: {e}") pygame.quit() quit() # 加载敌机图片 try: enemy_img = pygame.image.load("enemy.png") # 这里不再使用 enemy_rect 作为全局变量,避免混淆 enemy_base_rect = enemy_img.get_rect() except pygame.error as e: print(f"无法加载敌机图片: {e}") pygame.quit() quit() # 加载空投图片 try: airdrop_img = pygame.image.load("airdrop.png") airdrop_rect = airdrop_img.get_rect() except pygame.error: print("无法加载空投图片,请确保 airdrop.png 文件存在。") pygame.quit() quit() airdrops = [] # 加载爆炸图片 explode_imgs = [] for i in range(1, 5): try: img = pygame.image.load(f"explode{i}.png") explode_imgs.append(img) except pygame.error as e: print(f"无法加载爆炸图片 {i}: {e}") pygame.quit() quit() # 定义爆炸效果类 class Explosion: def __init__(self, center): self.center = center self.frame = 0 self.last_update = pygame.time.get_ticks() self.frame_rate = 50 # 每50毫秒切换一张图片 def update(self): now = pygame.time.get_ticks() if now - self.last_update > self.frame_rate: self.last_update = now self.frame += 1 if self.frame == len(explode_imgs): return True # 爆炸结束 return False def draw(self, screen): screen.blit(explode_imgs[self.frame], self.center) # 设置帧率 clock = pygame.time.Clock() # 初始化血量和分数 player_health = 3 score = 0 # 敌机生成频率 enemy_spawn_rate = int(50 * 1.1) # 降低 15% enemy_move_speed = 5 * 0.8 # 降低 20% 的移动速度 airdrop_move_speed = enemy_move_speed * 0.5 # 空投速度比敌机慢 50% # 字体设置 try: font = pygame.font.Font("Deng.ttf", 36) except pygame.error: print("无法加载字体文件,使用默认字体") font = pygame.font.SysFont(None, 36) # 读取最高得分 def read_high_score(): if os.path.exists("high_score.txt"): with open("high_score.txt", "r") as file: return int(file.read()) return 0 # 保存最高得分 def save_high_score(high_score): with open("high_score.txt", "w") as file: file.write(str(high_score)) # 获取当前最高得分 high_score = read_high_score() # 古诗列表 poems = [ "远上寒山石径斜白云生处有人家", "水光潋滟晴方好山色空蒙雨亦奇", "月落乌啼霜满天江枫渔火对愁眠", "大漠孤烟直长河落日圆", "孤帆远影碧空尽唯见长江天际流", "粉骨碎身浑不怕要留清白在人间", "咬定青山不放松立根原在破岩中", "千磨万击还坚劲任尔东西南北风", "荷尽已无擎雨盖菊残犹有傲霜枝", "劝君更尽一杯酒西出阳关无故人" ] current_poem = "" collected_chars = [] char_positions = [] completed_poems = [] # 记录已挑战的古诗 # 干扰字符集 distractor_chars = "甲乙丙丁戊己庚辛壬癸子丑寅卯辰巳午未申酉戌亥" # 开始新一轮古诗挑战 def start_new_poem_challenge(): global current_poem, collected_chars, char_positions, enemy_spawn_rate available_poems = [poem for poem in poems if poem not in completed_poems] if not available_poems: return False # 所有古诗都已挑战完成 current_poem = random.choice(available_poems) collected_chars = [] char_positions = [] for i in range(len(current_poem)): x = 50 + i * 30 y = screen_height - 50 char_positions.append((x, y)) # 每完成一轮挑战,提高 10% 的敌机生成频率 enemy_spawn_rate = int(enemy_spawn_rate * 1.1) return True # 开始界面 def show_start_screen(): title_font = pygame.font.Font("Deng.ttf", 80) title_text = title_font.render("飞机大战", True, (255, 255, 255)) title_text_rect = title_text.get_rect(center=(screen_width // 2, screen_height // 2 - 150)) start_font = font start_text = start_font.render("开始游戏", True, (255, 255, 255)) start_text_rect = start_text.get_rect(center=(screen_width // 2, screen_height // 2)) screen.blit(background, (0, 0)) screen.blit(title_text, title_text_rect) screen.blit(start_text, start_text_rect) pygame.display.flip() waiting = True while waiting: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() return if event.type == pygame.MOUSEBUTTONDOWN: waiting = False return # 失败提示动画及跳转死亡界面 def show_fail_animation(): fail_font = pygame.font.Font("Deng.ttf", 72) fail_text = fail_font.render("失败", True, (128, 128, 128)) fail_rect = fail_text.get_rect(center=(screen_width // 2, -fail_text.get_height())) falling_speed = 5 while fail_rect.top < screen_height // 2: screen.blit(background, (0, 0)) fail_rect.move_ip(0, falling_speed) screen.blit(fail_text, fail_rect) pygame.display.flip() clock.tick(60) # 死亡界面 def show_death_screen(current_score): global high_score, player_health, score, enemy_spawn_rate, current_poem, collected_chars, completed_poems if current_score > high_score: high_score = current_score save_high_score(high_score) death_font = font death_text = death_font.render("再来一次", True, (255, 255, 255)) current_score_text = death_font.render(f"本次得分: {current_score}", True, (255, 255, 255)) high_score_text = death_font.render(f"最高得分: {high_score}", True, (255, 255, 255)) death_text_rect = death_text.get_rect(center=(screen_width // 2, screen_height // 2)) high_score_text_rect = high_score_text.get_rect(center=(screen_width // 2, death_text_rect.top - 100)) current_score_text_rect = current_score_text.get_rect(center=(screen_width // 2, high_score_text_rect.bottom + 40)) screen.blit(background, (0, 0)) screen.blit(high_score_text, high_score_text_rect) screen.blit(current_score_text, current_score_text_rect) screen.blit(death_text, death_text_rect) pygame.display.flip() waiting = True while waiting: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() return if event.type == pygame.MOUSEBUTTONDOWN: waiting = False # 重置游戏状态 player_health = 3 score = 0 enemy_spawn_rate = int(50 * 1.1 * 0.85) current_poem = "" collected_chars = [] completed_poems = [] # 重新开始游戏 game_loop() return # 游戏胜利界面 def show_win_screen(): win_font = font win_text = win_font.render("游戏胜利!点击鼠标重新开始", True, (255, 255, 255)) win_text_rect = win_text.get_rect(center=(screen_width // 2, screen_height // 2)) screen.blit(background, (0, 0)) screen.blit(win_text, win_text_rect) pygame.display.flip() waiting = True while waiting: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() return if event.type == pygame.MOUSEBUTTONDOWN: waiting = False show_start_screen() # 点击重新开始后跳转开始界面 return def game_loop(): global player_health, score, enemy_spawn_rate, current_poem, collected_chars, completed_poems, airdrop_rect # 添加 airdrop_rect 到 global 声明 running = True explosions = [] # 用于存储爆炸效果的列表 airdrop_last_time = time.time() # 记录上次空投时间 if not start_new_poem_challenge(): show_win_screen() return bullets = [] # 初始化子弹列表 enemies = [] # 初始化敌机列表 while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: # 鼠标左键 bullet_rect.topleft = (player_rect.left + player_rect.width // 2 - bullet_rect.width // 2, player_rect.top - bullet_rect.height) bullets.append(bullet_rect.copy()) # 获取鼠标位置 mouse_pos = pygame.mouse.get_pos() player_rect.centerx = mouse_pos[0] player_rect.centery = screen_height - player_rect.height - 30 # 移动子弹 for bullet in bullets[:]: bullet.move_ip(0, -10) if bullet.bottom < 0: bullets.remove(bullet) # 生成敌机 if random.randint(1, enemy_spawn_rate) == 1: if current_poem: # 15% 的概率生成干扰敌机 if random.random() < 0.2: char = random.choice(distractor_chars) else: available_chars = [char for char in current_poem if char not in collected_chars] if available_chars: char = random.choice(available_chars) else: continue # 每次生成敌机时复制一个新的矩形 new_enemy_rect = enemy_base_rect.copy() new_enemy_rect.topleft = (random.randint(0, screen_width - new_enemy_rect.width), -new_enemy_rect.height) enemies.append((new_enemy_rect, char)) # 生成空投 current_time = time.time() if current_time - airdrop_last_time >= 20: new_airdrop_rect = airdrop_rect.copy() # 这里现在可以正确访问全局的 airdrop_rect new_airdrop_rect.topleft = (random.randint(0, screen_width - new_airdrop_rect.width), -new_airdrop_rect.height) angle = random.uniform(-30, 30) # 随机向左或向右偏差 0 - 30 度 airdrop_dx = math.sin(math.radians(angle)) * airdrop_move_speed airdrop_dy = math.cos(math.radians(angle)) * airdrop_move_speed airdrops.append((new_airdrop_rect, airdrop_dx, airdrop_dy)) airdrop_last_time = current_time # 移动敌机 for enemy in enemies[:]: enemy_rect = enemy[0] enemy_rect.move_ip(0, enemy_move_speed) if enemy_rect.top > screen_height: enemies.remove(enemy) # 检测敌机是否碰到玩家飞机 if enemy_rect.colliderect(player_rect): enemies.remove(enemy) player_health -= 1 # 创建玩家飞机的爆炸效果 explosion = Explosion(player_rect.center) explosions.append(explosion) if player_health <= 0: running = False # 移动空投 for airdrop in airdrops[:]: airdrop_rect, airdrop_dx, airdrop_dy = airdrop new_x = airdrop_rect.x + airdrop_dx new_y = airdrop_rect.y + airdrop_dy # 处理空投碰到屏幕边缘反弹 if new_x < 0 or new_x > screen_width - airdrop_rect.width: airdrop_dx = -airdrop_dx if new_y > screen_height: airdrops.remove(airdrop) continue airdrop_rect.x = new_x airdrop_rect.y = new_y if airdrop_rect.colliderect(player_rect): airdrops.remove(airdrop) player_health = min(10, player_health + 1) # 血量上限为 10 # 检测子弹和敌机碰撞 for bullet in bullets[:]: for enemy in enemies[:]: enemy_rect = enemy[0] if bullet.colliderect(enemy_rect): bullets.remove(bullet) enemies.remove(enemy) char = enemy[1] if char not in current_poem: # 击中错误敌机,本轮挑战失败 score = max(0, score - 10) if score < 10: player_health = max(0, player_health - 1) for enemy in enemies[:]: explosion = Explosion(enemy[0].center) explosions.append(explosion) enemies.remove(enemy) if player_health <= 0: running = False if not start_new_poem_challenge(): show_win_screen() return elif char not in collected_chars: collected_chars.append(char) # 创建敌机的爆炸效果 explosion = Explosion(enemy_rect.center) explosions.append(explosion) score += 1 # 检查是否收集完古诗 if sorted(collected_chars) == sorted(list(current_poem)): score *= 2 completed_poems.append(current_poem) # 让所有有关这轮古诗挑战的敌机自动爆炸 for enemy in enemies[:]: explosion = Explosion(enemy[0].center) explosions.append(explosion) enemies.remove(enemy) if not start_new_poem_challenge(): show_win_screen() return # 绘制背景 screen.blit(background, (0, 0)) # 绘制飞机 screen.blit(player_img, player_rect) # 绘制子弹 for bullet in bullets: screen.blit(bullet_img, bullet) # 绘制敌机和上面的字 for enemy in enemies: enemy_rect = enemy[0] char = enemy[1] screen.blit(enemy_img, enemy_rect) char_text = font.render(char, True, (255, 0, 0)) # 字的颜色改为红色 char_rect = char_text.get_rect(center=enemy_rect.center) screen.blit(char_text, char_rect) # 绘制空投 for airdrop in airdrops: airdrop_rect, _, _ = airdrop screen.blit(airdrop_img, airdrop_rect) # 更新爆炸效果 for explosion in explosions[:]: if explosion.update(): explosions.remove(explosion) else: explosion.draw(screen) # 绘制收集的字 for i, char in enumerate(collected_chars): char_text = font.render(char, True, (255, 0, 0)) # 字的颜色改为红色 pos = char_positions[current_poem.index(char)] screen.blit(char_text, pos) # 完成 score_text 的赋值 score_text = font.render(f"分数: {score}", True, (255, 255, 255)) # 绘制血量和分数 health_text = font.render(f"血量: {player_health}", True, (255, 255, 255)) screen.blit(health_text, (10, 10)) screen.blit(score_text, (10, 50)) # 更新显示 pygame.display.flip() # 设置帧率 clock.tick(60) if player_health <= 0: show_fail_animation() show_death_screen(score) # 显示开始界面 show_start_screen() # 进入游戏主循环 game_loop() # 退出 pygame pygame.quit()
六、你对AI辅助代码编写的思考: AI 辅助代码编写,它能快速生成基础代码框架,大幅提升编程效率。但过度依赖也会削弱开发者自主思考能力。我们要使其成为助力,而非替代人类智慧,所以我们还是需要学习编程。
-
2025-3-2 10:03:52@
一、作品名称:成语连连看
二、作品创作者及使用的AI工具:豆包
三、作品主要功能:
(1) 随机字词展示 游戏会从预定义的成语列表(如 “一心一意”“三心二意” 等)中提取所有的汉字字符,然后将这些字符进行随机打乱。
(2)成语组合 玩家通过点击界面上的字符按钮,选择自己认为能组成成语的字符。每点击一个按钮,该按钮会被禁用,防止重复选择。 当玩家选择的字符数量达到当前需要组成的成语的长度时,游戏会检查玩家组成的字符串是否为正确的成语。
(3)游戏进度提示 界面上有一个标签会显示当前要组成的成语的长度,让玩家明确目标。
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import tkinter as tk import random # 定义一些成语 idioms = ["一心一意", "三心二意", "四面楚歌", "五湖四海", "七上八下", "八面玲珑"] all_characters = "".join(idioms) shuffled_chars = list(all_characters) random.shuffle(shuffled_chars) selected_chars = [] current_idiom_index = 0 # 创建主窗口 root = tk.Tk() root.title("成语连连看") # 显示打乱的字词 buttons = [] for i, char in enumerate(shuffled_chars): def on_click(c=char, b_index=i): button_click(c, b_index) button = tk.Button(root, text=char, width=3, height=1, command=on_click) button.grid(row=i // 6, column=i % 6) buttons.append(button) # 显示当前要组成的成语长度提示 length_label = tk.Label(root, text=f"当前要组成的成语长度: {len(idioms[current_idiom_index])}") length_label.grid(row=len(idioms), columnspan=6) # 显示提示信息 hint_label = tk.Label(root, text="") hint_label.grid(row=len(idioms) + 1, columnspan=6) def button_click(char, button_index): global selected_chars, current_idiom_index selected_chars.append(char) buttons[button_index].config(state=tk.DISABLED) if len(selected_chars) == len(idioms[current_idiom_index]): formed_idiom = "".join(selected_chars) if formed_idiom == idioms[current_idiom_index]: hint_label.config(text="正确!继续下一个成语。") current_idiom_index += 1 if current_idiom_index == len(idioms): hint_label.config(text="恭喜你,全部成语都已组成!游戏结束。") for button in buttons: button.config(state=tk.DISABLED) else: length_label.config(text=f"当前要组成的成语长度: {len(idioms[current_idiom_index])}") else: hint_label.config(text="错误,请重新选择。") for char in selected_chars: index = shuffled_chars.index(char) buttons[index].config(state=tk.NORMAL) selected_chars = [] def give_hint(): current_idiom = idioms[current_idiom_index] hint_text = "" for i, char in enumerate(current_idiom): if i < len(selected_chars): hint_text += char else: hint_text += "_" hint_label.config(text=f"提示: {hint_text}") # 提示按钮 hint_button = tk.Button(root, text="提示", command=give_hint) hint_button.grid(row=len(idioms) + 2, columnspan=6) # 运行主循环 root.mainloop()
六、你对AI辅助代码编写的思考: AI 辅助代码编写优势显著,能快速输出基础代码框架,还可提供优化建议,提升开发效率与代码质量。但它也有局限,生成代码不一定契合具体需求,且过度依赖会削弱开发者思维能力。开发者应合理借助 AI,同时加强自身能力,让二者相辅相成。
-
2025-3-2 9:36:08@
一、作品名称:坦克大战——成语挑战
二、作品创作者及使用的AI工具:DeepSeek/豆包
三、作品主要功能:
(1)通过操控绿色坦克依次击打正确顺序的成语,获得游戏的胜利。
(2)被成语坦克攻击到时,游戏是失败(可以重新挑战)。
(3)没有按顺序击打成语坦克时,游戏失败(可以重新挑战)
四、作品主要截图
五、作品的代码:
import pygame import random import math # 初始化Pygame pygame.init() # 设置屏幕尺寸 WIDTH, HEIGHT = 800, 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("坦克大战 - 成语挑战") # 检查是否支持“微软雅黑”字体 try: font = pygame.font.Font("msyh.ttf", 72) medium_font = pygame.font.Font("msyh.ttf", 48) small_font = pygame.font.Font("msyh.ttf", 36) except: # 如果系统中没有“微软雅黑”,则使用默认字体 font = pygame.font.SysFont(None, 72) medium_font = pygame.font.SysFont(None, 48) small_font = pygame.font.SysFont(None, 36) # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) LIGHT_BLUE = (173, 216, 230) # 子弹类 class Bullet: def __init__(self, x, y, direction): self.x = x self.y = y self.radius = 5 self.color = BLACK self.speed = 10 self.direction = direction # 'up', 'down', 'left', 'right' def move(self): if self.direction == 'up': self.y -= self.speed elif self.direction == 'down': self.y += self.speed elif self.direction == 'left': self.x -= self.speed elif self.direction == 'right': self.x += self.speed def draw(self, surface): pygame.draw.circle(surface, self.color, (self.x, self.y), self.radius) def is_off_screen(self): return self.x < 0 or self.x > WIDTH or self.y < 0 or self.y > HEIGHT # 坦克类 class Tank: def __init__(self, x, y, color, character=None): self.x = x self.y = y self.width = 40 self.height = 40 self.color = color self.speed = 5 self.direction = 'up' self.bullets = [] self.character = character # 成语字符 def move(self, keys_pressed): if keys_pressed[pygame.K_LEFT] and self.x - self.speed > 0: self.x -= self.speed self.direction = 'left' if keys_pressed[pygame.K_RIGHT] and self.x + self.speed + self.width < WIDTH: self.x += self.speed self.direction = 'right' if keys_pressed[pygame.K_UP] and self.y - self.speed > 0: self.y -= self.speed self.direction = 'up' if keys_pressed[pygame.K_DOWN] and self.y + self.speed + self.height < HEIGHT: self.y += self.speed self.direction = 'down' def shoot(self): if self.direction == 'up': bullet_x = self.x + self.width // 2 bullet_y = self.y elif self.direction == 'down': bullet_x = self.x + self.width // 2 bullet_y = self.y + self.height elif self.direction == 'left': bullet_x = self.x bullet_y = self.y + self.height // 2 elif self.direction == 'right': bullet_x = self.x + self.width bullet_y = self.y + self.height // 2 bullet = Bullet(bullet_x, bullet_y, self.direction) self.bullets.append(bullet) def draw(self, surface): pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height)) for bullet in self.bullets: bullet.draw(surface) def update_bullets(self): for bullet in self.bullets[:]: bullet.move() if bullet.is_off_screen(): self.bullets.remove(bullet) # 敌方坦克类 class EnemyTank(Tank): def __init__(self, x, y, color, character): super().__init__(x, y, color, character) self.speed = 2 self.direction = random.choice(['up', 'down', 'left', 'right']) self.shoot_cooldown = 0 def move(self): if random.randint(0, 100) < 5: self.direction = random.choice(['up', 'down', 'left', 'right']) if self.direction == 'up' and self.y - self.speed > 0: self.y -= self.speed elif self.direction == 'down' and self.y + self.speed + self.height < HEIGHT: self.y += self.speed elif self.direction == 'left' and self.x - self.speed > 0: self.x -= self.speed elif self.direction == 'right' and self.x + self.speed + self.width < WIDTH: self.x += self.speed def shoot(self): if self.shoot_cooldown == 0: if self.direction == 'up': bullet_x = self.x + self.width // 2 bullet_y = self.y elif self.direction == 'down': bullet_x = self.x + self.width // 2 bullet_y = self.y + self.height elif self.direction == 'left': bullet_x = self.x bullet_y = self.y + self.height // 2 elif self.direction == 'right': bullet_x = self.x + self.width bullet_y = self.y + self.height // 2 bullet = Bullet(bullet_x, bullet_y, self.direction) self.bullets.append(bullet) self.shoot_cooldown = 60 # 60 frames = 1 second def update(self): self.move() self.shoot() if self.shoot_cooldown > 0: self.shoot_cooldown -= 1 self.update_bullets() def draw(self, surface): pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height)) if self.character: text = small_font.render(self.character, True, BLACK) text_rect = text.get_rect(center=(self.x + self.width//2, self.y + self.height//2)) surface.blit(text, text_rect) for bullet in self.bullets: bullet.draw(surface) # 菜单类 class Menu: def __init__(self): self.start_button = pygame.Rect(WIDTH//2 - 100, HEIGHT//2 - 50, 200, 50) self.exit_button = pygame.Rect(WIDTH//2 - 100, HEIGHT//2 + 10, 200, 50) self.buttons = [self.start_button, self.exit_button] self.button_color = BLUE self.animating = False self.animation_step = 0 self.animation_direction = 1 def draw(self, surface): surface.fill(LIGHT_BLUE) # 修改背景颜色为浅蓝色 title_text = font.render("坦克大战 - 成语挑战", True, BLACK) title_rect = title_text.get_rect(center=(WIDTH//2, HEIGHT//2 - 150)) surface.blit(title_text, title_rect) # 动画效果:按钮颜色渐变 if self.animating: self.button_color = ( self.button_color[0] + self.animation_step * self.animation_direction, self.button_color[1] + self.animation_step * self.animation_direction, self.button_color[2] + self.animation_step * self.animation_direction ) if self.button_color[0] >= 255 or self.button_color[0] <= 0: self.animation_direction *= -1 # 绘制按钮 pygame.draw.rect(surface, self.button_color, self.start_button) start_text = small_font.render("开始游戏", True, BLACK) start_rect = start_text.get_rect(center=self.start_button.center) surface.blit(start_text, start_rect) pygame.draw.rect(surface, self.button_color, self.exit_button) exit_text = small_font.render("退出游戏", True, BLACK) exit_rect = exit_text.get_rect(center=self.exit_button.center) surface.blit(exit_text, exit_rect) # 更新动画状态 self.animation_step += 1 if self.animation_step >= 5: self.animation_step = 0 def handle_event(self, event): if event.type == pygame.MOUSEBUTTONDOWN: if self.start_button.collidepoint(event.pos): return 'start' elif self.exit_button.collidepoint(event.pos): return 'exit' return None # 游戏结束类 class GameOver: def __init__(self, message): self.message = message self.button = pygame.Rect(WIDTH//2 - 100, HEIGHT//2 + 50, 200, 50) self.button_color = BLUE def draw(self, surface): surface.fill(LIGHT_BLUE) message_text = font.render(self.message, True, BLACK) message_rect = message_text.get_rect(center=(WIDTH//2, HEIGHT//2 - 150)) surface.blit(message_text, message_rect) back_text = small_font.render("返回菜单", True, BLACK) back_rect = back_text.get_rect(center=self.button.center) pygame.draw.rect(surface, self.button_color, self.button) surface.blit(back_text, back_rect) def handle_event(self, event): if event.type == pygame.MOUSEBUTTONDOWN: if self.button.collidepoint(event.pos): return 'menu' return None # 初始化玩家坦克 player = Tank(WIDTH//2, HEIGHT - 60, GREEN) # 初始化敌方坦克 enemy_tanks = [] idiom_list = [ '一帆风顺', '二龙戏珠', '三阳开泰', '四面楚歌', '五福临门', '六六大顺', '七步成诗', '八仙过海', '九霄云外', '十全十美', '画龙点睛', '刻舟求剑', '亡羊补牢', '守株待兔', '拔苗助长', '杯弓蛇影', '愚公移山', '精卫填海', '夸父逐日', '南柯一梦', # 你可以在这里添加更多成语 ] idiom = random.choice(idiom_list) #print(f"当前成语: {idiom}") for i in range(4): x = random.randint(0, WIDTH - 40) y = random.randint(0, HEIGHT//2) enemy = EnemyTank(x, y, RED, idiom[i]) enemy_tanks.append(enemy) # 游戏状态 state = 'menu' # 菜单实例 menu = Menu() # 游戏结束实例 game_over = None # 玩家击中的顺序 player_hits = [] correct_order = list(idiom) # 游戏主循环 clock = pygame.time.Clock() running = True while running: clock.tick(60) # 60 FPS for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif state == 'menu': result = menu.handle_event(event) if result == 'start': # 重新选择成语 idiom = random.choice(idiom_list) print(f"当前成语: {idiom}") enemy_tanks = [] for i in range(4): x = random.randint(0, WIDTH - 40) y = random.randint(0, HEIGHT//2) enemy = EnemyTank(x, y, RED, idiom[i]) enemy_tanks.append(enemy) state = 'game' elif result == 'exit': running = False elif state == 'game': if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player.shoot() elif state == 'game_over' or state == 'victory': if event.type == pygame.MOUSEBUTTONDOWN: result = game_over.handle_event(event) if result == 'menu': state = 'menu' else: pass if state == 'game': keys_pressed = pygame.key.get_pressed() player.move(keys_pressed) player.update_bullets() # 更新敌方坦克 for enemy in enemy_tanks[:]: enemy.update() # 敌方坦克射击 enemy.shoot() # 检测子弹与敌方坦克的碰撞 for bullet in player.bullets[:]: if (enemy.x < bullet.x < enemy.x + enemy.width) and (enemy.y < bullet.y < enemy.y + enemy.height): player_hits.append(enemy.character) player.bullets.remove(bullet) enemy_tanks.remove(enemy) break # 检测敌方子弹与玩家坦克的碰撞 for bullet in enemy.bullets[:]: if (player.x < bullet.x < player.x + player.width) and (player.y < bullet.y < player.y + player.height): print("玩家被敌方子弹击中!游戏失败!") state = 'game_over' game_over = GameOver("游戏失败") break # 检查玩家是否按顺序击中 if player_hits == correct_order: state = 'victory' game_over = GameOrder("胜利!") elif player_hits != correct_order and len(player_hits) >= 4: state = 'game_over' game_over = GameOver("游戏失败") elif state == 'game_over' or state == 'victory': game_over.draw(screen) elif state == 'menu': menu.draw(screen) # 渲染 if state == 'game': screen.fill(LIGHT_BLUE) player.draw(screen) for enemy in enemy_tanks: enemy.draw(screen) pygame.display.flip() elif state == 'menu': menu.draw(screen) pygame.display.flip() elif state == 'game_over' or state == 'victory': game_over.draw(screen) pygame.display.flip() pygame.quit()
六、你对AI辅助代码编写的思考:
AI辅助代码编写可以更有效地完成代码和查错。但它编写的代码往往会很精简,这就需要你不断改进你的提示词,永远无法到达一个完美的预期。。。
-
2025-3-2 8:59:40@
一、作品名称:2dAI对战
二、作品创作者及使用的AI工具:冯靖瀚,豆包AI
三、作品主要功能:
(1):2d游戏对战 (2):数学计算
四、作品主要截图:
五、作品代码:
import pygame import random import math px = 20 ax = 200 class Weapon: def __init__(self, name, damage): self.name = name # 大幅降低伤害,例如将伤害值缩小为原来的二分之一 self.damage = damage / 2 class Bullet: def __init__(self, x, y, speed, angle, damage): self.pos = pygame.math.Vector2(x, y) # 子弹的位置使用向量表示 self.speed = speed self.angle = angle # 子弹飞行的角度 self.damage = damage self.radius = 5 # 子弹半径 self.active = True # 子弹是否处于活动状态 def update(self, screen_width, screen_height): # 根据角度和速度更新子弹位置 dx = math.cos(self.angle) * self.speed dy = math.sin(self.angle) * self.speed self.pos.x += dx self.pos.y += dy # 检查子弹是否超出屏幕边界 if self.pos.x < 0 or self.pos.x > screen_width or self.pos.y < 0 or self.pos.y > screen_height: self.active = False return self.active class Player: def __init__(self, name, health, weapons, x, y, size, speed, min_x, min_y, max_x, max_y): self.name = name self.health = health self.weapons = weapons self.current_weapon_index = 0 self.pos = pygame.math.Vector2(x, y) # 玩家的位置使用向量表示 self.size = size self.speed = speed self.min_x = min_x self.min_y = min_y self.max_x = max_x self.max_y = max_y self.bullets = [] # 存储玩家发射的子弹 self.rect = pygame.Rect(x - size // 2, y - size // 2, size, size) # 玩家的矩形区域,用于碰撞检测 self.last_attack_time = 0 # 新增:记录玩家上一次攻击的时间 # 人类玩家的攻击间隔范围 self.attack_interval_min = 500 # 0.5 秒 self.attack_interval_max = 1000 # 1 秒 self.next_attack_bonus = 1 # 下一次攻击的伤害倍数 def attack(self, target): weapon = self.weapons[self.current_weapon_index] # 模拟攻击的伤害波动,伤害范围在 80% 到 180% 之间 damage_dealt = random.uniform(0.6, 1.8) * weapon.damage * self.next_attack_bonus # 计算玩家朝向目标的角度 angle = math.atan2(target.pos.y - self.pos.y, target.pos.x - self.pos.x) # 创建子弹,根据玩家朝向发射子弹 self.bullets.append(Bullet(self.pos.x, self.pos.y, 15, angle, damage_dealt)) print(f"{self.name} used {weapon.name} to deal potential damage of {damage_dealt:.2f} to {target.name}.") self.next_attack_bonus = 1 # 重置下一次攻击的伤害倍数 def take_damage(self, damage): self.health -= damage if self.health < 0: self.health = 0 print(f"{self.name} took {damage:.2f} damage. Remaining health: {self.health:.2f}") def switch_weapon(self): self.current_weapon_index = (self.current_weapon_index + 1) % len(self.weapons) print(f"{self.name} switched to weapon: {self.weapons[self.current_weapon_index].name}") def move(self, dx, dy): new_pos = self.pos + pygame.math.Vector2(dx * self.speed, dy * self.speed) # 使用向量计算新位置 # 限制玩家在屏幕范围内移动 new_pos.x = max(self.min_x, min(new_pos.x, self.max_x)) new_pos.y = max(self.min_y, min(new_pos.y, self.max_y)) self.pos = new_pos self.rect.topleft = (self.pos.x - self.size // 2, self.pos.y - self.size // 2) class AIPlayer(Player): def __init__(self, name, health, weapons, x, y, size, speed, min_x, min_y, max_x, max_y, difficulty="easy"): super().__init__(name, health, weapons, x, y, size, speed, min_x, min_y, max_x, max_y) self.difficulty = difficulty self.last_attack_time = 0 # 设置攻击间隔范围与人类玩家相同 self.attack_interval_min = 500 # 0.5 秒 self.attack_interval_max = 1000 # 1 秒 # 设置不同难度下的命中概率范围,使用字典存储 self.hit_probability_ranges = { "easy": (0.3, 0.5), "medium": (0.5, 0.7), "hard": (0.7, 0.9) } def make_decision(self, player): current_time = pygame.time.get_ticks() if current_time - self.last_attack_time >= random.randint(self.attack_interval_min, self.attack_interval_max): self.last_attack_time = current_time return True else: return False def check_hit(self): # 生成一个随机数,判断是否命中 min_prob, max_prob = self.hit_probability_ranges[self.difficulty] hit_probability = random.uniform(min_prob, max_prob) return random.random() < hit_probability def move_randomly(self): # 生成随机的移动方向 dx = random.uniform(-1, 1) dy = random.uniform(-1, 1) direction = pygame.math.Vector2(dx, dy).normalize() self.move(direction.x * self.speed, direction.y * self.speed) class Item: def __init__(self, item_type, x, y): self.item_type = item_type self.pos = pygame.math.Vector2(x, y) self.radius = 10 self.active = True def update(self, screen_width, screen_height): pass def check_bullet_collision(bullet, target): # 创建子弹的矩形区域 bullet_rect = pygame.Rect(int(bullet.pos.x - bullet.radius), int(bullet.pos.y - bullet.radius), bullet.radius * 2, bullet.radius * 2) # 检查子弹和目标的矩形区域是否相交 if bullet_rect.colliderect(target.rect): return True return False def check_item_collision(item, player): item_rect = pygame.Rect(int(item.pos.x - item.radius), int(item.pos.y - item.radius), item.radius * 2, item.radius * 2) if item_rect.colliderect(player.rect): return True return False def generate_math_puzzle(): # 随机生成不同类型的数学谜题 puzzle_type = random.choice(['add', 'subtract', 'multiply', 'divide']) num1 = random.randint(1, 20) num2 = random.randint(1, 20) if puzzle_type == 'add': question = f"{num1} + {num2} = ?" answer = num1 + num2 elif puzzle_type == 'subtract': num1, num2 = max(num1, num2), min(num1, num2) question = f"{num1} - {num2} = ?" answer = num1 - num2 elif puzzle_type == 'multiply': question = f"{num1} * {num2} = ?" answer = num1 * num2 else: num1 = num1 * num2 question = f"{num1} / {num2} = ?" answer = num1 / num2 return question, answer def main(): # 初始化 pygame pygame.init() screen = pygame.display.set_mode((1200, 800)) # 扩大地图 pygame.display.set_caption("2D Shooting Game with Math Puzzles") clock = pygame.time.Clock() start_font = pygame.font.Font(None, 100) # 开始界面字体 end_font = pygame.font.Font(None, 120) # 结束界面字体 game_font = pygame.font.Font(None, 36) # 游戏界面字体 puzzle_font = pygame.font.Font(None, 60) # 谜题字体 # 创建武器,大幅降低伤害 pistol = Weapon("Pistol", 3) # 从 30 降低为 3 rifle = Weapon("Rifle", 5) # 从 50 降低为 5 shotgun = Weapon("Shotgun", 8) # 从 80 降低为 8 # 创建玩家,玩家可以拥有多个武器 player1 = Player("Player 1", px, [pistol, rifle, shotgun], 100, 100, 50, 10, 0, 0, 1150, 750) # 调整玩家范围以适应新地图 # 创建 AI 玩家,并设置难度 ai_player = AIPlayer("AI Player", ax, [rifle, shotgun], 600, 400, 50, 5, 0, 0, 1150, 750, difficulty="medium") # 游戏状态 game_started = False game_over = False # 新增:游戏结束标志 winner = None # 新增:记录获胜者 item_list = [] # 存储道具,将原本的 items 改为 item_list last_item_spawn_time = pygame.time.get_ticks() # 记录上一次生成道具的时间 puzzle_active = False puzzle_question = "" puzzle_answer = 0 user_input = "" # 游戏循环 running = True while running: screen.fill((0, 0, 0)) # 填充背景为黑色 # 存储需要移除的子弹 player1_bullets_to_remove = [] ai_player_bullets_to_remove = [] for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif not game_started: if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: game_started = True elif event.type == pygame.KEYDOWN and game_started: if event.key == pygame.K_j: # 玩家按 'j' 键切换武器 player1.switch_weapon() elif puzzle_active: if event.key == pygame.K_RETURN: try: if float(user_input) == puzzle_answer: print("Correct answer! You get a power boost.") player1.next_attack_bonus = 3 # 回答正确,下一次攻击伤害变为 3 倍 else: print("Wrong answer! No power boost.") puzzle_active = False user_input = "" except ValueError: print("Invalid input. Please enter a number.") elif event.unicode.isdigit() or event.unicode == '.': user_input += event.unicode elif event.key == pygame.K_BACKSPACE: user_input = user_input[:-1] elif event.type == pygame.MOUSEBUTTONDOWN and game_started: # 获取鼠标点击位置 mouse_x, mouse_y = pygame.mouse.get_pos() direction = pygame.math.Vector2(mouse_x, mouse_y) - player1.pos if direction.length() > 0: direction.normalize_ip() # 归一化方向向量 # 移动玩家 player1.move(direction.x * player1.speed, direction.y * player1.speed) if game_started and not game_over: # 玩家攻击决策 current_time = pygame.time.get_ticks() if current_time - player1.last_attack_time >= random.randint(player1.attack_interval_min, player1.attack_interval_max): player1.last_attack_time = current_time if not puzzle_active: player1.attack(ai_player) else: print("Answer the math puzzle first to attack.") # AI 玩家决策 if ai_player.make_decision(player1): ai_player.attack(player1) # AI 玩家随机移动 ai_move_time = pygame.time.get_ticks() if ai_move_time - ai_player.last_attack_time >= random.randint(500, 1000): # 控制移动频率在 0.5 秒到 1 秒 ai_player.last_attack_time = ai_move_time ai_player.move_randomly() # 生成道具 if current_time - last_item_spawn_time >= 10000: # 每 10 秒生成一次道具 item_type = random.choice(["health_potion", "power_potion", "puzzle_potion"]) x = random.randint(0, 1200) y = random.randint(0, 800) item_list.append(Item(item_type, x, y)) last_item_spawn_time = current_time # 玩家子弹的移动和绘制 for bullet in player1.bullets[:]: if bullet.update(1200, 800): # 更新子弹状态,使用新的屏幕尺寸 # 绘制玩家子弹,使用不同的颜色 (0, 255, 0) 绿色 pygame.draw.circle(screen, (0, 255, 0), (int(bullet.pos.x), int(bullet.pos.y)), bullet.radius) # 改进伤害判定,当子弹接近目标时造成伤害 if check_bullet_collision(bullet, ai_player): # 只有在命中时才造成伤害 ai_player.take_damage(bullet.damage) player1_bullets_to_remove.append(bullet) else: player1_bullets_to_remove.append(bullet) # 移除需要移除的玩家子弹 for bullet in player1_bullets_to_remove: player1.bullets.remove(bullet) # AI 玩家子弹的移动和绘制 for bullet in ai_player.bullets[:]: if bullet.update(1200, 800): # 更新子弹状态,使用新的屏幕尺寸 # 绘制 AI 玩家子弹,使用更明显的颜色 (255, 0, 255) 紫色 pygame.draw.circle(screen, (255, 0, 255), (int(bullet.pos.x), int(bullet.pos.y)), bullet.radius) # 改进伤害判定,当子弹接近目标时造成伤害 if check_bullet_collision(bullet, player1): # 只有在命中且检查命中结果为真时才造成伤害 if ai_player.check_hit(): player1.take_damage(bullet.damage) ai_player_bullets_to_remove.append(bullet) else: ai_player_bullets_to_remove.append(bullet) # 移除需要移除的 AI 玩家子弹 for bullet in ai_player_bullets_to_remove: ai_player.bullets.remove(bullet) # 道具的更新和绘制 items_to_remove = [] for item in item_list: if item.active: if check_item_collision(item, player1): if item.item_type == "health_potion": player1.health = min(px / 1.5, player1.health + 30) # 回复 30 点生命值,最多回复到 100 print(f"{player1.name} picked up a health potion.") elif item.item_type == "power_potion": player1.next_attack_bonus = 2 # 下一次攻击伤害加倍 print(f"{player1.name} picked up a power potion.") elif item.item_type == "puzzle_potion": puzzle_question, puzzle_answer = generate_math_puzzle() puzzle_active = True user_input = "" print(f"Answer this math puzzle to get a special bonus: {puzzle_question}") item.active = False items_to_remove.append(item) pygame.draw.circle(screen, (255, 192, 203) if item.item_type == "health_potion" else ( 255, 255, 0) if item.item_type == "power_potion" else (0, 255, 255), (int(item.pos.x), int(item.pos.y), item.radius)) else: items_to_remove.append(item)
六、我对AI辅助代码编写的思考:
我认为AI辅助可以更加有效地完成代码的编写,但是在AI的帮助下,人类较为难以理解代码,以至于在报错时较难以找到真正的问题所在
-
2025-3-2 2:17:23@
一、作品名称:文件格式名字修改器
二、作品创作者及使用的AI工具:石政涛 deepseek
三、作品主要功能:
方便日常生活文件格式
四、作品主要截图
五、作品的代码:
import tkinter as tk from tkinter import filedialog, messagebox import os class FileConverterApp: def __init__(self, root): self.root = root self.root.title("文件格式转换器") self.root.geometry("400x300") # 创建界面元素 self.label = tk.Label(root, text="欢迎使用文件格式转换器", font=("Arial", 16)) self.label.pack(pady=10) # 文件选择按钮 self.select_button = tk.Button(root, text="选择文件", command=self.select_file, width=20) self.select_button.pack(pady=10) # 显示选择的文件路径 self.file_path_label = tk.Label(root, text="未选择文件", fg="gray") self.file_path_label.pack(pady=5) # 修改文件名部分 self.rename_frame = tk.Frame(root) self.rename_frame.pack(pady=10) self.rename_label = tk.Label(self.rename_frame, text="新文件名:") self.rename_label.pack(side=tk.LEFT) self.rename_entry = tk.Entry(self.rename_frame, width=20) self.rename_entry.pack(side=tk.LEFT, padx=10) self.rename_button = tk.Button(root, text="修改文件名", command=self.rename_file, width=20) self.rename_button.pack(pady=10) # 目标格式选择 self.format_frame = tk.Frame(root) self.format_frame.pack(pady=10) self.format_label = tk.Label(self.format_frame, text="选择目标格式:") self.format_label.pack(side=tk.LEFT) self.format_var = tk.StringVar() self.format_var.set(".txt") # 默认格式 self.format_menu = tk.OptionMenu(self.format_frame, self.format_var, ".txt", ".csv", ".json", ".xml") self.format_menu.pack(side=tk.LEFT, padx=10) # 转换按钮 self.convert_button = tk.Button(root, text="转换格式", command=self.convert_file, width=20) self.convert_button.pack(pady=10) self.file_path = None def select_file(self): self.file_path = filedialog.askopenfilename() if self.file_path: self.file_path_label.config(text=f"已选择文件: {os.path.basename(self.file_path)}", fg="black") else: self.file_path_label.config(text="未选择文件", fg="gray") def rename_file(self): if not self.file_path: messagebox.showerror("错误", "请先选择一个文件") return new_name = self.rename_entry.get().strip() if not new_name: messagebox.showerror("错误", "请输入新文件名") return file_dir = os.path.dirname(self.file_path) new_file_path = os.path.join(file_dir, new_name) try: os.rename(self.file_path, new_file_path) self.file_path = new_file_path self.file_path_label.config(text=f"已选择文件: {os.path.basename(self.file_path)}", fg="black") messagebox.showinfo("成功", f"文件名已修改为: {new_name}") except Exception as e: messagebox.showerror("错误", f"修改文件名失败: {e}") def convert_file(self): if not self.file_path: messagebox.showerror("错误", "请先选择一个文件") return target_format = self.format_var.get() file_dir, file_name = os.path.split(self.file_path) file_base, file_ext = os.path.splitext(file_name) new_file_name = f"{file_base}{target_format}" new_file_path = os.path.join(file_dir, new_file_name) try: os.rename(self.file_path, new_file_path) self.file_path = new_file_path self.file_path_label.config(text=f"已选择文件: {os.path.basename(self.file_path)}", fg="black") messagebox.showinfo("成功", f"文件已成功转换为 {target_format} 格式") except Exception as e: messagebox.showerror("错误", f"转换失败: {e}") if __name__ == "__main__": root = tk.Tk() app = FileConverterApp(root) root.mainloop()
-
2025-3-2 0:05:59@
一、作品名称:化独
二、作品创作者及使用的AI工具:吴建宇,deepseek
三、作品主要功能:
(1)使用颜色区分不同主族元素(如第1族显示为粉色)
3x3宫格有交替背景色增强辨识度
固定元素显示为彩色标签,空格为下拉菜单
(2)下拉菜单选择元素符号(避免输入错误)
即时验证:选择错误时输入框变红
右键菜单支持(可扩展)
(3)一键检查当前进度
随时查看游戏规则
新游戏快速生成
(4)元素周期信息通过颜色编码呈现
错误提示包含化学规则反馈
固定元素显示对应周期颜色
四、作品主要截图
五、作品的代码:
import tkinter as tk from tkinter import ttk, messagebox import random # 化学元素配置 elements = { 1: {'symbol': 'H', 'period': 1, 'group': 1, 'color': '#FFB3BA'}, 2: {'symbol': 'He','period': 1, 'group': 18, 'color': '#FFDFBA'}, 3: {'symbol': 'C', 'period': 2, 'group': 14, 'color': '#FFFFBA'}, 4: {'symbol': 'N', 'period': 2, 'group': 15, 'color': '#BAFFC9'}, 5: {'symbol': 'O', 'period': 2, 'group': 16, 'color': '#BAE1FF'}, 6: {'symbol': 'Na','period': 3, 'group': 1, 'color': '#FFB3BA'}, 7: {'symbol': 'Mg','period': 3, 'group': 2, 'color': '#FFDFBA'}, 8: {'symbol': 'Al','period': 3, 'group': 13, 'color': '#FFFFBA'}, 9: {'symbol': 'Cl','period': 3, 'group': 17, 'color': '#BAFFC9'} } class SudokuGUI: def __init__(self, root): self.root = root self.root.title("化学元素数独") self.puzzle = None self.solution = None self.cells = {} # 创建界面组件 self.create_widgets() self.new_game() def create_widgets(self): # 顶部控制栏 control_frame = ttk.Frame(self.root) control_frame.pack(pady=10) ttk.Button(control_frame, text="新游戏", command=self.new_game).pack(side=tk.LEFT, padx=5) ttk.Button(control_frame, text="检查答案", command=self.check_solution).pack(side=tk.LEFT, padx=5) ttk.Button(control_frame, text="规则说明", command=self.show_rules).pack(side=tk.LEFT, padx=5) # 数独棋盘 self.board_frame = ttk.Frame(self.root) self.board_frame.pack() # 底部状态栏 self.status = ttk.Label(self.root, text="等待开始...") self.status.pack(pady=5) def new_game(self): """生成新游戏""" self.puzzle, self.solution = generate_puzzle() self.create_board() self.status.config(text="游戏进行中") def create_board(self): """创建棋盘界面""" for widget in self.board_frame.winfo_children(): widget.destroy() self.cells = {} for i in range(9): for j in range(9): frame = tk.Frame(self.board_frame, bg='white', highlightbackground='#cccccc', highlightthickness=1) frame.grid(row=i, column=j, sticky='nsew') # 设置宫格背景色 if (i//3 + j//3) % 2 == 0: frame.config(bg='#f0f0f0') value = self.puzzle[i][j] if value == 0: # 创建下拉菜单 var = tk.StringVar() cb = ttk.Combobox(frame, textvariable=var, values=[e['symbol'] for e in elements.values()], width=2, state='readonly') cb.bind('<<ComboboxSelected>>', lambda e, i=i, j=j: self.on_select(i,j)) cb.pack(expand=True) self.cells[(i,j)] = {'type': 'input', 'var': var, 'cb': cb} else: # 显示固定元素 label = tk.Label(frame, text=elements[value]['symbol'], bg=elements[value]['color'], width=3) label.pack(expand=True, fill='both') self.cells[(i,j)] = {'type': 'fixed'} def on_select(self, row, col): """处理元素选择事件""" var = self.cells[(row, col)]['var'] symbol = var.get() try: num = next(k for k,v in elements.items() if v['symbol'] == symbol) if self.is_valid_move(row, col, num): self.puzzle[row][col] = num self.cells[(row, col)]['cb'].config(style='TCombobox') if self.check_win(): messagebox.showinfo("恭喜", "挑战成功!") else: self.cells[(row, col)]['cb'].config(style='Error.TCombobox') self.status.config(text="错误:不符合化学规则!") except StopIteration: pass def is_valid_move(self, row, col, num): """验证移动有效性""" # 原始验证逻辑保持不变 current = elements[num] # 检查行周期 for x in self.puzzle[row]: if x != 0 and elements[x]['period'] == current['period']: return False # 检查列族别 for y in range(9): cell_val = self.puzzle[y][col] if cell_val !=0 and elements[cell_val]['group'] == current['group']: return False # 检查宫格族别 start_r, start_c = 3*(row//3), 3*(col//3) for i in range(start_r, start_r+3): for j in range(start_c, start_c+3): cell_val = self.puzzle[i][j] if cell_val !=0 and elements[cell_val]['group'] != current['group']: return False return True def check_solution(self): """检查当前进度""" errors = [] for i in range(9): for j in range(9): if self.puzzle[i][j] != self.solution[i][j]: errors.append((i,j)) if not errors: messagebox.showinfo("检查结果", "全部正确!") else: messagebox.showwarning("检查结果", f"发现{len(errors)}处错误") def check_win(self): """检查是否获胜""" return all(self.puzzle[i][j] == self.solution[i][j] for i in range(9) for j in range(9)) def show_rules(self): """显示游戏规则""" rules = [ "化学元素数独规则:", "1. 每个3x3宫格必须属于同一主族(相同颜色)", "2. 同一行不能有相同周期的元素", "3. 同一列不能有同族元素", "4. 从下拉列表中选择元素填入空格" ] messagebox.showinfo("游戏规则", "\n".join(rules)) # 以下为原游戏逻辑函数(保持不变) def generate_puzzle(difficulty=30): board = [[0]*9 for _ in range(9)] numbers = list(elements.keys()) solve(board, numbers) puzzle = [row.copy() for row in board] cells = [(i,j) for i in range(9) for j in range(9)] random.shuffle(cells) for i,j in cells[:difficulty]: puzzle[i][j] = 0 return puzzle, board def solve(board, numbers): empty = next(((i,j) for i in range(9) for j in range(9) if board[i][j]==0), None) if not empty: return True row, col = empty random.shuffle(numbers) for num in numbers: if is_valid_temp(board, row, col, num): board[row][col] = num if solve(board, numbers): return True board[row][col] = 0 return False def is_valid_temp(board, row, col, num): current = elements[num] for x in board[row]: if x != 0 and elements[x]['period'] == current['period']: return False for y in range(9): if board[y][col] !=0 and elements[board[y][col]]['group'] == current['group']: return False start_r, start_c = 3*(row//3), 3*(col//3) for i in range(start_r, start_r+3): for j in range(start_c, start_c+3): if board[i][j] !=0 and elements[board[i][j]]['group'] != current['group']: return False return True if __name__ == "__main__": root = tk.Tk() root.style = ttk.Style() root.style.configure('Error.TCombobox', fieldbackground='#ffdddd') app = SudokuGUI(root) root.mainloop()
六、你对AI辅助代码编写的思考:
在AI辅助代码开发的过程中,我深刻感受到人机协作的独特价值。以数独游戏的开发为例,AI展现了强大的框架生成能力——从最初的命令行版本到学科融合的化学数独,再到最终的图形界面实现,它能在短时间内构建出可运行的基础代码,这相当于为开发者搭建好了脚手架。但这种协作绝非简单的代码搬运,真正的价值在于AI的知识整合能力:当提出将数独规则与元素周期表结合时,AI不仅能理解化学中的"族"和"周期"概念,还能将其精准映射到数独的宫格、行列约束中,这种跨学科的逻辑转换往往需要开发者耗费大量时间查阅资料。
-
2025-3-1 23:28:19@
一、作品名称:初中数学练习游戏
二、作品创作者及使用的AI工具:deepseek
三、作品主要功能:
(1)锻炼思考能力
(2)巩固初中数学知识
(3)预习数学知识
......
四、作品主要截图 (alt+PrtScreen键) 拿了其他电脑,安装不上python,后面补图片
五、作品的代码:
import tkinter as tk import random import math from fractions import Fraction from tkinter import messagebox class MathGame: def __init__(self, master): self.master = master self.master.title("初中数学练习") self.master.geometry("500x400") # 游戏变量 self.score = 0 self.time_left = 45 self.correct_answer = None self.current_type = "" # 创建界面元素 self.create_widgets() self.generate_problem() self.update_timer() def create_widgets(self): # 分数显示 self.score_label = tk.Label(self.master, text="分数: 0", font=("微软雅黑", 14)) self.score_label.pack(pady=10) # 倒计时显示 self.time_label = tk.Label(self.master, text="剩余时间: 45", font=("微软雅黑", 12)) self.time_label.pack() # 题目类型显示 self.type_label = tk.Label(self.master, text="", font=("微软雅黑", 10)) self.type_label.pack() # 题目显示 self.problem_label = tk.Label(self.master, text="", font=("微软雅黑", 18)) self.problem_label.pack(pady=20) # 答案输入框 self.answer_entry = tk.Entry(self.master, font=("微软雅黑", 14), width=15) self.answer_entry.pack() self.answer_entry.bind("<Return>", self.check_answer) # 提交按钮 self.submit_btn = tk.Button(self.master, text="提交", command=self.check_answer, font=("微软雅黑", 12), bg="#4CAF50", fg="white") self.submit_btn.pack(pady=10) # 反馈标签 self.feedback_label = tk.Label(self.master, text="", fg="red", font=("微软雅黑", 10)) self.feedback_label.pack() def generate_problem(self): problem_type = random.choice([ "一元一次方程", "分数运算", "平方根计算", "几何问题", "指数运算" ]) self.current_type = problem_type self.type_label.config(text=f"当前题型:{problem_type}") if problem_type == "一元一次方程": a = random.randint(2, 10) b = random.randint(1, 20) c = random.randint(10, 50) equation = f"{a}x + {b} = {c}" self.correct_answer = Fraction(c - b, a) elif problem_type == "分数运算": num1 = Fraction(random.randint(1, 5), random.randint(2, 5)) num2 = Fraction(random.randint(1, 5), random.randint(2, 5)) op = random.choice(["+", "-", "×"]) if op == "+": result = num1 + num2 elif op == "-": result = num1 - num2 else: result = num1 * num2 equation = f"{num1} {op} {num2} = ?" self.correct_answer = result elif problem_type == "平方根计算": base = random.choice([25, 36, 49, 64, 81, 100, 121, 144]) equation = f"√{base} = ?" self.correct_answer = int(math.sqrt(base)) elif problem_type == "几何问题": shape = random.choice(["矩形面积", "圆面积", "三角形周长"]) if shape == "矩形面积": l = random.randint(5, 20) w = random.randint(5, 20) equation = f"矩形长{l}cm 宽{w}cm,面积是?" self.correct_answer = l * w elif shape == "圆面积": r = random.randint(3, 10) equation = f"圆半径{r}cm(π取3.14),面积是?" self.correct_answer = round(3.14 * r**2, 2) else: a = random.randint(5, 15) b = random.randint(5, 15) c = random.randint(5, 15) equation = f"三角形三边{a}cm、{b}cm、{c}cm,周长是?" self.correct_answer = a + b + c elif problem_type == "指数运算": base = random.randint(2, 5) exp = random.randint(2, 4) equation = f"{base}^{exp} = ?" self.correct_answer = base ** exp self.problem_label.config(text=equation) self.answer_entry.delete(0, tk.END) self.feedback_label.config(text="") def check_answer(self, event=None): user_input = self.answer_entry.get().strip() try: # 转换分数输入 if "/" in user_input: user_answer = Fraction(user_input) # 处理小数输入 elif "." in user_input: user_answer = float(user_input) # 如果正确答案是整数,允许小数形式 if isinstance(self.correct_answer, int): user_answer = int(user_answer) if user_answer.is_integer() else user_answer else: user_answer = int(user_input) # 处理浮点数精度问题 if isinstance(self.correct_answer, float): correct = round(self.correct_answer, 2) user_answer = round(float(user_answer), 2) else: correct = self.correct_answer if user_answer == correct: self.score += 5 self.feedback_label.config(text="正确!", fg="green") else: self.score = max(0, self.score - 2) self.feedback_label.config(text=f"错误,正确答案是:{self._format_answer()}", fg="red") self.score_label.config(text=f"分数: {self.score
六、你对AI辅助代码编写的思考: 当借助 AI 来制作小游戏时,我深刻体会到了它的强大与便捷。起初构思小游戏框架时,AI 能快速给出多种可行的架构方案,帮我确定了清晰的开发方向。在编写代码阶段,对于游戏中角色移动、碰撞检测等复杂逻辑,AI 提供了详细的代码示例,极大地加速了开发进程。 然而,AI 并非完美。它给出的代码有时会存在逻辑漏洞,或者与我预期的游戏风格不匹配。这就需要我具备扎实的编程基础去甄别和修改。但不可否认,AI 辅助代码编写为游戏开发打开了新的局面,只要合理运用,就能高效地创造出有趣的游戏。
-
2025-3-1 19:29:20@
一、作品名称:班级抽奖小程序
二、作品创作者及使用的AI工具: DeepSeek-V3&DeepSeek-R1
三、作品主要功能:
(1)基本PPT创建和保存功能
(2)多元素插入和编辑
(3)撤销/重做操作
(4)属性修改
(5)幻灯片管理
(6)异常输入处理
(7)自动保存功能
四、作品主要截图:
五、作品的代码:
import tkinter as tk from tkinter import ttk, messagebox, Canvas, filedialog, colorchooser from pptx import Presentation from pptx.util import Inches, Pt from pptx.enum.text import PP_ALIGN from pptx.enum.shapes import MSO_SHAPE from pptx.dml.color import RGBColor import os import json from PIL import Image, ImageTk import datetime import copy # ==================== 操作历史管理 ==================== class Action: """操作历史记录类,支持完整的状态管理""" def __init__(self, action_type, element, old_state, new_state): self.action_type = action_type self.element = element self.old_state = copy.deepcopy(old_state) self.new_state = copy.deepcopy(new_state) def undo(self): try: if self.action_type == "move": self._undo_move() elif self.action_type == "insert": self._undo_insert() elif self.action_type == "delete": self._undo_delete() elif self.action_type == "format": self._undo_format() except Exception as e: messagebox.showerror("撤销错误", f"无法撤销操作: {str(e)}") def redo(self): try: if self.action_type == "move": self._redo_move() elif self.action_type == "insert": self._redo_insert() elif self.action_type == "delete": self._redo_delete() elif self.action_type == "format": self._redo_format() except Exception as e: messagebox.showerror("重做错误", f"无法重做操作: {str(e)}") def _undo_move(self): self.element.left = self.old_state['x'] self.element.top = self.old_state['y'] self.element.width = self.old_state['width'] self.element.height = self.old_state['height'] def _redo_move(self): self.element.left = self.new_state['x'] self.element.top = self.new_state['y'] self.element.width = self.new_state['width'] self.element.height = self.new_state['height'] def _undo_insert(self): if self.element._element.getparent() is not None: self.element._element.getparent().remove(self.element._element) def _redo_insert(self): if self.element._element.getparent() is not None: self.element._element.getparent().append(self.element._element) def _undo_delete(self): if self.element._element.getparent() is not None: self.element._element.getparent().append(self.element._element) def _redo_delete(self): if self.element._element.getparent() is not None: self.element._element.getparent().remove(self.element._element) def _undo_format(self): if 'text' in self.old_state: self.element.text_frame.text = self.old_state['text'] if 'color' in self.old_state: self.element.fill.solid() self.element.fill.fore_color.rgb = self.old_state['color'] def _redo_format(self): if 'text' in self.new_state: self.element.text_frame.text = self.new_state['text'] if 'color' in self.new_state: self.element.fill.solid() self.element.fill.fore_color.rgb = self.new_state['color'] # ==================== 主应用类 ==================== class PPTCreatorPro: def __init__(self, root): self.root = root self.root.title("PPT Creator Professional v3.3") self.root.geometry("1200x800") # 初始化核心组件 self.presentation = Presentation() self.current_slide = None self.selected_element = None self.dragging = False self.editing_text = None self.canvas_element_map = {} self.undo_stack = [] self.redo_stack = [] self.clipboard = None self.preview_scale = 0.8 self.preview_width = 800 self.preview_height = 450 # 加载配置 self.load_config() self.setup_ui() self.setup_bindings() self.setup_auto_save() # ==================== 界面初始化 ==================== def setup_ui(self): # 菜单系统 self.menu_bar = tk.Menu(self.root) self.setup_file_menu() self.setup_edit_menu() self.setup_view_menu() self.root.config(menu=self.menu_bar) # 主布局 main_panel = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL) main_panel.pack(fill=tk.BOTH, expand=True) # 左侧面板 left_panel = ttk.Frame(main_panel, width=250) self.setup_slide_panel(left_panel) self.setup_tool_panel(left_panel) main_panel.add(left_panel) # 中央预览 center_panel = ttk.Frame(main_panel) self.setup_preview_canvas(center_panel) main_panel.add(center_panel) # 右侧属性面板 right_panel = ttk.Frame(main_panel, width=300) self.setup_property_panel(right_panel) main_panel.add(right_panel) # 状态栏 self.status_bar = ttk.Label(self.root, text="就绪", relief=tk.SUNKEN) self.status_bar.pack(side=tk.BOTTOM, fill=tk.X) def setup_file_menu(self): file_menu = tk.Menu(self.menu_bar, tearoff=0) file_menu.add_command(label="新建", command=self.new_presentation) file_menu.add_command(label="打开", command=self.open_presentation) file_menu.add_command(label="保存", command=self.save_presentation) file_menu.add_command(label="另存为", command=self.save_as_presentation) file_menu.add_separator() file_menu.add_command(label="导出为Word", command=self.export_to_word) file_menu.add_command(label="导出为图片", command=self.export_as_image) file_menu.add_separator() file_menu.add_command(label="退出", command=self.exit_app) self.menu_bar.add_cascade(label="文件", menu=file_menu) def setup_edit_menu(self): edit_menu = tk.Menu(self.menu_bar, tearoff=0) edit_menu.add_command(label="撤销", command=self.undo, accelerator="Ctrl+Z") edit_menu.add_command(label="重做", command=self.redo, accelerator="Ctrl+Y") edit_menu.add_separator() edit_menu.add_command(label="剪切", command=self.cut_element) edit_menu.add_command(label="复制", command=self.copy_element) edit_menu.add_command(label="粘贴", command=self.paste_element) edit_menu.add_separator() edit_menu.add_command(label="删除", command=self.delete_element) self.menu_bar.add_cascade(label="编辑", menu=edit_menu) def setup_view_menu(self): view_menu = tk.Menu(self.menu_bar, tearoff=0) view_menu.add_checkbutton(label="标尺", command=self.toggle_ruler) view_menu.add_checkbutton(label="网格线", command=self.toggle_grid) view_menu.add_separator() view_menu.add_command(label="重置缩放", command=self.reset_zoom) self.menu_bar.add_cascade(label="视图", menu=view_menu) def setup_slide_panel(self, parent): slide_frame = ttk.LabelFrame(parent, text="幻灯片管理") btn_frame = ttk.Frame(slide_frame) ttk.Button(btn_frame, text="新增", command=self.add_slide).pack(side=tk.LEFT, expand=True) ttk.Button(btn_frame, text="删除", command=self.delete_slide).pack(side=tk.LEFT, expand=True) btn_frame.pack(fill=tk.X, pady=2) self.slide_list = tk.Listbox(slide_frame, height=15) self.slide_list.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) self.slide_list.bind("<<ListboxSelect>>", self.select_slide) slide_frame.pack(fill=tk.BOTH, padx=5, pady=5) def setup_tool_panel(self, parent): tool_frame = ttk.LabelFrame(parent, text="插入元素") ttk.Button(tool_frame, text="文本框", command=self.insert_text_box).pack(fill=tk.X, pady=2) ttk.Button(tool_frame, text="图片", command=self.insert_image).pack(fill=tk.X, pady=2) ttk.Button(tool_frame, text="形状", command=self.show_shape_menu).pack(fill=tk.X, pady=2) ttk.Button(tool_frame, text="图表", command=self.insert_chart).pack(fill=tk.X, pady=2) tool_frame.pack(fill=tk.BOTH, padx=5, pady=5) def setup_preview_canvas(self, parent): self.canvas = Canvas(parent, bg="white", width=self.preview_width, height=self.preview_height, highlightthickness=0) self.canvas.pack(fill=tk.BOTH, expand=True) scroll_y = ttk.Scrollbar(parent, orient=tk.VERTICAL, command=self.canvas.yview) scroll_y.pack(side=tk.RIGHT, fill=tk.Y) self.canvas.configure(yscrollcommand=scroll_y.set) def setup_property_panel(self, parent): self.prop_frame = ttk.LabelFrame(parent, text="属性设置") pos_frame = ttk.Frame(self.prop_frame) ttk.Label(pos_frame, text="X (inches):").grid(row=0, column=0) self.x_entry = ttk.Entry(pos_frame, width=8) self.x_entry.grid(row=0, column=1) ttk.Label(pos_frame, text="Y (inches):").grid(row=1, column=0) self.y_entry = ttk.Entry(pos_frame, width=8) self.y_entry.grid(row=1, column=1) pos_frame.pack(pady=5) size_frame = ttk.Frame(self.prop_frame) ttk.Label(size_frame, text="宽 (inches):").grid(row=0, column=0) self.width_entry = ttk.Entry(size_frame, width=8) self.width_entry.grid(row=0, column=1) ttk.Label(size_frame, text="高 (inches):").grid(row=1, column=0) self.height_entry = ttk.Entry(size_frame, width=8) self.height_entry.grid(row=1, column=1) size_frame.pack(pady=5) ttk.Button(self.prop_frame, text="应用属性", command=self.apply_properties).pack(pady=10) self.enhanced_prop_frame = ttk.Frame(self.prop_frame) self.enhanced_prop_frame.pack(fill=tk.BOTH, expand=True) self.prop_frame.pack(fill=tk.BOTH, padx=5, pady=5) # ==================== 核心功能 ==================== def new_presentation(self): self.presentation = Presentation() self.current_slide = None self.update_slide_list() self.update_preview() self.status_bar.config(text="已创建新演示文稿") def add_slide(self): if not self.presentation.slide_layouts: messagebox.showwarning("错误", "没有可用的幻灯片版式!") return try: new_slide = self.presentation.slides.add_slide( self.presentation.slide_layouts[0] ) self.current_slide = new_slide self.update_slide_list() self.update_preview() self.status_bar.config(text="已添加新幻灯片") except Exception as e: messagebox.showerror("错误", f"无法添加幻灯片: {str(e)}") def delete_slide(self): if len(self.presentation.slides) == 0: messagebox.showwarning("警告", "没有可删除的幻灯片") return if len(self.presentation.slides) == 1: messagebox.showwarning("警告", "必须保留至少一张幻灯片") return try: slide_id = self.current_slide.slide_id self.presentation.slides._sldIdLst.remove(slide_id) self.current_slide = self.presentation.slides[0] self.update_slide_list() self.update_preview() self.status_bar.config(text="已删除当前幻灯片") except Exception as e: messagebox.showerror("错误", f"无法删除幻灯片: {str(e)}") def update_slide_list(self): self.slide_list.delete(0, tk.END) for idx, slide in enumerate(self.presentation.slides): self.slide_list.insert(tk.END, f"幻灯片 {idx+1}") def select_slide(self, event): selection = self.slide_list.curselection() if selection: self.current_slide = self.presentation.slides[selection[0]] self.update_preview() def insert_text_box(self): if not self.current_slide: messagebox.showwarning("警告", "请先选择幻灯片!") return try: text_box = self.current_slide.shapes.add_textbox( Inches(1), Inches(1), Inches(4), Inches(2) ) text_frame = text_box.text_frame paragraph = text_frame.add_paragraph() paragraph.text = "点击输入文本" paragraph.alignment = PP_ALIGN.CENTER paragraph.font.size = Pt(24) self.record_action("insert", text_box, None, { 'x': text_box.left, 'y': text_box.top }) self.update_preview() except Exception as e: messagebox.showerror("错误", f"无法插入文本框: {str(e)}") def show_shape_menu(self): shape_menu = tk.Menu(self.root, tearoff=0) shape_menu.add_command(label="矩形", command=lambda: self.insert_shape(MSO_SHAPE.RECTANGLE)) shape_menu.add_command(label="圆形", command=lambda: self.insert_shape(MSO_SHAPE.OVAL)) shape_menu.add_command(label="箭头", command=lambda: self.insert_shape(MSO_SHAPE.LEFT_ARROW)) shape_menu.post(self.root.winfo_pointerx(), self.root.winfo_pointery()) def insert_shape(self, shape_type): if not self.current_slide: messagebox.showwarning("警告", "请先选择幻灯片!") return try: shape = self.current_slide.shapes.add_shape( shape_type, Inches(2), Inches(2), Inches(3), Inches(2)) self.record_action("insert", shape, None, { 'x': shape.left, 'y': shape.top }) self.update_preview() self.status_bar.config(text="形状已插入") except Exception as e: messagebox.showerror("错误", f"无法插入形状: {str(e)}") def insert_image(self): if not self.current_slide: messagebox.showwarning("警告", "请先选择幻灯片!") return try: file_path = filedialog.askopenfilename( filetypes=[("图片文件", "*.png;*.jpg;*.jpeg")] ) if file_path: Image.open(file_path).verify() pic = self.current_slide.shapes.add_picture( file_path, Inches(1), Inches(1), width=Inches(4)) self.record_action("insert", pic, None, { 'x': pic.left, 'y': pic.top }) self.update_preview() self.status_bar.config(text="图片已插入") except Exception as e: messagebox.showerror("错误", f"无效的图片文件: {str(e)}") def update_preview(self): self.canvas.delete("all") self.canvas_element_map.clear() if not self.current_slide: return for shape in self.current_slide.shapes: if shape.has_text_frame: self.draw_text(shape) elif shape.shape_type == 13: self.draw_image(shape) elif shape.shape_type in MSO_SHAPE.__members__.values(): self.draw_shape(shape) self.update_property_panel(None) def draw_text(self, shape): x = shape.left.pt * self.preview_scale y = shape.top.pt * self.preview_scale text = shape.text_frame.text item = self.canvas.create_text(x, y, text=text, anchor=tk.NW, font=("Arial", 12), tags=("text", "draggable")) self.canvas_element_map[item] = (shape, "text") def draw_image(self, shape): x = shape.left.pt * self.preview_scale y = shape.top.pt * self.preview_scale width = shape.width.pt * self.preview_scale height = shape.height.pt * self.preview_scale item = self.canvas.create_rectangle(x, y, x+width, y+height, fill="gray", tags=("image", "draggable")) self.canvas_element_map[item] = (shape, "image") def draw_shape(self, shape): x = shape.left.pt * self.preview_scale y = shape.top.pt * self.preview_scale width = shape.width.pt * self.preview_scale height = shape.height.pt * self.preview_scale if shape.shape_type == MSO_SHAPE.RECTANGLE: item = self.canvas.create_rectangle(x, y, x+width, y+height, fill="blue", outline="black", tags=("shape", "draggable")) elif shape.shape_type == MSO_SHAPE.OVAL: item = self.canvas.create_oval(x, y, x+width, y+height, fill="green", outline="black", tags=("shape", "draggable")) else: item = self.canvas.create_polygon(x, y+height/2, x+width, y, x+width, y+height, fill="red", outline="black", tags=("shape", "draggable")) self.canvas_element_map[item] = (shape, "shape") # ==================== 事件处理 ==================== def setup_bindings(self): self.canvas.tag_bind("text", "<Double-Button-1>", self.start_text_edit) self.canvas.bind("<Button-1>", self.start_drag) self.canvas.bind("<B1-Motion>", self.do_drag) self.canvas.bind("<ButtonRelease-1>", self.end_drag) self.root.bind("<Control-z>", lambda e: self.undo()) self.root.bind("<Control-y>", lambda e: self.redo()) self.root.bind("<Delete>", lambda e: self.delete_element()) def start_text_edit(self, event): item = self.canvas.find_closest(event.x, event.y)[0] if "text" not in self.canvas.gettags(item): return self.editing_text = item shape, _ = self.canvas_element_map[item] self.text_edit = tk.Text(self.canvas, width=40, height=3, font=("Arial", 12), wrap=tk.WORD) self.text_edit.insert(tk.END, shape.text_frame.text) x, y = self.canvas.coords(item) self.edit_window = self.canvas.create_window(x, y, anchor=tk.NW, window=self.text_edit) self.text_edit.focus_set() self.text_edit.bind("<FocusOut>", lambda e: self.finish_text_edit(shape)) def finish_text_edit(self, shape): new_text = self.text_edit.get("1.0", tk.END).strip() old_text = shape.text_frame.text self.record_action("format", shape, {'text': old_text}, {'text': new_text}) shape.text_frame.text = new_text self.canvas.delete(self.edit_window) self.text_edit.destroy() self.update_preview() def start_drag(self, event): item = self.canvas.find_closest(event.x, event.y) if item: tags = self.canvas.gettags(item) if "draggable" in tags: self.dragging = True self.selected_item = item[0] self.selected_element, elem_type = self.canvas_element_map[self.selected_item] self.start_x = event.x self.start_y = event.y self.original_x = self.selected_element.left self.original_y = self.selected_element.top # 仅对形状类元素设置轮廓 if elem_type == "shape": self.canvas.itemconfig(self.selected_item, outline="red", width=2) elif elem_type == "text": self.canvas.itemconfig(self.selected_item, fill="red") elif elem_type == "image": self.canvas.itemconfig(self.selected_item, outline="red") def do_drag(self, event): if self.dragging and self.selected_element: # 计算实际移动距离(英寸) dx_inch = (event.x - self.start_x) / 72 * self.preview_scale dy_inch = (event.y - self.start_y) / 72 * self.preview_scale # 更新元素位置 self.selected_element.left = self.original_x + Inches(dx_inch) self.selected_element.top = self.original_y + Inches(dy_inch) # 更新画布显示 dx_px = (event.x - self.start_x) dy_px = (event.y - self.start_y) self.canvas.move(self.selected_item, dx_px, dy_px) self.start_x = event.x self.start_y = event.y def end_drag(self, event): if self.dragging: new_x = self.selected_element.left new_y = self.selected_element.top self.record_action("move", self.selected_element, {'x': self.original_x, 'y': self.original_y}, {'x': new_x, 'y': new_y}) self.dragging = False # 恢复元素样式 _, elem_type = self.canvas_element_map[self.selected_item] if elem_type == "shape": self.canvas.itemconfig(self.selected_item, outline="black", width=1) elif elem_type == "text": self.canvas.itemconfig(self.selected_item, fill="black") elif elem_type == "image": self.canvas.itemconfig(self.selected_item, outline="") self.selected_element = None # ==================== 属性面板功能 ==================== def update_property_panel(self, element): for widget in self.enhanced_prop_frame.winfo_children(): widget.destroy() if element is None: return self.x_entry.delete(0, tk.END) self.x_entry.insert(0, f"{element.left.inches:.2f}") self.y_entry.delete(0, tk.END) self.y_entry.insert(0, f"{element.top.inches:.2f}") self.width_entry.delete(0, tk.END) self.width_entry.insert(0, f"{element.width.inches:.2f}") self.height_entry.delete(0, tk.END) self.height_entry.insert(0, f"{element.height.inches:.2f}") if element.has_text_frame: ttk.Label(self.enhanced_prop_frame, text="字体大小").pack() self.font_size = ttk.Spinbox(self.enhanced_prop_frame, from_=8, to=72) self.font_size.set(element.text_frame.paragraphs[0].font.size.pt) self.font_size.pack() if element.shape_type in [MSO_SHAPE.RECTANGLE, MSO_SHAPE.OVAL]: ttk.Button(self.enhanced_prop_frame, text="修改颜色", command=lambda: self.change_shape_color(element)).pack() def apply_properties(self): if self.selected_element: try: # 验证输入有效性 float(self.x_entry.get()) float(self.y_entry.get()) float(self.width_entry.get()) float(self.height_entry.get()) except ValueError: messagebox.showerror("错误", "请输入有效的数字值") return old_state = { 'x': self.selected_element.left, 'y': self.selected_element.top, 'width': self.selected_element.width, 'height': self.selected_element.height } try: self.selected_element.left = Inches(float(self.x_entry.get())) self.selected_element.top = Inches(float(self.y_entry.get())) self.selected_element.width = Inches(float(self.width_entry.get())) self.selected_element.height = Inches(float(self.height_entry.get())) except Exception as e: messagebox.showerror("错误", f"无效的参数: {str(e)}") return new_state = { 'x': self.selected_element.left, 'y': self.selected_element.top, 'width': self.selected_element.width, 'height': self.selected_element.height } self.record_action("format", self.selected_element, old_state, new_state) self.update_preview() def change_shape_color(self, element): if not hasattr(element, 'fill'): messagebox.showerror("错误", "该元素不支持颜色修改") return color = colorchooser.askcolor() if color[1]: try: old_color = element.fill.fore_color.rgb element.fill.solid() element.fill.fore_color.rgb = RGBColor.from_string(color[1][1:]) self.record_action("format", element, {'color': old_color}, {'color': element.fill.fore_color.rgb}) self.update_preview() except AttributeError: messagebox.showerror("错误", "颜色修改失败") # ==================== 文件操作 ==================== def open_presentation(self): file_path = filedialog.askopenfilename( filetypes=[("PPTX Files", "*.pptx")] ) if file_path: try: self.presentation = Presentation(file_path) self.current_slide = self.presentation.slides[0] self.update_slide_list() self.update_preview() self.status_bar.config(text="文件已打开") except Exception as e: messagebox.showerror("错误", f"打开失败: {str(e)}") def save_presentation(self): if not hasattr(self.presentation, 'saved_path'): self.save_as_presentation() else: try: self.presentation.save(self.presentation.saved_path) self.status_bar.config(text="文件已保存") except Exception as e: messagebox.showerror("错误", f"保存失败: {str(e)}") def save_as_presentation(self): file_path = filedialog.asksaveasfilename( defaultextension=".pptx", filetypes=[("PPTX Files", "*.pptx")] ) if file_path: self.presentation.saved_path = file_path self.presentation.save(file_path) self.status_bar.config(text="文件已另存为") # ==================== 其他功能 ==================== def record_action(self, action_type, element, old_state, new_state): if old_state == new_state: return action = Action(action_type, element, old_state, new_state) if len(self.undo_stack) >= 50: self.undo_stack.pop(0) self.undo_stack.append(action) self.redo_stack.clear() def undo(self): if self.undo_stack: action = self.undo_stack.pop() action.undo() self.redo_stack.append(action) self.update_preview() self.status_bar.config(text=f"已撤销:{action.action_type}") def redo(self): if self.redo_stack: action = self.redo_stack.pop() action.redo() self.undo_stack.append(action) self.update_preview() self.status_bar.config(text=f"已重做:{action.action_type}") def delete_element(self): if self.selected_element: old_state = { 'x': self.selected_element.left, 'y': self.selected_element.top, 'width': self.selected_element.width, 'height': self.selected_element.height } self.record_action("delete", self.selected_element, old_state, None) self.selected_element._element.getparent().remove(self.selected_element._element) self.update_preview() def cut_element(self): if self.selected_element: self.copy_element() self.delete_element() def copy_element(self): if self.selected_element: self.clipboard = { 'type': type(self.selected_element), 'state': { 'left': self.selected_element.left, 'top': self.selected_element.top, 'width': self.selected_element.width, 'height': self.selected_element.height, 'text': self.selected_element.text_frame.text if hasattr(self.selected_element, 'text_frame') else None } } def paste_element(self): if self.clipboard and self.current_slide: try: if self.clipboard['type'] == type(self.current_slide.shapes.add_textbox(Inches(0), Inches(0))): new_element = self.current_slide.shapes.add_textbox( Inches(self.clipboard['state']['left'].inches), Inches(self.clipboard['state']['top'].inches), Inches(self.clipboard['state']['width'].inches), Inches(self.clipboard['state']['height'].inches) ) new_element.text_frame.text = self.clipboard['state']['text'] self.update_preview() except Exception as e: messagebox.showerror("粘贴错误", str(e)) def export_to_word(self): messagebox.showinfo("提示", "该功能正在开发中") def export_as_image(self): messagebox.showinfo("提示", "该功能正在开发中") def toggle_ruler(self): messagebox.showinfo("提示", "标尺功能正在开发中") def toggle_grid(self): messagebox.showinfo("提示", "网格功能正在开发中") def reset_zoom(self): self.preview_scale = 0.8 self.update_preview() def insert_chart(self): messagebox.showinfo("提示", "图表功能正在开发中") def load_config(self): try: with open("config.json") as f: self.config = json.load(f) if self.config.get("theme") == "dark": self.root.configure(bg="gray20") style = ttk.Style() style.theme_use("alt") except: self.config = {"auto_save": True, "theme": "light"} def setup_auto_save(self): if self.config.get("auto_save", False): self.root.after(300000, self.auto_save) def auto_save(self): try: if hasattr(self.presentation, 'saved_path'): self.presentation.save(self.presentation.saved_path) self.status_bar.config(text=f"自动保存成功 {datetime.datetime.now().strftime('%H:%M:%S')}") self.root.after(300000, self.auto_save) except Exception as e: messagebox.showerror("自动保存失败", str(e)) def exit_app(self): self.save_config() self.root.quit() if __name__ == "__main__": root = tk.Tk() app = PPTCreatorPro(root) root.mainloop()
六、你对AI辅助代码编写的思考: AI辅助代码编写正重塑软件开发范式,其核心价值体现在效率革命、知识平权和思维增强三个维度:通过自动化生成、智能补全和架构建议显著提升开发效率,借助语法提示和跨语言转换降低技术门槛,结合设计模式推荐与性能优化反馈增强开发者创造力。然而这种变革伴随认知陷阱、质量隐患与伦理挑战——过度依赖可能导致基础能力退化,隐藏的安全漏洞和技术债可能破坏代码健康,而版权归属与就业结构调整则引发行业争议。未来演进将呈现工具智能化(上下文感知、自解释代码)、协作范式革新(AI结对编程、自然语言转系统)和开发者角色转型(从编码转向架构设计)三重趋势,这要求个人保持底层原理认知的同时掌握AI协同技巧,团队建立代码审核与知识库维护机制,行业推动规范制定与开源生态建设。最终,人机协同将推动编程抽象层级跃升,使开发者从代码实现转向需求塑形,核心竞争力转向精准描述问题的能力,形成"软件设计师"主导、AI高效实现的增强智能新生态。
-
2025-3-1 18:57:17@
一、作品名称:音频分离小程序 二、作品创作者及使用的AI工具: 创作者:艾峻平 使用的AI工具:豆包 三、作品主要功能: (1)将视屏的音频分离出来 (2)可以切换语言 四、作品主要截图:
五、作品的代码:
import tkinter as tk from tkinter import filedialog import os import shutil #from moviepy.editor import VideoFileClip as mp # 定义语言文本字典 LANGUAGES = { "中文": { "button1": "上传视频", "button2": "语言", "button3": "打卡文件夹", "button4": "粘贴路径", "button5": "返回", "button6": "中文", "button7": "英文", "button8": "返回", "button9": "俄文", "button10": "法语", "label": "欢迎使用" }, "英文": { "button1": "Upload Video", "button2": "Language", "button3": "Open Folder", "button4": "Paste Path", "button5": "Back", "button6": "Chinese", "button7": "English", "button8": "Back", "button9": "Russian", "button10": "French", "label": "Welcome to use" }, "俄文": { "button1": "Загрузить видео", "button2": "Язык", "button3": "Открыть папку", "button4": "Вставить путь", "button5": "Назад", "button6": "Китайский", "button7": "Английский", "button8": "Назад", "button9": "Русский", "button10": "Французский", "label": "Добро пожаловать" }, "法语": { "button1": "Télécharger une vidéo", "button2": "Langue", "button3": "Ouvrir le dossier", "button4": "Coller le chemin", "button5": "Retour", "button6": "Chinois", "button7": "Anglais", "button8": "Retour", "button9": "Russe", "button10": "Français", "label": "Bienvenue" } } # 当前语言,默认为中文 current_language = "中文" def show_second_interface(): # 隐藏主界面 main_frame.pack_forget() # 显示界面二 second_frame.pack() def show_main_interface(): # 隐藏界面二和界面三 second_frame.pack_forget() third_frame.pack_forget() # 显示主界面 main_frame.pack() def show_third_interface(): # 隐藏当前界面(假设当前是主界面或界面二) main_frame.pack_forget() second_frame.pack_forget() # 显示界面三 third_frame.pack() def separate_audio(): # 打开文件选择对话框 file_path = filedialog.askopenfilename(filetypes=[("视频文件", "*.mp4;*.avi;*.mov")]) if file_path: try: # 加载视频文件 video = mp(file_path) audio = video.audio # 获取桌面路径 desktop_path = os.path.join(os.path.expanduser("~"), "Desktop") # 创建新文件夹 new_folder = os.path.join(desktop_path, "背景音乐") if not os.path.exists(new_folder): os.makedirs(new_folder) # 生成音频文件名 audio_filename = os.path.splitext(os.path.basename(file_path))[0] + ".mp3" audio_path = os.path.join(new_folder, audio_filename) # 保存音频文件 audio.write_audiofile(audio_path) # 关闭视频和音频对象 audio.close() video.close() print(f"背景音乐已保存到: {audio_path}") except Exception as e: print(f"处理视频时出错: {e}") def change_language(lang): global current_language current_language = lang # 更新所有按钮和标签的文本 button1.config(text=LANGUAGES[current_language]["button1"]) button2.config(text=LANGUAGES[current_language]["button2"]) button3.config(text=LANGUAGES[current_language]["button3"]) button4.config(text=LANGUAGES[current_language]["button4"]) button5.config(text=LANGUAGES[current_language]["button5"]) button6.config(text=LANGUAGES[current_language]["button6"]) button7.config(text=LANGUAGES[current_language]["button7"]) button8.config(text=LANGUAGES[current_language]["button8"]) button9.config(text=LANGUAGES[current_language]["button9"]) button10.config(text=LANGUAGES[current_language]["button10"]) label.config(text=LANGUAGES[current_language]["label"]) # 创建主窗口 root = tk.Tk() root.title("两个按钮的界面") # 创建主界面框架 main_frame = tk.Frame(root) main_frame.pack() # 创建第一个按钮(上传视频) button1 = tk.Button(main_frame, text=LANGUAGES[current_language]["button1"], command=show_second_interface) button1.pack(pady=10) # 创建第二个按钮(语言) button2 = tk.Button(main_frame, text=LANGUAGES[current_language]["button2"], command=show_third_interface) button2.pack(pady=10) # 创建界面二框架 second_frame = tk.Frame(root) # 初始时界面二隐藏 # 在界面二框架中添加两个按钮 button3 = tk.Button(second_frame, text=LANGUAGES[current_language]["button3"], command=separate_audio) button3.pack(pady=10) button4 = tk.Button(second_frame, text=LANGUAGES[current_language]["button4"]) button4.pack(pady=10) button5 = tk.Button(second_frame, text=LANGUAGES[current_language]["button5"], command=show_main_interface) button5.pack(pady=10) # 简单添加一个标签作为示例 label = tk.Label(second_frame, text=LANGUAGES[current_language]["label"]) label.pack(pady=20) # 创建界面三框架 third_frame = tk.Frame(root) # 在界面三框架中添加四个按钮 button6 = tk.Button(third_frame, text=LANGUAGES[current_language]["button6"], command=lambda: change_language("中文")) button6.pack(pady=10) button7 = tk.Button(third_frame, text=LANGUAGES[current_language]["button7"], command=lambda: change_language("英文")) button7.pack(pady=10) button9 = tk.Button(third_frame, text=LANGUAGES[current_language]["button9"], command=lambda: change_language("俄文")) button9.pack(pady=10) button10 = tk.Button(third_frame, text=LANGUAGES[current_language]["button10"], command=lambda: change_language("法语")) button10.pack(pady=10) # 将 show_main_interface 函数绑定给“返回”按钮 button8 = tk.Button(third_frame, text=LANGUAGES[current_language]["button8"], command=show_main_interface) button8.pack(pady=10) # 进入主循环 root.mainloop()
六、你对AI辅助代码编写的思考:AI 辅助代码编写极大提升效率,能快速生成框架、提供思路,打破技术瓶颈。但输出质量参差不齐,需人工审核校验,不可盲目依赖。
-
2025-3-1 17:11:29@
一、作品名称:背单词工具
二、作品创作者及使用的AI工具:
创作者:何楠楠 使用的AI工具:DeepSeek
三、作品主要功能:
1.可用于背单词,具体分为两部分; 2.第一部分是“单词新学”,这部分是用来学新的单词的,利用选项选单词翻译的方式让我们更利于记住单词; 3.第二部分是“我的词书”,可以将新学的单词记录在词书中,保存到本地。
四、作品主要截图:
五、作品的代码:
import tkinter as tk from tkinter import messagebox, ttk import json import random # 单词库 word_categories = { "四级": [ ("apple", "苹果"), ("banana", "香蕉"), ("cherry", "樱桃"), ("date", "枣"), ("elderberry", "接骨木莓") ], "六级": [ ("fig", "无花果"), ("grape", "葡萄"), ("honeydew", "蜜瓜"), ("kiwi", "猕猴桃"), ("lemon", "柠檬") ], "考研": [ ("mango", "芒果"), ("orange", "橙子"), ("peach", "桃子"), ("pear", "梨"), ("pineapple", "菠萝") ] } # 词书 word_book = [] # 当前显示的单词索引 current_word_index = 0 # 当前选择的单词分类 current_category = None # 清空屏幕 def clear_screen(): for widget in root.winfo_children(): widget.destroy() # 显示封面 def show_cover(): clear_screen() # 设置背景颜色 root.configure(bg="#F0F8FF") # 封面标题 label = tk.Label(root, text="也没啥,就想问问你背单词了吗?", font=("楷体", 28), fg="#2E86C1", bg="#F0F8FF") label.pack(pady=100) # 开始按钮 button = ttk.Button(root, text="开始", style="TButton", command=show_message) button.pack() # 显示鼓励信息 def show_message(): clear_screen() root.configure(bg="#F0F8FF") # 鼓励信息 label = tk.Label(root, text="没有困难的单词,只有勇敢的读书人!!!", font=("楷体", 24), fg="#2E86C1", bg="#F0F8FF") label.pack(pady=50) # 像素小人画布 canvas = tk.Canvas(root, width=100, height=150, bg="#F0F8FF", highlightthickness=0) canvas.pack(pady=20) # 绘制更美观的像素小人 def draw_pixel_man(): canvas.delete("all") # 清空画布 # 绘制头部 canvas.create_oval(30, 10, 70, 50, fill="#FFD700", outline="") # 金色头部 # 绘制眼睛 canvas.create_oval(40, 20, 45, 25, fill="#000000", outline="") # 左眼 canvas.create_oval(55, 20, 60, 25, fill="#000000", outline="") # 右眼 # 绘制嘴巴 canvas.create_arc(40, 30, 60, 40, start=0, extent=-180, fill="#FF6347", outline="") # 红色微笑 # 绘制身体 canvas.create_rectangle(40, 50, 60, 100, fill="#1E90FF", outline="") # 蓝色身体 # 绘制左臂 canvas.create_rectangle(20, 50, 40, 70, fill="#1E90FF", outline="") # 蓝色左臂 # 绘制右臂 canvas.create_rectangle(60, 50, 80, 70, fill="#1E90FF", outline="") # 蓝色右臂 # 绘制左腿 canvas.create_rectangle(40, 100, 50, 130, fill="#1E90FF", outline="") # 蓝色左腿 # 绘制右腿 canvas.create_rectangle(50, 100, 60, 130, fill="#1E90FF", outline="") # 蓝色右腿 # 绘制鞋子 canvas.create_rectangle(35, 130, 55, 140, fill="#8B4513", outline="") # 棕色鞋子 canvas.create_rectangle(45, 130, 65, 140, fill="#8B4513", outline="") # 棕色鞋子 # 初始绘制 draw_pixel_man() # 跳跃动画 def jump_animation(): for i in range(10): canvas.move("all", 0, -5) # 向上移动 root.update() root.after(50) # 延迟 50 毫秒 for i in range(10): canvas.move("all", 0, 5) # 向下移动 root.update() root.after(50) # 延迟 50 毫秒 root.after(500, jump_animation) # 循环动画 # 点击小人跳转到主页 def on_click(event): show_main_menu() # 绑定点击事件 canvas.bind("<Button-1>", on_click) # 提示文字 label_click = tk.Label(root, text="点我开始学习单词~", font=("楷体", 16), fg="#2E86C1", bg="#F0F8FF") label_click.pack(pady=10) # 启动动画 jump_animation() # 显示主菜单 def show_main_menu(): clear_screen() root.configure(bg="#F0F8FF") # 标题 label = tk.Label(root, text="背单词工具", font=("楷体", 28), fg="#2E86C1", bg="#F0F8FF") label.pack(pady=50) # 单词新学按钮 button1 = ttk.Button(root, text="单词新学", style="TButton", command=show_category_menu) button1.pack(pady=20) # 我的词书按钮 button2 = ttk.Button(root, text="我的词书", style="TButton", command=show_word_book) button2.pack(pady=20) # 显示分类菜单 def show_category_menu(): clear_screen() root.configure(bg="#F0F8FF") # 标题 label = tk.Label(root, text="选择单词分类", font=("楷体", 24), fg="#2E86C1", bg="#F0F8FF") label.pack(pady=50) # 分类按钮 for category in word_categories.keys(): button = ttk.Button(root, text=category, style="TButton", command=lambda c=category: start_learning(c)) button.pack(pady=10) # 返回按钮 button_back = ttk.Button(root, text="返回", style="TButton", command=show_main_menu) button_back.pack(pady=20) # 开始学习单词 def start_learning(category): global current_word_index, current_category current_word_index = 0 current_category = category show_word_quiz() # 显示单词和翻译选项 def show_word_quiz(): clear_screen() root.configure(bg="#F0F8FF") if current_word_index < len(word_categories[current_category]): word, correct_translation = word_categories[current_category][current_word_index] # 显示单词 label_word = tk.Label(root, text=word, font=("Arial", 24), fg="#2E86C1", bg="#F0F8FF") label_word.pack(pady=50) # 随机生成一个错误翻译 wrong_translation = random.choice([t for (_, t) in word_categories[current_category] if t != correct_translation]) # 随机打乱选项顺序 options = [correct_translation, wrong_translation] random.shuffle(options) # 显示翻译选项 def on_option_click(selected_translation): if selected_translation == correct_translation: messagebox.showinfo("提示", "答对啦!") else: messagebox.showinfo("提示", "错了哦~") show_example_sentence(word) # 创建选项按钮 for option in options: button = ttk.Button(root, text=option, style="TButton", command=lambda o=option: on_option_click(o)) button.pack(pady=10) # 加入词书按钮 def add_to_word_book(): word, translation = word_categories[current_category][current_word_index] if (word, translation) not in word_book: word_book.append((word, translation)) messagebox.showinfo("提示", f"'{word}' 已加入词书") else: messagebox.showinfo("提示", f"'{word}' 已在词书中") button_add = ttk.Button(root, text="加入词书", style="TButton", command=add_to_word_book) button_add.pack(pady=10) # 下一个按钮 button_next = ttk.Button(root, text="下一个", style="TButton", command=next_word) button_next.pack(pady=20) else: show_category_menu() # 显示例句 def show_example_sentence(word): # 简单的例句生成逻辑 example_sentences = { "apple": "I ate an apple for breakfast.", "banana": "She likes to eat bananas.", "cherry": "The cherry is very sweet.", "date": "He bought some dates from the market.", "elderberry": "Elderberry is good for health.", "fig": "The fig tree is in the garden.", "grape": "Grapes are used to make wine.", "honeydew": "Honeydew melon is very refreshing.", "kiwi": "Kiwi is rich in vitamin C.", "lemon": "She added lemon to her tea.", "mango": "Mango is my favorite fruit.", "orange": "Oranges are a great source of vitamin C.", "peach": "The peach is very juicy.", "pear": "She bought a pear from the store.", "pineapple": "Pineapple is a tropical fruit." } sentence = example_sentences.get(word, "No example sentence available.") label_sentence = tk.Label(root, text=f"例句: {sentence}", font=("Arial", 16), fg="#2E86C1", bg="#F0F8FF") label_sentence.pack(pady=20) # 下一个单词 def next_word(): global current_word_index current_word_index += 1 show_word_quiz() # 显示词书 def show_word_book(): clear_screen() root.configure(bg="#F0F8FF") if word_book: # 显示词书标题 label = tk.Label(root, text="我的词书", font=("楷体", 24), fg="#2E86C1", bg="#F0F8FF") label.pack(pady=20) # 显示词书内容 for word, translation in word_book: word_label = tk.Label(root, text=f"{word} - {translation}", font=("Arial", 18), fg="#2E86C1", bg="#F0F8FF") word_label.pack(pady=10) # 保存本地按钮 button_save = ttk.Button(root, text="保存本地", style="TButton", command=save_word_book) button_save.pack(pady=20) else: # 词书为空时的提示 label = tk.Label(root, text="词书为空", font=("楷体", 18), fg="#2E86C1", bg="#F0F8FF") label.pack(pady=100) # 返回按钮 button_back = ttk.Button(root, text="返回", style="TButton", command=show_main_menu) button_back.pack(pady=20) # 保存词书到本地 def save_word_book(): try: with open("word_book.json", "w", encoding="utf-8") as f: json.dump(word_book, f, ensure_ascii=False, indent=4) messagebox.showinfo("提示", "词书已保存到本地文件 word_book.json") except Exception as e: messagebox.showerror("错误", f"保存失败: {str(e)}") # 创建主窗口 root = tk.Tk() root.title("背单词工具") root.geometry("800x600") # 设置主题样式 style = ttk.Style() style.configure("TButton", font=("Arial", 16), padding=10, background="#2E86C1", foreground="#FFFFFF") style.map("TButton", background=[("active", "#1B4F72")]) # 显示封面 show_cover() # 运行主循环 root.mainloop()
六、你对AI辅助代码编写的思考:
AI写代码是更省事省力,可是要经过大量的描述,经过大量是修改提示词,还不一定能达到预期,所以我认为有时还是自己更明白自己的想法,AI不能代替人类。
-
2025-3-1 17:01:29@
一、作品名称:丰富桌面壁纸程序
二、作品创作者及使用的AI工具:DeepSeek
三、作品主要功能、应用场景及使用说明:
(1)丰富桌面壁纸
详细介绍:再根据使用说明修改完相应设置后,每次开机都会爬取“bing.com”上的背景图片并保存到一个文件夹,电脑依次会将该文件夹中的图片作为桌面壁纸
(2)批量重命名
详细介绍:用户选择一个文件夹,选择不需重命名的文件并输入重命名前缀,程序会以“重命名前缀_序号”的形式对选择的文件进行批量重命名
(3)删除重复文件
详细介绍:用户选择一个文件夹,程序会删除该文件中的重复文件(并非简单的删除重名的)
应用场景:
我们班的一些同学经常会在下课时间从Bing上下载图片并将其存在一个文件夹中作为桌面壁纸,然而经常会出现忘记或者时间不够的情况,因此,我编写了一个代码来替代这些同学的“工作”
使用说明:
从“五、作品的代码”下的链接将“丰富桌面壁纸”文件夹下载到桌面上,运行该文件夹下的“丰富桌面壁纸”Python程序,在用户界面中点击“激活丰富桌面壁纸程序”按钮(首次使用),根据程序打开的使用说明完成相应设置即可使用
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
由于本作品涉及变量永久保存及多个程序,请通过该链接下载:https://www.123912.com/s/j4vlTd-fQyPv
六、你对AI辅助代码编写的思考:
相比于豆包、Kimi,Deepseek生成的代码质量较高,看起来仿佛人类只用输入提示词就可以得到到一个还不错的代码,但是我觉得AI能提供给我们的只是“充足的砖头”,“盖房子”是我们的事AI能把极致的技术和工具给到我们,但运用工具的“精神”,“品质”只能靠我们就现在而言,人类总体掌握的知识随着AI拥有的知识的增多而减少,如果仍然不改变,AI获得人类所有知识或者拥有“精神”或“品质”之时,即是人类的丧钟被敲响之时
-
2025-3-1 16:24:39@
一、作品名称:数独小游戏
二、作品创作者及使用的AI工具:豆包
三、作品主要功能:
(1)在游戏启动时,会弹出一个初始界面,显示 “欢迎来到数独游戏!” 这样的欢迎语,让用户能清晰知晓进入的是数独游戏。
(2)在初始界面中,详细列出了数独游戏的规则,包括要在空白单元格填入 1 - 9 的数字,每行、每列和每个 3x3 子网格内数字不能重复,完成所有单元格填充即为获胜等内容,帮助新用户快速了解游戏玩法。
(3)提供 “开始游戏” 按钮,用户点击该按钮后,初始界面关闭,正式进入数独游戏界面。
四、作品主要截图
五、作品的代码:
import random import tkinter as tk from tkinter import messagebox # 生成一个完整的数独解 def generate_sudoku_solution(): base = 3 side = base * base def pattern(r, c): return (base * (r % base) + r // base + c) % side def shuffle(s): return random.sample(s, len(s)) rBase = range(base) rows = [g * base + r for g in shuffle(rBase) for r in shuffle(rBase)] cols = [g * base + c for g in shuffle(rBase) for c in shuffle(rBase)] nums = shuffle(range(1, base * base + 1)) board = [[nums[pattern(r, c)] for c in cols] for r in rows] return board # 从完整的数独解中移除一些数字以生成谜题 def generate_sudoku_puzzle(solution, difficulty=30): side = len(solution) squares = side * side empties = squares * difficulty // 100 for p in random.sample(range(squares), empties): solution[p // side][p % side] = 0 return solution # 验证数独是否合法 def is_valid(board, row, col, num): # 检查行 for i in range(9): if board[row][i] == num: return False # 检查列 for i in range(9): if board[i][col] == num: return False # 检查 3x3 子网格 start_row = (row // 3) * 3 start_col = (col // 3) * 3 for i in range(3): for j in range(3): if board[start_row + i][start_col + j] == num: return False return True # 检查数独是否已完成 def is_complete(board): for i in range(9): for j in range(9): if board[i][j] == 0: return False return True # 打印数独棋盘到 GUI def print_board_gui(board, entries): for i in range(9): for j in range(9): if board[i][j] == 0: entries[i][j].delete(0, tk.END) entries[i][j].config(state=tk.NORMAL) else: entries[i][j].delete(0, tk.END) entries[i][j].insert(0, str(board[i][j])) entries[i][j].config(state=tk.DISABLED) # 检查用户输入是否有效 def check_input(entries, puzzle): temp_puzzle = [row[:] for row in puzzle] for i in range(9): for j in range(9): try: num = int(entries[i][j].get()) if entries[i][j].get() else 0 if num != 0: if not is_valid(temp_puzzle, i, j, num): messagebox.showerror("错误", "这个数字不能放在这里,请重试。") return False temp_puzzle[i][j] = num except ValueError: if entries[i][j].get(): messagebox.showerror("错误", "输入无效,请输入 1 - 9 的数字。") return False if is_complete(temp_puzzle): for i in range(9): for j in range(9): puzzle[i][j] = temp_puzzle[i][j] messagebox.showinfo("恭喜", "你完成了数独游戏!") root.destroy() return True # 主游戏界面 def start_game(): global solution, puzzle solution = generate_sudoku_solution() puzzle = [row[:] for row in solution] puzzle = generate_sudoku_puzzle(puzzle) # 创建主窗口 global root root = tk.Tk() root.title("数独游戏") # 创建输入框矩阵 entries = [[None] * 9 for _ in range(9)] for i in range(9): if i % 3 == 0 and i != 0: tk.Label(root, text="- - - - - - - - - - - -").grid(row=i, column=0, columnspan=9) for j in range(9): if j % 3 == 0 and j != 0: tk.Label(root, text="|").grid(row=i, column=j) entries[i][j] = tk.Entry(root, width=3, justify=tk.CENTER) entries[i][j].grid(row=i, column=j) # 打印初始棋盘 print_board_gui(puzzle, entries) # 创建提交按钮 submit_button = tk.Button(root, text="提交", command=lambda: check_input(entries, puzzle)) submit_button.grid(row=9, column=0, columnspan=9) root.mainloop() # 初始界面 def initial_interface(): initial_root = tk.Tk() initial_root.title("数独游戏 - 初始界面") # 提示信息 welcome_label = tk.Label(initial_root, text="欢迎来到数独游戏!", font=("Arial", 16)) welcome_label.pack(pady=20) instruction_label = tk.Label(initial_root, text="游戏规则:\n1. 请在空白单元格中填入 1 - 9 的数字。\n2. 每行、每列和每个 3x3 子网格内的数字不能重复。\n3. 完成所有单元格的填充即为获胜。", font=("Arial", 12)) instruction_label.pack(pady=10) start_button = tk.Button(initial_root, text="开始游戏", command=lambda: [initial_root.destroy(), start_game()]) start_button.pack(pady=20) initial_root.mainloop() if __name__ == "__main__": initial_interface()
六、你对AI辅助代码编写的思考:
借助 AI,我快速获取了数独算法思路,比如生成数独解的方法。同时,在处理tkinter界面元素布局和交互逻辑时,AI 给出的示例代码和优化建议,让我少走许多弯路。不过,AI 也并非十全十美,它给出的部分代码在实际应用场景中需要微调,其对复杂业务逻辑的理解深度有时也不足。总体而言,AI 极大提升了我的开发效率,成为我编程路上不可或缺的得力助手 。
-
2025-3-1 14:40:13@
一. 作品名称
迷宫收集游戏
二. 作品创作者及使用的AI工具:
DeepSeek
三. 作品主要功能:
- 生成迷宫. 每次随机生成迷宫,增加挑战难度
- 生成物品. 在迷宫中随机生成收集物,增加游戏的趣味性
- 闯关机制. 在迷宫中寻找收集物,并回答完所有的问题后即可通关
四. 作品主要截图
五、作品的代码:
import pygame import random from collections import deque import pygame_gui # 初始化 pygame.init() # 屏幕尺寸 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("迷宫收集游戏") # 颜色定义 white = (255, 255, 255) black = (50, 50, 50) blue = (0, 0, 255) yellow = (100, 255, 255) # 玩家属性 player_width = 20 player_height = 20 player_speed = 2 # 迷宫尺寸 maze_width = 50 maze_height = 50 cell_size = 40 # 初始化pygame_gui manager = pygame_gui.UIManager((screen_width, screen_height)) print("欢迎游玩“迷宫收集游戏”,在迷宫中寻找宝石,回答问题,通关游戏!") # 随机生成迷宫 def generate_maze(width, height): # 初始化迷宫,全部为墙 maze = [[1 for _ in range(width)] for _ in range(height)] # 使用深度优先搜索生成迷宫 def dfs(x, y): maze[y][x] = 0 # 打通当前单元格 directions = [(1, 0), (-1, 0), (0, 1), (0, -1)] random.shuffle(directions) # 随机方向 for dx, dy in directions: nx, ny = x + dx * 2, y + dy * 2 # 跳过一格 if 0 <= nx < width and 0 <= ny < height and maze[ny][nx] == 1: maze[y + dy][x + dx] = 0 # 打通中间的墙 dfs(nx, ny) dfs(1, 1) # 从起点开始生成 # 确保迷宫的最外层是墙 for x in range(width): maze[0][x] = 1 maze[height - 1][x] = 1 for y in range(height): maze[y][0] = 1 maze[y][width - 1] = 1 return maze # 检测玩家是否可以到达所有收集物 def can_reach_all_collectibles(maze, start_x, start_y, collectibles): # 将坐标转换为迷宫索引 start_row, start_col = start_y // cell_size, start_x // cell_size # 使用广度优先搜索(BFS)检测是否可达 queue = deque() queue.append((start_row, start_col)) visited = set() visited.add((start_row, start_col)) collectibles_reached = 0 while queue: row, col = queue.popleft() # 检查当前位置是否是收集物 for item in collectibles: if row == item[1] // cell_size and col == item[0] // cell_size: collectibles_reached += 1 if collectibles_reached == len(collectibles): return True # 所有收集物都可达 # 遍历四个方向 for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]: new_row, new_col = row + dy, col + dx if 0 <= new_row < maze_height and 0 <= new_col < maze_width: if maze[new_row][new_col] == 0 and (new_row, new_col) not in visited: visited.add((new_row, new_col)) queue.append((new_row, new_col)) return False # 未找到所有收集物 # 生成随机收集物 def generate_collectibles(maze, count): collectibles = [] while len(collectibles) < count: x = random.randint(0, maze_width - 1) y = random.randint(0, maze_height - 1) if maze[y][x] == 0: # 确保收集物在可通行区域 collectibles.append((x * cell_size, y * cell_size)) return collectibles # 生成随机玩家初始位置 def generate_player_position(maze): while True: x = random.randint(0, maze_width - 1) y = random.randint(0, maze_height - 1) if maze[y][x] == 0: # 确保玩家初始位置在可通行区域 return x * cell_size, y * cell_size # 生成有效的迷宫、玩家初始位置和收集物 def generate_valid_maze_and_collectibles(): while True: maze = generate_maze(maze_width, maze_height) collectibles = generate_collectibles(maze, 5) # 生成5个收集物 player_x, player_y = generate_player_position(maze) # 随机生成玩家初始位置 if can_reach_all_collectibles(maze, player_x, player_y, collectibles): return maze, player_x, player_y, collectibles # 生成迷宫、玩家初始位置和收集物 maze, player_x, player_y, collectibles = generate_valid_maze_and_collectibles() # 加载中文字体 try: # 使用黑体字体(确保字体文件路径正确) font = pygame.font.Font("simhei.ttf", 36) gui_font = pygame.font.Font("simhei.ttf", 24) # pygame_gui使用的字体 except Exception as e: print(" ") font = pygame.font.SysFont(None, 36) # 如果找不到字体,使用默认字体 gui_font = pygame.font.SysFont(None, 24) # 随机生成问题 def generate_random_question(): questions = [ {"question": "《朝花夕拾》的作者是谁? :", "answer": "鲁迅"}, {"question": "《红楼梦》的作者是谁? :", "answer": "曹雪芹"}, {"question": "《西游记》的作者是谁? :", "answer": "吴承恩"}, {"question": "《三国演义》的作者是谁? :", "answer": "罗贯中"}, {"question": "《水浒传》的作者是谁? :", "answer": "施耐庵"}, {"question": "1343+ 2423等于几? :", "answer": "3766"}, {"question": "2的8次方是多少? :", "answer": "256"}, {"question": "3的4是多少? :", "answer": "81"}, {"question": "999除以3等于几? :", "answer": "333"}, {"question": "圆周率的前两位是多少? :", "answer": "3.14"} ] return random.choice(questions) # 绘制迷宫 def draw_maze(maze, offset_x, offset_y): for y, row in enumerate(maze): for x, cell in enumerate(row): if cell == 1: pygame.draw.rect(screen, black, (x * cell_size + offset_x, y * cell_size + offset_y, cell_size, cell_size)) # 绘制玩家 def draw_player(x, y): pygame.draw.rect(screen, blue, (x, y, player_width, player_height)) # 绘制收集物 def draw_collectibles(collectibles, offset_x, offset_y): for item in collectibles: pygame.draw.circle(screen, yellow, (item[0] + offset_x + cell_size // 2, item[1] + offset_y + cell_size // 2), 10) # 检测碰撞 def check_collision(x, y): # 检查是否超出迷宫范围 if x < 0 or x >= maze_width * cell_size or y < 0 or y >= maze_height * cell_size: return True # 检查是否撞墙 row = y // cell_size col = x // cell_size if maze[row][col] == 1: return True return False # 检测是否收集到物品 def check_collect(x, y, collectibles): for item in collectibles: if x >= item[0] and x <= item[0] + cell_size and y >= item[1] and y <= item[1] + cell_size: return item return None # 显示消息 def show_message(message, color): text = font.render(message, True, color) screen.blit(text, (screen_width // 2 - 150, screen_height // 2 - 50)) # 游戏主循环 running = True collected_count = 0 while running: screen.fill(white) # 计算视野偏移 offset_x = screen_width // 2 - player_x offset_y = screen_height // 2 - player_y # 绘制迷宫(根据视野偏移) draw_maze(maze, offset_x, offset_y) # 绘制玩家和收集物(根据视野偏移) draw_player(screen_width // 2, screen_height // 2) draw_collectibles(collectibles, offset_x, offset_y) # 检测是否收集到物品 collected_item = check_collect(player_x, player_y, collectibles) if collected_item: collectibles.remove(collected_item) collected_count += 1 # 弹出随机问题 question = generate_random_question() answer = input(question["question"]) # 在控制台输入答案 if answer == question["answer"]: print("回答正确!") else: print(f"回答错误!正确答案是:{question['answer']}") # 检测是否收集完所有物品 if collected_count == 5: # 总共有5个收集物 show_message("恭喜通关!", yellow) pygame.display.update() pygame.time.wait(3000) # 显示胜利消息3秒 running = False pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 检测按键 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: new_x = player_x - player_speed if not check_collision(new_x, player_y): player_x = new_x if keys[pygame.K_RIGHT]: new_x = player_x + player_speed if not check_collision(new_x, player_y): player_x = new_x if keys[pygame.K_UP]: new_y = player_y - player_speed if not check_collision(player_x, new_y): player_y = new_y if keys[pygame.K_DOWN]: new_y = player_y + player_speed if not check_collision(player_x, new_y): player_y = new_y # 退出游戏 pygame.quit() print("游戏结束,感谢游玩!")
六、你对AI辅助代码编写的思考:
AI辅助代码编写为开发者带来了巨大的便利,但也伴随着一些挑战和风险。开发者应当合理利用这些工具,既要享受其带来的效率提升,也要保持对代码质量和安全性的关注。未来,随着AI技术的进一步发展,AI辅助编程将在软件开发中扮演更加重要的角色。
-
2025-3-1 13:39:59@
一、作品名称:Music Player
二、作品创作者及使用的AI工具:豆包、deepseek
三、作品主要功能:
1.音频播放能力 支持主流音频格式(如MP3、AAC、FLAC、WAV、OGG等)。
2.用户界面(UI) 播放控制按钮:播放/暂停、上一首、下一首、进度条拖动,在按钮上加上该功能文字。 显示歌曲信息:标题、艺术家、专辑、时长、专辑封面。 音量调节和静音功能。
3.播放列表管理 创建、编辑、删除播放列表。 支持拖拽排序或手动添加歌曲到列表。
4.播放控制与模式 播放模式 顺序播放、单曲循环、列表循环、随机播放。
5.歌词同步 自动匹配并显示歌词(支持滚动歌词)。
6.播放历史 记录用户播放过的歌曲,方便用户随时查看和再次播放。
7.快捷键 支持快捷键操作,方便用户在不使用鼠标的情况下控制播放器。
四、作品主要截图
五、作品的代码:
import sys import os import random from PyQt5.QtCore import Qt, QUrl, QTimer, QTime, pyqtSignal from PyQt5.QtGui import QIcon, QPixmap, QPalette, QColor from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QLabel, QPushButton, QSlider, QListWidget, QHBoxLayout, QVBoxLayout, QFileDialog, QMessageBox, QShortcut, QTabWidget, QScrollArea, QAbstractItemView) from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QMediaPlaylist from mutagen import File from mutagen.id3 import ID3, APIC class DraggableListWidget(QListWidget): filesAdded = pyqtSignal(list) def __init__(self, parent=None): super().__init__(parent) self.setAcceptDrops(True) self.setDragEnabled(True) self.setDragDropMode(QAbstractItemView.InternalMove) self.setStyleSheet(""" QListWidget { background-color: #404040; color: white; border: none; font-size: 12px; } QListWidget::item { padding: 8px; border-bottom: 1px solid #505050; } QListWidget::item:selected { background-color: #606060; } """) def dragEnterEvent(self, event): if event.mimeData().hasUrls(): event.acceptProposedAction() else: super().dragEnterEvent(event) def dropEvent(self, event): if event.mimeData().hasUrls(): urls = event.mimeData().urls() added_files = [] for url in urls: path = url.toLocalFile() if os.path.isfile(path) and path.lower().endswith(('.mp3', '.aac', '.flac', '.wav', '.ogg')): self.addItem(path) added_files.append(path) self.filesAdded.emit(added_files) event.acceptProposedAction() else: super().dropEvent(event) class MusicPlayer(QMainWindow): def __init__(self): super().__init__() self.initUI() self.initPlayer() self.current_lyrics = [] self.history = [] self.play_mode = 0 # 0-顺序 1-单曲 2-列表 3-随机 self.initShortcuts() def initUI(self): self.setWindowTitle('PyMusic Player') self.setWindowIcon(QIcon('icon.png')) self.setGeometry(100, 100, 1200, 800) self.setStyleSheet(""" QMainWindow { background-color: #2E2E2E; } QPushButton { background-color: #606060; color: white; border: none; padding: 8px; border-radius: 4px; min-width: 80px; } QPushButton:hover { background-color: #808080; } QSlider::groove:horizontal { height: 8px; background: #404040; border-radius: 4px; } QSlider::handle:horizontal { width: 15px; margin: -5px 0; background: #FFFFFF; border-radius: 7px; } """) # 主界面布局 main_widget = QWidget() self.setCentralWidget(main_widget) main_layout = QHBoxLayout(main_widget) # 左侧面板(专辑封面和信息) left_panel = QVBoxLayout() self.cover_label = QLabel() self.cover_label.setFixedSize(300, 300) self.cover_label.setAlignment(Qt.AlignCenter) self.cover_label.setStyleSheet("background-color: #404040;") self.title_label = QLabel("歌曲标题") self.title_label.setStyleSheet("font-size: 18px; color: white;") self.artist_label = QLabel("艺术家") self.artist_label.setStyleSheet("font-size: 14px; color: #AAAAAA;") self.album_label = QLabel("专辑") self.album_label.setStyleSheet("font-size: 14px; color: #AAAAAA;") left_panel.addWidget(self.cover_label) left_panel.addWidget(self.title_label) left_panel.addWidget(self.artist_label) left_panel.addWidget(self.album_label) left_panel.addStretch() # 中间面板(歌词) center_panel = QVBoxLayout() self.lyrics_scroll = QScrollArea() self.lyrics_content = QLabel() self.lyrics_content.setAlignment(Qt.AlignCenter) self.lyrics_content.setStyleSheet("color: white; font-size: 16px;") self.lyrics_content.setWordWrap(True) self.lyrics_scroll.setWidget(self.lyrics_content) self.lyrics_scroll.setWidgetResizable(True) center_panel.addWidget(self.lyrics_scroll) # 右侧面板(播放列表和历史) right_panel = QVBoxLayout() self.tab_widget = QTabWidget() self.playlist_widget = DraggableListWidget() self.playlist_widget.itemDoubleClicked.connect(self.play_selected) self.history_widget = QListWidget() self.history_widget.itemDoubleClicked.connect(self.play_selected) self.tab_widget.addTab(self.playlist_widget, "播放列表") self.tab_widget.addTab(self.history_widget, "播放历史") right_panel.addWidget(self.tab_widget) # 底部控制面板 control_panel = QVBoxLayout() self.progress_slider = QSlider(Qt.Horizontal) self.progress_slider.sliderMoved.connect(self.set_position) self.time_label = QLabel("00:00 / 00:00") self.time_label.setStyleSheet("color: white;") # 控制按钮布局 btn_layout = QHBoxLayout() self.prev_btn = QPushButton("上一首") self.play_btn = QPushButton("播放") self.next_btn = QPushButton("下一首") self.mode_btn = QPushButton("顺序播放") self.vol_slider = QSlider(Qt.Horizontal) self.vol_slider.setRange(0, 100) self.vol_slider.setValue(50) self.vol_slider.valueChanged.connect(self.set_volume) # 连接按钮事件 self.prev_btn.clicked.connect(self.prev_track) self.play_btn.clicked.connect(self.toggle_play) self.next_btn.clicked.connect(self.next_track) self.mode_btn.clicked.connect(self.change_play_mode) # 组合布局 btn_layout.addWidget(self.prev_btn) btn_layout.addWidget(self.play_btn) btn_layout.addWidget(self.next_btn) btn_layout.addWidget(self.mode_btn) btn_layout.addWidget(QLabel("音量:")) btn_layout.addWidget(self.vol_slider) control_panel.addWidget(self.progress_slider) control_panel.addWidget(self.time_label) control_panel.addLayout(btn_layout) # 主布局组合 main_layout.addLayout(left_panel, 1) main_layout.addLayout(center_panel, 2) main_layout.addLayout(right_panel, 1) main_layout.addLayout(control_panel, 1) # 连接信号 self.playlist_widget.filesAdded.connect(self.add_files_to_playlist) def initPlayer(self): self.player = QMediaPlayer() self.playlist = QMediaPlaylist() self.player.setPlaylist(self.playlist) self.player.positionChanged.connect(self.update_position) self.player.durationChanged.connect(self.update_duration) self.player.stateChanged.connect(self.update_buttons) self.playlist.currentIndexChanged.connect(self.update_info) def initShortcuts(self): QShortcut(Qt.Key_Space, self, self.toggle_play) QShortcut(Qt.Key_Left, self, self.prev_track) QShortcut(Qt.Key_Right, self, self.next_track) QShortcut(Qt.Key_M, self, lambda: self.vol_slider.setValue(0)) QShortcut(Qt.Key_L, self, self.load_lyrics) # 核心功能方法 def add_files_to_playlist(self, paths): for path in paths: url = QUrl.fromLocalFile(path) content = QMediaContent(url) self.playlist.addMedia(content) def play_selected(self, item): index = self.playlist_widget.row(item) if 0 <= index < self.playlist.mediaCount(): self.playlist.setCurrentIndex(index) self.player.play() def update_info(self): current_index = self.playlist.currentIndex() if current_index == -1: return path = self.playlist_widget.item(current_index).text() self.load_metadata(path) self.history.insert(0, path) self.history_widget.insertItem(0, os.path.basename(path)) def load_metadata(self, path): try: audio = File(path) title = audio.tags.get('TIT2', ['未知标题'])[0] artist = audio.tags.get('TPE1', ['未知艺术家'])[0] album = audio.tags.get('TALB', ['未知专辑'])[0] self.title_label.setText(title) self.artist_label.setText(artist) self.album_label.setText(album) if 'APIC:' in audio.tags: apic = audio.tags['APIC:'].data pixmap = QPixmap() pixmap.loadFromData(apic) self.cover_label.setPixmap(pixmap.scaled(300, 300, Qt.KeepAspectRatio)) else: self.cover_label.clear() except Exception as e: print(f"元数据加载错误: {e}") self.title_label.setText(os.path.basename(path)) self.cover_label.clear() def update_position(self, position): self.progress_slider.setValue(position) current_time = QTime(0, 0).addMSecs(position).toString('mm:ss') total_time = QTime(0, 0).addMSecs(self.player.duration()).toString('mm:ss') self.time_label.setText(f"{current_time} / {total_time}") def update_duration(self, duration): self.progress_slider.setRange(0, duration) def set_position(self, position): self.player.setPosition(position) def set_volume(self, value): self.player.setVolume(value) def toggle_play(self): if self.player.state() == QMediaPlayer.PlayingState: self.player.pause() else: self.player.play() def update_buttons(self, state): self.play_btn.setText("暂停" if state == QMediaPlayer.PlayingState else "播放") def prev_track(self): if self.play_mode == 3: # 随机模式 self.playlist.setCurrentIndex(random.randint(0, self.playlist.mediaCount()-1)) else: self.playlist.previous() def next_track(self): if self.play_mode == 3: # 随机模式 self.playlist.setCurrentIndex(random.randint(0, self.playlist.mediaCount()-1)) else: self.playlist.next() def change_play_mode(self): modes = ["顺序播放", "单曲循环", "列表循环", "随机播放"] self.play_mode = (self.play_mode + 1) % 4 self.mode_btn.setText(modes[self.play_mode]) self.playlist.setPlaybackMode([ QMediaPlaylist.Sequential, QMediaPlaylist.CurrentItemInLoop, QMediaPlaylist.Loop, QMediaPlaylist.Random ][self.play_mode]) def load_lyrics(self): # 歌词加载功能留待后续扩展 pass if __name__ == '__main__': app = QApplication(sys.argv) player = MusicPlayer() player.show() sys.exit(app.exec_())
六、你对AI辅助代码编写的思考:
AI能够快速生成代码、提供代码修改建议,极大地缩短了编写代码时间。 但AI也有局限性,当我们使用AI编写代码时,AI可能不能完全理解我们的意思(或提示词不准确),所以写不出能呈现我们想法的代码。因此,我们需要仔细检查AI生成的代码,不能完全依赖AI。我们还要在学时用好AI,充分利用AI来学习,更要学习提示词的编写。
-
2025-3-1 10:42:12@
一、作品名称:单词拼写小游戏
二、作品创作者及使用的AI工具:KIMI、豆包
三、作品主要功能:
(1)字母生成:程序随机生成9个字母,显示在3x3的按钮网格中。
(2)拼写单词:玩家点击字母按钮,将字母添加到输入框中,拼出一个单词后点击“提交单词”按钮。
(3)分数计算:每拼出一个有效且未拼过的单词加一分。
(4)刷新字母:当无法再拼出新单词时,点击“刷新字母”按钮可以重新生成9个字母,积分不变。
(5)时间限制:游戏时间为8分钟,时间结束后弹出结算画面,显示最终分数。
五、作品的代码:
import tkinter as tk from tkinter import messagebox import random import time class ReactionGame: def __init__(self, root): self.root = root self.root.title("反应力小游戏") self.root.geometry("400x400") # 初始化变量 self.letters = [] self.used_words = set() self.score = 0 self.start_time = time.time() # 创建字母按钮的网格 self.buttons = [] for i in range(3): for j in range(3): button = tk.Button(root, text="", font=("Arial", 24), width=5, height=2, command=lambda idx=i*3+j: self.click_letter(idx)) button.grid(row=i, column=j, padx=5, pady=5) self.buttons.append(button) # 创建输入框和提交按钮 self.word_entry = tk.Entry(root, font=("Arial", 16)) self.word_entry.grid(row=3, column=0, columnspan=3, pady=10) self.submit_button = tk.Button(root, text="提交单词", command=self.submit_word) self.submit_button.grid(row=4, column=0, columnspan=3, pady=10) # 创建分数和时间显示 self.score_label = tk.Label(root, text="分数: 0", font=("Arial", 16)) self.score_label.grid(row=5, column=0, columnspan=3) self.time_label = tk.Label(root, text="时间: 00:00", font=("Arial", 16)) self.time_label.grid(row=6, column=0, columnspan=3) # 创建刷新按钮 self.refresh_button = tk.Button(root, text="刷新字母", command=self.refresh_letters) self.refresh_button.grid(row=7, column=0, columnspan=3, pady=10) # 初始化游戏 self.refresh_letters() self.update_time() def refresh_letters(self): """刷新字母""" self.letters = random.sample('abcdefghijklmnopqrstuvwxyz', 9) for i, letter in enumerate(self.letters): self.buttons[i].config(text=letter, state=tk.NORMAL) self.word_entry.delete(0, tk.END) def click_letter(self, idx): """点击字母""" letter = self.letters[idx] self.word_entry.insert(tk.END, letter) self.buttons[idx].config(state=tk.DISABLED) def submit_word(self): """提交单词""" word = self.word_entry.get().strip().lower() if not word: messagebox.showwarning("警告", "请输入一个单词!") return # 检查单词是否有效 if word in self.used_words: messagebox.showwarning("警告", "这个单词已经使用过了!") elif not self.is_valid_word(word): messagebox.showwarning("警告", "无效的单词或无法用当前字母拼出!") else: self.score += 1 self.score_label.config(text=f"分数: {self.score}") self.used_words.add(word) self.refresh_letters() def is_valid_word(self, word): """检查单词是否可以用当前字母拼出""" word_letters = list(word) for letter in word_letters: if letter not in self.letters or word_letters.count(letter) > self.letters.count(letter): return False return True def update_time(self): """更新时间""" elapsed_time = int(time.time() - self.start_time) minutes, seconds = divmod(480 - elapsed_time, 60) self.time_label.config(text=f"时间: {minutes:02}:{seconds:02}") if elapsed_time >= 480: self.end_game() else: self.root.after(1000, self.update_time) def end_game(self): """游戏结束""" messagebox.showinfo("游戏结束", f"游戏结束!您的最终分数是:{self.score}") self.root.destroy() if __name__ == "__main__": root = tk.Tk() game = ReactionGame(root) root.mainloop()
六、你对AI辅助代码编写的思考:
AI辅助代码编写是利用人工智能技术帮助开发者更高效地编程。它通过自然语言处理理解需求,生成代码片段;借助机器学习分析代码模式,提供优化建议;还能实时补全代码,减少重复劳动。它显著提升了开发效率,降低了入门门槛,同时帮助开发者聚焦于复杂逻辑。但AI生成的代码可能缺乏灵活性,依赖数据质量,且无法完全替代人类的创造力和经验
-
2025-3-1 9:54:50@
一、作品名称:翻译器
二、作品创作者及使用的AI工具:
林净瑶 deepseek、
三、作品主要功能:
(1) 用户可以在输入框中输入文本,并选择源语言和目标语言,点击“翻译”按钮后,工具会调用 googletrans 库进行翻译,并将结果显示在输出框中。支持的语言包括中文、英语、日语、法语、西班牙语、德语、俄语、韩语、阿拉伯语和意大利语。
(2) 用户可以通过点击“切换界面语言”按钮,将界面语言在中文和英文之间切换。界面上的所有标签和按钮文本都会根据选择的语言进行更新。
(3) 用户可以通过点击“改变字体”按钮,循环切换输入框、输出框和标签的字体。可用的字体包括 Helvetica、Times New Roman、Courier、Arial 和 Comic Sans MS。
(4) 在翻译过程中,如果发生错误(如网络问题或翻译失败),工具会在输出框中显示错误信息,提示用户翻译失败。
(5 )界面背景颜色设置为浅灰色,字体颜色为深灰色,整体视觉效果舒适,适合长时间使用。
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import tkinter as tk from tkinter import ttk, font from googletrans import Translator # 初始化翻译器 translator = Translator() # 语言列表(Google 翻译支持的语言) LANGUAGES = { '中文': 'zh-cn', '英语': 'en', '日语': 'ja', '法语': 'fr', '西班牙语': 'es', '德语': 'de', '俄语': 'ru', '韩语': 'ko', '阿拉伯语': 'ar', '意大利语': 'it' } # 界面语言字典 UI_LANGUAGES = { '中文': { 'title': '多语言翻译工具', 'input_label': '输入文本:', 'output_label': '翻译结果:', 'source_label': '选择源语言:', 'target_label': '选择目标语言:', 'translate_button': '翻译', 'font_button': '改变字体', 'language_button': '切换界面语言' }, 'English': { 'title': 'Multi-language Translator', 'input_label': 'Input Text:', 'output_label': 'Translation Result:', 'source_label': 'Select Source Language:', 'target_label': 'Select Target Language:', 'translate_button': 'Translate', 'font_button': 'Change Font', 'language_button': 'Switch UI Language' } } # 可用字体列表 FONTS = ["Helvetica", "Times New Roman", "Courier", "Arial", "Comic Sans MS"] # 当前界面语言 current_ui_language = '中文' # 翻译函数 def translate_text(): # 获取用户输入 text = input_text.get("1.0", tk.END).strip() # 获取输入框的内容 src_lang = LANGUAGES[source_lang.get()] # 获取源语言代码 dest_lang = LANGUAGES[target_lang.get()] # 获取目标语言代码 # 调用翻译器 try: translated = translator.translate(text, src=src_lang, dest=dest_lang) output_text.delete("1.0", tk.END) # 清空输出框 output_text.insert(tk.END, translated.text) # 显示翻译结果 except Exception as e: output_text.delete("1.0", tk.END) output_text.insert(tk.END, f"翻译失败: {e}") # 改变字体函数 def change_font(): current_font = FONTS.pop(0) FONTS.append(current_font) new_font = (current_font, 12) input_text.configure(font=new_font) output_text.configure(font=new_font) title_label.configure(font=(current_font, 16, "bold")) input_label.configure(font=new_font) output_label.configure(font=new_font) source_label.configure(font=new_font) target_label.configure(font=new_font) # 改变界面语言函数 def change_ui_language(): global current_ui_language if current_ui_language == '中文': current_ui_language = 'English' else: current_ui_language = '中文' update_ui_language() # 更新界面语言 def update_ui_language(): ui_text = UI_LANGUAGES[current_ui_language] title_label.config(text=ui_text['title']) input_label.config(text=ui_text['input_label']) output_label.config(text=ui_text['output_label']) source_label.config(text=ui_text['source_label']) target_label.config(text=ui_text['target_label']) translate_button.config(text=ui_text['translate_button']) font_button.config(text=ui_text['font_button']) language_button.config(text=ui_text['language_button']) # 启动动画函数 def start_animation(): text = "欢迎使用翻译器" if current_ui_language == '中文' else "Welcome to Translator" for i in range(len(text) + 1): title_label.config(text=text[:i]) root.update() root.after(100) # 每100毫秒更新一次 # 创建主窗口 root = tk.Tk() root.title("多语言翻译工具") root.geometry("600x500") root.configure(bg="#f0f0f0") # 设置背景颜色 # 设置窗口图标(可选) # root.iconbitmap("icon.ico") # 替换为你的图标文件路径 # 标题 title_label = tk.Label( root, text="", font=("Helvetica", 16, "bold"), bg="#f0f0f0", fg="#333333" ) title_label.pack(pady=10) # 启动动画 start_animation() # 输入框 input_frame = tk.Frame(root, bg="#f0f0f0") input_frame.pack(pady=10) input_label = tk.Label( input_frame, text="输入文本:", font=("Helvetica", 12), bg="#f0f0f0", fg="#333333" ) input_label.grid(row=0, column=0, padx=5, pady=5, sticky="w") input_text = tk.Text(input_frame, height=5, width=50, font=("Helvetica", 12)) input_text.grid(row=1, column=0, padx=5, pady=5) # 语言选择 language_frame = tk.Frame(root, bg="#f0f0f0") language_frame.pack(pady=10) source_label = tk.Label( language_frame, text="选择源语言:", font=("Helvetica", 12), bg="#f0f0f0", fg="#333333" ) source_label.grid(row=0, column=0, padx=5, pady=5, sticky="w") source_lang = ttk.Combobox( language_frame, values=list(LANGUAGES.keys()), font=("Helvetica", 12), state="readonly" ) source_lang.current(0) # 默认选择中文 source_lang.grid(row=0, column=1, padx=5, pady=5) target_label = tk.Label( language_frame, text="选择目标语言:", font=("Helvetica", 12), bg="#f0f0f0", fg="#333333" ) target_label.grid(row=1, column=0, padx=5, pady=5, sticky="w") target_lang = ttk.Combobox( language_frame, values=list(LANGUAGES.keys()), font=("Helvetica", 12), state="readonly" ) target_lang.current(1) # 默认选择英语 target_lang.grid(row=1, column=1, padx=5, pady=5) # 按钮框架 button_frame = tk.Frame(root, bg="#f0f0f0") button_frame.pack(pady=10) # 翻译按钮 translate_button = tk.Button( button_frame, text="翻译", font=("Helvetica", 12, "bold"), bg="#4CAF50", # 绿色背景 fg="white", # 白色文字 activebackground="#45a049", # 点击时的背景色 activeforeground="white", command=translate_text ) translate_button.grid(row=0, column=0, padx=5) # 改变字体按钮 font_button = tk.Button( button_frame, text="改变字体", font=("Helvetica", 12, "bold"), bg="#008CBA", # 蓝色背景 fg="white", # 白色文字 activebackground="#007B9E", # 点击时的背景色 activeforeground="white", command=change_font ) font_button.grid(row=0, column=1, padx=5) # 切换界面语言按钮 language_button = tk.Button( button_frame, text="切换界面语言", font=("Helvetica", 12, "bold"), bg="#FF9800", # 橙色背景 fg="white", # 白色文字 activebackground="#FB8C00", # 点击时的背景色 activeforeground="white", command=change_ui_language ) language_button.grid(row=0, column=2, padx=5) # 输出框 output_frame = tk.Frame(root, bg="#f0f0f0") output_frame.pack(pady=10) output_label = tk.Label( output_frame, text="翻译结果:", font=("Helvetica", 12), bg="#f0f0f0", fg="#333333" ) output_label.grid(row=0, column=0, padx=5, pady=5, sticky="w") output_text = tk.Text(output_frame, height=5, width=50, font=("Helvetica", 12)) output_text.grid(row=1, column=0, padx=5, pady=5) # 初始化界面语言 update_ui_language() # 运行主循环 root.mainloop()
六、你对AI辅助代码编写的思考:
AI工具在提升效率、减少重复劳动方面表现突出。它们能够快速生成代码片段、提供语法建议,甚至帮助调试错误,极大地缩短了开发时间。尤其是在处理一些标准化任务或学习新语言时,AI的辅助作用尤为明显。 但它也有局限性,比如可能生成不符合需求的代码或存在安全隐患。因此,我们需要仔细检查AI生成的代码,不能完全依赖它。 总的来说,AI辅助代码编写是一种强大的工具,但它应该是我们的助手而非替代者。合理利用AI,结合自身的编程经验和逻辑思维,才能真正发挥其价值,提升开发效率和质量。
-
2025-3-1 0:48:05@
一、作品名称:赛博围棋
二、作品创作者及使用的AI工具:deepseek、智谱清言、豆包、kimi
三、作品主要功能:
(1)完成了围棋基本对弈功能
(2)添加了步数、提子数等记录功能
(3)增加了落子记录的滚动列表
(4)将传统围棋与赛博风相结合,增添许多动态粒子、扫描线、动态边框等效果
四、作品主要截图
五、作品的代码:
import pygame import random import math from copy import deepcopy from pygame.locals import * # 初始化 Pygame pygame.init() screen = pygame.display.set_mode((1280, 720)) pygame.display.set_caption("賽博圍棋") clock = pygame.time.Clock() # 游戏状态 current_player = 'Black' # 黑方先行 stones = [] # 棋子数据 last_ko = None # 记录最后一次提子相关的信息 cell_size = 0 # 棋盘格子大小 margin = 0 # 棋盘左边距 top_margin = 0 # 棋盘上边距 STAR_POINTS = [] # 星位坐标 BOARD_SIZE = 540 # 棋盘大小 (540x540) particles = [] # 粒子系统 move_history = [] # 移动历史记录 captured_black = 0 # Black stones captured captured_white = 0 # White stones captured step_count = 0 # Step count # 使用系统默认字体 font = pygame.font.SysFont("Arial", 20) # 减小字体大小 large_font = pygame.font.SysFont("Arial", 30) # 粒子系统类 class CyberParticle: def __init__(self): self.x = random.randint(0, 1280) self.y = random.randint(0, 720) self.size = random.uniform(0.5, 2) self.speed = random.uniform(0.02, 0.1) self.color = ( random.randint(0, 50), random.randint(50, 150), random.randint(200, 255) ) def update(self): self.y += math.sin(pygame.time.get_ticks()*0.0015)*self.speed self.x += math.cos(pygame.time.get_ticks()*0.0008)*self.speed # 粒子从屏幕一侧移出后从另一侧出现 if self.x > 1280: self.x -= 1280 if self.x < 0: self.x += 1280 class CyberStone: def __init__(self, pos, color): self.x, self.y = pos self.color = color self.captured = False # 是否被提走 def draw(self, surface): if self.captured: return core_color = "#00FFCC" if self.color == 'White' else "#0094FF" pygame.draw.circle(surface, core_color, (self.x, self.y), 14) def init_game(): global particles, STAR_POINTS, BOARD_SIZE, margin, top_margin, cell_size particles = [CyberParticle() for _ in range(300)] BOARD_SIZE = 540 cell_size = BOARD_SIZE / 18 margin = 100 # 棋盘左边距 top_margin = (720 - BOARD_SIZE) // 2 # 生成星位坐标 STAR_POINTS = [] for i in range(19): for j in range(19): if i in [3, 9, 15] and j in [3, 9, 15]: STAR_POINTS.append(( int(margin + i * cell_size), int(top_margin + j * cell_size) )) return BOARD_SIZE, margin, top_margin, cell_size, STAR_POINTS BOARD_SIZE, margin, top_margin, cell_size, STAR_POINTS = init_game() def draw_cyber_board(surface): surface.fill((0, 0, 0)) # 绘制粒子背景 for p in particles: pygame.draw.circle(surface, p.color, (int(p.x), int(p.y)), int(p.size)) # 动态霓虹边框 border_glow = 20 + 10 * math.sin(pygame.time.get_ticks()*0.003) border_surface = pygame.Surface((BOARD_SIZE + border_glow*2, BOARD_SIZE + border_glow*2), pygame.SRCALPHA) pygame.draw.rect(border_surface, (0, 150, 255, 30), (0, 0, BOARD_SIZE + border_glow*2, BOARD_SIZE + border_glow*2), border_radius=15) surface.blit(border_surface, (margin - border_glow, top_margin - border_glow)) # 棋盘底纹 grid_bg = pygame.Surface((BOARD_SIZE, BOARD_SIZE)) grid_bg.set_alpha(50) for x in range(0, BOARD_SIZE, 10): for y in range(0, BOARD_SIZE, 10): if random.random() > 0.8: pygame.draw.rect(grid_bg, (0, 80, 120), (x, y, 5, 1)) surface.blit(grid_bg, (margin, top_margin)) # 绘制棋子 for stone in stones: stone.draw(surface) # 动态扫描线 scan_y = top_margin + int((pygame.time.get_ticks() % 3000)/3000 * BOARD_SIZE) pygame.draw.line(surface, "#00FFCC", (margin, scan_y), (margin + BOARD_SIZE, scan_y), 2) # 脉冲网格 pulse = abs(math.sin(pygame.time.get_ticks()*0.002)) * 50 for i in range(19): x = int(margin + i * (BOARD_SIZE/18)) pygame.draw.line(surface, f"#{int(30 + pulse):02X}{int(200 + pulse):02X}{220:02X}", (x, top_margin), (x, top_margin + BOARD_SIZE), 2 - (i % 3 == 0)) y = int(top_margin + i * (BOARD_SIZE/18)) pygame.draw.line(surface, f"#{int(30 + pulse):02X}{int(200 + pulse):02X}{220:02X}", (margin, y), (margin + BOARD_SIZE, y), 2 - (i % 3 == 0)) # 星位特效 for (x, y) in STAR_POINTS: glow_size = 15 + math.sin(pygame.time.get_ticks()*0.005 + x + y)*5 glow = pygame.Surface((glow_size*2, glow_size*2), pygame.SRCALPHA) pygame.draw.circle(glow, (0, 200, 255, 80), (glow_size, glow_size), glow_size) surface.blit(glow, (x - glow_size, y - glow_size)) pygame.draw.circle(surface, "#00FF00", (x, y), 4) pygame.draw.circle(surface, "#0096FF", (x, y), 2) def draw_right_ui(surface): """绘制右侧现代化 UI""" # 计算右侧界面的宽度和位置 panel_right = 1280 - 100 # 右侧距屏幕边缘100px panel_width = panel_right - (margin + BOARD_SIZE + 50) panel_x = margin + BOARD_SIZE + 50 panel_height = 600 panel_margin = (720 - panel_height) // 2 # 背景板 pygame.draw.rect(surface, "#000A1F", (panel_x, panel_margin, panel_width, panel_height), border_radius=15) pygame.draw.rect(surface, "#0094FF", (panel_x, panel_margin, panel_width, panel_height), 4, 15) # 标题 title_text = large_font.render("Cyber Go Data", True, "#00FFCC") title_rect = title_text.get_rect(center=(panel_x + panel_width//2, panel_margin + 30)) surface.blit(title_text, title_rect) # 步数 step_rect = pygame.Rect(panel_x + 30, panel_margin + 80, panel_width - 60, 50) pygame.draw.rect(surface, "#003366", step_rect, border_radius=10) step_text = font.render(f"Steps: {step_count}", True, "#00FFCC") surface.blit(step_text, (panel_x + 40, panel_margin + 90)) # 提子數量 captured_black_rect = pygame.Rect(panel_x + 30, panel_margin + 140, (panel_width - 60)/2, 50) pygame.draw.rect(surface, "#0094FF", captured_black_rect, border_radius=10) captured_black_text = font.render(f"Black Captured: {captured_black}", True, "#00FFCC") surface.blit(captured_black_text, (panel_x + 40, panel_margin + 150)) captured_white_rect = pygame.Rect(panel_x + 30 + (panel_width - 60)/2, panel_margin + 140, (panel_width - 60)/2, 50) pygame.draw.rect(surface, "#00FFCC", captured_white_rect, border_radius=10) captured_white_text = font.render(f"White Captured: {captured_white}", True, "#FFFFFF") surface.blit(captured_white_text, (panel_x + 30 + (panel_width - 60)/2 + 10, panel_margin + 150)) # 行棋方 current_player_rect = pygame.Rect(panel_x + 30, panel_margin + 200, panel_width - 100, 50) # 减小矩形宽度 pygame.draw.rect(surface, "#004488", current_player_rect, border_radius=10) current_player_text = large_font.render(f"Current Player: {current_player}", True, "#00FFCC") surface.blit(current_player_text, (panel_x + 40, panel_margin + 210)) # 历史记录(垂直滚动) history_rect = pygame.Rect(panel_x + 30, panel_margin + 200 + 50, panel_width - 60, 300) # 上移历史记录框 pygame.draw.rect(surface, "#002255", history_rect, border_radius=10) history_text = font.render("Move History:", True, "#00FFCC") surface.blit(history_text, (panel_x + 40, panel_margin + 250)) # 计算滚动条参数 visible_lines = 10 line_height = 24 total_lines = len(move_history) max_scroll = max(0, total_lines - visible_lines) scroll_handle_height = max(30, min((visible_lines / max(total_lines, 1)) * 300, 300)) # 添加长度上限 # 显示历史记录 start_index = max(0, scroll_offset) end_index = min(start_index + visible_lines, total_lines) for i in range(start_index, end_index): if i >= total_lines: break move_text = move_history[i] # 提取棋子颜色 color = move_text.split(":")[1].strip().split(" ")[-1] text_color = "#00FFCC" if color == "Black" else "#FFFFFF" step_text = font.render(move_text, True, text_color) surface.blit(step_text, (panel_x + 40, panel_margin + 280 + (i - start_index) * line_height)) # 绘制滚动条 panel_right = 1280 - 100 panel_width = panel_right - (margin + BOARD_SIZE + 50) panel_x = margin + BOARD_SIZE + 50 panel_margin = (720 - 600) // 2 scroll_bar_rect = pygame.Rect(panel_x + panel_width - 30, panel_margin + 200 + 50, 20, 300) pygame.draw.rect(surface, "#555555", scroll_bar_rect, border_radius=5) if max_scroll == 0: scroll_handle_rect = pygame.Rect( panel_x + panel_width - 25, panel_margin + 250, 10, 30 # 确保滚动条长度有上限 ) else: scroll_handle_rect = pygame.Rect( panel_x + panel_width - 25, panel_margin + 250 + (300 - 30) * (scroll_offset / max_scroll), 10, 30 # 确保滚动条长度有上限 ) pygame.draw.rect(surface, "#AAAAAA", scroll_handle_rect, border_radius=5) def get_grid_pos(mouse_pos): """将鼠标坐标转换为棋盘坐标""" x, y = mouse_pos col = round((x - margin) / cell_size) row = round((y - top_margin) / cell_size) if 0 <= col <= 18 and 0 <= row <= 18: grid_x = margin + col * cell_size grid_y = top_margin + row * cell_size return (int(grid_x), int(grid_y)) return None def add_to_history(step, pos, player): """将一步棋添加到历史记录""" x = round((pos[0] - margin) / cell_size) + 1 y = round((pos[1] - top_margin) / cell_size) + 1 move = f"Step {step}: ({x}, {y}) ({player})" move_history.append(move) def check_prohibited_move(new_stone, stones): """检查是否为禁招点(自填眼)""" temp_stones = deepcopy(stones) new_stone_pos = (new_stone.x, new_stone.y) new_stone_copy = CyberStone(new_stone_pos, new_stone.color) temp_stones.append(new_stone_copy) captured = check_capture(temp_stones, new_stone_copy) for s in captured: s.captured = True group = get_group(temp_stones, new_stone_copy) liberties = get_liberties(group, temp_stones) return len(liberties) == 0 def check_capture(stones, new_stone): """检查是否有棋子需要被提走""" captured = [] directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] for dx, dy in directions: x = new_stone.x y = new_stone.y for stone in stones: if (stone.x == x + dx * cell_size and stone.y == y + dy * cell_size and not stone.captured and stone.color != new_stone.color): group = get_group(stones, stone) liberties = get_liberties(group, stones) if len(liberties) == 0: captured.extend(group) return captured def get_group(stones, stone): """获取与该棋子相连的所有同色棋子""" group = [] visited = set() stack = [stone] while stack: current = stack.pop() if current in visited or current.captured: continue visited.add(current) group.append(current) for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]: x = current.x + dx * cell_size y = current.y + dy * cell_size for s in stones: if (s.x == x and s.y == y and s.color == current.color and not s.captured and s not in visited): stack.append(s) return group def get_liberties(group, stones): """获取棋子集团的所有自由气(空交叉点)""" liberties = set() for stone in group: x = stone.x y = stone.y for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]: pos = (x + dx * cell_size, y + dy * cell_size) if not any(s.x == pos[0] and s.y == pos[1] and not s.captured for s in stones): liberties.add(pos) return liberties def check_ko(new_stone, captured): """检查是否发生打劫""" global last_ko ko = False if len(captured) == 1: captured_coord = (captured[0].x, captured[0].y) current_coord = (new_stone.x, new_stone.y) if last_ko and last_ko['captured_coord'] == current_coord and last_ko['current_coord'] == captured_coord: ko = True last_ko = { 'current_coord': current_coord, 'captured_coord': captured_coord, 'time': pygame.time.get_ticks(), 'color': new_stone.color } else: last_ko = None return ko running = True mouse_dragging = False scroll_offset = 0 while running: screen.fill((0, 0, 0)) for event in pygame.event.get(): if event.type == QUIT: running = False elif event.type == MOUSEBUTTONDOWN: if event.button == 1: grid_pos = get_grid_pos(event.pos) if grid_pos: occupied = any(s.x == grid_pos[0] and s.y == grid_pos[1] and not s.captured for s in stones) if not occupied: new_stone = CyberStone(grid_pos, current_player) prohibited = check_prohibited_move(new_stone, stones) if prohibited: continue stones.append(new_stone) step_count += 1 add_to_history(step_count, grid_pos, current_player) captured = check_capture(stones, new_stone) for s in captured: if s.color == 'Black': captured_black += 1 else: captured_white += 1 s.captured = True is_ko = check_ko(new_stone, captured) if is_ko: stones.remove(new_stone) for s in captured: s.captured = False if s.color == 'Black': captured_black -= 1 else: captured_white -= 1 else: current_player = 'White' if current_player == 'Black' else 'Black' else: # 检查是否点击了滚动条手柄 panel_right = 1280 - 100 panel_width = panel_right - (margin + BOARD_SIZE + 50) panel_x = margin + BOARD_SIZE + 50 panel_margin = (720 - 600) // 2 scroll_bar_rect = pygame.Rect(panel_x + panel_width - 30, panel_margin + 200 + 50, 20, 300) if scroll_bar_rect.collidepoint(event.pos): mouse_dragging = True mouse_offset = event.pos[1] - scroll_handle_rect.y elif event.type == MOUSEBUTTONUP: if event.button == 1: mouse_dragging = False elif event.type == MOUSEMOTION: if mouse_dragging: new_y = event.pos[1] - panel_margin - 200 - 50 - mouse_offset new_y = max(0, min(300 - 30, new_y)) # 调整位置 scroll_offset = max(0, int(new_y * max_scroll / (300 - 30)) if max_scroll != 0 else 0) # 更新粒子 for p in particles: p.update() # 计算滚动条相关参数 visible_lines = 10 line_height = 24 total_lines = len(move_history) max_scroll = max(0, total_lines - visible_lines) # 绘制场景 draw_cyber_board(screen) draw_right_ui(screen) # 绘制滚动条 panel_right = 1280 - 100 panel_width = panel_right - (margin + BOARD_SIZE + 50) panel_x = margin + BOARD_SIZE + 50 panel_margin = (720 - 600) // 2 scroll_bar_rect = pygame.Rect(panel_x + panel_width - 30, panel_margin + 200 + 50, 20, 300) pygame.draw.rect(screen, "#555555", scroll_bar_rect, border_radius=5) if max_scroll == 0: scroll_handle_rect = pygame.Rect( panel_x + panel_width - 25, panel_margin + 250, 10, 30 # 确保滚动条长度有上限 ) else: scroll_handle_rect = pygame.Rect( panel_x + panel_width - 25, panel_margin + 250 + (300 - 30) * (scroll_offset / max_scroll), 10, 30 # 确保滚动条长度有上限 ) pygame.draw.rect(screen, "#AAAAAA", scroll_handle_rect, border_radius=5) pygame.display.flip() clock.tick(60) pygame.quit()
六、对AI辅助代码编写的思考:
AI辅助代码编写极大地提升了开发效率,但不同AI模型的优点各异。例如,deepseek擅长准确生成理想代码框架,智谱清言则擅长优化细节,kimi则能生成超长代码。因此,我们需要实现不同模型的优势互补,以达到最佳辅助效果。同时,AI辅助编程对提示词的准确度有较高要求,只有精准的提示词才能引导AI生成符合需求的代码。这就要求开发者不断提高自己的提示技巧,以充分发挥AI的潜能。
-
2025-2-28 23:51:28@
一、作品名称:记账小管家
二、作品创作者及使用的AI工具:黄可文 豆包AI,Kimi
三、作品主要功能:
(1)能查看历史流水情况
(2)能直观的看到支出、收入的竖形图和扇形图
(3)能快速的搜索以往的流水记录
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import tkinter as tk from tkinter import ttk, messagebox, simpledialog import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from datetime import datetime, timedelta import pickle # 全局变量 transactions = [] # 记账函数 def add_transaction(): amount = simpledialog.askfloat("记账", "请输入金额(正数为收入,负数为支出):") if amount is not None: category = simpledialog.askstring("记账", "请输入类别(如:餐饮、交通、工资等):") if category: date = datetime.now().strftime("%Y-%m-%d %H:%M:%S") transactions.append({"date": date, "amount": amount, "category": category}) messagebox.showinfo("成功", "记账成功!") # 记账后重新绘制竖形图 show_daily_bar_chart() # 查看流水函数 def view_transactions(): if not transactions: messagebox.showinfo("流水", "当前没有流水记录。") else: transactions_text = "\n".join([f"{t['date']} - {t['category']}: {t['amount']:.2f}" for t in transactions]) messagebox.showinfo("流水记录", transactions_text) # 增加删除交易的功能 delete_option = messagebox.askyesno("删除交易", "是否要删除某条交易记录?") if delete_option: delete_transaction() # 增加修改交易的功能 modify_option = messagebox.askyesno("修改交易", "是否要修改某条交易记录?") if modify_option: modify_transaction() # 增加搜索交易的功能 search_option = messagebox.askyesno("搜索交易", "是否要搜索某条交易记录?") if search_option: search_transaction() # 删除交易函数 def delete_transaction(): transaction_index = simpledialog.askinteger("删除交易", "请输入要删除的交易记录的序号:") if transaction_index is not None: if 0 <= transaction_index < len(transactions): del transactions[transaction_index] messagebox.showinfo("成功", "交易记录已删除!") # 删除交易后重新绘制竖形图 show_daily_bar_chart() else: messagebox.showerror("错误", "无效的交易记录序号!") # 修改交易函数 def modify_transaction(): transaction_index = simpledialog.askinteger("修改交易", "请输入要修改的交易记录的序号:") if transaction_index is not None: if 0 <= transaction_index < len(transactions): new_amount = simpledialog.askfloat("修改交易", "请输入新的金额:") if new_amount is not None: new_category = simpledialog.askstring("修改交易", "请输入新的类别:") if new_category: transactions[transaction_index]['amount'] = new_amount transactions[transaction_index]['category'] = new_category messagebox.showinfo("成功", "交易记录已修改!") # 修改交易后重新绘制竖形图 show_daily_bar_chart() else: messagebox.showerror("错误", "无效的交易记录序号!") # 搜索交易函数 def search_transaction(): search_keyword = simpledialog.askstring("搜索交易", "请输入搜索关键词:") if search_keyword: found_transactions = [t for t in transactions if search_keyword in t['date'] or search_keyword in t['category'] or str(search_keyword) in str(t['amount'])] if found_transactions: search_results = "\n".join([f"{t['date']} - {t['category']}: {t['amount']:.2f}" for t in found_transactions]) messagebox.showinfo("搜索结果", search_results) else: messagebox.showinfo("搜索结果", "没有找到相关的交易记录。") # 生成扇形图函数 def show_pie_chart(): if not transactions: messagebox.showinfo("提示", "当前没有流水记录,无法生成图表。") return # 计算最近一个月的收入和支出 one_month_ago = datetime.now() - timedelta(days=30) recent_transactions = [t for t in transactions if datetime.strptime(t['date'], "%Y-%m-%d %H:%M:%S") >= one_month_ago] if not recent_transactions: messagebox.showinfo("提示", "最近一个月没有流水记录。") return income = sum(t['amount'] for t in recent_transactions if t['amount'] > 0) expense = sum(-t['amount'] for t in recent_transactions if t['amount'] < 0) if income == 0 and expense == 0: messagebox.showinfo("提示", "最近一个月没有收入或支出。") return # 绘制扇形图 labels = ['收入', '支出'] sizes = [income, expense] colors = ['#66b3ff', '#ff9999'] explode = (0.1, 0) # 突出显示收入部分 plt.figure(figsize=(6, 6)) plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90) plt.title("最近一个月的收入与支出分布") # 将扇形图嵌入到Tkinter窗口中 canvas = FigureCanvasTkAgg(plt.gcf(), master=root) canvas_widget = canvas.get_tk_widget() canvas_widget.pack(side=tk.RIGHT, padx=20, pady=20) # 确保图形正确显示 plt.tight_layout() plt.show() # 保存数据函数 def save_data(): with open('transactions.pkl', 'wb') as f: pickle.dump(transactions, f) # 读取数据函数 def load_data(): global transactions try: with open('transactions.pkl', 'rb') as f: transactions = pickle.load(f) except FileNotFoundError: transactions = [] # 创建主窗口 root = tk.Tk() root.title("记账小管家") # 调整主窗口大小 root.geometry("800x600") # 宽度x高度 # 添加按钮 # 搜索按钮放到右上角 tk.Button(root, text="搜索交易", command=search_transaction, width=20, height=2).pack(anchor=tk.NE, padx=10, pady=10) # 其他按钮放到左边,且离边框有一定距离 button_frame = tk.Frame(root) button_frame.pack(side=tk.LEFT, padx=20, pady=20) tk.Button(button_frame, text="记账", command=add_transaction, width=20, height=2).pack(pady=10) tk.Button(button_frame, text="查看流水", command=view_transactions, width=20, height=2).pack(pady=10) tk.Button(button_frame, text="查看收入支出扇形图", command=show_pie_chart, width=20, height=2).pack(pady=10) # 在主界面右边放一个每日记账的竖形图 # 这里需要根据实际数据来绘制竖形图,以下是一个示例 # 假设我们有一个每日记账的列表,每个元素是一个元组,包含日期和金额 def show_daily_bar_chart(): today = datetime.now().strftime("%Y-%m-%d") today_transactions = [t for t in transactions if t['date'].startswith(today)] if today_transactions: # 绘制竖形图 plt.figure(figsize=(6, 4)) plt.bar(range(len(today_transactions)), [t['amount'] for t in today_transactions]) plt.xticks(range(len(today_transactions)), [t['date'] for t in today_transactions]) plt.xlabel('日期') plt.ylabel('金额') plt.title(f'今日记账金额({today})') # 将竖形图嵌入到Tkinter窗口中 canvas = FigureCanvasTkAgg(plt.gcf(), master=root) canvas_widget = canvas.get_tk_widget() canvas_widget.pack(side)
六、你对AI辅助代码编写的思考:
AI辅助代码编写方便迅捷,但是有时候AI不能完全理解我们的意思,所以写不出能呈现我们想法的代码,这时候就需要我们自行修改代码。由此可见,AI辅助代码编写有利有弊,且如果太过于依赖AI的帮助,会使我们的动手能力变弱,所以我们要适当的使用。
-
2025-2-28 23:09:38@
一、作品名称:生成句子小程序
二、作品创作者及使用的AI工具:海螺AI,豆包AI
三、作品主要功能:
(1)生成句子帮助写作
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import tkinter as tk import random
sentence_templates = { "励志": [ "在漫长的人生道路上,无论遇到多少艰难险阻,都要怀揣着梦想,勇往直前,因为每一次的挫折都是成长的阶梯。", "生活就像一场马拉松,不在于瞬间的爆发,而在于途中的坚持。纵有千百个理由放弃,也要给自己找一个坚持下去的理由。", "当你觉得坚持不下去的时候,其实离成功已经不远了。只要咬紧牙关,再往前迈一步,胜利就会属于你。" ], "抒情": [ "在宁静的夜晚,月光洒在大地上,仿佛给世界披上了一层银纱,我静静地坐在窗前,回忆着那些美好的过往,心中满是温柔。", "微风轻轻拂过脸颊,带着淡淡的花香,仿佛是大自然温柔的抚摸。我漫步在花丛中,感受着这如梦如幻的美景,心中充满了喜悦。", "夕阳的余晖洒在湖面上,波光粼粼,宛如一幅绚丽的画卷。我站在湖边,望着远方,心中涌起一股莫名的惆怅。" ], "写景": [ "远处的山峦连绵起伏,与蓝天白云相映成趣,山间的绿树郁郁葱葱,仿佛是大自然用绿色的画笔勾勒出的一幅美丽画卷。", "春天到了,田野里一片生机勃勃的景象。金黄的油菜花盛开着,散发出阵阵清香,蝴蝶和蜜蜂在花丛中飞舞,仿佛在诉说着春天的故事。", "夏日的海边,阳光明媚,沙滩金黄柔软。海浪一波一波地涌来,拍打着岸边的礁石,发出清脆的声响,仿佛是大海在演奏着美妙的乐章。" ] }
def generate_sentence(): sentence_type = entry.get() if sentence_type in sentence_templates: templates = sentence_templates[sentence_type] if templates: sentence = random.choice(templates) templates.remove(sentence)
result_label.config(text=sentence) else: result_label.config(text=f"该类型的句子已用完,请选择其他类型。") else: result_label.config(text=f"未找到 {sentence_type} 类型的句子,请重新输入。")def enter_generation_page(): start_frame.pack_forget() generation_frame.pack()
root = tk.Tk() root.title("句子生成器")
start_frame = tk.Frame(root) start_frame.pack(pady=20)
start_label = tk.Label(start_frame, text="欢迎使用句子生成器!", font=("Arial", 16)) start_label.pack(pady=10)
start_button = tk.Button(start_frame, text="开始生成句子", command=enter_generation_page) start_button.pack(pady=20)
generation_frame = tk.Frame(root)
label = tk.Label(generation_frame, text="请输入句子类型(励志、抒情、写景):", font=("Arial", 12)) label.pack(pady=10)
entry = tk.Entry(generation_frame, font=("Arial", 12)) entry.pack(pady=5)
generate_button = tk.Button(generation_frame, text="生成句子", command=generate_sentence) generate_button.pack(pady=20)
result_label = tk.Label(generation_frame, text="", font=("Arial", 12), wraplength=400) result_label.pack(pady=10)
root.mainloop()
六、你对AI辅助代码编写的思考: 快速代码生成:AI 可以根据给定的功能描述,迅速生成基础代码框架,大大节省了编写代码的时间。AI 辅助工具通过分析代码上下文,能够准确预测并自动补全代码。尽管 AI 在处理标准化、结构化的代码任务方面表现出色,但对于复杂的业务逻辑和特定领域的专业知识,其理解能力仍然有限。
-
2025-2-28 23:07:35@
一、名称:诗坛试炼
二、创作者及使用的AI工具:王楚墨 豆包AI
三、主要功能:
(1)该游戏有两个人操控,左右两个区块,分别由两人操控。开始游戏后会进行抽签,决定先手。
(2)两边最上方分别有该方的剩余生命值。左右两边中间分别是一个显示诗句的文本框。双方的最下方分别是一个文本输入框,用于输入诗句。
(3)该游戏玩法如下:用诗词进行攻击,玩家需要输入包含“金木水火土”其中一个字的诗句,对对方进行伤害,基础伤害值是5。其中,五个元素分别相克,分别是金克木、木克土、土克水、水克火、火克金关系。当进攻一方的攻击对对方上一轮的诗符合相克条件,那么伤害值为8。当有一方生命值低于零时,游戏结束,存活者获胜。
四、作品截图
五、作品代码:
import tkinter as tk from tkinter import messagebox import random # 元素相克关系 ELEMENT_RELATIONS = { '金': '木', '木': '土', '土': '水', '水': '火', '火': '金' } # 初始生命值 INITIAL_HP = 50 # 出招时间限制(秒) TIME_LIMIT = 20 # 定义全局字体 FONT = ("Microsoft YaHei", 12) class PoetryBattleGame: def __init__(self, root): self.root = root self.root.title("诗词对战游戏") self.root.configure(bg="#43978D") # 设置主窗口背景颜色 # 菜单界面 self.menu_frame = tk.Frame(root, width=350, height=350, bg="#43978D") self.menu_frame.pack_propagate(0) # 防止框架根据内容调整大小 self.menu_frame.pack(pady=20) # 增大“诗坛试炼”字体大小 title_label = tk.Label(self.menu_frame, text="诗坛试炼", font=("Microsoft YaHei", 36), bg="#43978D", fg="#264D59") title_label.pack(pady=20) battle_button = tk.Button(self.menu_frame, text="诗词对战", command=self.start_battle, font=FONT, bg="#F9E07F", fg="#264D59") battle_button.pack(pady=10) #flying_flower_button = tk.Button(self.menu_frame, text="背景音乐", command=self.start_flying_flower, font=FONT, bg="#F9E07F", fg="#264D59") #flying_flower_button.pack(pady=10) help_button = tk.Button(self.menu_frame, text="帮助", command=self.show_help, font=FONT, bg="#F9E07F", fg="#264D59") help_button.pack(pady=10) # 抽签界面 self.lottery_frame = tk.Frame(root, width=200, height=200, bg="#43978D") self.lottery_frame.pack_propagate(0) self.lottery_frame.pack(pady=20) self.lottery_frame.pack_forget() # 初始隐藏 self.lottery_label = tk.Label(self.lottery_frame, text="正在抽签决定先手...", font=FONT, bg="#43978D", fg="#264D59") self.lottery_label.pack(pady=10) self.lottery_button = tk.Button(self.lottery_frame, text="开始抽签", command=self.draw_lottery, font=FONT, bg="#F9E07F", fg="#264D59") self.lottery_button.pack(pady=10) # 游戏界面,初始隐藏 self.game_frame = tk.Frame(root, bg="#43978D") self.game_frame.pack_forget() # 划分左右两个区域 self.left_frame = tk.Frame(self.game_frame, width=400, height=600, bd=2, relief=tk.SOLID, bg="#43978D") self.left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) self.right_frame = tk.Frame(self.game_frame, width=400, height=600, bd=2, relief=tk.SOLID, bg="#43978D") self.right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) # 双方生命值 self.left_hp = INITIAL_HP self.right_hp = INITIAL_HP self.left_hp_label = tk.Label(self.left_frame, text=f"生命值: {self.left_hp}", font=FONT, bg="#43978D", fg="#264D59") self.left_hp_label.pack(pady=10) self.right_hp_label = tk.Label(self.right_frame, text=f"生命值: {self.right_hp}", font=FONT, bg="#43978D", fg="#264D59") self.right_hp_label.pack(pady=10) # 双方文本显示框 self.left_text = tk.Text(self.left_frame, height=20, width=40, font=FONT, bg="#ffffff", fg="#264D59") self.left_text.pack(pady=10) self.right_text = tk.Text(self.right_frame, height=20, width=40, font=FONT, bg="#ffffff", fg="#264D59") self.right_text.pack(pady=10) # 双方输入框 self.left_entry = tk.Entry(self.left_frame, width=40, state=tk.DISABLED, font=FONT, bg="#ffffff", fg="#264D59") self.left_entry.pack(pady=10) self.right_entry = tk.Entry(self.right_frame, width=40, state=tk.DISABLED, font=FONT, bg="#ffffff", fg="#264D59") self.right_entry.pack(pady=10) # 双方提交按钮 self.left_button = tk.Button(self.left_frame, text="提交", command=lambda: self.submit_poem(0), state=tk.DISABLED, font=FONT, bg="#F9E07F", fg="#264D59") self.left_button.pack(pady=10) self.right_button = tk.Button(self.right_frame, text="提交", command=lambda: self.submit_poem(1), state=tk.DISABLED, font=FONT, bg="#F9E07F", fg="#264D59") self.right_button.pack(pady=10) # 倒计时显示标签 self.timer_label = tk.Label(self.game_frame, text="", font=FONT, bg="#43978D", fg="#264D59") self.timer_label.pack(pady=10) # 返回按钮 self.back_button = tk.Button(self.game_frame, text="返回菜单", command=self.back_to_menu, font=FONT, bg="#F9E07F", fg="#264D59") self.back_button.pack(pady=10) # 新增的元素相克提示文本框 button_width = self.back_button.winfo_reqwidth() button_height = self.back_button.winfo_reqheight() self.element_hint = tk.Label(self.game_frame, text="", font=FONT, bg="#43978D", fg="red", width=button_width, height=button_height * 2) self.element_hint.pack(pady=10) self.last_left_element = None self.last_right_element = None self.current_player = None self.timer = None self.poetry_index = 0 def start_battle(self): self.menu_frame.pack_forget() self.lottery_frame.pack() self.start_poetry_loop() #def start_flying_flower(self): # try: # playsound(music_file_path) # except Exception as e: # print(f"播放音乐时出错: {e}") def show_help(self): # 这里可以添加帮助信息 messagebox.showinfo("帮助", "该游戏有两个人操控,左右两个区块,分别由两人操控。两边最上方分别有该方的剩余生命值;左右两边中间分别是一个显示招数的文本框,双方的最下方分别是一个文本输入框。该游戏玩法如下:用诗词进行攻击,玩家需要输入包含“金”“木”“水”“火”“土”其中一个字的诗句,对对方进行伤害,基础伤害值是5。其中,五个元素分别相克,分别是金克木、木克土、土克水、水克火、火克金物种相克关系。当进攻一方的攻击对对方上一轮的诗符合相克条件,那么伤害值为8。当有一方生命值低于零时,游戏结束,存活者获胜。") def draw_lottery(self): # 随机决定先手 self.current_player = random.choice([0, 1]) if self.current_player == 0: message = "左边玩家先手!" self.left_entry.config(state=tk.NORMAL) self.left_button.config(state=tk.NORMAL) else: message = "右边玩家先手!" self.right_entry.config(state=tk.NORMAL) self.right_button.config(state=tk.NORMAL) messagebox.showinfo("抽签结果", message) self.lottery_frame.pack_forget() self.game_frame.pack() self.start_timer() def submit_poem(self, player): if player == self.current_player: if player == 0: # 左边玩家 poem = self.left_entry.get().strip() element = self.get_element(poem) if element: damage = self.calculate_damage(element, self.last_right_element) self.right_hp -= damage self.right_hp_label.config(text=f"生命值: {self.right_hp}") self.left_text.insert(tk.END, f"你出招: {poem}\n") self.right_text.insert(tk.END, f"对方出招: {poem}\n") self.last_left_element = element if damage == 8: self.show_element_hint("左", element, self.last_right_element) if self.right_hp <= 0: messagebox.showinfo("游戏结束", "左边玩家获胜!") self.reset_game() else: self.switch_player() self.stop_timer() self.start_timer() else: messagebox.showerror("错误", "诗句中需包含金、木、水、火、土其中一个字或其一部分。") self.left_entry.delete(0, tk.END) else: # 右边玩家 poem = self.right_entry.get().strip() element = self.get_element(poem) if element: damage = self.calculate_damage(element, self.last_left_element) self.left_hp -= damage self.left_hp_label.config(text=f"生命值: {self.left_hp}") self.right_text.insert(tk.END, f"你出招: {poem}\n") self.left_text.insert(tk.END, f"对方出招: {poem}\n") self.last_right_element = element if damage == 8: self.show_element_hint("右", element, self.last_left_element) if self.left_hp <= 0: messagebox.showinfo("游戏结束", "右边玩家获胜!") self.reset_game() else: self.switch_player() self.stop_timer() self.start_timer() else: messagebox.showerror("错误", "诗句中需包含金、木、水、火、土其中一个字或其一部分。") self.right_entry.delete(0, tk.END) def get_element(self, poem): elements = "金木水火土" for char in poem: for element in elements: if element in char: return element return None def calculate_damage(self, attack_element, defense_element): if defense_element and ELEMENT_RELATIONS[attack_element] == defense_element: return 8 return 5 def switch_player(self): # 切换玩家回合 self.current_player = 1 - self.current_player if self.current_player == 0: self.left_entry.config(state=tk.NORMAL) self.left_button.config(state=tk.NORMAL) self.right_entry.config(state=tk.DISABLED) self.right_button.config(state=tk.DISABLED) else: self.right_entry.config(state=tk.NORMAL) self.right_button.config(state=tk.NORMAL) self.left_entry.config(state=tk.DISABLED) self.left_button.config(state=tk.DISABLED) def start_timer(self): self.time_remaining = TIME_LIMIT self.update_timer() def update_timer(self): if self.time_remaining > 0: self.timer_label.config(text=f"剩余时间: {self.time_remaining} 秒") self.time_remaining -= 1 self.timer = self.root.after(1000, self.update_timer) else: self.timer_label.config(text="时间到!轮到对方出招。") self.switch_player() self.start_timer() def stop_timer(self): if self.timer: self.root.after_cancel(self.timer) self.timer = None def back_to_menu(self): # 停止当前的倒计时 self.stop_timer() # 隐藏游戏界面 self.game_frame.pack_forget() # 显示菜单界面 self.menu_frame.pack() # 重置游戏状态 self.reset_game() def reset_game(self): self.lottery_frame.pack() self.game_frame.pack_forget() self.left_hp = INITIAL_HP self.right_hp = INITIAL_HP self.left_hp_label.config(text=f"生命值: {self.left_hp}") self.right_hp_label.config(text=f"生命值: {self.right_hp}") self.left_text.delete(1.0, tk.END) self.right_text.delete(1.0, tk.END) self.last_left_element = None self.last_right_element = None self.current_player = None self.left_entry.config(state=tk.DISABLED) self.right_entry.config(state=tk.DISABLED) self.left_button.config(state=tk.DISABLED) self.right_button.config(state=tk.DISABLED) def show_element_hint(self, attacker_side, attack_element, defense_element): hint_text = f"({attacker_side}方{attack_element})元素相克(对方{defense_element})元素" self.element_hint.config(text=hint_text) self.root.after(3000, self.clear_element_hint) def clear_element_hint(self): self.element_hint.config(text="") if __name__ == "__main__": root = tk.Tk() game = PoetryBattleGame(root) root.mainloop()
六、对AI辅助代码编写的思考:
近年来,随着人工智能行业的飞速发展,更多更强的人工智能出现在世人面前。这使得更多没有编程基础的人们也可以通过AI来实现自己的创意,这是一件好事;同时计算机行业的技术人员也可以使用AI来完成基础代码,减轻了工作压力,无疑也是AI辅助代码的好处。但值得注意的是,AI辅助代码也有弊端。AI辅助代码出现后,愿意去认真钻研代码、学习代码的人变少了,因为AI能替他们完成这些工作,这无疑不利于推动计算机技术的进步。我们应该以AI作为学习代码的工具,而不是遇事就找AI。所以综上所述,我们要合理使用AI辅助代码的同时,坚持自己的思考和学习。
-
2025-2-28 22:54:14@
一、作品名称:五子棋小程序
二、作品创作者及使用的AI工具:kimi
三、作品主要功能:
(1)可选择双人对战和人机对战两种模式
(2)以五子棋的规则边学边玩
(3)人机对战有简单、中等、困难三种模式
......
四、作品主要截图
五、作品的代码:
import tkinter as tk from tkinter import messagebox, simpledialog import random class GoGame: def __init__(self, root): self.root = root self.root.title("五子棋小游戏") self.root.geometry("550x650") # 增加窗口宽度以容纳提示标签 # 棋盘大小 self.board_size = 9 self.cell_size = 50 self.canvas_size = self.board_size * self.cell_size # 初始化棋盘状态,0表示空,1表示黑棋,2表示白棋 self.board = [[0 for _ in range(self.board_size)] for _ in range(self.board_size)] # 当前玩家,1为黑棋先手 self.current_player = 1 # 游戏模式,0为双人对局,1为人机对局 self.mode = 0 # AI 难度,0为简单,1为中等,2为困难 self.difficulty = 0 # 知识问答模式 self.knowledge_mode = False self.knowledge_score = 0 # 创建棋盘画布 self.canvas = tk.Canvas(root, width=self.canvas_size, height=self.canvas_size, bg="bisque") self.canvas.pack(side=tk.LEFT, padx=10, pady=10) # 绘制棋盘 self.draw_board() # 绑定鼠标点击事件 self.canvas.bind("<Button-1>", self.place_piece) # 创建模式切换按钮 self.mode_button = tk.Button(root, text="切换到人机对局", command=self.toggle_mode, font=("Arial", 12), bg="#4CAF50", fg="white") self.mode_button.pack(pady=10) # 创建难度选择下拉菜单 self.difficulty_label = tk.Label(root, text="AI 难度:简单", font=("Arial", 12)) self.difficulty_label.pack() self.difficulty_menu = tk.OptionMenu(root, tk.StringVar(value="简单"), "简单", "中等", "困难", command=self.set_difficulty) self.difficulty_menu.pack() # 创建知识问答按钮 self.knowledge_button = tk.Button(root, text="知识问答模式", command=self.toggle_knowledge_mode, font=("Arial", 12), bg="#2196F3", fg="white") self.knowledge_button.pack(pady=10) # 创建知识分数显示 self.knowledge_score_label = tk.Label(root, text="知识分数:0", font=("Arial", 12)) self.knowledge_score_label.pack() # 创建提示标签,显示当前轮到哪方下棋 self.turn_label = tk.Label(root, text="当前轮到:黑棋", font=("Arial", 14), fg="black") self.turn_label.pack(pady=10) # 创建重置按钮 self.reset_button = tk.Button(root, text="重置游戏", command=self.reset_game, font=("Arial", 12), bg="#f44336", fg="white") self.reset_button.pack(pady=10) # 学科问题库 self.questions = [ # 数学问题 {"subject": "数学", "question": "1 + 1 = ?", "answer": "2"}, {"subject": "数学", "question": "10 ÷ 2 = ?", "answer": "5"}, {"subject": "数学", "question": "5 × 6 = ?", "answer": "30"}, {"subject": "数学", "question": "平方根(16) 是多少?", "answer": "4"}, # 语文问题 {"subject": "语文", "question": "《静夜思》的作者是谁?", "answer": "李白"}, {"subject": "语文", "question": "《岳阳楼记》的作者是谁?", "answer": "范仲淹"}, {"subject": "语文", "question": "成语‘画龙点睛’的典故与哪位画家有关?", "answer": "张僧繇"}, {"subject": "语文", "question": "‘推敲’一词出自哪位诗人的故事?", "answer": "贾岛"}, # 英语问题 {"subject": "英语", "question": "What is the capital of France?", "answer": "Paris"}, {"subject": "英语", "question": "Translate ‘你好’ to English.", "answer": "Hello"}, {"subject": "英语", "question": "What is the past tense of ‘go’?", "answer": "went"}, {"subject": "英语", "question": "What is the plural form of ‘child’?", "answer": "children"}, # 科学问题 {"subject": "科学", "question": "水的化学式是什么?", "answer": "H2O"}, {"subject": "科学", "question": "光速是多少(单位:米/秒)?", "answer": "300000000"}, {"subject": "科学", "question": "人体最大的器官是什么?", "answer": "皮肤"}, {"subject": "科学", "question": "地球自转一周需要多长时间?", "answer": "24小时"}, # 历史问题 {"subject": "历史", "question": "中国历史上第一个统一的封建王朝是哪个?", "answer": "秦朝"}, {"subject": "历史", "question": "《辛丑条约》签订于哪一年?", "answer": "1901"}, {"subject": "历史", "question": "二战结束的标志是什么?", "answer": "日本投降"}, {"subject": "历史", "question": "中国共产党成立于哪一年?", "answer": "1921"} ] def draw_board(self): """绘制棋盘""" for i in range(self.board_size): # 绘制横线 self.canvas.create_line(i * self.cell_size, 0, i * self.cell_size, self.canvas_size, fill="black") # 绘制竖线 self.canvas.create_line(0, i * self.cell_size, self.canvas_size, i * self.cell_size, fill="black") def place_piece(self, event): """放置棋子""" x, y = event.x // self.cell_size, event.y // self.cell_size if self.board[y][x] == 0: # 如果该位置为空 self.board[y][x] = self.current_player color = "black" if self.current_player == 1 else "white" self.draw_piece(x, y, color) if self.check_winner(y, x): messagebox.showinfo("游戏结束", f"玩家 {'黑棋' if self.current_player == 1 else '白棋'} 获胜!") self.reset_game() else: self.current_player = 3 - self.current_player # 切换玩家 self.update_turn_label() # 更新提示标签 if self.mode == 1 and self.current_player == 2: # 如果是人机对局且轮到 AI self.ai_move() elif self.knowledge_mode: self.ask_question() def ai_move(self): """AI 自动放置棋子""" if self.difficulty == 0: # 简单难度:随机选择 empty_cells = [(r, c) for r in range(self.board_size) for c in range(self.board_size) if self.board[r][c] == 0] if empty_cells: row, col = random.choice(empty_cells) elif self.difficulty == 1: # 中等难度:启发式规则 row, col = self.minimax(2, True) # 搜索深度为2 elif self.difficulty == 2: # 困难难度:更复杂的启发式规则 row, col = self.minimax(3, True) # 搜索深度为3 self.board[row][col] = self.current_player self.draw_piece(col, row, "white") if self.check_winner(row, col): messagebox.showinfo("游戏结束", "玩家 白棋(AI) 获胜!") self.reset_game() else: self.current_player = 1 # 切换回玩家(黑棋) self.update_turn_label() # 更新提示标签 def minimax(self, depth, is_maximizing): """Minimax算法实现""" if self.check_winner() or depth == 0: return self.evaluate_board() if is_maximizing: best_score = float("-inf") best_move = None for row in range(self.board_size): for col in range(self.board_size): if self.board[row][col] == 0: self.board[row][col] = 2 # AI是白棋 score = self.minimax(depth - 1, False) self.board[row][col] = 0 if score > best_score: best_score = score best_move = (row, col) return best_move if depth == 3 else best_score else: best_score = float("inf") for row in range(self.board_size): for col in range(self.board_size): if self.board[row][col] == 0: self.board[row][col] = 1 # 玩家是黑棋 score = self.minimax(depth - 1, True) self.board[row][col] = 0 if score < best_score: best_score = score return best_score def evaluate_board(self): """评估棋局得分""" score = 0 for dr, dc in [(1, 0), (0, 1), (1, 1), (1, -1)]: # 横、竖、正对角线、反对角线 for row in range(self.board_size): for col in range(self.board_size): if self.board[row][col] == 2: # AI是白棋 count = 1 r, c = row + dr, col + dc while 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == 2: count += 1 r += dr c += dc score += count * count return score def draw_piece(self, x, y, color): """绘制棋子""" self.canvas.create_oval(x * self.cell_size + 5, y * self.cell_size + 5, (x + 1) * self.cell_size - 5, (y + 1) * self.cell_size - 5, fill=color, outline=color) def check_winner(self, row=None, col=None): """检查是否有五子连珠""" for dr, dc in [(1, 0), (0, 1), (1, 1), (1, -1)]: # 横、竖、正对角线、反对角线 for r in range(self.board_size): for c in range(self.board_size): if self.board[r][c] != 0: count = 1 rr, cc = r + dr, c + dc while 0 <= rr < self.board_size and 0 <= cc < self.board_size and self.board[rr][cc] == self.board[r][c]: count += 1 rr += dr cc += dc if count >= 5: return True return False def reset_game(self): """重置游戏""" self.canvas.delete("all") self.draw_board() self.board = [[0 for _ in range(self.board_size)] for _ in range(self.board_size)] self.current_player = 1 self.knowledge_score = 0 self.knowledge_score_label.config(text="知识分数:0") self.update_turn_label() # 更新提示标签 def toggle_mode(self): """切换游戏模式""" self.mode = 1 - self.mode # 切换模式 if self.mode == 0: self.mode_button.config(text="切换到人机对局") else: self.mode_button.config(text="切换到双人对局") self.reset_game() # 切换模式时重置棋盘 def set_difficulty(self, value): """设置 AI 难度""" self.difficulty = {"简单": 0, "中等": 1, "困难": 2}.get(value, 0) self.difficulty_label.config(text=f"AI 难度:{value}") self.reset_game() # 切换难度时重置棋盘 def toggle_knowledge_mode(self): """切换知识问答模式""" self.knowledge_mode = not self.knowledge_mode if self.knowledge_mode: self.knowledge_button.config(text="关闭知识问答") else: self.knowledge_button.config(text="知识问答模式") def ask_question(self): """弹出知识问答""" if not self.questions: messagebox.showinfo("提示", "没有更多问题了!") return question = random.choice(self.questions) user_answer = simpledialog.askstring("知识问答", f"{question['subject']}:{question['question']}") if user_answer and user_answer.strip().lower() == question['answer'].lower(): self.knowledge_score += 10 self.knowledge_score_label.config(text=f"知识分数:{self.knowledge_score}") messagebox.showinfo("回答正确", "恭喜你,回答正确!") else: messagebox.showinfo("回答错误", f"很遗憾,正确答案是:{question['answer']}") def update_turn_label(self): """更新提示标签,显示当前轮到哪方下棋""" if self.current_player == 1: self.turn_label.config(text="当前轮到:黑棋", fg="black") else: self.turn_label.config(text="当前轮到:白棋", fg="white") if __name__ == "__main__": root = tk.Tk() game = GoGame(root) root.mainloop()
六、你对AI辅助代码编写的思考:
AI可以帮助我们做出更多的代码改进,但它的思路过于死板,没有像人一样的开放性思维。它不仅能快速解答我的问题,还能提供丰富的信息和多角度的思考方式。AI 在代码编写和优化方面提供了巨大的帮助,但它的局限性也很明显。AI 的高效性和人类的创造性思维相结合,可以更好地发挥各自的优势。开发者可以利用 AI 提供的工具和建议,提升编程效率和代码质量,同时保持对复杂问题的灵活处理能力。
-
2025-2-28 22:48:04@
一、作品名称:大型音乐播放器
二、作品创作者及使用的AI工具:海螺AI,豆包
三、作品主要功能:
- 用户友好的图形界面 主题化界面,自定义布局,背景图片,图标按钮
- 多格式音频支持 音频格式,自动识别
- 播放列表管理 添加歌曲,移除歌曲,持久化存储,实时更新
- 音乐播放控制 播放/暂停,上一首/下一首,播放模式,顺序播放,随机播放,循环播放
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import tkinter as tk from tkinter import Canvas, Label, Button, ttk, Listbox, Scrollbar, filedialog, messagebox from PIL import Image, ImageTk import time import threading import pygame import sys import os import re import json # 配置日志 import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') class MusicPlayer: def __init__(self, master): self.master = master master.title("大型音乐播放器") master.geometry("800x600") master.resizable(False, False) # 初始化pygame mixer pygame.mixer.init() self.volume = 1.0 # 初始音量 # 加载背景图片 try: self.background_image = Image.open("cover.jpg") except FileNotFoundError: messagebox.showerror("错误", "未找到背景图片!") master.destroy() return self.background_photo = ImageTk.PhotoImage(self.background_image) self.canvas = Canvas(master, width=800, height=600) self.canvas.pack() self.canvas.create_image(0, 0, anchor='nw', image=self.background_photo) # 初始化歌曲列表 self.playlist = [] self.current_song_index = -1 self.is_playing = False self.is_paused = False self.total_length = 0 self.play_mode = "顺序播放" # 顺序播放, 随机播放, 循环播放 self.load_playlist() # 创建歌曲列表显示 self.listbox = Listbox(master, width=50, height=20, font=("Helvetica", 14), bg="black", fg="white", selectbackground="gray", selectforeground="black") self.listbox.place(relx=0.05, rely=0.1, anchor='nw') self.update_playlist_display() # 添加滚动条 self.scrollbar = Scrollbar(master) self.scrollbar.place(relx=0.3, rely=0.1, anchor='nw', relheight=0.8) self.listbox.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self.listbox.yview) # 添加控制按钮 self.add_button = Button(master, text="添加歌曲", command=self.add_songs, font=("Helvetica", 12), bg="gray", fg="white") self.add_button.place(relx=0.05, rely=0.92, anchor='nw') self.remove_button = Button(master, text="移除歌曲", command=self.remove_song, font=("Helvetica", 12), bg="gray", fg="white") self.remove_button.place(relx=0.15, rely=0.92, anchor='nw') self.play_button = Button(master, text="播放", command=self.play_music, font=("Helvetica", 12), bg="gray", fg="white") self.play_button.place(relx=0.3, rely=0.92, anchor='nw') self.pause_button = Button(master, text="暂停", command=self.pause_music, font=("Helvetica", 12), bg="gray", fg="white", state=tk.DISABLED) self.pause_button.place(relx=0.4, rely=0.92, anchor='nw') self.stop_button = Button(master, text="停止", command=self.stop_music, font=("Helvetica", 12), bg="gray", fg="white", state=tk.DISABLED) self.stop_button.place(relx=0.5, rely=0.92, anchor='nw') self.prev_button = Button(master, text="上一首", command=self.prev_song, font=("Helvetica", 12), bg="gray", fg="white", state=tk.DISABLED) self.prev_button.place(relx=0.6, rely=0.92, anchor='nw') self.next_button = Button(master, text="下一首", command=self.next_song, font=("Helvetica", 12), bg="gray", fg="white", state=tk.DISABLED) self.next_button.place(relx=0.7, rely=0.92, anchor='nw') # 添加播放模式按钮 self.mode_button = Button(master, text="顺序播放", command=self.toggle_play_mode, font=("Helvetica", 12), bg="gray", fg="white") self.mode_button.place(relx=0.8, rely=0.92, anchor='nw') # 添加音量控制 self.volume_slider = ttk.Scale(master, from_=0, to=1, orient='horizontal', command=self.set_volume, length=100) self.volume_slider.set(self.volume) self.volume_slider.place(relx=0.85, rely=0.92, anchor='nw') # 添加进度条 self.progress = ttk.Progressbar(master, orient='horizontal', mode='determinate', length=600) self.progress.place(relx=0.05, rely=0.85, anchor='nw') # 添加时间标签 self.time_label = Label(master, text="", font=("Helvetica", 12), fg="white", bg="black") self.time_label.place(relx=0.05, rely=0.9, anchor='nw') # 添加歌曲信息标签 self.song_info_label = Label(master, text="", font=("Helvetica", 16), fg="white", bg="black") self.song_info_label.place(relx=0.4, rely=0.05, anchor='nw') # 启动音乐播放线程 self.master.after(100, self.update_progress) # 绑定快捷键 master.bind('<Left>', self.prev_song) master.bind('<Right>', self.next_song) master.bind('<space>', self.toggle_pause) def load_playlist(self): # 加载播放列表 playlist_file = "playlist.json" if os.path.exists(playlist_file): with open(playlist_file, "r", encoding="utf-8") as file: self.playlist = json.load(file) else: music_folder = "music" if not os.path.exists(music_folder): messagebox.showerror("错误", "音乐文件夹未找到!") return for file in os.listdir(music_folder): if file.endswith((".mp3", ".wav", ".ogg")): self.playlist.append(os.path.join(music_folder, file)) if not self.playlist: messagebox.showerror("错误", "未找到音乐文件!") return def save_playlist(self): # 保存播放列表 playlist_file = "playlist.json" with open(playlist_file, "w", encoding="utf-8") as file: json.dump(self.playlist, file) def update_playlist_display(self): self.listbox.delete(0, tk.END) for song in self.playlist: self.listbox.insert(tk.END, os.path.basename(song)) def add_songs(self): # 添加多个歌曲到播放列表 file_paths = filedialog.askopenfilenames(filetypes=[("Audio Files", "*.mp3 *.wav *.ogg")]) if file_paths: for file_path in file_paths: self.playlist.append(file_path) self.update_playlist_display() self.save_playlist() def remove_song(self): # 从播放列表中移除选中的歌曲 selected_indices = self.listbox.curselection() if not selected_indices: messagebox.showwarning("警告", "请选择要移除的歌曲!") return for index in reversed(selected_indices): del self.playlist[index] self.update_playlist_display() self.save_playlist() if self.current_song_index >= len(self.playlist): self.current_song_index = len(self.playlist) - 1 self.update_song_info() def play_music(self): # 播放选中的歌曲 selected_indices = self.listbox.curselection() if not selected_indices: messagebox.showwarning("警告", "请选择要播放的歌曲!") return self.current_song_index = selected_indices[0] self.is_playing = True self.is_paused = False self.play_button.config(state=tk.DISABLED) self.pause_button.config(state=tk.NORMAL) self.stop_button.config(state=tk.NORMAL) self.prev_button.config(state=tk.NORMAL) self.next_button.config(state=tk.NORMAL) self.play_selected_song() def play_selected_song(self): # 加载并播放选中的歌曲 song = self.playlist[self.current_song_index] pygame.mixer.music.load(song) pygame.mixer.music.play() self.update_song_info() self.update_lyrics() def pause_music(self): # 暂停音乐播放 if self.is_playing and not self.is_paused: pygame.mixer.music.pause() self.is_paused = True self.pause_button.config(text="恢复") elif self.is_playing and self.is_paused: pygame.mixer.music.unpause() self.is_paused = False self.pause_button.config(text="暂停") def toggle_pause(self, event): # 切换暂停/恢复 if self.is_playing: self.pause_music() def stop_music(self): # 停止音乐播放 pygame.mixer.music.stop() self.is_playing = False self.is_paused = False self.play_button.config(state=tk.NORMAL) self.pause_button.config(text="暂停", state=tk.DISABLED) self.stop_button.config(state=tk.DISABLED) self.prev_button.config(state=tk.DISABLED) self.next_button.config(state=tk.DISABLED) self.progress['value'] = 0 self.time_label.config(text="") self.song_info_label.config(text="") def prev_song(self, event=None): # 播放上一首歌曲 if self.current_song_index > 0: self.current_song_index -= 1 else: self.current_song_index = len(self.playlist) - 1 self.play_selected_song() def next_song(self, event=None): # 播放下一首歌曲 if self.current_song_index < len(self.playlist) - 1: self.current_song_index += 1 else: self.current_song_index = 0 self.play_selected_song() def update_song_info(self): # 更新歌曲信息 song = self.playlist[self.current_song_index] song_name = os.path.basename(song) artist = "未知艺术家" album = "未知专辑" # 使用正则表达式解析文件名获取艺术家和专辑信息 pattern = re.compile(r'^(.*?) - (.*?) - (.*?)\.(mp3|wav|ogg)$') match = pattern.match(song_name) if match: artist = match.group(1) album = match.group(2) song_name = match.group(3) else: pattern = re.compile(r'^(.*?) - (.*?)\.(mp3|wav|ogg)$') match = pattern.match(song_name) if match: artist = match.group(1) song_name = match.group(2) self.song_info_label.config(text=f"{song_name}\n艺术家: {artist}\n专辑: {album}") def update_lyrics(self): # 更新歌词显示 lyrics_folder = "lyrics" if not os.path.exists(lyrics_folder): return song_name = os.path.basename(self.playlist[self.current_song_index]) lyrics_file = os.path.join(lyrics_folder, f"{song_name}.txt") if os.path.exists(lyrics_file): with open(lyrics_file, "r", encoding="utf-8") as file: lyrics = file.read() self.song_info_label.config(text=lyrics) else: self.song_info_label.config(text="未找到歌词文件") def update_progress(self): if self.is_playing and not self.is_paused: current_position = pygame.mixer.music.get_pos() # 当前播放位置(毫秒) self.progress['value'] = current_position current_time = time.strftime('%M:%S', time.gmtime(current_position / 1000)) total_time = time.strftime('%M:%S', time.gmtime(self.total_length)) self.time_label.config(text=f"{current_time} / {total_time}") if current_position < self.total_length * 1000: self.master.after(100, self.update_progress) else: self.progress['value'] = self.total_length * 1000 self.time_label.config(text=f"{total_time} / {total_time}") self.is_playing = False self.play_button.config(state=tk.NORMAL) self.pause_button.config(text="暂停", state=tk.DISABLED) self.stop_button.config(state=tk.DISABLED) self.prev_button.config(state=tk.DISABLED) self.next_button.config(state=tk.DISABLED) else: self.master.after(100, self.update_progress) def set_volume(self, val): self.volume = float(val) pygame.mixer.music.set_volume(self.volume) def toggle_play_mode(self): if self.play_mode == "顺序播放": self.play_mode = "随机播放" self.mode_button.config(text="随机播放") elif self.play_mode == "随机播放": self.play_mode = "循环播放" self.mode_button.config(text="循环播放") else: self.play_mode = "顺序播放" self.mode_button.config(text="顺序播放") def on_closing(self): pygame.mixer.music.stop() self.save_playlist() self.master.destroy() def main(): root = tk.Tk() app = MusicPlayer(root) root.protocol("WM_DELETE_WINDOW", app.on_closing) root.mainloop() if __name__ == "__main__": main()
六、你对AI辅助代码编写的思考: AI辅助代码编写在提高开发效率、减少错误和加速学习方面具有显著优势。然而,开发者需要在依赖AI的同时,保持对基础知识和系统设计的掌握,并审慎对待AI生成的内容。通过合理利用AI工具,开发者可以更专注于创造性和战略性工作,从而推动软件开发的进步。
-
2025-2-28 22:43:21@
一、作品名称:丛林迷宫
二、作品创作者及使用的AI工具:豆包
三、作品主要功能:
(1)挑战一个25*25宫格的迷宫,并走到出口
(2)在迷宫的途中认识一些植物
四、作品主要截图
五、作品的代码:
import pygame import random # 初始化 Pygame pygame.init() # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) GREEN = (0, 255, 0) YELLOW = (255, 255, 0) RED = (255, 0, 0) # 每个格子的尺寸(像素),0.5 厘米大约对应 19 像素 block_size = 19 # 迷宫大小 maze_width = 25 maze_height = 25 # 游戏窗口设置 width = maze_width * block_size height = maze_height * block_size screen = pygame.display.set_mode((width, height)) pygame.display.set_caption("丛林迷宫识植物") # 深度优先搜索生成迷宫 def generate_maze(width, height): maze = [[1] * width for _ in range(height)] stack = [] start_x, start_y = 1, 1 maze[start_y][start_x] = 0 stack.append((start_x, start_y)) while stack: x, y = stack[-1] directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] random.shuffle(directions) found = False for dx, dy in directions: new_x, new_y = x + 2 * dx, y + 2 * dy if 0 < new_x < width - 1 and 0 < new_y < height - 1 and maze[new_y][new_x] == 1: maze[y + dy][x + dx] = 0 maze[new_y][new_x] = 0 stack.append((new_x, new_y)) found = True break if not found: stack.pop() return maze maze = generate_maze(maze_width, maze_height) # 确定红格子位置为迷宫右下角的通路格子 red_x, red_y = maze_width - 1, maze_height - 1 while maze[red_y][red_x] != 0: red_x -= 1 if red_x < 0: red_x = maze_width - 1 red_y -= 1 # 玩家初始位置 player_x = 1 player_y = 1 # 植物信息 plants = { (3, 3): {"name": "仙人掌", "info": "仙人掌是一种多肉植物,适应干旱环境,茎肉质,可储存大量水分。"}, (5, 7): {"name": "绿萝", "info": "绿萝是常见的室内观叶植物,能吸收空气中的有害气体,净化空气。"}, (7, 3): {"name": "竹子", "info": "竹子是一种多年生禾本科植物,生长迅速,用途广泛。"}, (10, 15): {"name": "含羞草", "info": "含羞草受到触碰时,叶片会闭合,是一种很有趣的植物。"}, (18, 20): {"name": "君子兰", "info": "君子兰具有很高的观赏价值,花朵鲜艳,叶片整齐。"}, (22, 12): {"name": "吊兰", "info": "吊兰是常见的垂挂植物,能有效吸收甲醛等有害物质。"} } # 绘制迷宫 def draw_maze(): for i in range(maze_height): for j in range(maze_width): if maze[i][j] == 1: pygame.draw.rect(screen, BLACK, (j * block_size, i * block_size, block_size, block_size)) # 绘制玩家 def draw_player(): pygame.draw.rect(screen, GREEN, (player_x * block_size, player_y * block_size, block_size, block_size)) # 绘制植物 def draw_plants(): for pos in plants.keys(): pygame.draw.rect(screen, YELLOW, (pos[1] * block_size, pos[0] * block_size, block_size, block_size)) # 绘制红格子 def draw_red_block(): pygame.draw.rect(screen, RED, (red_x * block_size, red_y * block_size, block_size, block_size)) # 显示植物信息 def show_plant_info(plant_name, plant_info): font = pygame.font.Font(None, 24) text_name = font.render(f"植物名称: {plant_name}", True, WHITE) text_info = font.render(f"植物介绍: {plant_info}", True, WHITE) # 创建支持透明度的 Surface info_screen = pygame.Surface((width, height), pygame.SRCALPHA) info_screen.fill((0, 0, 0, 128)) info_screen.blit(text_name, (10, 10)) info_screen.blit(text_info, (10, 50)) screen.blit(info_screen, (0, 0)) pygame.display.flip() pygame.time.wait(3000) # 显示游戏结束信息 def show_game_over(): font = pygame.font.Font(None, 48) text = font.render("游戏结束!", True, WHITE) game_over_screen = pygame.Surface((width, height), pygame.SRCALPHA) game_over_screen.fill((0, 0, 0, 128)) game_over_screen.blit(text, (width // 2 - text.get_width() // 2, height // 2 - text.get_height() // 2)) screen.blit(game_over_screen, (0, 0)) pygame.display.flip() pygame.time.wait(3000) # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: new_x, new_y = player_x, player_y if event.key == pygame.K_UP: new_y -= 1 elif event.key == pygame.K_DOWN: new_y += 1 elif event.key == pygame.K_LEFT: new_x -= 1 elif event.key == pygame.K_RIGHT: new_x += 1 # 检查新位置是否越界或为墙 if 0 <= new_x < maze_width and 0 <= new_y < maze_height and maze[new_y][new_x] == 0: player_x, player_y = new_x, new_y # 检查是否碰到植物 if (player_y, player_x) in plants: plant = plants[(player_y, player_x)] show_plant_info(plant["name"], plant["info"]) # 检查是否碰到红格子 if player_x == red_x and player_y == red_y: show_game_over() running = False screen.fill((0, 128, 0)) # 绿色背景 draw_maze() draw_plants() draw_player() draw_red_block() pygame.display.flip() pygame.time.Clock().tick(60) pygame.quit()
六、你对AI辅助代码编写的思考: AI 辅助代码编写提升效率,能快速生成基础代码框架、精准纠错。但它也存在理解局限,难以处理复杂逻辑与创意性需求。我们应合理利用,让 AI 成为有力助手,而非完全依赖。
-
2025-2-28 22:34:54@
一、作品名称:
文件批量重命名工具
二、作品创作者及使用的AI工具:
豆包
三、作品主要功能:
(1)此工具可批量重命名文件,用户能选文件夹和设置前缀。支持更换背景,可选 JPG、GIF 图,JPG 会用 ImageMagick 转 GIF 显示,退出时删临时文件,操作便捷。
四、作品主要截图
五、作品的代码:
import os import tkinter as tk from tkinter import filedialog, messagebox import subprocess current_background_photo = None temp_gif_path = "temp_bg.gif" def batch_rename_files(folder_path, prefix): # 检查文件夹是否存在 if not os.path.exists(folder_path): messagebox.showerror("错误", f"指定的文件夹 {folder_path} 不存在。") return # 遍历文件夹中的所有文件 for index, filename in enumerate(os.listdir(folder_path)): file_extension = os.path.splitext(filename)[1] new_filename = f"{prefix}{index}{file_extension}" old_file_path = os.path.join(folder_path, filename) new_file_path = os.path.join(folder_path, new_filename) try: # 重命名文件 os.rename(old_file_path, new_file_path) print(f"已将 {filename} 重命名为 {new_filename}") except Exception as e: messagebox.showerror("错误", f"重命名 {filename} 时出错: {e}") messagebox.showinfo("完成", "文件重命名完成。") def select_folder(): folder_path = filedialog.askdirectory() folder_entry.delete(0, tk.END) folder_entry.insert(0, folder_path) def start_renaming(): folder_path = folder_entry.get() prefix = prefix_entry.get() if not folder_path or not prefix: messagebox.showerror("错误", "请输入文件夹路径和重命名前缀。") else: batch_rename_files(folder_path, prefix) def convert_to_gif(input_path, output_path): try: # 使用 ImageMagick 进行转换 subprocess.run(['convert', input_path, output_path], check=True) return True except subprocess.CalledProcessError as e: messagebox.showerror("错误", f"转换图片时出错: {e}") return False except FileNotFoundError: messagebox.showerror("错误", "未找到 ImageMagick 的 'convert' 命令,请确保已安装 ImageMagick 并配置好环境变量。") return False def change_background(): global current_background_photo file_path = filedialog.askopenfilename(filetypes=[("图片文件", "*.jpg;*.jpeg;*.gif")]) if file_path: if file_path.lower().endswith(('.jpg', '.jpeg')): if convert_to_gif(file_path, temp_gif_path): try: current_background_photo = tk.PhotoImage(file=temp_gif_path) # 更新 Canvas 上的背景图片 canvas.itemconfig(background_image_id, image=current_background_photo) except Exception as e: messagebox.showerror("错误", f"显示背景图片时出错: {e}") elif file_path.lower().endswith('.gif'): try: current_background_photo = tk.PhotoImage(file=file_path) # 更新 Canvas 上的背景图片 canvas.itemconfig(background_image_id, image=current_background_photo) except Exception as e: messagebox.showerror("错误", f"显示背景图片时出错: {e}") root = tk.Tk() root.title("文件批量重命名工具") root.geometry("600x300") initial_background_path = "background.jpg" # 替换为你的背景图片文件名 if os.path.exists(initial_background_path): if convert_to_gif(initial_background_path, temp_gif_path): try: current_background_photo = tk.PhotoImage(file=temp_gif_path) except tk.TclError: messagebox.showerror("错误", "无法加载初始背景图片,请检查文件。") else: messagebox.showerror("错误", "未找到初始背景图片,请检查文件路径。") canvas = tk.Canvas(root, width=600, height=300) canvas.pack(fill=tk.BOTH, expand=True) if current_background_photo: background_image_id = canvas.create_image(0, 0, anchor=tk.NW, image=current_background_photo) else: background_image_id = None label_font = ("Arial", 12) entry_font = ("Arial", 10) button_font = ("Arial", 11) folder_label = tk.Label(root, text="文件夹路径:", font=label_font, bg="white", bd=0) folder_label_window = canvas.create_window(10, 10, anchor=tk.NW, window=folder_label) folder_entry = tk.Entry(root, width=50, font=entry_font) folder_entry.insert(0, "请选择文件夹路径") folder_entry_window = canvas.create_window(10, 40, anchor=tk.NW, window=folder_entry) select_folder_button = tk.Button(root, text="选择文件夹", font=button_font, command=select_folder) select_folder_button_window = canvas.create_window(470, 38, anchor=tk.NW, window=select_folder_button) prefix_label = tk.Label(root, text="重命名前缀:", font=label_font, bg="white", bd=0) prefix_label_window = canvas.create_window(10, 80, anchor=tk.NW, window=prefix_label) prefix_entry = tk.Entry(root, width=50, font=entry_font) prefix_entry.insert(0, "请输入重命名前缀") prefix_entry_window = canvas.create_window(10, 110, anchor=tk.NW, window=prefix_entry) start_button = tk.Button(root, text="开始重命名", font=button_font, command=start_renaming, bg="#4CAF50", fg="white") start_button_window = canvas.create_window(230, 180, anchor=tk.NW, window=start_button) settings_button = tk.Button(root, text="设置", font=button_font, command=change_background) settings_button_window = canvas.create_window(550, 10, anchor=tk.NW, window=settings_button) def on_closing(): if os.path.exists(temp_gif_path): os.remove(temp_gif_path) root.destroy() root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop()
-
2025-2-28 22:29:15@
一、作品名称:小鸟飞飞
二、作品创作者及使用的AI工具:kimi
三、作品主要功能:在游玩中还能学习数学知识
四、作品主要截图 (alt+PrtScreen键)
五、作品的代码:
import pygame import sys import random # 初始化pygame pygame.init() # 设置屏幕大小 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("小鸟飞飞 - 数学版") # 加载小鸟图片 bird_image = pygame.image.load("bird.jpg") bird_rect = bird_image.get_rect() bird_rect.center = (100, screen_height // 2) # 小鸟初始位置 # 设置颜色 background_color = (135, 206, 235) # 天空蓝 gravity = 0.5 # 重力加速度 bird_velocity = 0 # 小鸟的垂直速度 # 障碍物 obstacle_color = (0, 128, 0) # 绿色 obstacle_width = 50 obstacle_height = random.randint(50, 300) # 随机高度 obstacle_x = screen_width # 初始位置在屏幕右侧 obstacle_speed = 5 # 障碍物移动速度 obstacle_gap = 200 # 障碍物之间的空隙 # 数学问题相关 question_font = pygame.font.Font(None, 36) score = 0 # 玩家的初始分数 question = "" answer = 0 show_question = False waiting_for_answer = False # 是否等待玩家回答 answered = False # 是否已经回答过问题 user_input = "" # 用户输入的答案 # 生成随机数学问题 def generate_question(): num1 = random.randint(1, 10) num2 = random.randint(1, 10) operator = random.choice(["+", "-", "*", "/"]) if operator == "+": answer = num1 + num2 elif operator == "-": answer = num1 - num2 elif operator == "*": answer = num1 * num2 elif operator == "/": answer = num1 / num2 answer = round(answer, 2) # 保留两位小数 return f"{num1} {operator} {num2}", answer # 检测碰撞 def check_collision(): if (bird_rect.right > obstacle_x and bird_rect.left < obstacle_x + obstacle_width and (bird_rect.bottom > screen_height - obstacle_height or bird_rect.top < obstacle_gap)): return True return False # 游戏主循环 running = True while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: # 按空格键让小鸟向上飞 bird_velocity = -10 # 给小鸟一个向上的速度 if event.key == pygame.K_RETURN and waiting_for_answer and not answered: # 按回车键提交答案 try: user_answer = float(user_input) if abs(user_answer - answer) < 0.01: # 允许一定的误差 score += 10 # 回答正确,加分 print("回答正确!") waiting_for_answer = False answered = False # 重置回答状态 obstacle_x = screen_width # 重新生成障碍物 obstacle_height = random.randint(50, 300) else: print("回答错误!游戏结束!") running = False except ValueError: print("请输入有效的数字!") answered = True # 标记已经回答过问题 user_input = "" # 清空输入 if event.key == pygame.K_BACKSPACE and waiting_for_answer: user_input = user_input[:-1] # 删除最后一个字符 elif event.key != pygame.K_RETURN and waiting_for_answer: user_input += event.unicode # 添加字符到输入 # 更新小鸟的位置 bird_velocity += gravity bird_rect.y += bird_velocity # 防止小鸟飞出屏幕 if bird_rect.top <= 0: bird_rect.top = 0 bird_velocity = 0 elif bird_rect.bottom >= screen_height: bird_rect.bottom = screen_height bird_velocity = 0 # 更新障碍物位置 obstacle_x -= obstacle_speed if obstacle_x < -obstacle_width: obstacle_x = screen_width obstacle_height = random.randint(50, 300) # 检测碰撞 if check_collision() and not waiting_for_answer: print("碰到障碍物!请回答数学问题以继续游戏!") question, answer = generate_question() waiting_for_answer = True # 绘制背景和小鸟 screen.fill(background_color) screen.blit(bird_image, bird_rect) # 绘制障碍物 pygame.draw.rect(screen, obstacle_color, (obstacle_x, 0, obstacle_width, obstacle_gap)) pygame.draw.rect(screen, obstacle_color, (obstacle_x, screen_height - obstacle_height, obstacle_width, obstacle_height)) # 显示数学问题 if waiting_for_answer: question_text = question_font.render(question, True, (0, 0, 0)) screen.blit(question_text, (screen_width // 2 - 150, 50)) input_text = question_font.render(f"答案: {user_input}", True, (0, 0, 0)) screen.blit(input_text, (screen_width // 2 - 150, 100)) score_text = question_font.render(f"分数: {score}", True, (0, 0, 0)) screen.blit(score_text, (screen_width - 150, 50)) # 更新屏幕显示 pygame.display.flip() # 控制帧率 pygame.time.Clock().tick(30) # 退出pygame pygame.quit() sys.exit()
六、你对AI辅助代码编写的思考: 在使用AI的过程中,我深刻感受到它如同一位智慧的伙伴,为我的学习和生活带来了极大的便利。它不仅能快速解答我的问题,还能提供丰富的信息和多角度的思考方式,让我在知识的海洋中畅游。同时,我也意识到AI并非万能,它需要人类的引导和监督。在与AI的互动中,我学会了如何更高效地利用技术,也更加珍惜人类独有的创造力和情感智慧。这种人机协作的体验,让我对未来充满了期待,也让我明白,科技的发展离不开人类的智慧和责任。
- 1