トップページ | 全エントリー一覧 | RSS購読

Twitter

訪問者数

プロフィール

オリナス

Author:オリナス
続・脱サラの道2にようこそ〜
アメブロより移転してきました。
宜しくお願いします。

カテゴリ

最新記事

月別アーカイブ

検索フォーム

RSSリンクの表示

QRコード

QR

ブロとも申請フォーム

メールフォーム

名前:
メール:
件名:
本文:

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
トラックバック
トラックバック送信先 :
コメント

古い記事にコメントを頂いたので貼付けます

Androidで動くテトリスのソースコードです。

一つのクラスで作ってますのでちょっと恥ずかしいですが、コメントを頂いたので貼付けます。

まぁ~商用価値0となったテトリスは勉強用にはうってつけということで・・・

ただ正直、最近JAVAの開発環境を更新してないので、現状の開発環境で動くかどうかは未定です。

あと・・・質問されても・・・覚えてませんw

あらかじめご了承ください。

----以下java言語

↓パッケージ名
package ********;


import java.util.Random;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RectShape;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
import android.view.KeyEvent;
import android.view.SurfaceView;

public class Droidris extends Activity {
private class FieldView extends SurfaceView {

Random mRand = new Random(System.currentTimeMillis());

int[][][] blocks = {
{
{1,1},
{0,1},
{0,1}
},
{
{1,1},
{1,0},
{1,0}
},
{
{1,1},
{1,1}
},
{
{1,0},
{1,1},
{1,0}
},
{
{1,0},
{1,1},
{0,1}
},
{
{0,1},
{1,1},
{1,0}
},
{
{1},
{1},
{1},
{1}
}
};

int[][] block = blocks[mRand.nextInt(blocks.length)];
int posx, posy;
int mapWidth = 10;
int mapHeight = 20;
int[][] map = new int[mapHeight][];

public FieldView(Context context) {
super(context);

setBackgroundColor(0xFFFFFFFF);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
}

public void initGame() {
for (int y = 0; y < mapHeight; y++) {
map[y] = new int[mapWidth];
for (int x = 0; x < mapWidth; x++) {
map[y][x] = 0;
}
}
}

private void paintMatrix(Canvas canvas, int[][] matrix, int offsetx, int offsety, int color) {
ShapeDrawable rect = new ShapeDrawable(new RectShape());
rect.getPaint().setColor(color);
int h = matrix.length;
int w = matrix[0].length;

for (int y = 0; y < h; y ++) {
for (int x = 0; x < w; x ++) {
if (matrix[y][x] != 0) {
int px = (x + offsetx) * 20;
int py = (y + offsety) * 20;
rect.setBounds(px, py, px + 20, py + 20);
rect.draw(canvas);
}
}
}
}


boolean check(int[][] block, int offsetx, int offsety) {
if (offsetx < 0 || offsety < 0 ||
mapHeight < offsety + block.length ||
mapWidth < offsetx + block[0].length) {
return false;
}
for (int y = 0; y < block.length; y ++) {
for (int x = 0; x < block[y].length; x ++) {
if (block[y][x] != 0 && map[y + offsety][x + offsetx] != 0) {
return false;
}
}
}
return true;
}

void mergeMatrix(int[][] block, int offsetx, int offsety) {
for (int y = 0; y < block.length; y ++) {
for (int x = 0; x < block[0].length; x ++) {
if (block[y][x] != 0) {
map[offsety + y][offsetx + x] = block[y][x];
}
}
}
}

void clearRows() {
// 埋まった行は消す。nullで一旦マーキング
for (int y = 0; y < mapHeight; y ++) {
boolean full = true;
for (int x = 0; x < mapWidth; x ++) {
if (map[y][x] == 0) {
full = false;
break;
}
}

if (full) map[y] = null;
}

// 新しいmapにnull以外の行を詰めてコピーする
int[][] newMap = new int[mapHeight][];
int y2 = mapHeight - 1;
for (int y = mapHeight - 1; y >= 0; y--) {
if (map[y] == null) {
continue;
} else {
newMap[y2--] = map[y];
}
}

// 消えた行数分新しい行を追加する
for (int i = 0; i <= y2; i++) {
int[] newRow = new int[mapWidth];
for (int j = 0; j < mapWidth; j ++) {
newRow[j] = 0;
}
newMap[i] = newRow;
}
map = newMap;
}

/**
* Draws the 2D layer.
*/
@Override
protected void onDraw(Canvas canvas) {
ShapeDrawable rect = new ShapeDrawable(new RectShape());
rect.setBounds(0, 0, 210, 410);
rect.getPaint().setColor(0xFF000000);
rect.draw(canvas);
canvas.translate(5, 5);
rect.setBounds(0, 0, 200, 400);
rect.getPaint().setColor(0xFFFFFFFF);
rect.draw(canvas);

paintMatrix(canvas, block, posx, posy, 0xFFFF0000);
paintMatrix(canvas, map, 0, 0, 0xFF808080);
}

int[][] rotate(final int[][] block) {
int[][] rotated = new int[block[0].length][];
for (int x = 0; x < block[0].length; x ++) {
rotated[x] = new int[block.length];
for (int y = 0; y < block.length; y ++) {
rotated[x][block.length - y - 1] = block[y][x];
}
}
return rotated;
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
int[][] newBlock = rotate(block);
if (check(newBlock, posx, posy)) {
block = newBlock;
}
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (check(block, posx + 1, posy)) {
posx = posx + 1;
}
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
if (check(block, posx - 1, posy)) {
posx = posx - 1;
}
break;
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
int y = posy;
while (check(block, posx, y)) { y++; }
if (y > 0) posy = y - 1;

break;
}
mHandler.sendEmptyMessage(INVALIDATE);
return true;
}

public void startAnime() {
mHandler.sendEmptyMessage(INVALIDATE);
mHandler.sendEmptyMessage(DROPBLOCK);
}

public void stopAnime() {
mHandler.removeMessages(INVALIDATE);
mHandler.removeMessages(DROPBLOCK);
}

private static final int INVALIDATE = 1;
private static final int DROPBLOCK = 2;

/**
* Controls the animation using the message queue. Every time we receive an
* INVALIDATE message, we redraw and place another message in the queue.
*/
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case INVALIDATE:
invalidate();
break;
case DROPBLOCK:
if (check(block, posx, posy + 1)) {
posy++;
} else {
mergeMatrix(block, posx, posy);
clearRows();
posx = 0; posy = 0;
block = blocks[mRand.nextInt(blocks.length)];
}

invalidate();
Message massage = new Message();
massage.what = DROPBLOCK;
sendMessageDelayed(massage, 500);
break;
}
}
};
}

