標籤:sele item 部落格 uri return commit git lte 商業
本文告訴大家去做一個商業遊戲,遊戲很簡單,幾乎沒有什麼技術
遊戲的開始,需要添加架構庫,於是引用我自己寫的庫。
首先是建立一個啟動頁面,這個頁面是顯示啟動的。
在顯示啟動的時候,是需要載入遊戲需要使用的資源,如果覺得這時需要控制進度條,就需要使用注入的方法,給他知道現在的進度,不過我現在不去做這裡,於是就很簡單的代碼做出來啟動頁面。
現在的啟動頁還是空的,但是先不管他。
然後開始寫一個歡迎頁面,也就是開始遊戲、繼續、協助等的頁面,暫時先不做。
但是寫了這麼多,都不需要在 MainPage 寫一個代碼,現在就到了在 MainPage
開始寫代碼,這時的代碼就是添加一個 Frame 作為跳轉,和一個菜單。當然菜單現在還沒東西,只是需要添加到這裡。
看下,現在已經建立了兩個頁面。一個是啟動頁,一個是歡迎頁面。
接著開始做遊戲的首頁面,請注意,在寫的時候,一個頁面都是對應一個視圖。可以看到在寫的時候,不需要去管兩個頁面之間的邏輯。當然現在也無法管。
可以知道遊戲的首頁面需要有倉庫、買東西的店鋪、買東西的地方和工廠。
那麼需要想遊戲是如何玩的。
因為這個遊戲是我昨天看到買菜的人說的,我就想去做一個。
首先物品有很多,而且可以通過工廠把低級的物品轉為進階的物品。
物品包括
種子小米麥面麵包番薯礦石鐵銅木頭石礦碳煤鋤頭椅子桌子雕刻刀大刀弓箭
如果還有想到其他的物品,歡迎告訴我。不過在看完之前,請不要很快的告訴我,你希望添加那些物品,請在知道遊戲如何玩之後在告訴我,你喜歡的物品。
物品是包括當前價格和市場價格,其中當前價格是不變的,而市場價格是會在 80%-120% 之間波動。
開始說遊戲的商店是如何賣東西的,遊戲使用的商店是可以通過市場買東西,然後把東西買個買東西的人。商店可以有很多個,當然,現在做的只有一個。商店存在信譽,商店來的客人數是不固定,和商店所在地方和商店信譽有關。如果一個地方人很多那麼來商店的人會很多。如果商店信譽很好,來商店的人很多。
一個買東西的人,會告訴商店他買的是有哪些,數量,希望買的價格。買的價格就是市場價格,市場價格總是變化,需要在每個時間決定是否買入。
所以商店的輸入按鈕現在就有了一個,下一時間,也就是在這個時間是否有買東西的人過來,是否決定要從市場買東西。
所以點擊一下按鈕,就可以獲得當前有多少個買東西的過來,處理完之後在去市場買東西。
買東西的人過來,就會說他現在需要買什麼,當然遊戲一開始不會立刻就出現進階的人來買比較大的東西。來買東西的人是有分等級的,也就是他有多少錢,於是按照錢判斷他現在可以買多少東西。
如果商店存在他可以買的東西,如商店現在有東西
種子 2小米 10麥 10面 2
他想買東西是
種子 1小米 2麥 3
於是剛好都可以買入,於是顧客就會給滿分,因為他想要的商店可以買到所有他想要的東西。於是商店加信譽1。
一個人總的帶來信譽 是這樣計算,他想要的商品價格可以獲得數
var s = 買東西人買東西加起來的所有價值 var a = 商店供應商品總價格 帶來信譽 = 2 * a / s - 1
如果只能滿足買東西人一半的需要,那麼不會帶來任何的信譽提升。
於是在點擊下一時間,就開始計算有多少買東西的人,他們有多少錢,所以需要物品這個類給出他可以被改變的機率,通過他的錢就可以算出。於是物品需要的屬性就可以得到,物品名、物品需要多少錢,物品總量。現在物品的總量可以不計算。
來買東西的人有這些屬性,所有的錢,層級。買的東西。層級就是商店有多少信譽在可以吸引這個買東西的人,這裡寫為一個列表
但是開始先做一個簡單的程式,之後在添加比較多功能。
介面
遊戲的介面很重要,但是我就寫一個簡單的介面。我先給介面的,可以看到這個介面很簡單,就是一個列表和一些按鈕
列表有個問題,如何做表頭,實際我也沒辦法,於是用了下面的代碼
<ListView Grid.Row="1" ItemsSource="{x:Bind View.PropertyStorage}" SelectedItem="{Binding CarloPiperIsaacProperty,Mode=TwoWay}"> <FrameworkElement.Resources> <Style TargetType="TextBlock"> <Setter Property="HorizontalAlignment" Value="Center"></Setter> </Style> </FrameworkElement.Resources> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> </Style> </ListView.ItemContainerStyle> <ListView.Header> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="30*"></ColumnDefinition> <ColumnDefinition Width="15*"></ColumnDefinition> <ColumnDefinition Width="15*"></ColumnDefinition> <ColumnDefinition Width="15*"></ColumnDefinition> </Grid.ColumnDefinitions> <TextBlock Text="名稱"></TextBlock> <TextBlock Grid.Column="1" Text="價格"></TextBlock> <TextBlock Grid.Column="2" Text="倉庫擁有"></TextBlock> <TextBlock Grid.Column="3" Text="買入價錢"></TextBlock> </Grid> </ListView.Header> <ListView.ItemTemplate> <DataTemplate x:DataType="view:Property"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="30*"></ColumnDefinition> <ColumnDefinition Width="15*"></ColumnDefinition> <ColumnDefinition Width="15*"></ColumnDefinition> <ColumnDefinition Width="15*"></ColumnDefinition> </Grid.ColumnDefinitions> <FrameworkElement.Resources> <Style TargetType="TextBlock"> <Setter Property="HorizontalAlignment" Value="Center"></Setter> </Style> </FrameworkElement.Resources> <TextBlock Text="{x:Bind Name}"></TextBlock> <TextBlock Grid.Column="1" Text="{x:Bind Price,Mode=OneWay}"></TextBlock> <TextBlock Grid.Column="2" Text="{x:Bind Num,Mode=OneWay}"></TextBlock> <TextBlock Grid.Column="3" Text="{x:Bind AshliLyverGeraldo,Mode=OneWay}"></TextBlock> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView>
上面代碼為了讓列表不壓縮寬,於是就需要使用 ItemContainerStyle ,請看代碼
<ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> </Style> </ListView.ItemContainerStyle>
為了讓列表所有文字都置中,不想寫給每個文字,但是列表之外的文字就不置中,於是修改列表內文字的置中就可以使用下面代碼
<FrameworkElement.Resources> <Style TargetType="TextBlock"> <Setter Property="HorizontalAlignment" Value="Center"></Setter> </Style> </FrameworkElement.Resources>
這樣在列表內的文字就會置中,而列表外的文字就不會置中。
如果在列表使用 x:bind 那麼需要使用 DataType 來告訴綁定的類型,所以需要資料的類型是什麼,不然就無法通過。所以在寫列表之前還需要定義好資料,於是讓我來告訴大家這個遊戲需要的資料。
然後就需要開始綁定進去了,不過這時發現遊戲需要的資料很簡單,暫時我就不繼續寫代碼,如果需要代碼,請看 VarietyHiggstGushed
添加表徵圖
可以看到,上面的介面沒有表徵圖,看起來不好看,所以需要給他添加一些表徵圖。表徵圖可以到 http://www.iconfont.cn/ 下載,在這裡下載需要注意著作權問題,不過我的這個在下載的時候就有看了,好像是不需要給錢。
首先把圖片放在 Assest 檔案夾,然後就可以設定出來了。
<Grid> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> <FrameworkElement.Resources> <Style TargetType="StackPanel"> <Setter Property="Margin" Value="10,10,10,10"></Setter> </Style> </FrameworkElement.Resources> <StackPanel Orientation="Horizontal"> <Image Source="ms-appx:///Assets/天.png" Height="20" Width="20"></Image> <TextBlock Text="天數"></TextBlock> <TextBlock Text="{x:Bind View.PinkieDuchesneGeraldo,Mode=OneWay}"></TextBlock> </StackPanel> <StackPanel Orientation="Horizontal"> <Image Source="ms-appx:///Assets/倉庫.png" Height="20" Width="20"></Image> <TextBlock Text="倉庫容量"></TextBlock> <TextBlock Text="{x:Bind View.JwStorage.Transit,Mode=OneWay}"/> <TextBlock Text="/"></TextBlock> <TextBlock Text="{x:Bind View.JwStorage.TransitStorage,Mode=OneWay}"></TextBlock> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="金錢"></TextBlock> <TextBlock Text="{x:Bind View.JwStorage.TranStoragePrice,Mode=OneWay}"></TextBlock> </StackPanel> </StackPanel> </Grid>
可以看到圖片的寫法 Source 的值是使用ms-appx
,這裡就是從資源獲得,如果希望知道這個代碼是如何寫,我有部落格win10 uwp 訪問解決方案檔案 裡面就告訴大家如何寫。
注意需要設定圖片的大小,可以運行程式,然後開始設定,這樣介面就可以看到修改,但是需要儲存才可以看到。
可以看到原來的代碼是 VarietyHiggstGushed 買東西的介面看起來不好
下面就需要修改這個,修改為一個好看的
可以使用 ContentDialog 彈出一個好看的介面
那麼如何做這個介面,簡單的方法是做一個使用者控制項,這個控制項的介面很簡單,但是後台需要寫一些屬性,這個屬性就是買入的當前,買入最大值,對應還有賣出的。
於是這個介面的後台代碼就是幾個屬性,還有在設定 ViewModel 時更新屬性
public sealed partial class JediahPage : UserControl { public JediahPage() { this.InitializeComponent(); } public StorageModel ViewModel { get { return _viewModel; } set { _viewModel = value; //最大可以買 NewLansheehyBrunaSharon = (int) Math.Floor(_viewModel.JwStorage.TranStoragePrice / _viewModel.CarloPiperIsaacProperty.Price); var sresidue = _viewModel.JwStorage.TransitStorage - _viewModel.JwStorage.Transit; NewLansheehyBrunaSharon = NewLansheehyBrunaSharon > sresidue ? sresidue : NewLansheehyBrunaSharon; AimeeLansheehyBrunaSharon = _viewModel.CarloPiperIsaacProperty.Num; } } public static readonly DependencyProperty NewLansheehyBrunaSharonNumProperty = DependencyProperty.Register( "NewLansheehyBrunaSharonNum", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int))); public int NewLansheehyBrunaSharonNum { get { return (int) GetValue(NewLansheehyBrunaSharonNumProperty); } set { SetValue(NewLansheehyBrunaSharonNumProperty, value); } } public static readonly DependencyProperty NewLansheehyBrunaSharonProperty = DependencyProperty.Register( "NewLansheehyBrunaSharon", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int))); public int NewLansheehyBrunaSharon { get { return (int) GetValue(NewLansheehyBrunaSharonProperty); } set { SetValue(NewLansheehyBrunaSharonProperty, value); } } public static readonly DependencyProperty AimeeLansheehyBrunaSharonNumProperty = DependencyProperty.Register( "AimeeLansheehyBrunaSharonNum", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int))); public int AimeeLansheehyBrunaSharonNum { get { return (int) GetValue(AimeeLansheehyBrunaSharonNumProperty); } set { SetValue(AimeeLansheehyBrunaSharonNumProperty, value); } } public static readonly DependencyProperty AimeeLansheehyBrunaSharonProperty = DependencyProperty.Register( "AimeeLansheehyBrunaSharon", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int))); private StorageModel _viewModel; public int AimeeLansheehyBrunaSharon { get { return (int) GetValue(AimeeLansheehyBrunaSharonProperty); } set { SetValue(AimeeLansheehyBrunaSharonProperty, value); } } public event EventHandler Close; private void NewLansheehy(object sender, RoutedEventArgs e) { ViewModel.LansheehyBrunaSharon = NewLansheehyBrunaSharonNum; ViewModel.NewLansheehyBrunaSharon(); Close?.Invoke(this, null); } private void AimeeLansheehy(object sender, RoutedEventArgs e) { ViewModel.LansheehyBrunaSharon = AimeeLansheehyBrunaSharonNum; ViewModel.AimeeLansheehyBrunaSharon(); Close?.Invoke(this, null); } private void MnewBruna(object sender, RoutedEventArgs e) { NewLansheehyBrunaSharonNum = NewLansheehyBrunaSharon; } private void MaimeeBruna(object sender, RoutedEventArgs e) { AimeeLansheehyBrunaSharonNum = AimeeLansheehyBrunaSharon; } private void CloseButton_OnClick(object sender, RoutedEventArgs e) { Close?.Invoke(this, null); } }
介面代碼很簡單
<Grid > <Grid Margin="10,10,10,10"> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="64*" /> </Grid.RowDefinitions> <Grid> <Button FontFamily="Segoe MDL2 Assets" Content="" HorizontalAlignment="Right" Click="CloseButton_OnClick"> </Button> </Grid> <Grid Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="64*" /> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> <RowDefinition Height="100*" /> </Grid.RowDefinitions> <Grid> <TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.Name}"></TextBlock> </Grid> <Grid Grid.Row="1"> <StackPanel Orientation="Horizontal"> <Image Source="ms-appx:///Assets/倉庫.png" Height="20" Width="20"></Image> <TextBlock Text="倉庫擁有:"></TextBlock> <TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.Num}"></TextBlock> </StackPanel> </Grid> <Grid Width="300" Grid.Row="2"> <StackPanel Orientation="Horizontal"> <TextBlock Text="$"></TextBlock> <TextBlock Text="買入價格"></TextBlock> <TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.AshliLyverGeraldo,Converter={StaticResource ConverDoubleStr}}"></TextBlock> </StackPanel> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> <TextBlock Text="$"></TextBlock> <TextBlock Text="市場價格"></TextBlock> <TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.Price}"></TextBlock> </StackPanel> </Grid> <Grid Grid.Row="3"> <Grid.RowDefinitions> <RowDefinition Height="74*" /> <RowDefinition Height="85*" /> </Grid.RowDefinitions> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="307*" /> <ColumnDefinition Width="auto" /> </Grid.ColumnDefinitions> <Slider Margin="10,10,10,10" Value="{x:Bind NewLansheehyBrunaSharonNum,Mode=TwoWay,Converter={StaticResource ResourceKey=Convert}}" Maximum="{x:Bind NewLansheehyBrunaSharon}"> </Slider> <StackPanel Grid.Column="1" Orientation="Horizontal"> <Button Content="max" Click="MnewBruna"></Button> <Button Content="買入" Click="NewLansheehy"></Button> </StackPanel> </Grid> <Grid Grid.Row="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="59*" /> <ColumnDefinition Width="auto" /> </Grid.ColumnDefinitions> <Slider Margin="10,10,10,10" Value="{x:Bind AimeeLansheehyBrunaSharonNum,Mode=TwoWay,Converter={StaticResource Convert}}" Maximum="{x:Bind AimeeLansheehyBrunaSharon}"> </Slider> <StackPanel Grid.Column="1" Orientation="Horizontal"> <Button Content="max" Click="MaimeeBruna"></Button> <Button Content="賣出" Click="AimeeLansheehy"></Button> </StackPanel> </Grid> </Grid> </Grid> </Grid> </Grid> </Grid>
可以看到需要兩個轉換器,一個是把字串轉 double 一個是顯示 double 保留小數後兩位,這個實現很簡單,我就不說了。那麼接下來就是使用這個介面,使用方法請看下面。
var temp = new JediahPage() { ViewModel = View, }; ContentDialog contentDialog = new ContentDialog() { Content = temp, IsPrimaryButtonEnabled = false, IsSecondaryButtonEnabled = false, }; temp.Close += (s, args) => contentDialog.Hide(); await contentDialog.ShowAsync();
主要注意把 close 事件寫在顯示前,然後去掉預設的按鈕。
大概這樣就可以運行了,其他的代碼不是重要的,所以就不說啦。現在我把遊戲發在微軟商店,點擊下載。
這就是商業遊戲 1.0.75 ,在這個版本發布之後,還會繼續開發,但是就不在這篇文章更新了。
下面是相關文章
win10 uwp 商業遊戲
win10 uwp 商業遊戲 1.1.5
win10 uwp 商業遊戲 1.2.1
感謝
walterlv
JAKE
落書き https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64830430
歡迎大家來我的部落格,現在csdn的部落格文章發布了就不再編輯,如果希望看最新的文章,請到我的部落格。本文也發在部落格園備份,如果大家有什麼建議,請在部落格下面評論。
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請與我聯絡。
win10 uwp 商業遊戲