当前位置: 首页 > news >正文

创建网站并制作首页教案/上海百度公司地址在哪里

创建网站并制作首页教案,上海百度公司地址在哪里,自建微网站服务器,wordpress cia易验证目标 在做这个游戏之前,我们先定一些小目标列出来,一个一个的解决,这样,一个小游戏就不知不觉的完成啦。我们的目标如下: 1. 游戏全屏,将图片拉伸成屏幕大小,并将其切成若干块。 2. 将拼图块随…

目标

在做这个游戏之前,我们先定一些小目标列出来,一个一个的解决,这样,一个小游戏就不知不觉的完成啦。我们的目标如下: 
1. 游戏全屏,将图片拉伸成屏幕大小,并将其切成若干块。 
2. 将拼图块随机打乱,并保证其能有解。 
3. 在屏幕上留出一个空白块,当点空白块旁边的块,将这块移动到空白块。 
4. 判断是否已经拼好。 
动图

实现目标

1.将图片拉伸成屏幕大小,并将其切成若干块。

想拉伸成屏幕大小,首先要知道屏幕的大小,Android获得屏幕大小的代码如下:

DisplayMetrics metrics =new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);//sdk17+
int screenWidth = metrics.widthPixels;//屏幕宽
int screenHeight = metrics.heightPixels;//屏幕高

将图片拉伸到屏幕大小

Bitmap back=Bitmap.createScaledBitmap(bitmap,
MainActivity.getScreenWidth(),
MainActivity.getScreenHeight(),
true);

将图片切成若干块

 private final int COL=3;//列,默认3列private final int ROW=3;//行,默认3行int tileWidth=back.getWidth()/COL;//每一块的宽int tileHeight=back.getHeight()/ROW;//每一块的高Bitmap[] bitmapTiles =new Bitmap[COL*ROW];int idx=0;for(int i=0;i<ROW;i++){for(int j=0;j<COL;j++){bitmapTiles[idx++]=Bitmap.createBitmap(back,j*tileWidth,i*tileHeight,tileWidth,tileHeight);}

2. 将拼图块随机打乱,并保证其能有解。

这个问题应该是这个小游戏的核心了,有些人在做拼图的时候就随便乱摆,最后发现拼不回来,超级尴尬。要想打乱了还能拼回来,我们呢,就想到了模拟人打乱拼图的方法,就是将空白块与旁边的非空白块交换位置,与旁边哪个非空白块交换是随机的,然后将这个过程重复若干次,重复的次数也是随机的,这样一来,保证了图块的随机,又保证了能拼回来。在这里我们用数字0到N-1(N为块的数量)表示每一块,并用二维数组存储他们。

    private void createIntegerArray(int row,int col){array=new int[row][col];int idx=0;for(int i=0;i<row;i++)for(int j=0;j<col;j++)array[i][j]=idx++;}

下面是打乱块的算法,最后一块是空白块,让它随机与旁边的某一块进行交换,这个过程中要检查数组边界,不要让它越界。

    //四个方向private int[][] dir={{0,1},//下{1,0},//右{0,-1},//上{-1,0}//左};/*** 移动块的位置* @param srcX 初始x位置* @param srcY 初始y位置* @param xOffset x偏移量* @param yOffset y偏移量* @return 新的位置,错误返回new Point(-1,-1);*/private Point move(int srcX,int srcY,int xOffset,int yOffset){int x=srcX+xOffset;int y=srcY+yOffset;if(x<0||y<0||x>=col||y>=row)return new Point(-1,-1);int temp=array[y][x];array[y][x]=array[srcY][srcX];array[srcY][srcX]=temp;return new Point(x,y);}/*** 得到下一个可以移动的位置* @param src 初始的点* @return*/private  Point getNextPoint(Point src){Random rd=new Random();int idx=rd.nextInt(4);//,因为有4个方向,所以产生0~3的随机数int xOffset=dir[idx][0];int yOffset=dir[idx][1];Point newPoint=move(src.getX(),src.getY(),xOffset,yOffset);if(newPoint.getX()!=-1&&newPoint.getY()!=-1) {return newPoint;//找到了新的点}return getNextPoint(src);//没有找到,继续}/*** 生成拼图数据* @param row* @param col* @return*/public int[][] createRandomBoard(int row,int col){if(row<2||col<2)throw new IllegalArgumentException("行和列都不能小于2");this.row=row;this.col=col;createIntegerArray(row,col);//初始化拼图数据int count=0;Point tempPoint=new Point(col-1,row-1);//最后一块是空白块Random rd=new Random();int num=rd.nextInt(100)+20;//产生20~119的随机数,表示重复的次数while (count<num){tempPoint=getNextPoint(tempPoint);//获得下个点,并更新空白块位置count++;}return  array;}

