本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术

游戏的开始,需要添加框架库,于是引用我自己写的库。

首先是创建一个启动页面,这个页面是显示启动的。

在显示启动的时候,是需要加载游戏需要使用的资源,如果觉得这时需要控制进度条,就需要使用注入的方法,给他知道现在的进度,不过我现在不去做这里,于是就很简单的代码做出来启动页面。

现在的启动页还是空的,但是先不管他。

然后开始写一个欢迎页面,也就是开始游戏、继续、帮助等的页面,暂时先不做。

但是写了这么多,都不需要在 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 ,在这个版本发布之后,还会继续开发,但是就不在这篇文章更新了。

下面是相关文章

感谢

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 商业游戏的更多相关文章

  1. win10 uwp 商业游戏 1.2.1

    上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...

  2. win10 uwp 商业游戏 1.1.5

    本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...

  3. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

  4. win10 uwp 萤火虫效果

    原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...

  5. win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl

    本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件. 在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl,实际上 ...

  6. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  7. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  8. win10 uwp 列表模板选择器

    本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...

  9. win10 uwp 获得元素绝对坐标

    有时候需要获得一个元素,相对窗口的坐标,在修改他的位置可以使用. 那么 UWP 如何获得元素坐标? 我提供了一个方法,可以获得元素的坐标. 首先需要获得元素,如果没有获得元素,那么如何得到他的坐标? ...

随机推荐

  1. .net core signalR 忽略https 证书

    var connection = new HubConnectionBuilder().WithUrl(serverUrl, option => { option.HttpMessageHand ...

  2. .net core An assembly specified in the application dependencied mainfest<****.json>was not found解决办法

    最近在开发项目中,遇到了一个问题.在本机开发中部署到本机iis上或者本机控制台都没有问题,运行正常.当发布部署到服务器(windowsServer)中的时候一直运行不起来,用控制台也运行不起来,直接报 ...

  3. 博客迁址 xpeng.scorpionstudio.com

    这里不再更新!现在博客的正式地址是: http://xpeng.scorpionstudio.com

  4. 程序媛计划——mysql修改表结构

    #查看表的结构 mysql> desc score; +------------+--------------+------+-----+---------+----------------+ ...

  5. Python web后端接收到的json数据有前端格式的布尔值 true false

    最近在后端处理前端传过来的json数据,发现,因为数据是各种数据格式的嵌套,使用json.loads(),无法将内层的数据转换为原来格式的数据,所以需要使用eval( )函数进行转换,但是如果数据含有 ...

  6. POJ 1577Falling Leaves(二叉树的建立)

    题目链接:http://poj.org/problem?id=1577 解题思路:题目是中文就不翻译了,网上都说这题很水,但本蒟蒻虽然知道是倒过来建立二叉搜索树,可是实现不了,得到小伙伴的关键递归思想 ...

  7. Android逆向-Android基础逆向(5)

    本文作者:i春秋作家——HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)Android逆向-Android基 ...

  8. php 删除二维数组中某个key值

    /** * 根据key删除数组中指定元素 * @param array $arr 数组 * @param string/int $key 键(key) * @return array */ priva ...

  9. 关于MySQL连接抛出Authentication Failed错误分析

    [问题描述] 在应用端,偶尔看到有如下报错: Authentication to host 'xxxx' for user 'yyyy' using method 'mysql_native_pass ...

  10. D04——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D04         20180810内容纲要: 1 内置函数 2 装饰器 3 生成器 4 迭代器 5 软件目录结构规范 6 小结 1 内置函数 内置函数方法详 ...