Thread SoDuKo: natürlich in Wx ! (21 answers)
Opened by lichtkind at 2006-10-16 00:45

lichtkind
 2006-10-16 12:09
#38898 #38898
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
genau deswegen hab ich das hier gepostet. hab die gui jetzt so weit das man rätseln kann nur der generator und checker, und solver fehlen und die kann ich ja jetzt hier rasukopieren. könnte also schnell fertig werden durch teamwork.

was halt auch nicht so einfach ist, ist sudokus zu generieren die tatsächlich lösbar sind. mein aktuelles heft enthält 20% unlösbare son kack. aber ich glaube es gibt eh bestimmte stufen der lösbarkeit wel ich bei manchen 3 stufen um ecke denke wie bei schach und ich nicht glaube das der 3 lines solver ähnliche denktiefe hinlegt aber erst mal überprüfen. danke soweit an poster ergebnis werde ich natürlich hier veröffentlichen bis jetzt hab ich:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
use strict;
use warnings;

package SuKoDo;
our $VERSION = 0.05;
our $NAME = "SoKuDo";

our $icon = 'wxwin.ico';
our $frame;
our %temp;

use Wx qw( wxTOP wxLEFT wxALIGN_CENTRE wxALIGN_CENTER_VERTICAL wxGROW
wxVERTICAL wxHORIZONTAL wxLI_VERTICAL wxLI_HORIZONTAL wxST_NO_AUTORESIZE
wxNO_FULL_REPAINT_ON_RESIZE wxSYSTEM_MENU wxCAPTION wxMINIMIZE_BOX wxCLOSE_BOX
wxBITMAP_TYPE_ICO );
use base qw(Wx::App);
use Wx::Event qw( EVT_MENU EVT_LEFT_DOWN EVT_RIGHT_DOWN );

sub OnInit {
$frame = Wx::Frame->new
( undef, -1, " $NAME ", [-1,-1],[-1,-1], wxNO_FULL_REPAINT_ON_RESIZE |
wxSYSTEM_MENU | wxCAPTION | wxMINIMIZE_BOX | wxCLOSE_BOX );
# set icon
Wx::InitAllImageHandlers();
$frame->SetIcon( Wx::Icon->new($icon, wxBITMAP_TYPE_ICO) ) if -e $icon;

# menubar
my $bar = Wx::MenuBar->new(1);
my $menu_game = Wx::Menu->new();
$menu_game->Append(1000,'New',' random new game');
$menu_game->Append(1001,'Open');
$menu_game->Append(1003,'Save');
$menu_game->Append(1004,'Exit');

my $menu_rules = Wx::Menu->new();
$menu_rules->AppendCheckItem(2000,'Hints allowed');

my $menu_help = Wx::Menu->new();
$menu_help->Append(3000,'Hint');
$menu_help->Append(3001,'How To ...');
$menu_help->Append(3002,'Info ...');

$bar->Append($menu_game, 'Game');
$bar->Append($menu_rules,'Rules');
$bar->Append($menu_help, 'Help');
$frame->SetMenuBar($bar);

# context menu
my $num_selector = Wx::Menu->new();
my $num_menu_id = 10000;
for (0..9){
$num_selector->Append($num_menu_id+$_,$_);
eval 'EVT_MENU($frame, '.($num_menu_id+$_).", sub{set_current_value($_)})";
}
$num_selector->Append(10010,'?');
EVT_MENU($frame, 10010, sub{ set_current_value('?') } );

# statusbar
my $sb = $frame->CreateStatusBar(1);
$sb->SetFieldsCount(1);
$sb->SetStatusWidths( -1 );
$frame->SetStatusBarPane(0);
#$sb->SetStatusText(' welcome',0);

my $panel = Wx::Panel->new( $frame, -1);
my (@cf, $cf, $sl, @h_sizer, $hs); #char field, current field
my $v_sizer = Wx::BoxSizer->new(wxVERTICAL);
$v_sizer->Add(Wx::StaticLine->new($panel, -1,[-1,-1], [-1,3]), 0, wxTOP|wxGROW, 0);
for my $y (1..9){
$hs = $h_sizer[$y] = Wx::BoxSizer->new(wxHORIZONTAL);
$hs->Add(Wx::StaticLine->new($panel, -1,[-1,-1], [3,-1]), 0, wxLEFT|wxGROW, 0);
for my $x (1..9){
$cf = $cf[$x][$y] = Wx::StaticText->new

($panel, -1, '?', [-1,-1], [16,16], wxALIGN_CENTRE|wxST_NO_AUTORESIZE);
EVT_LEFT_DOWN ( $cf[$x][$y], sub{

my ($widget, $event) = @_;

set_current_field($x, $y);

$widget->PopupMenu($num_selector, $event->GetX, $event->GetY);
} );
EVT_RIGHT_DOWN( $cf, sub { status_msg($x.$y) } );
$hs->Add($cf, 0, wxLEFT, 0);
if ($x % 3) {$sl = Wx::StaticLine->new($panel, -1,[-1,-1],[1,-1]) }
else {$sl = Wx::StaticLine->new($panel, -1,[-1,-1],[3,-1]) }
$hs->Add($sl, 0, wxLEFT|wxGROW, 0);
}
$v_sizer->Add($hs, 0, wxTOP, 0);

if ($y % 3) {$sl = Wx::StaticLine->new($panel, -1, [-1,-1], [-1,1]) }
else {$sl = Wx::StaticLine->new($panel, -1, [-1,-1], [-1,3]) }
$v_sizer->Add($sl, 0, wxTOP|wxGROW, 0);
}
$frame->{'num_field'} = \@cf;

$panel->SetSizer($v_sizer);
my $m_sizer = Wx::BoxSizer->new(wxHORIZONTAL);
$m_sizer->Add($panel, 0, wxTOP|wxGROW, 0);
$frame->SetSizer($m_sizer);
$frame->SetAutoLayout(1);
$frame->Fit();
status_msg('welcome to version '.$VERSION);
$frame->Show(1);
}

sub status_msg {
my $msg = shift;
$frame->SetStatusText( " $msg", 0);
}

sub set_current_field{
my $x = shift;
my $y = shift;
$temp{'current_field'}{'x'} = $x;
$temp{'current_field'}{'y'} = $y;
$temp{'current_field'}{'ref'} = $frame->{'num_field'}[$x][$y];
}

sub set_current_value{
my $new = shift;
my $c = $temp{'current_field'};
my $old = $c->{'ref'}->GetLabel;
$c->{'ref'}->SetLabel($new);
status_msg("field [$c->{y},$c->{x}] set from $old to $new");
}

package main;
SuKoDo->new->MainLoop;
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.

View full thread SoDuKo: natürlich in Wx !