windows phone 智能拼图

这是在Windows Phone 下开发的一个智能拼图的小游戏:可以先玩一下
上面并没有将所有功能展示出来,游戏的主要功能有:
1、可以选择 图片拼图 和数字拼图
2、可以自定义图片拼图的图片、数字拼图的背景色、拼图块颜色、字体颜色
3、可以设置拼图的难度、简单计算分数
4、状态的保持
 
实现关键点:
1、为了实现状态的保持,在程序退出时候将拼图的状态信息保存到xml文件中,包括行数、列数、拼图片顺序、移动次数、所用时间等等
定义两个配置文件类 NumberPuzzleSettings和ImagePuzzleSettings,公共的部分继承自PuzzleSettings
主要处理配置的加载和保存,加载和保存的实现基本相同、使用XmlSerializer:
View Code
   //加载配置信息
public static NumberPuzzleSettings LoadSettings()
{
NumberPuzzleSettings numberPuzzleSettings;
IsolatedStorageFile isoStorageFile = IsolatedStorageFile.GetUserStoreForApplication();
//isoStorageFile.DeleteFile("puzzleSettings.xml");
if (isoStorageFile.FileExists("numberPuzzleSettings.xml"))
{
IsolatedStorageFileStream isoStorageFileStream = isoStorageFile.OpenFile("numberPuzzleSettings.xml", FileMode.Open);
StreamReader reader = new StreamReader(isoStorageFileStream);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(NumberPuzzleSettings));
numberPuzzleSettings = xmlSerializer.Deserialize(reader) as NumberPuzzleSettings;
reader.Close();
}
else
{
numberPuzzleSettings = new NumberPuzzleSettings(1);
}
isoStorageFile.Dispose();
return numberPuzzleSettings;
}
//保存配置信息
public void SaveSettings()
{
IsolatedStorageFile isoStorageFile = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream isoStorageFileStream = isoStorageFile.CreateFile("numberPuzzleSettings.xml");
StreamWriter writer = new StreamWriter(isoStorageFileStream);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(NumberPuzzleSettings));
xmlSerializer.Serialize(writer, this);
writer.Close();
isoStorageFile.Dispose();
}
然后在App.xaml.cs的启动和退出时加载和保存就Ok啦
2、拼图片的生成,首先要根据行数和列数 创建拼图片,如4行4列需要创建一个 16个整型的随机数组
开始想的是直接使用1-16生成随机数组,这样的话会有一半没有解的情况
故采用如下方法:
先将数组初始化为1,2..14,15,-1,即为完成状态,最后一个-1表示空拼图片
为-1随机选择可用的方向移动,如下进行计算,可移动的值进行判断,
                              |  puzzleIndex-rowNum  |
      ------------------+--------------------------+----------------
       puzzleIndex-1  |                 +                |puzzleIndex+1
      ------------------+--------------------------+------------------
                              |  puzzleIndex+rowNum |
重复上述操作rowNum*columnNum*100次,得到一个随机数组,然后生成拼图片即可
3、拼图片的移动,因为手机不同于电脑,如果点击就移动的话 自己感觉玩着不好 so.....这里用户拖动拼图片的时候才进行移动,当然这里想在点击时移动的话,只要 在OnMannipulationStarted中写相应的处理就Ok了,实现如下:
View Code
 void OnPuzzlePieceManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
Grid grid = sender as Grid;
int row = Grid.GetRow(grid);
int colum = Grid.GetColumn(grid);
CompositeTransform transform = new CompositeTransform();
grid.RenderTransform = transform;

//用来标志空拼图中的元素
int lastnum =- 1;
//因为PuzzleArray中保存有拼图的状态信息, 且空拼图片对应的值为-1
// 所以可以直接判断要移动元素的相邻元素是否为-1即可判断是否可以移动
//若不为空,则不执行任何操作
//若为空,将其与空元素交换位置,并且交换PuzzleArray数组中的值,以便下一次继续比较

double moveX = e.DeltaManipulation.Translation.X;
double moveY = e.DeltaManipulation.Translation.Y;
//向右
if (moveX > 0 && colum < (settings.ColumnNumber - 1) && settings.PuzzleArray[getCorrectNum(settings,row, colum + 1) - 1] == lastnum)
{
Grid.SetRow(grid, row);
Grid.SetColumn(grid, colum + 1);
PuzzleService.AdjustPostion(settings.PuzzleArray,getCorrectNum(settings, row, colum + 1) - 1,getCorrectNum(settings, row, colum) - 1);
settings.MoveTimes++;
}
//向左
else if (moveX < 0 && colum > 0 && settings.PuzzleArray[getCorrectNum(settings,row, colum - 1) - 1] == lastnum)
{
Grid.SetRow(grid, row);
Grid.SetColumn(grid, colum - 1);
PuzzleService.AdjustPostion(settings.PuzzleArray,getCorrectNum(settings,row, colum - 1) - 1,getCorrectNum(settings,row, colum) - 1);
settings.MoveTimes++;
}
//向下
else if (moveY > 0 && row < (settings.RowNumber - 1) && settings.PuzzleArray[getCorrectNum(settings,row + 1, colum) - 1] == lastnum)
{
Grid.SetRow(grid, row + 1);
Grid.SetColumn(grid, colum);
PuzzleService.AdjustPostion(settings.PuzzleArray,getCorrectNum(settings, row + 1, colum) - 1,getCorrectNum(settings, row, colum) - 1);
settings.MoveTimes++;
}
//向上
else if (moveY < 0 && row > 0 && settings.PuzzleArray[getCorrectNum(settings,row - 1, colum) - 1] == lastnum)
{
Grid.SetRow(grid, row - 1);
Grid.SetColumn(grid, colum);
PuzzleService.AdjustPostion(settings.PuzzleArray,getCorrectNum(settings, row - 1, colum) - 1,getCorrectNum(settings, row, colum) - 1);
settings.MoveTimes++;
}
//更新拼图移动次数
UpdateMoveTimes(settings.MoveTimes);
//触发一次后立即结束,否则的话 拼图片会一直移动,
//故此处一定要调用Complete方法
e.Complete();
e.Handled = true;
}
其他的像 颜色设置、难度设置、积分榜等都比较简单就不多说了,效果图片如图:

    数字拼图

    图片拼图

    拼图菜单

    难度设置

        颜色设置

        高分榜

 

xap文件下载:WPPuzzle.xap

 

posted @ 2011-10-21 20:03  LeverLiu  阅读(1776)  评论(6编辑  收藏  举报