项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu 。代码随项目进度更新。

保存进度是移动应用的基本功能,在应用的使用过程中会有各种各样的可能导致使用中断,再次回到应用时,应该恢复到中断前的状态。前面我们已经初步完成了数独游戏,但还不具备状态保存的功能,现在我们增加这个功能,将游戏进度保存到本地文件中。

首先确定在什么地方保存和恢复状态。在Xamarin的View退出时会触发OnDisappearing事件,在这个事件中可以保存游戏的进度。在View再次显示时,首先判断是否存在以保存的进度,如果存在,就恢复状态,否则创建新的游戏。

然后确定需要保存的内容,需要保存当前已经输入的数字和位置,还需要保存输入的过程以及花费的时间。

还有就是保存的位置,Xamarin提供了每个应用保存数据的抽象位置,我们可以使用Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)来获取路径而不需要考虑设备类型。

所有这些确定好之后,就可以编写相应的逻辑了。

首先是保存状态的方法:

      private void Save(string filename)
{
try
{
var strchess = "";
for (var i = 0; i < 9; i++)
{
for (var j = 0; j < 9; j++)
{
strchess += chess[i, j].ToString();
}
}
strchess += " ";
for (var i = 0; i < 9; i++)
{
for (var j = 0; j < 9; j++)
{
strchess += string.IsNullOrEmpty(buttons[i, j].Text) ? "0" : buttons[i, j].Text;
}
}
strchess += " ";
foreach (var str in steps)
{
strchess += str + ";";
}
strchess += " ";
strchess += (DateTime.Now - dtBegin).Ticks.ToString();
string _fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), filename);
File.WriteAllText(_fileName, strchess);
}
catch (Exception ex)
{ lbMessage.Text = ex.Message;
}
}

在OnDisappearing事件响应中调用这个方法:

        protected override void OnDisappearing()
{
Save("shudu_current.txt");
}

恢复状态的函数如下:

     private bool OpenCurrent()
{
try
{
string _fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "shudu_current.txt");
if (File.Exists(_fileName))
{
var strchess = File.ReadAllText(_fileName);
int[,] fchess = new int[9, 9];
var arr = strchess.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
for (var i = 0; i < 9; i++)
{
for (var j = 0; j < 9; j++)
{
chess[i, j] = int.Parse(arr[0].Substring(i * 9 + j, 1));
fchess[i, j] = int.Parse(arr[1].Substring(i * 9 + j, 1));
}
}
for (var i = 0; i < 9; i++)
{
for (var j = 0; j < 9; j++)
{
var btn = buttons[i, j];
if (chess[i, j] > 0)
{
btn.Text = chess[i, j].ToString();
}
else
{
btn.Text = fchess[i, j] > 0 ? fchess[i, j].ToString() : "";
}
btn.IsEnabled = chess[i, j] == 0;
int m = i / 3;
int n = j / 3; var c = new Color(0.9, 0.9, 0.9);
if ((m + n) % 2 == 0)
{
c = new Color(0.7, 0.7, 0.7);
}
btn.BackgroundColor = c;
}
}
if (arr.Length > 2)
{
var steparr = arr[2].Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
steps.Clear();
foreach(var step in steparr) steps.Push(step);
}
if (arr.Length > 3)
{
currentDiffer = long.Parse(arr[3]);
}
dtBegin = DateTime.Now;
return true;
}
}
catch (Exception ex)
{ lbMessage.Text = ex.Message;
}
return false;
}

在初始化时调用这个函数:

        public Game()
{
try
{
InitializeComponent(); SetNumButtons();
SetLayout();
if (!OpenCurrent()) SetNewGame(); }
catch (Exception ex)
{
lbMessage.IsVisible = true;
rowResult.Height = 40;
lbMessage.Text = ex.Message;
//throw;
}
}

最后,在游戏完成时删除状态文件:

            if (IsFinish())
{
lbFinish.IsVisible = true;
lbTime.IsVisible = true;
rowResult.Height = 40;
var diff = (DateTime.Now.Ticks - dtBegin.Ticks + currentDiffer) / 10000 / 1000 / 60;
lbTime.Text = diff + "分钟";
string _fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "shudu_current.txt");
File.Delete(_fileName);
}

