English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dieser Artikel beschreibt ein einfaches Gomoku-Spiel, das mit Android entwickelt wurde. Hiermit teile ich es mit euch zur Referenz, wie folgt:
Ich habe gerade ein kleines Gomoku-Programm auf Android geschrieben und hier mit euch teilen.
Nachdem ich fertig bin, fühle ich, dass der Android-SDK, obwohl er auch Java verwendet, doch sehr unterschiedlich von Java ME ist.
Zunächst hat der Android-SDK nicht alle Java ME-Standards implementiert, Anwendungen, die ursprünglich auf KJava liefen, können nicht direkt auf Android ausgeführt werden.
Außerdem hat der Android-SDK viele APIs, die spezifisch für Android sind, die Entwickler müssen sie verstehen.
Das Entwicklungsrahmen von Android ist auch anders als andere, es muss gelernt werden.
Dieser Gomoku-Spiel ist nach dem Demo "Snake" von Android und anderen Beispielen sowie meinen eigenen Anforderungen geschrieben worden.
Darin sind Funktionen wie das Brett, das Spielen, das Urteilen über Sieg und Niederlage und das Neustarten des Spiels implementiert. Derzeit ist die Funktion der KI, die Steine zu bewegen, noch nicht implementiert.
Die Touchscreen-Funktion von Android ist sehr praktisch, ich habe vor kurzem ein G gesehen, das jemand演示过。1, das Touchscreen ist sehr praktisch und die "Window"-Fenster und "Shade"-Vorhänge von Android plus Touchscreen sehen sehr cool aus.
Ah, dieses Gomoku wird auch mit dem Touchscreen zur Bewegung der Steine realisiert. Klicke auf einen Platz auf dem Brett, um den Stein auf das Brett zu legen.
Zuerst ein Bild, um die Wirkung zu sehen.
Gut, jetzt fangen wir direkt mit dem Code an:
/* * Five In a Row. (Gomoku) * Dies ist ein einfaches Gomoku-Programm, das ich als Übung geschrieben habe und hier mit euch teile. * Ich hoffe, dass wir alle miteinander mehr kommunizieren können. Meine GoogleTalk: lixinso <at> gmail.com * * */ //---------------------- //TBD: KI, Rückschritt //--------------------- package lixinsong.game.gobang; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; //Dies ist das Hauptprogramm, das von Activity abgeleitet ist und die onCreate-Methode implementiert.: public class gobang extends Activity { GobangView gbv; /** Wird aufgerufen, wenn die Aktivität zum ersten Mal erstellt wird. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); gbv = (GobangView)this.findViewById(R.id.gobangview); gbv.setTextView((TextView)this.findViewById(R.id.text)); }
Der R.id.gobangview im res ist ein definiertes View.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="volle_parent" android:layout_height="volle_parent"> <lixinsong.game.gobang.GobangView android:id="@"+id/gobangview" android:layout_width="volle_parent" android:layout_height="volle_parent" android:text="aaaaa" tileSize="24" /> <RelativeLayout android:layout_width="flexibel" android:layout_height="flexibel" android:layout_centerInParent="wahr" > <TextView android:id="@"+id/text" android:text="hahahhaha" android:visibility="sichtbar" android:layout_width="flexibel" android:layout_height="flexibel" android:layout_centerInParent="wahr" android:gravity="zentral_ausgerichtet" android:textColor="#ffff0000" android:textStyle="fett" android:textSize="24sp" /> </RelativeLayout> </FrameLayout>
View für das Gobang
package lixinsong.game.gobang; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; /*Das Brett insgesamt10×10Feld * Brettmitte * * * */ //public class GobangView extends View implements Runnable { public class GobangView extends View{ protected static int GRID_SIZE = 10; protected static int GRID_WIDTH = 30; // Breite der Brettergitter protected static int CHESS_DIAMETER = 26; // Durchmesser der Steine protected static int mStartX;// X-Koordinate der linken oberen Ecke des Brettspiels protected static int mStartY;// Y-Koordinate der linken oberen Ecke des Brettspiels private Bitmap[] mChessBW; // Schwarze und weiße Steine private static int[][] mGridArray; // Gitter boolean key = false; int wbflag = 1; //jetzt ist der weiße Stein dran=2jetzt ist der schwarze Stein dran=1. Zuerst den schwarzen Stein setzen (der schwarze Stein wird später als automatisch durch den Computer gespielter Stein gesetzt) int mLevel = 1; //Spiel Schwierigkeit int mWinFlag = 0; private final int BLACK=1; private final int WHITE=2; int mGameState = GAMESTATE_RUN; //Spielphase: 0=Noch kein Spiel1=Spiel im Gange2=Spiel beendet static final int GAMESTATE_PRE = 0; static final int GAMESTATE_RUN = 1; static final int GAMESTATE_PAUSE = 2; static final int GAMESTATE_END = 3; //private TextView mStatusTextView; // Setzen Sie den anzuzeigenden Text basierend auf dem Spielstatus public TextView mStatusTextView; // Setzen Sie den anzuzeigenden Text basierend auf dem Spielstatus private Bitmap btm1; private final Paint mPaint = new Paint(); CharSequence mText; CharSequence STRING_WIN = "Weiß gewinnt!" /Drücken Sie die Feuertaste, um ein neues Spiel zu starten."; CharSequence STRING_LOSE = "Schwarz gewinnt!" /Drücken Sie die Feuertaste, um ein neues Spiel zu starten."; CharSequence STRING_EQUAL = "Cool! You are equal!" /Drücken Sie die Feuertaste, um ein neues Spiel zu starten."; public GobangView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public GobangView(Context context, AttributeSet attrs) { //好像调用的是这个构造函数,为什么不是前面的呢 super(context, attrs); this.setFocusable(true); //20090530 this.setFocusableInTouchMode(true); init();}} } //Hier wurden die Steine ursprünglich nicht mit Bildern gezeichnet, sondern direkt als Kreise. Da meine Bilder nicht gut aussahen. // Initialisiere die Bitmap für die schwarzen und weißen Steine public void init() { mGameState = 1; //Setze das Spiel auf den Startzustand wbflag = BLACK; //Der Start ist schwarz. mWinFlag = 0; //Leere Sieg- und Niederlagenmarken. mGridArray = new int[GRID_SIZE-1][GRID_SIZE-1]; mChessBW = new Bitmap[2]; Bitmap bitmap = Bitmap.createBitmap(CHESS_DIAMETER, CHESS_DIAMETER, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Resources r = this.getContext().getResources(); Drawable tile = r.getDrawable(R.drawable.chess1); tile.setBounds(0, 0, CHESS_DIAMETER, CHESS_DIAMETER); tile.draw(canvas); mChessBW[0] = bitmap; tile = r.getDrawable(R.drawable.chess2); tile.setBounds(0, 0, CHESS_DIAMETER, CHESS_DIAMETER); tile.draw(canvas); mChessBW[1] = bitmap; } public void setTextView(TextView tv){ mStatusTextView =tv; mStatusTextView.setVisibility(View.INVISIBLE); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mStartX = w / 2 - GRID_SIZE * GRID_WIDTH / 2; mStartY = h / 2 - GRID_SIZE * GRID_WIDTH / 2; } @Override public boolean onTouchEvent(MotionEvent event){ switch (mGameState) { case GAMESTATE_PRE: break; case GAMESTATE_RUN: { int x; int y; float x0 = GRID_WIDTH - (event.getX() - mStartX) % GRID_WIDTH; float y0 = GRID_WIDTH - (event.getY() - mStartY) % GRID_WIDTH; if (x0 < GRID_WIDTH / 2) { x = (int) ((event.getX() - mStartX) / GRID_WIDTH); } else { x = (int) ((event.getX() - mStartX) / GRID_WIDTH) - 1; } if (y0 < GRID_WIDTH / 2) { y = (int) ((event.getY() - mStartY) / GRID_WIDTH); } else { y = (int) ((event.getY() - mStartY) / GRID_WIDTH) - 1; } if ((x >= 0 && x < GRID_SIZE - 1) && (y >= 0 && y < GRID_SIZE - 1)) { if (mGridArray[x][y] == 0) { if (wbflag == BLACK) { putChess(x, y, BLACK); //this.mGridArray[x][y] = 1; if(checkWin(BLACK)){ //Wenn schwarze Steine gewonnen haben mText = STRING_LOSE; mGameState = GAMESTATE_END; showTextView(mText); } else if(checkFull()){//Wenn das Brett voll ist mText = STRING_EQUAL; mGameState = GAMESTATE_END; showTextView(mText); } wbflag = WHITE; } else if (wbflag == WHITE) { putChess(x, y, WHITE); //this.mGridArray[x][y] = 2; if(checkWin(WHITE)){ mText = STRING_WIN; mGameState = GAMESTATE_END; showTextView(mText); } else if(checkFull()){//Wenn das Brett voll ist mText = STRING_EQUAL; mGameState = GAMESTATE_END; showTextView(mText); } wbflag = BLACK; } } } } break; case GAMESTATE_PAUSE: break; case GAMESTATE_END: break; } this.invalidate(); else } @Override public boolean onKeyDown(int keyCode, KeyEvent msg) { Log.e("KeyEvent.KEYCODE_DPAD_CENTER", " "; + keyCode); if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER){ switch(mGameState){ case GAMESTATE_PRE: break; case GAMESTATE_RUN: break; case GAMESTATE_PAUSE: break; case GAMESTATE_END: {//Das Spiel ist beendet, drücken Sie die CENTRAL Taste, um fortzufahren Log.e("Fire Key Pressed:::", "FIRE"); mGameState = GAMESTATE_RUN; this.setVisibility(View.VISIBLE); this.mStatusTextView.setVisibility(View.INVISIBLE); this.init(); this.invalidate(); } break; } } return super.onKeyDown(keyCode, msg); } @Override public void onDraw(Canvas canvas) { canvas.drawColor(Color.YELLOW); // 绘制棋盘 { Paint paintRect = new Paint(); paintRect.setColor(Color.GRAY); paintRect.setStrokeWidth(2); paintRect.setStyle(Style.STROKE); for (int i = 0; i < GRID_SIZE; i++) { for (int j = 0; j < GRID_SIZE; j++) { int mLeft = i * GRID_WIDTH + mStartX; int mTop = j * GRID_WIDTH + mStartY; int mRright = mLeft + , GRID_WIDTH; int mBottom = mTop + , GRID_WIDTH; canvas.drawRect(mLeft, mTop, mRright, mBottom, paintRect); } } //绘制棋盘的外边框 paintRect.setStrokeWidth(4); canvas.drawRect(mStartX, mStartY, mStartX + GRID_WIDTH*, mStartY + GRID_WIDTH*, GRID_SIZE, paintRect); } //绘制棋子 for (int i = 0; i < GRID_SIZE-1; i++) { for (int j = 0; j < GRID_SIZE-1; j++) { if (mGridArray[i][j] == BLACK) { //通过图片来绘制 //canvas.drawBitmap(mChessBW[0], mStartX + (i+1) * GRID_WIDTH - CHESS_DIAMETER/2 , mStartY + (j+1)* GRID_WIDTH - CHESS_DIAMETER/2 , mPaint); //通过圆形来画 { Paint paintCircle = new Paint(); paintCircle.setColor(Color.BLACK); canvas.drawCircle(mStartX + (i+1) * GRID_WIDTH, mStartY + (j+1)* GRID_WIDTH, CHESS_DIAMETER/2, paintCircle); } } else if (mGridArray[i][j] == WHITE) { //通过图片来绘制 //canvas.drawBitmap(mChessBW[1], mStartX + (i+1) * GRID_WIDTH - CHESS_DIAMETER/2 , mStartY + (j+1)* GRID_WIDTH - CHESS_DIAMETER/2 , mPaint); //通过圆形来画 { Paint paintCircle = new Paint(); paintCircle.setColor(Color.WHITE); canvas.drawCircle(mStartX + (i+1) * GRID_WIDTH, mStartY + (j+1)* GRID_WIDTH, CHESS_DIAMETER/2, paintCircle); } } } } } public void putChess(int x, int y, int blackwhite) { mGridArray[x][y] = blackwhite; } public boolean checkWin(int wbflag) { for(int i = 0; i < GRID_SIZE - 1 ; i++ ) //i表示列(根据宽度算出来的) for(int j = 0; j < GRID_SIZE - 1; j++{//i表示行(根据高度算出来的) //检测横轴五个相连 if (((i+4) < (GRID_SIZE - 1)) && ] == wbflag) && (mGridArray[i+1][j] == wbflag) && (mGridArray[i + 2][j] == wbflag) && (mGridArray[i + 3][j] == wbflag) && (mGridArray[i + 4][j] == wbflag) { "win"); + mWinFlag = wbflag; if (mWinFlag == wbflag) { } //纵轴5个相连 if (((j+4) < (GRID_SIZE - 1)) && ] == wbflag) && (mGridArray[i][j+1] == wbflag) && (mGridArray[i][j+ 2] == wbflag) && (mGridArray[i][j+ 3] == wbflag) && (mGridArray[i][j+ 4Log.e("check win or loss:", wbflag "win"); + mWinFlag = wbflag; if (mWinFlag == wbflag) { } //左上到右下5个相连 if (((j+4) < (GRID_SIZE - 1)) && ((i+4) < (GRID_SIZE - 1) && ] == wbflag) && (mGridArray[i+1] == wbflag)) {+1] == wbflag) && (mGridArray[i + 2 ] == wbflag)) {+ 2][j + 3] == wbflag)) {+ 3][j + 4 ] == wbflag)) {+ 4Log.e("check win or loss:", wbflag "win"); + mWinFlag = wbflag; if (mWinFlag == wbflag) { } //右上到左下5个相连 if (((i-4) >= 0) && ((j+4) < (GRID_SIZE - 1) && ] == wbflag) && (mGridArray[i-1] == wbflag)) {+1] == wbflag) && (mGridArray[i - 2 ] == wbflag)) {+ 2][j - 3] == wbflag)) {+ 3][j - 4 ] == wbflag)) {+ 4Log.e("check win or loss:", wbflag "win"); + mWinFlag = wbflag; if (mWinFlag == wbflag) { } } return true; else } return false; } public boolean checkFull() { int mNotEmpty = 0; for(int i = 0; i < GRID_SIZE -1; i ++) for(int j = 0; j < GRID_SIZE - 1; j ++{ if(mGridArray[i][j] != 0) mNotEmpty +=1; } if(mNotEmpty == (GRID_SIZE-1)*(GRID_SIZE-1)) return true; else return false; } public void showTextView(CharSequence mT){ this.mStatusTextView.setText(mT); mStatusTextView.setVisibility(View.VISIBLE); } }
PS: Hier empfehlen wir noch ein weiteres js-basiertes Fünferliga-Spiel dieser Website zur Referenz (der AI ist relativ einfach)
Online-Fünferliga-Spiel:
http://tools.jb51.net/games/wuziqi
Interessierte Leser, die mehr über Android-Themen erfahren möchten, können die Themenbereiche dieser Website besuchen: "Einführung und Fortgeschrittene Android-Entwicklung", "Android-Debugging-Techniken und Zusammenfassung häufiger Problemebehandlungsmethoden", "Zusammenfassung der Verwendung von Android-Basiskomponenten", "Zusammenfassung der Techniken der Android-Ansichten View", "Zusammenfassung der Techniken der Android-Layouts layout" und "Zusammenfassung der Verwendung von Android-Kontrollen"
Wir hoffen, dass die in diesem Artikel beschriebenen Inhalte allen bei der Android-Programmgestaltung helfen.
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Sie übernimmt keine rechtlichen Haftung. Wenn Sie urheberrechtlich anstößigen Inhalt entdecken, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @ beim Senden einer E-Mail zur Meldung von Verstößen und stellen Sie relevante Beweise zur Verfügung. Bei nachgewiesener Verletzung wird diese Website sofort den beanstandeten urheberrechtlichen Inhalt löschen.)