zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    CSS:清除浮动小技巧
    CSS:可见格式化模型BFC与应用
    JavaScript:所有视图属性和方法(innerWidth、outerHeight、clientX等)
    JavaScript:正则表达式(入门篇)
    JavaScript:六种继承比较
    表格内展示2行,超出部分省略
    Docker删除大量停止的container
    docker学习笔记
    使用redis实现分布式锁
    Sublime text 3 如何格式化HTML/css/js代码
  • 原文地址:https://www.cnblogs.com/yinghuochong/p/2220651.html
Copyright © 2011-2022 走看看