FieldView mFieldView;

private void setFieldView() {
if (mFieldView == null) {
mFieldView = new FieldView(getApplication());
setContentView(mFieldView);
}
}

@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
}

@Override
protected void onResume() {
super.onResume();
setFieldView();
mFieldView.initGame();
mFieldView.startAnime();
Looper.myQueue().addIdleHandler(new Idler());
}


@Override
protected void onPause() {
super.onPause();
mFieldView.stopAnime();
}

@Override
protected void onStop() {
super.onStop();
mFieldView.stopAnime();
}


// Allow the activity to go idle before its animation starts
class Idler implements MessageQueue.IdleHandler {
public Idler() {
super();
}

public final boolean queueIdle() {
return false;
}
}
}
スポンサーサイト
トラックバック
トラックバック送信先 :
コメント

iPhoneアプリ

Run打Jet:
カジュアルゲーム
$続・脱サラの道2
手配書 - Listener Amusement Android app on Google Play

Run打!!:
ひたすら連打ゲーム
$続・脱サラの道2
手配書 - Listener Amusement

セルフタイマーカメラ:
selfCamFull
セルフタイマー機能搭載
$続・脱サラの道2
手配書 - Listener Amusement

微音セルフカメラ:
selfCamTime
セルフタイマー機能を搭載
$続・脱サラの道2
手配書 - Listener Amusement

最速微音カメラ:
SpeedCamera
起動が早い微音カメラ
$続・脱サラの道2
手配書 - Listener Amusement

超微音カメラ: SmallSound
微音カメラの亜種Verです。
ズームなどが追加されています。
$続・脱サラの道2
手配書 - Listener Amusement

超微音PRO: SmallSoundP
100万ダウンロードを超えた
微音カメラの有料版!
$続・脱サラの道2
手配書 - Listener Amusement

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。