3. 在屏幕上留出一个空白块,当点空白块旁边的块,将这块移动到空白块。

留出空白块很简单,由于上面我们将最后一块作为空白块。当我们绘图时,略过它即可。代码实现如下:

    @Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.GRAY);for(int i=0;i<ROW;i++) {for (int j = 0; j < COL; j++) {int idx=dataTiles[i][j];if(idx==ROW*COL-1&&!isSuccess)continue;canvas.drawBitmap(bitmapTiles[idx],j*tileWidth,i*tileHeight,paint);}}}

移动块也很简单,当点击屏幕时,计算其在拼图数据中对应的索引。当计算到点击非空白块就寻找它旁边有没有空白块,有,则将拼图数据中表示空白块和非空白块的数据交换,并刷新View即可

    /*** 将屏幕上的点转换成,对应拼图块的索引* @param x* @param y* @return*/private Point xyToIndex(int x,int y){int extraX=x%tileWidth>0?1:0;int extraY=x%tileWidth>0?1:0;int col=x/tileWidth+extraX;int row=y/tileHeight+extraY;return new Point(col-1,row-1);}/***点击屏幕时发生*/@Overridepublic boolean onTouchEvent(MotionEvent event) {if(event.getAction()==MotionEvent.ACTION_DOWN) {Point point = xyToIndex((int) event.getX(), (int) event.getY());for(int i=0;i<dir.length;i++){int newX=point.getX()+dir[i][0];int newY=point.getY()+dir[i][1];if(newX>=0&&newX<COL&&newY>=0&&newY<ROW){if(dataTiles[newY][newX]==COL*ROW-1){int temp=dataTiles[point.getY()][point.getX()];dataTiles[point.getY()][point.getX()]=dataTiles[newY][newX];dataTiles[newY][newX]=temp;invalidate();}}}}return true;}

4. 判断是否已经拼好

我们初始化数据时,是从0开始,依次增加作为拼图数据。当拼好的时候,拼图数据也应该是一样的,所以我们比较数组中每一个数据与它的下一个数据,如果每一个数据都小于它的下一个数据,说明数组里面的数据已经从小到大排列好。

/*** 判断是否拼图成功* @param arr* @return*/public boolean isSuccess(int[][] arr){int idx=0;for(int i=0;i<arr.length;i++){for(int j=0;j<arr[i].length&&idx<row*col-1;j++){if(arr[idx/row][idx%col]>arr[(idx+1)/row][(idx+1)%col]){return false;}idx++;}}return  true;}

拼图游戏技巧

拼图技巧觉得也有必要教一下,不然有些人就会说:你的算法有问题,这根本拼不好!我也是超级无奈啊!拼图的技巧是,我们先把上面的第一行拼好,然后再把第二行拼好,这样,一直下去~就能完全拼好了。

http://www.jmfq.cn/news/4883185.html

相关文章:

  • Django可以做门户网站吗/app开发
  • 舆情分析案例/百度seo优化
  • 免费网站建设视频教程/360seo排名优化服务
  • 银川网站建设价格/网络营销策划包括哪些内容
  • 电子商务网站建设组织流程图/产品网络推广深圳
  • 网站建设应重视后期的服务和维护/seo短视频网页入口引流网站
  • 网站上怎么做动画广告视频/关键词优化公司
  • 越南做企业网站/什么软件可以免费发广告
  • 中国电信网站备案管理系统/百度霸屏培训
  • 南通城乡建设局网站/seo优化是啥
  • 张家界seo优化/如何对seo进行优化
  • 怎么做网站作业/谷歌推广怎么样
  • 东莞公司网站建设/推广文案范例
  • 网站怎么做域名/全搜网
  • 做网站的视频教学/下拉词排名
  • 哈尔滨网站开发建设公司/网站开发平台有哪些
  • 一个好的网站应该具有什么/如何建网站赚钱
  • 嘉兴网站建设企业/南宁seo优化公司排名
  • 做网站的职业/搜索引擎下载入口
  • 微信 网站 优劣势/百度信息流投放
  • 宝安大型商城网站建设/深圳seo优化seo优化
  • 深圳市浩天建设网站/线上推广是做什么的
  • 做带后台的网站/建站之星官方网站
  • 科技开发公司/宁波seo整体优化
  • 网站制作工作室/东莞网站优化公司哪家好
  • 网站推广的定义及方法/seo优化内页排名
  • 西昌手机网站制作/网络推广是网络营销的基础
  • 好的学校网站设计/搜索网站大全排名
  • 如何做电商网站/创意营销案例
  • 亲姐弟做愛电影在线网站/山东百度推广