パズルミニゲーム「ST--パズル」開発編の主な機能実現(一)
前回ブログを出してから长い间、主に最近忙しくて、ずっといろいろな高级なコントロールの知识と仕事を探すことに忙しくて、だからとても申し訳ありませんが、ちょうど今日の周末を吸って、后ろの补完をします.くだらないことはあまり言わないで、本題に入りましょう.
前の2つの招待状はインタフェースを登录してとインタフェースを始めて绍介し终わって、今から私达の主要な机能の実现のコードを书いて、私のために使う考え方は“简単です”で、“普通です”、“困难です”の3つの异なる関系はすべて悪くなくて、ただその中のパラメータはいくつか変化が発生したので、ここで直接“简単です”の関系を持って绍介します
まず、インタフェースの上のActionBarが透明であるという効果を得たいのですが、ここではNoActionBarではなく、ActionBarの背景を透明に変えるということに注意してください.
その中のactionbarは透明な画像なので、簡単なPSを使って図を描くのは勉強になるのに役立ちます.もちろん、それだけではだめです.レイアウトファイルを追加する前に、このようなコードを追加する必要があります.つまり、
文中にも注釈があり、
この言葉の役割はActionBarをレイアウトの上に浮かべることです
次に全体のレイアウトを追加しました.ゲームのインタフェースについて、私が使っている線形レイアウトは、レイアウトを簡単に描いてからUIをかけます.手順が煩わしいかもしれませんが、UIをかけるとき、簡単なスケッチがあることに気づきます.UIを合わせるのは便利です.
効果はこうです
その中のすべてのImageViewはすべて1枚の小さい図で、私は1枚の完全な大きい図を切り出したので、もちろん、これは1つの大きい工事で、しかしもしあなたはPsを使うことができて、中のロットの切り出し図を使って、多くの精力を節約することができます
レイアウトができたら、コントロールを取得できます.
レイアウトに画像を追加できます
次にインタフェースを初期化することができます.ここでは特に注意しなければなりません.パズルを作るとき、古典的な数学の論理問題に関連します.初期化するときに判断する必要があります.そうしないと、あなたのプログラムが完成した後、いつも5割の確率で最後の2枚の画像が完成できません.これは古典的な15 puzzleアルゴリズムの問題です.
ここでは、いくつかの概念について説明します.
1、行数
2、空白のコントロールは下から上へ数番目のコントロールにあります.
3,逆数の和
まず、最初の行数は説明しなくてもいいでしょう.私たちのような簡単な関門は3*3のモードなので、行数は3です.
2つ目の空白のコントロールは、私たちの3*3のモードのように、ゲームの中で、8枚の画像しか表示されません.1つの空白は移動するために使用されています.これがその空白のコントロールです.
3つ目は逆転数です.例を挙げて説明します.私たちは3*3のゲームモードで、8枚の画像が表示されます.正しく並べられたときは
012
345
67
このとき,それらの順序は0,1,2,3,4,5,6,7である.
しかし、初期化すると必ず順序が狂ってしまいます.これはランダムであれば、その順序はそうかもしれません.
461
270
35
4,6,1,2,7,0,3,5の順です
彼らの逆転数は4,5,1,1,3です
ここでの倒置数とは1つの配列を指し、まず最初の数とその後ろの数を比較し、この数より小さい数がA個あると、この数の最初の倒置数はAであり、次に2番目の数と2番目の数の後ろの数を比較し、順次、1つの数の後ろの数がこの数より大きい場合は0と記す
このように解釈すれば、逆転数とは何かがわかるでしょう.逆転数の和とは、これらの逆転数を加算した和のことです
次に、この判断ルールを理解する必要があります.
1、行数が偶数の場合、いずれにしてもパズルは最後に完了し、最后の2枚の画像の异位の现象は现れません(これは私が前に博友を见つけた1篇の招待状の上で言及したので、前にあまり検证していませんが、私がよく検证する时、たとえ行数が偶数ですとしても、依然として画像の异位の现象が现れることを発见して、だから、この文は正しくないべきで、広范な博友达がすべて试みて、みんながいっしょに结果を讨论することを望みます)
2、行数が奇数の場合:
a,空白コントロールの底からの距離に奇数個のコントロールがある場合,逆置数の和は奇数であり,最後の2枚の画像の異位は現れない.
b,空白のコントロールが底からの距離に偶数個のコントロールがある場合,逆転数の和は偶数であり,最後の2枚のピクチャが異位になる現象は起こらない.
これは私の前の写真の異位問題を専門に話していたブログの説明とは違うかもしれませんが、これまで詳しく検証していなかったので、問題点が見つかりませんでした.ここで申し訳ありません.
例を挙げて説明しますが、3*3と5*5は必ず50パーセントの確率で画像が異位になる現象が発生し、4*4もこのような状況が発生する可能性があるので、私たちが指定した空白コントロールが現れたときに最も右下の位置に現れたので、空白コントロールの距離が底の距離が0であれば、空白コントロールの距離が底の距離に偶数のコントロールがあると判断する必要があります.数の和が偶数であるか否かを判定するだけでよい
コードは次のとおりです.
このように初期化の際には、逆転数が偶数であれば、どのようにして値付けに成功するのか、逆転数が偶数でなければinitView()を呼び出し、初期化された配列を再生成し、逆転数の和が偶数になるまで判断を続けます
前の2つの招待状はインタフェースを登录してとインタフェースを始めて绍介し终わって、今から私达の主要な机能の実现のコードを书いて、私のために使う考え方は“简単です”で、“普通です”、“困难です”の3つの异なる関系はすべて悪くなくて、ただその中のパラメータはいくつか変化が発生したので、ここで直接“简単です”の関系を持って绍介します
まず、インタフェースの上のActionBarが透明であるという効果を得たいのですが、ここではNoActionBarではなく、ActionBarの背景を透明に変えるということに注意してください.
/**
* Actionbar
*/
private void initActionBar() {
// TODO Auto-generated method stub
// ActionBar
actionBar = getActionBar();
Resources r = getResources();
// ActionBar
Drawable myDrawable = r.getDrawable(R.drawable.actionbar);
actionBar.setBackgroundDrawable(myDrawable);
//
actionBar.setHomeButtonEnabled(true);
//
actionBar.setDisplayHomeAsUpEnabled(true);
}
その中のactionbarは透明な画像なので、簡単なPSを使って図を描くのは勉強になるのに役立ちます.もちろん、それだけではだめです.レイアウトファイルを追加する前に、このようなコードを追加する必要があります.つまり、
// ActionBar
<span style="white-space:pre"> </span>getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
<span style="white-space:pre"> </span>setContentView(R.layout.activity_easy);
<span style="white-space:pre"> </span>initActionBar();
文中にも注釈があり、
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
この言葉の役割はActionBarをレイアウトの上に浮かべることです
次に全体のレイアウトを追加しました.ゲームのインタフェースについて、私が使っている線形レイアウトは、レイアウトを簡単に描いてからUIをかけます.手順が煩わしいかもしれませんが、UIをかけるとき、簡単なスケッチがあることに気づきます.UIを合わせるのは便利です.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background13"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:gravity="bottom" >
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/partition" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="horizontal" >
<TextView
android:id="@+id/easy_tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical|right"
android:orientation="horizontal" >
<TextView
android:id="@+id/easy_tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:text="@string/hello" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginLeft="15sp"
android:layout_marginRight="15dp"
android:layout_marginTop="0dp"
android:layout_weight="8"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img4" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img7" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img2" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img5" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img8" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img3" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img6" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:id="@+id/easy_9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:scaleType="fitXY"
android:src="@drawable/img9" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center" >
<Button
android:id="@+id/easy_bt1"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:background="@drawable/select"
android:gravity="center"
android:onClick="onclick"
android:text=" " />
</LinearLayout>
</LinearLayout>
効果はこうです
その中のすべてのImageViewはすべて1枚の小さい図で、私は1枚の完全な大きい図を切り出したので、もちろん、これは1つの大きい工事で、しかしもしあなたはPsを使うことができて、中のロットの切り出し図を使って、多くの精力を節約することができます
レイアウトができたら、コントロールを取得できます.
/**
* findViewById
*
*/
public void findId() {
action_showimage = (ImageView) findViewById(R.id.action_showimage);
ll = (LinearLayout) findViewById(R.id.ll);
tv1 = (TextView) findViewById(R.id.easy_tv1);
tv2 = (TextView) findViewById(R.id.easy_tv2);
iv_group = new ImageView[3][3];
iv_group[0][0] = (ImageView) findViewById(R.id.easy_1);
iv_group[0][1] = (ImageView) findViewById(R.id.easy_2);
iv_group[0][2] = (ImageView) findViewById(R.id.easy_3);
iv_group[1][0] = (ImageView) findViewById(R.id.easy_4);
iv_group[1][1] = (ImageView) findViewById(R.id.easy_5);
iv_group[1][2] = (ImageView) findViewById(R.id.easy_6);
iv_group[2][0] = (ImageView) findViewById(R.id.easy_7);
iv_group[2][1] = (ImageView) findViewById(R.id.easy_8);
iv_group[2][2] = (ImageView) findViewById(R.id.easy_9);
}
レイアウトに画像を追加できます
<span style="font-size:18px;">/**
*
*
*/
public void initGame() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j + i == 4) {
iv_group[i][j].setImageResource(number[8]);
} else {
iv_group[i][j].setImageResource(number[i * 3 + j]);
}
}
}
}</span>
次にインタフェースを初期化することができます.ここでは特に注意しなければなりません.パズルを作るとき、古典的な数学の論理問題に関連します.初期化するときに判断する必要があります.そうしないと、あなたのプログラムが完成した後、いつも5割の確率で最後の2枚の画像が完成できません.これは古典的な15 puzzleアルゴリズムの問題です.
ここでは、いくつかの概念について説明します.
1、行数
2、空白のコントロールは下から上へ数番目のコントロールにあります.
3,逆数の和
まず、最初の行数は説明しなくてもいいでしょう.私たちのような簡単な関門は3*3のモードなので、行数は3です.
2つ目の空白のコントロールは、私たちの3*3のモードのように、ゲームの中で、8枚の画像しか表示されません.1つの空白は移動するために使用されています.これがその空白のコントロールです.
3つ目は逆転数です.例を挙げて説明します.私たちは3*3のゲームモードで、8枚の画像が表示されます.正しく並べられたときは
012
345
67
このとき,それらの順序は0,1,2,3,4,5,6,7である.
しかし、初期化すると必ず順序が狂ってしまいます.これはランダムであれば、その順序はそうかもしれません.
461
270
35
4,6,1,2,7,0,3,5の順です
彼らの逆転数は4,5,1,1,3です
ここでの倒置数とは1つの配列を指し、まず最初の数とその後ろの数を比較し、この数より小さい数がA個あると、この数の最初の倒置数はAであり、次に2番目の数と2番目の数の後ろの数を比較し、順次、1つの数の後ろの数がこの数より大きい場合は0と記す
このように解釈すれば、逆転数とは何かがわかるでしょう.逆転数の和とは、これらの逆転数を加算した和のことです
次に、この判断ルールを理解する必要があります.
1、行数が偶数の場合、いずれにしてもパズルは最後に完了し、最后の2枚の画像の异位の现象は现れません(これは私が前に博友を见つけた1篇の招待状の上で言及したので、前にあまり検证していませんが、私がよく検证する时、たとえ行数が偶数ですとしても、依然として画像の异位の现象が现れることを発见して、だから、この文は正しくないべきで、広范な博友达がすべて试みて、みんながいっしょに结果を讨论することを望みます)
2、行数が奇数の場合:
a,空白コントロールの底からの距離に奇数個のコントロールがある場合,逆置数の和は奇数であり,最後の2枚の画像の異位は現れない.
b,空白のコントロールが底からの距離に偶数個のコントロールがある場合,逆転数の和は偶数であり,最後の2枚のピクチャが異位になる現象は起こらない.
これは私の前の写真の異位問題を専門に話していたブログの説明とは違うかもしれませんが、これまで詳しく検証していなかったので、問題点が見つかりませんでした.ここで申し訳ありません.
例を挙げて説明しますが、3*3と5*5は必ず50パーセントの確率で画像が異位になる現象が発生し、4*4もこのような状況が発生する可能性があるので、私たちが指定した空白コントロールが現れたときに最も右下の位置に現れたので、空白コントロールの距離が底の距離が0であれば、空白コントロールの距離が底の距離に偶数のコントロールがあると判断する必要があります.数の和が偶数であるか否かを判定するだけでよい
コードは次のとおりです.
/**
*
*/
public void initView() {
//
for (int i = 0; i < number.length; i++) {
number[i] = gameover[i];
}
//
for (int i = 0; i < number.length - 4; i++) {
int temp = number[i];
int index = (int) (Math.random() * (number.length - 5));
number[i] = number[index];
number[index] = temp;
}
//
initGame();
//
socer = 0;
tv2.setText(" " + String.valueOf(socer) + " ");
//
getlist();
//
if (canSolve(data)) {
return;
} else {
initView();
}
}
/**
*
*
*/
public void initGame() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j + i == 4) {
iv_group[i][j].setImageResource(number[8]);
} else {
iv_group[i][j].setImageResource(number[i * 3 + j]);
}
}
}
}
/**
* data
*
*/
public void getlist() {
data = new ArrayList<Integer>();
for (int i = 0; i < number.length - 4; i++) {
for (int j = 0; j < number.length - 4; j++) {
if (number[i] == gameover[j]) {
data.add(j);
}
}
}
System.out.println("============" + data.toString());
}
/**
* , , getInversions(data)
*
* @param data
* @return
*/
public boolean canSolve(List<Integer> data) {
//
return getInversions(data) % 2 == 0;
}
/**
*
*
* @param data
* @return : , , ,
*
*/
public static int getInversions(List<Integer> data) {
int inversions = 0;
int inversionCount;
for (int i = 0; i < data.size(); i++) {
inversionCount = 0;
for (int j = i + 1; j < data.size(); j++) {
int index = data.get(i);
if (data.get(j) < index) {
inversionCount++;
}
}
inversions += inversionCount;
inversionCount = 0;
}
System.out.println("******" + data.toString() + inversions);
return inversions;
}
このように初期化の際には、逆転数が偶数であれば、どのようにして値付けに成功するのか、逆転数が偶数でなければinitView()を呼び出し、初期化された配列を再生成し、逆転数の和が偶数になるまで判断を続けます