|
|
楼主 |
发表于 2026-8-4 20:29:21
|
显示全部楼层
AI自动信息的两个大地图程序
本帖最后由 zzz19760225 于 2026-8-16 09:25 编辑
- #!/usr/bin/perl
- use strict;
- use warnings;
- use utf8;
- use Tk;
- # 创建主窗口
- my $mw = MainWindow->new;
- $mw->title("双地图圆形移动控制");
- $mw->geometry("700x600");
- # 创建主框架
- my $main_frame = $mw->Frame->pack(-expand => 1, -fill => 'both');
- # 创建画布(地图显示区域)
- my $canvas = $main_frame->Canvas(
- -width => 500,
- -height => 450,
- -bg => 'lightblue'
- )->pack(-expand => 1, -fill => 'both', -side => 'left');
- # 创建右侧控制面板
- my $control_frame = $main_frame->Frame(
- -width => 150,
- -bg => 'lightgray'
- )->pack(-side => 'right', -fill => 'y', -padx => 10, -pady => 10);
- # 地图数据
- my %maps = (
- 'map1' => {
- name => '城市地图',
- bg_color => 'lightblue',
- elements => [
- { type => 'rect', x1 => 50, y1 => 50, x2 => 150, y2 => 100, fill => 'brown', text => '建筑1' },
- { type => 'rect', x1 => 300, y1 => 80, x2 => 420, y2 => 150, fill => 'brown', text => '建筑2' },
- { type => 'oval', x1 => 200, y1 => 200, x2 => 250, y2 => 250, fill => 'green', text => '公园' },
- { type => 'line', x1 => 0, y1 => 300, x2 => 500, y2 => 300, fill => 'gray', width => 3, text => '道路' },
- { type => 'rect', x1 => 380, y1 => 350, x2 => 480, y2 => 420, fill => 'red', text => '商店' },
- ]
- },
- 'map2' => {
- name => '自然地图',
- bg_color => 'lightgreen',
- elements => [
- { type => 'oval', x1 => 30, y1 => 30, x2 => 100, y2 => 100, fill => 'darkgreen', text => '树林' },
- { type => 'oval', x1 => 350, y1 => 40, x2 => 450, y2 => 120, fill => 'darkgreen', text => '树林' },
- { type => 'oval', x1 => 180, y1 => 180, x2 => 320, y2 => 280, fill => 'blue', text => '湖泊' },
- { type => 'line', x1 => 0, y1 => 350, x2 => 250, y2 => 350, fill => 'brown', width => 5, text => '小路' },
- { type => 'line', x1 => 250, y1 => 350, x2 => 500, y2 => 400, fill => 'brown', width => 5, text => '小路' },
- { type => 'oval', x1 => 420, y1 => 370, x2 => 480, y2 => 430, fill => 'orange', text => '小屋' },
- ]
- }
- );
- # 当前地图
- my $current_map = 'map1';
- my $map_items = []; # 存储地图元素的ID
- # 圆形参数
- my $x = 250;
- my $y = 225;
- my $radius = 20;
- my $step = 10;
- # 创建圆形
- my $circle = $canvas->createOval(
- $x - $radius, $y - $radius,
- $x + $radius, $y + $radius,
- -fill => 'red',
- -outline => 'darkred',
- -width => 3,
- -tags => 'circle'
- );
- # 创建位置标签
- my $pos_label = $control_frame->Label(
- -text => "位置: ($x, $y)",
- -font => ['Arial', 11],
- -bg => 'lightgray'
- )->pack(-pady => 10, -fill => 'x');
- # 创建地图切换按钮
- $control_frame->Label(
- -text => "地图切换",
- -font => ['Arial', 12, 'bold'],
- -bg => 'lightgray'
- )->pack(-pady => 10);
- my $map1_button = $control_frame->Button(
- -text => "城市地图",
- -width => 12,
- -command => sub { switch_map('map1') }
- )->pack(-pady => 5);
- my $map2_button = $control_frame->Button(
- -text => "自然地图",
- -width => 12,
- -command => sub { switch_map('map2') }
- )->pack(-pady => 5);
- # 当前地图显示
- my $current_map_label = $control_frame->Label(
- -text => "当前: 城市地图",
- -font => ['Arial', 10],
- -bg => 'lightgray',
- -fg => 'blue'
- )->pack(-pady => 10, -fill => 'x');
- # 控制说明
- $control_frame->Label(
- -text => "控制键:",
- -font => ['Arial', 11, 'bold'],
- -bg => 'lightgray'
- )->pack(-pady => 10);
- $control_frame->Label(
- -text => "E: 前进 (↑)",
- -font => ['Arial', 10],
- -bg => 'lightgray'
- )->pack(-anchor => 'w');
- $control_frame->Label(
- -text => "D: 后退 (↓)",
- -font => ['Arial', 10],
- -bg => 'lightgray'
- )->pack(-anchor => 'w');
- $control_frame->Label(
- -text => "S: 左移 (←)",
- -font => ['Arial', 10],
- -bg => 'lightgray'
- )->pack(-anchor => 'w');
- $control_frame->Label(
- -text => "F: 右移 (→)",
- -font => ['Arial', 10],
- -bg => 'lightgray'
- )->pack(-anchor => 'w');
- # 重置按钮
- $control_frame->Button(
- -text => "重置位置",
- -width => 12,
- -command => sub { reset_position() }
- )->pack(-pady => 10);
- # 退出按钮
- $control_frame->Button(
- -text => "退出",
- -width => 12,
- -command => sub { exit }
- )->pack(-pady => 5);
- # 绘制地图函数
- sub draw_map {
- my ($map_id) = @_;
- my $map = $maps{$map_id};
-
- # 清除旧地图元素
- foreach my $item (@$map_items) {
- $canvas->delete($item);
- }
- $map_items = [];
-
- # 设置背景色
- $canvas->configure(-bg => $map->{bg_color});
-
- # 绘制地图元素
- foreach my $elem (@{$map->{elements}}) {
- my $id;
- if ($elem->{type} eq 'rect') {
- $id = $canvas->createRectangle(
- $elem->{x1}, $elem->{y1},
- $elem->{x2}, $elem->{y2},
- -fill => $elem->{fill},
- -outline => 'black',
- -width => 1
- );
- } elsif ($elem->{type} eq 'oval') {
- $id = $canvas->createOval(
- $elem->{x1}, $elem->{y1},
- $elem->{x2}, $elem->{y2},
- -fill => $elem->{fill},
- -outline => 'black',
- -width => 1
- );
- } elsif ($elem->{type} eq 'line') {
- $id = $canvas->createLine(
- $elem->{x1}, $elem->{y1},
- $elem->{x2}, $elem->{y2},
- -fill => $elem->{fill},
- -width => $elem->{width}
- );
- }
-
- # 添加文字标签
- if ($elem->{text}) {
- my $text_x = ($elem->{x1} + $elem->{x2}) / 2;
- my $text_y = ($elem->{y1} + $elem->{y2}) / 2;
- $canvas->createText(
- $text_x, $text_y,
- -text => $elem->{text},
- -fill => 'white',
- -font => ['Arial', 10, 'bold']
- );
- }
-
- push @$map_items, $id if $id;
- }
-
- # 将圆形提升到最上层
- $canvas->raise($circle);
-
- # 更新地图名称显示
- $current_map_label->configure(-text => "当前: $map->{name}");
- }
- # 切换地图
- sub switch_map {
- my ($map_id) = @_;
- $current_map = $map_id;
- draw_map($map_id);
-
- # 重置圆形到新地图的中心
- reset_position();
- }
- # 重置位置
- sub reset_position {
- my $canvas_width = $canvas->width;
- my $canvas_height = $canvas->height;
-
- $x = $canvas_width / 2;
- $y = $canvas_height / 2;
-
- $canvas->coords(
- $circle,
- $x - $radius, $y - $radius,
- $x + $radius, $y + $radius
- );
-
- update_position_label();
- }
- # 更新位置标签
- sub update_position_label {
- $pos_label->configure(-text => "位置: ($x, $y)");
- }
- # 移动圆形
- sub move_circle {
- my ($dx, $dy) = @_;
-
- my $new_x = $x + $dx;
- my $new_y = $y + $dy;
-
- my $canvas_width = $canvas->width;
- my $canvas_height = $canvas->height;
-
- # 边界检查
- if ($new_x - $radius < 0 || $new_x + $radius > $canvas_width ||
- $new_y - $radius < 0 || $new_y + $radius > $canvas_height) {
- return;
- }
-
- $x = $new_x;
- $y = $new_y;
-
- $canvas->coords(
- $circle,
- $x - $radius, $y - $radius,
- $x + $radius, $y + $radius
- );
-
- update_position_label();
- }
- # 键盘绑定
- $mw->bind('<Key-e>' => sub { move_circle(0, -$step) });
- $mw->bind('<Key-d>' => sub { move_circle(0, $step) });
- $mw->bind('<Key-s>' => sub { move_circle(-$step, 0) });
- $mw->bind('<Key-f>' => sub { move_circle($step, 0) });
- # 支持大写
- $mw->bind('<Key-E>' => sub { move_circle(0, -$step) });
- $mw->bind('<Key-D>' => sub { move_circle(0, $step) });
- $mw->bind('<Key-S>' => sub { move_circle(-$step, 0) });
- $mw->bind('<Key-F>' => sub { move_circle($step, 0) });
- # 方向键支持(可选)
- $mw->bind('<Up>' => sub { move_circle(0, -$step) });
- $mw->bind('<Down>' => sub { move_circle(0, $step) });
- $mw->bind('<Left>' => sub { move_circle(-$step, 0) });
- $mw->bind('<Right>' => sub { move_circle($step, 0) });
- # 初始化:绘制第一个地图
- draw_map('map1');
- # 让画布获取焦点
- $canvas->focus;
- # 进入主循环
- MainLoop;
复制代码 AI自动信息的模块单元认识理解不到,代码就吃不透。 |
|