基于WPF的八皇后简单应用程序

  写过不少次关于八皇后问题的代码了,不过都是基于标准的控制台层面上的输入输出。这次决定采用WPF来实现一个带有界面的八皇后的小程序

  

  在开始写代码之前,首先回顾一下八皇后问题:

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

    简单来说,八皇后问题就是一个递归回溯法的典型案例,相较于传统的穷举方法,采用递归回溯的方法可以大幅提高代码的执行效率,减少很多无效结果的判断。

    我们可以这样去简化思路:   

      1)从第一列开始,为皇后找到安全位置,然后跳到下一列

      2)如果在第n列出现死胡同,如果该列为第一列,棋局失败,否则后退到上一列,在进行回溯

      3)如果在第8列上找到了安全位置,则棋局成功。

  既然已经能完成算法的分析之后,完成简单的控制台版本的八皇后问题就会简单很多,这里就不详细讲解单纯的八皇后问题了,这个网上有很多的参考。我们这次的重点是放在了将一个控制台程序变成一个WPF应用程序。

  

  WPF应用程序的简单科普:

    WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

    简单来说,WPF就是原来WinForm的一个升级版本,可以更好的去实现桌面应用的界面效果的设计。(虽然这个程序基本上没有用到那么多的东西)

    开发WPF要用到的工具当然就是微软推出的Visual Studio这个强大的IDE了。由于是WPF程序,所有要求在创建项目的时候.NETFramwork的版本最低要求是3.0,本次采用的.NETFramwork4.0。

  

  开发WPF的基础过程:

    在创建完工程之后,我们在项目中会有一个叫做MainWindow.xaml的文件,这个就是我们程序的主题部分了。

    WPF的界面布局采用的是XAML语言的方式,如果有一定的H5的基础的掌握起来会很快

    整个程序的界面是包含在<Window></Window>标签内部的(相较于H5的<html></html>),在<Window>标签中,title属性就是我们程序的窗口显示的名称,Icon属性就是程序运行时的图标,width,height控制程序界面的大小。

    本次我使用的是<Grid></Grid>的标签来对棋盘那边进行的排版布局操作。可以类比于H5中的<table>标签。定义8行8列就要通过<Grid.ColumnDefinitions>,<Grid.RowDefinitions>这两个标签来创建(前者为列,后者为行)。需要多少列,多少行,就在这两个标签中对应添加<ColumnDefinition />或者<RowDefinition />就可以快速实现8*8棋盘的布局。

    那么想把某个部件放入里面的某一行某一列就只需要在部件的标签后面加入 Grid.Row,Grid.Column这两个属性,就可以精准控制位置啦!

    程序的执行还需要一个启动装置,这里我就用了一个按钮来作为程序启动。

    界面效果如下:

    附上界面的XAML代码:

 1 <Window x:Class="nQueen.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         Title="Queen" Height="700" Width="800" Icon="img/Queen.jpg" WindowStartupLocation="CenterScreen" UseLayoutRounding="True" ResizeMode="NoResize" xmlns:my="clr-namespace:nQueen">
 5
 6     <Grid Background="White" Name="GridMain" Width="560" Height="560" HorizontalAlignment="Left"  Margin="10 0 0 0">
 7         <Grid.ColumnDefinitions>
 8             <ColumnDefinition />
 9             <ColumnDefinition />
10             <ColumnDefinition />
11             <ColumnDefinition Width="70" />
12             <ColumnDefinition />
13             <ColumnDefinition />
14             <ColumnDefinition />
15             <ColumnDefinition />
16         </Grid.ColumnDefinitions>
17         <Grid.RowDefinitions>
18             <RowDefinition />
19             <RowDefinition />
20             <RowDefinition />
21             <RowDefinition />
22             <RowDefinition />
23             <RowDefinition />
24             <RowDefinition />
25             <RowDefinition />
26         </Grid.RowDefinitions>
27         <Border Background="{x:Null}" BorderBrush="Black" Grid.ColumnSpan="8" Grid.RowSpan="8" Width="560" Height="560" BorderThickness="4" Panel.ZIndex="1">
28
29         </Border>
30
31         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle1" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="0" Grid.Column="1" />
32         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle2" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="0" Grid.Column="3" />
33         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle3" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="1" Grid.Column="0"/>
34         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle4" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="1" Grid.Column="2" />
35         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle5" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="2" Grid.Column="1"/>
36         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle6" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="2" Grid.Column="3"/>
37         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle7" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="3" Grid.Column="0"/>
38         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle8" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="3" Grid.Column="2"/>
39         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle9" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="0" Grid.Column="5" />
40         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle10" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="0" Grid.Column="7" />
41         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle11" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="1" Grid.Column="4"/>
42         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle12" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="1" Grid.Column="6" />
43         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle13" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="2" Grid.Column="5"/>
44         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle14" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="2" Grid.Column="7"/>
45         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle15" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="3" Grid.Column="4"/>
46         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle16" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="3" Grid.Column="6"/>
47         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle17" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="4" Grid.Column="1" />
48         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle18" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="4" Grid.Column="3" />
49         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle19" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="4" Grid.Column="5"/>
50         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle20" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="4" Grid.Column="7" />
51         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle21" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="5" Grid.Column="0"/>
52         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle22" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="5" Grid.Column="2"/>
53         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle23" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="5" Grid.Column="4"/>
54         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle24" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="5" Grid.Column="6"/>
55         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle25" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="6" Grid.Column="1" />
56         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle26" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="6" Grid.Column="3" />
57         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle27" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="6" Grid.Column="5"/>
58         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle28" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF" Grid.Row="6" Grid.Column="7" />
59         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle29" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="7" Grid.Column="0"/>
60         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle30" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="7" Grid.Column="2"/>
61         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle31" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="7" Grid.Column="4"/>
62         <Rectangle Canvas.Left="0" Canvas.Top="0" Height="70" Name="rectangle32" Stroke="Black" Width="70" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FFB4AFAF"  Grid.Row="7" Grid.Column="6"/>
63         <Grid Height="42" HorizontalAlignment="Center" Margin="70,28,-225,0" Name="grid1" VerticalAlignment="Top" Width="225" Panel.ZIndex="0" Grid.Column="7" Grid.Row="4" >
64             <Button Content="开始求解" Height="30" HorizontalAlignment="Left" Name="startButton" VerticalAlignment="Top" Width="100" Panel.ZIndex="2" Foreground="Black" Margin="76,8,0,0" FontWeight="Normal" FontStretch="Normal" Click="startButton_Click">
65
66             </Button>
67         </Grid>
68
69     </Grid>
70
71 </Window>

    那么接下来就是完成通过按钮实现程序的启动和将结果展示出来了

    程序启动:

      我们只需要在按钮上面添加一个onClick的事件,然后在这个事件中放入原本在控制台版本的main方法的代码语句就ok了

    程序结果展示:

      我这里一方面用MessageBox.Show()方法弹框显示出每一步的结果,另一方面通过新建了一个皇后图片的XAML代码,将每个皇后的位置通过GridMain.Children.Remove()和GridMain.Children.Add()方法来添加和去除皇后。

    

  总结:这是第一次写WPF的应用程序,在编写的过程中参考了不少资料,不过网上对于WPF的资料并不是非常的丰富,遇上了很多的问题。本程序写的也不是非常的好,很多地方写的并不是非常的好。希望各位能给予指点或者帮助。

    提供一下代码吧(开发工具为vs2015)

    http://files.cnblogs.com/files/BoulderH/nQueen.7z