状态保存完成了。下一步,我们引入数据库,保存游戏结果,并增加新游戏的录入功能。

使用Xamarin开发移动应用示例——数独游戏(五)保存游戏进度的更多相关文章

  1. 使用Xamarin开发移动应用示例——数独游戏(一)项目的创建与调试

    最近项目中需要移动客户端,由于团队基本上使用.Net产品线,所以决定使用Xmarin进行开发,这样技术路线统一,便于后期维护.官网上是这样介绍的" Xamarin 允许你使用 .NET 代码 ...

  2. 使用Xamarin开发移动应用示例——数独游戏(六)使用数据库

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 现在我们希望为应用增加更多的功能,比如记录每个完成的游戏,可以让用户自己添加 ...

  3. 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们使用一个数组保存预制的游戏,然后随机从中抽取一个游戏作为新游戏,如果 ...

  4. 使用Xamarin开发移动应用示例——数独游戏(二)创建游戏界面

    在本系列第一部分,我们创建了程序框架,现在我们创建游戏的界面,项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 首先在View ...

  5. 使用Xamarin开发移动应用示例——数独游戏(七)添加新游戏

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 现在我们增加添加新游戏的功能,创建一个页面,编辑初始局面,并保存到数据库. ...

  6. 使用Xamarin开发移动应用示例——数独游戏(八)使用MVVM实现完成游戏列表页面

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们已经完成了游戏的大部分功能,玩家可以玩预制的数独游戏,也可以自己添加 ...

  7. Xamarin 开发过的那些项目

    您可能已经看到类似的统计数据:智能手机用户在手机媒体上花费了89%的时间使用应用程序.或者听说Gartner预测到2017年移动应用程序下载将产生价值770亿美元的收入.很难不考虑这些数字.今天,每个 ...

  8. 老司机学新平台 - Xamarin开发环境及开发框架初探

    随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增.免费.更好的VS2015集成.更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即 ...

  9. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

随机推荐

  1. 1131 - Just Two Functions

    1131 - Just Two Functions    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  2. window11连接局域网共享失败处理办法

    第一步1.按 Win + R 组合键,打开运行,并输入:gpedit.msc 命令,确定或回车,可以快速打开本地组策略编辑器2.本地组策略编辑器窗口中,依次展开到:计算机配置 - 管理模板 - 网络 ...

  3. MMD

    目录 概 主要内容 定义 MMD for kernel function classes 一个无偏统计量 MMD test Borgwardt K., Gretton A., Rasch M., Kr ...

  4. 华为云 Kubernetes 管理员实训 五 课后作业

    练习1 部署一个Deployment应用,使用secret普通卷,该应用启动依赖此secret. Deployment的名称为<hwcka-005-1-你的华为云id> 将所用命令.创建的 ...

  5. [网络编程] 自己构建一个cgi.FieldStorage()的对象

    问题描述: 通常cgi.FieldStorage()返回一个类似于Python字典的对象. 在cgi框架中必须通过浏览器发送表单过来才能接受消息 那么我该怎么进行本地调试呢? 或者说在没有搭建好一整套 ...

  6. spring cloud --- Feign --- 心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 什么是Feign? 为了简化我们的开发,Spring Cloud Fei ...

  7. POJ2891Strange Way to Express Integers

    http://poj.org/problem?id=2891 实际上就是一个一元线性同余方程组.按照合并的方式来解即可. 有一个注意点,调用函数是会慢的. #include<iostream&g ...

  8. java下拉框转换公共方法

    1. 下拉框实例类 import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.Boolean ...

  9. 【reverse】逆向4 初识堆栈

    [reverse]逆向4 初识堆栈 1.问题引入 假设我们需要一块内存,有如下的要求 主要用于临时存储一些数据(如果数据很少可以放入寄存器中) 能够记录存了多少数据 能够非常快速的找到某个数据 2.模 ...

  10. 【解决了一个小问题】alpine镜像中,busybox的date命令获取昨天的日期

    直接上答案: date -d@"$(( `date +%s`-86400))" +"%Y-%m-%d"