寫過不少次關於八皇後問題的代碼了,不過都是基於標準的控制台層面上的輸入輸出。這次決定採用WPF來實現一個帶有界面的八皇後的小程式 在開始寫代碼之前,首先回顧一下八皇後問題: 八皇後問題,是一個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國 ...
寫過不少次關於八皇後問題的代碼了,不過都是基於標準的控制台層面上的輸入輸出。這次決定採用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>View Code
那麼接下來就是完成通過按鈕實現程式的啟動和將結果展示出來了
程式啟動:
我們只需要在按鈕上面添加一個onClick的事件,然後在這個事件中放入原本在控制台版本的main方法的代碼語句就ok了
程式結果展示:
我這裡一方面用MessageBox.Show()方法彈框顯示出每一步的結果,另一方面通過新建了一個皇後圖片的XAML代碼,將每個皇後的位置通過GridMain.Children.Remove()和GridMain.Children.Add()方法來添加和去除皇後。
總結:這是第一次寫WPF的應用程式,在編寫的過程中參考了不少資料,不過網上對於WPF的資料並不是非常的豐富,遇上了很多的問題。本程式寫的也不是非常的好,很多地方寫的並不是非常的好。希望各位能給予指點或者幫助。
提供一下代碼吧(開發工具為vs2015)
http://files.cnblogs.com/files/BoulderH/nQueen.7z