时间: 2024-08-25 17:53:07

基于WPF的八皇后简单应用程序的相关文章

基于C语言libvirt API简单小程序

libvirt API简单小程序 1.程序代码如下 #include<stdio.h> #include<libvirt/libvirt.h> int getDomainInfo(int id) { virConnectPtr conn = NULL; virDomainPtr dom = NULL; virDomainInfo info; conn = virConnectOpenReadOnly(NULL); if (conn == NULL) { fprintf(stderr

kb-01-a&lt;简单搜索--dfs八皇后问题变种&gt;

题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域,

八皇后和全排列

经典的递归程序设计中的2到题目 1.八皇后问题 国际象棋棋盘走法,用递归实现所有的可能性: 棋盘: (1).代码如下: #include<stdio.h> typedef unsigned char boolean; #define TRUE        1 #define FALSE        0 #define EIGHT    8 void showChess(int (*chess)[EIGHT]);  //显示棋盘 boolean isSafe(int (*chess)[EIG

Lua实现的八皇后问题

来自<Lua程序与设计>第二节- 八皇后问题 输出所有解的解法 书中提供的源代码,加注了自己的注释. N = 8 --[[ N为棋盘规模 a为一维数组,保存第i个皇后所在的列数 ]] -- 检查是否可以将第n个皇后放在第n行第c列(前n-1行的皇后已经放好) function isplaceok(a,n,c) -- 检查前n-1个皇后是否与(n,c)位置冲突 for i = 1, n - 1, 1 do if a[i] == c or -- 是否同一列 a[i] - i == c - n or

基于html5 localStorage , web SQL, websocket的简单聊天程序

new function() { var ws = null; var connected = false; var serverUrl; var connectionStatus; var sendMessage; var connectButton; var disconnectButton; var sendButton; var open = function() { var url = serverUrl.val(); ws = new WebSocket(url); ws.onope

VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然后进行转换. 概述 小程序主界面如下: 首先选择一个日期和类别,从命名上对待分析的Excel文件进行过滤.点击[浏览]选择待分析的Excel文件所在的目录, 程序中会获取所有子目录.然后点击[执行分析]就会按照左边CheckBox中的选择进行分析,分析结果显示在每一行中间.[修改配置]可以对分析规则

【基础算法】回溯法与八皇后问题

在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行.列和斜线的敌方棋子.比中国象棋里的车强几百倍,比她那没用的老公更是强的飞起(国王只能前后左右斜线走一格).上图右边高大的棋子即为皇后. 八皇后问题是这样一个问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?此问题在1848年由棋手马克斯·贝瑟尔提出,岂止是有年头,简直就是有年头,82年的拉菲分分钟被秒的渣都不剩. 八皇后问题是典型的回溯法解决的问题,我们以这个问题为例介绍回溯法. 所谓回溯法

基于TINY4412的Andorid开发-------简单的LED灯控制【转】

本文转载自:http://www.cnblogs.com/pengdonglin137/p/3857724.html 基于TINY4412的Andorid开发-------简单的LED灯控制 阅读目录(Content) 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源代码情景分析> <嵌入式Linux系统开发完全手册_基于4412_上册> 作者:彭东林 邮箱:[em

Python----递归------Eight Queens 八皇后问题

递归思想是算法编程中的重要思想. 作为初学者,对递归编程表示很蒙逼,每次遇到需要递归的问题,心里就有一万头草泥马飞过~~~~~~(此处略去一万头草泥马) 在B站看数据结构与算法的视频时,视频中给了两个非常典型的例子--<汉诺塔>和<八皇后问题>,就希望自己用Python实现一下这两个递归程序,其中汉诺塔问题比较简单,还是能够理解,这里就不讲了. <八皇后问题>:说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平.