Coding/JavsScript 삽질기2020. 9. 10. 01:40

자바스크립트를 이용하여 테트리스를 만들고, 이를 Android의 WebView를 이용하여 Android 앱으로 만들어 보았다.

소스코드: github.com/chobocho/JsTetris

 

chobocho/JsTetris

Javascript tetris. Contribute to chobocho/JsTetris development by creating an account on GitHub.

github.com

다운로드: play.google.com/store/apps/details?id=com.chobocho.jstetris

 

Classic Block Game V2 - Google Play 앱

Simple block game

play.google.com

웹 브라우저로 해보기 (크롬에서만 동작 확인을 했습니다)

www.chobocho.com/game/tetris/tetris.html

 

Chobocho's Tetris

 

www.chobocho.com

* 사용키 : 방향키, 스페이스 (블록 아래로 내리기), Ctrl (Hold), S (Start / Resume), P (Pause)

 

Posted by chobocho

댓글을 달아 주세요

  1. 재미있는 글 매우 잘 배우고 가용~

    2020.11.26 03:06 [ ADDR : EDIT/ DEL : REPLY ]

Coding/Java 삽질기2019. 1. 31. 00:32

2019년 Toy project로 2018년에 만들었던 테트리스를 업데이트 하기로 했다.


1. 결과물

먼저 기본 기능만 동작하는 테트리스(?)의 동작 화면은 아래와 같다.


[다운로드 링크]

https://play.google.com/store/apps/details?id=com.chobocho.tetris


[Source code]

https://github.com/chobocho/ClassBlockGame




Posted by chobocho
TAG Tetris, UML

댓글을 달아 주세요

Coding/Java 삽질기2018. 5. 3. 00:08

기존에 Java로 만든 Tetris를 2인용으로 바꾸려고 하니, 구조에 문제가 있다는 걸 깨닫고,

키입력과 UI를 담당할 Player 클래스를 추가했다.

Key입력에 따른 동작과 화면을 그려 주는 부분을 변경 할 수 있도록, Strategy pattern을 적용하였다.

UI 클래스는 단지 키보드 입력을 받아 Player 객체로 전달하고,

Player 객체가 그린 화면을 뿌려주는 역할만 하도록 하였다.



ChoboTetris_20180504.zip

Source : https://github.com/chobocho/JavaTetris

Posted by chobocho

댓글을 달아 주세요

  1. 소리나 점수 시스템이 있으면 좋았을텐데~

    잘즐겼습니다!

    2019.07.03 14:15 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 주인장

      추후 개선해 보겠습니다.

      2019.07.10 00:30 [ ADDR : EDIT/ DEL ]
  2. 비밀댓글입니다

    2019.10.20 15:04 [ ADDR : EDIT/ DEL : REPLY ]
  3. 답변이 늦어 죄송합니다.
    TetrisBoard.java 의 isAcceptable 함수는 현재 블록을 표시 하려는 위치에 기존에 다른 블럭이 존재하는지
    확인하여, 다른 블럭이 존재하지 않으면 true를 리턴 합니다.

    if (board[y+i][x+j] != Tetris.EMPTY) {
    return false;
    }
    물론 현재 블록의 위치가 보드의 범위를 벗어난 경우에는 false를 리턴합니다.

    2019.11.07 02:08 신고 [ ADDR : EDIT/ DEL : REPLY ]

Coding/Java 삽질기2018. 4. 28. 03:00


Source : https://github.com/chobocho/JavaTetris

구조설명 : http://chobocho.tistory.com/2461355

ChoboTetris_20180429.zip


Java GUI Refer : http://zetcode.com/tutorials/javagamestutorial/tetris/

'Coding > Java 삽질기' 카테고리의 다른 글

Java Tetris (자바 테트리스 만들기 2)  (4) 2018.05.03
Java Tetris (자바 테트리스 만들기 1)  (7) 2018.04.28
UML of Alarm clock  (0) 2018.04.06
Android 화면 녹화 방법  (0) 2018.01.04
Posted by chobocho
TAG Java, Tetris

댓글을 달아 주세요

  1. ♬♬♫♩

    2020.04.24 11:10 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. ㅇㅇ

    초보초님께서 올려주신 테트리스를 통해 과제를 하고 있습니다. 정말 감사드립니다만, 주석이 조금 부족해서 이해가 안되는 부분이 있습니다 질문 드려도 될까요?

    2020.05.19 00:54 [ ADDR : EDIT/ DEL : REPLY ]
  3. 비밀댓글입니다

    2020.05.19 23:57 [ ADDR : EDIT/ DEL : REPLY ]
  4. 답변이 늦어 죄송합니다. 오늘 댓글을 봤네요 ^^;;

    1) GameState 에 대해서는 아래 글을 참고 하시기 바랍니다.
    https://chobocho.tistory.com/2461355
    idle state는 게임을 초기화 상태 입니다.

    2) oneAction 은 사용자의 입력을 받아서, Tetris 게임의 동작에 반영하는 클래스 입니다.
    3) oneDraw는 화면에 그려주기 위한 함수로, game state에 따라서 다른 화면을 그려주도록 하기 위한 클래스 입니다.
    4) Rotate 함수는 블럭의 방향을 변경해 주는 함수입니다.
    각각의 블럭 클래스는 회전 할 이미지 정보 모두 가지고 있으므로, 거기에 맞게 회전을 하게 합니다.
    블럭 클래스의 rotate 함수를 참고 하시면 됩니다.
    5) Tetrislog 클래스는 처음 이 게임을 만들때 부터, android드로 포팅을 하려고 만든거라서,
    Android 포팅시 로그 처리를 위해서 만든 함수 입니다. (wrapper class)

    * 2년전에 만든소스라서...소스가 많이 허접하네요 ^^
    좋은 하루 되세요.

    2020.05.30 12:11 신고 [ ADDR : EDIT/ DEL : REPLY ]
  5. 김태진

    정말 감사합니다! 웹 공부만 하다가 이런 게임도 만들어보는게 언어에 대한 이해에 도움이 될 것 같아요!! 감사합니다!!

    2020.08.02 14:31 [ ADDR : EDIT/ DEL : REPLY ]

Coding/Java 삽질기2018. 1. 3. 01:37

2018년 Toy project로 기능 추가가 쉬운(?) 테트리스를 만들어 보기로 했다.


1. 결과물

먼저 기본 기능만 동작하는 테트리스(?)의 동작 화면은 아래와 같다.


[ 다운로드 링크 ]

https://play.google.com/store/apps/details?id=com.chobocho.tetris


[ Source code ]

https://github.com/chobocho/AndroidTetris


[ Build guide ]

Guide for Android Tetris.pdf






2. 설계

먼저 구현을 위하여 아래와 같이 UML을 그렸다.




3. 상세설명

3.1 Block

Tetris는 아래 7가지 Block를 사용한다

그래서 Tetrominos 라는 추상 클래스를 만들고, 모든 블럭은 이 클래스를 상속받아서 만든다

이렇게 하면 추후 다른 모양의 블럭을 추가 하기가 쉽다.

[ Tetroinos.java ]

package com.chobocho.tetris;
import java.util.*;

public abstract class Tetrominos {
protected int x;
protected int y;
protected int r;
protected int w;
protected int h;
protected int type;
protected int numOfBlockType;
protected int[][][] block;


public Tetrominos() {
}

public void rotate() {
r = (r+1) % numOfBlockType;
}

public void preRotate() {
r = (r-1+numOfBlockType) % numOfBlockType;
}

public void moveLeft() {
x--;
}

public void moveRight() {
x++;
}


public void moveDown() {
y++;
}

public void moveUp() {
y--;
}

public int[][] getBlock() {
return null;
}

public int getWidth() {
return w;
}

public int getHeight() {
return h;
}

public int getX() {
return x;
}

public int getY() {
return y;
}

public int getType() { return type; }
}

각각의 블록은 위 클래스를 상속받아서 구현 한다.

x, y : 블럭이 보드에 표시되는 시작 좌표

w, h : 블럭을 나타내는 배열의 크기 (블럭마다 다르다. I의 경우 4x4 지만, ㅁ의 경우 2x2 면 된다)

r : 회전한 값을 나타내기 위해 필요하다

type : 블럭의 색상을 나타내기 위해 사용한다

numOfBlock : 블럭 회전시 나타날 수 있는 모양의 수 이다.

실제 이를 상속받은 I형 블럭의 구현 클래스의 소스를 확인하면 아래와 같다

[ ITetrominos.java ]

package com.chobocho.tetris;
import java.util.*;

public class ITetrominos extends Tetrominos {

public ITetrominos() {
this.block = new int[][][]{
{
{1, 0, 0, 0},
{1, 0, 0, 0},
{1, 0, 0, 0},
{1, 0, 0, 0},
},
{
{1, 1, 1, 1},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
}
};
numOfBlockType = 2;
x = 3;
y = 0;
r = 0;
w = 4;
h = 4;
type = 1;
}

public int[][] getBlock() {
return block[r];
}
}


3.2 Tetrominos Factory

Tetris 에서 사용하는 블럭을 만들어 주는 Factory class 이다

게임에 사용되는 모든 블럭은 이 클래스를 통하여 생성한다


[ TetrominosFactory.java ]

Factory pattern을 사용하여, Tetrominos 블럭을 생성한다.

package com.chobocho.tetris;
import java.util.*;

public class TetrominosFactory {

public static Tetrominos create() {
switch( (int) (Math.random() * 7)) {
case 0:
return new OTetrominos();
case 1:
return new ITetrominos();
case 2:
return new LTetrominos();
case 3:
return new JTetrominos();
case 4:
return new TTetrominos();
case 5:
return new STetrominos();
case 6:
return new ZTetrominos();
default:
return new ITetrominos();
}
}

private TetrominosFactory() {}
}

3.3 State

본 테트리스 게임은 4가지의 State를 가진다

1) IDLE

2) PLAY

3) PAUSE

4) GAMEOVER


[ Tetris game state chart ]


그래서 State pattern을 적용하였다.

각각의 State는 TetrisGameState를 상속받는 구조로 되어 있고, 실제 게임 동작은 TetrisPlayState에서 이루어 진다.

[ TetrisGameState.java ]

package com.chobocho.tetris;

public abstract class TetrisGameState {
protected ITetris tetris;

public TetrisGameState() {}

public void init() {}

public void rotate() {}

public void moveLeft() {}

public void moveRight() {}

public void moveDown() {}

public void fixCurrentBlock() {}

public void moveBottom() {}

public void updateBlock() {}

public boolean gameOver() {
return false;
}

public void updateBoard() {}

public Tetrominos getCurrentTetrominos() {
return null;
}

public Tetrominos getNextTetrominos() { return null; }

public void update() {
TetrisLog.d("TetrisGameState.update()");
}
}


TetrisPlayState는 TetrisGameState를 상속받으며, 현재 블럭과 다음 블럭의 정보를 가지고 있다.

사용자가 화면을 터치하여 블럭을 움직이거나 회전을 하게 되면 블럭의 정보를 업데이트 하고

보드에 블럭정보를 업데이트 하는 동작을 한다.

블럭을 이동하고 나면 Observer pattern을 이용하여 UI 화면을 갱신한다


[ TetrisPlayState.java ]

package com.chobocho.tetris;

public class TetrisPlayState extends TetrisGameState {
private Tetrominos currentTetrominos;
private Tetrominos nextTetrominos;
private TetrisBoard tetrisBoard;
private int additionalPoint = 1;

public TetrisPlayState(Tetris tetris, TetrisBoard board) {
this.tetris = tetris;
this.tetrisBoard = board;
currentTetrominos = TetrominosFactory.create();
nextTetrominos = TetrominosFactory.create();
}

public void init() {
this.tetrisBoard.init();
currentTetrominos = TetrominosFactory.create();
nextTetrominos = TetrominosFactory.create();
additionalPoint = 1;
}

public void update() {
TetrisLog.d("TetrisPlayState.update()");
tetris.getObserver().updatePlay();
}

public void moveLeft() {
TetrisLog.d("TetrisPlayState.moveLeft()");
currentTetrominos.moveLeft();
if (tetrisBoard.isAcceptable(currentTetrominos) == false) {
currentTetrominos.moveRight();
TetrisLog.d("Not Accept");
} else {
TetrisLog.d("Accept");
}
}

public void moveRight() {
TetrisLog.d("TetrisPlayState.moveRight()");
currentTetrominos.moveRight();
if (tetrisBoard.isAcceptable(currentTetrominos) == false) {
currentTetrominos.moveLeft();
TetrisLog.d("Not Accept");
} else {
TetrisLog.d("Accept");
}
}

public void rotate() {
TetrisLog.d("TetrisPlayState.rotate()");
currentTetrominos.rotate();
if (tetrisBoard.isAcceptable(currentTetrominos) == false) {
currentTetrominos.preRotate();
TetrisLog.d("Not Accept");
} else {
TetrisLog.d("Accept");
}
}

public void moveDown() {
TetrisLog.d("TetrisPlayState.moveDown()");
currentTetrominos.moveDown();
if (tetrisBoard.isAcceptable(currentTetrominos) == false) {
currentTetrominos.moveUp();
TetrisLog.d("Can not move down");
fixCurrentBlock();
updateBoard();
updateBlock() ;
} else {
TetrisLog.d("Accept");
}
}

public void moveBottom() {
TetrisLog.d("TetrisPlayState.moveBottom()");
while(tetrisBoard.isAcceptable(currentTetrominos)) {
currentTetrominos.moveDown();
}
if (tetrisBoard.isAcceptable(currentTetrominos) == false) {
currentTetrominos.moveUp();
}
}

public void fixCurrentBlock() {
tetrisBoard.addTetrominos(currentTetrominos);
}

public void updateBlock() {
currentTetrominos = nextTetrominos;
nextTetrominos = TetrominosFactory.create();
}

public boolean gameOver() {
TetrisLog.d("Game over!");
return (tetrisBoard.isAcceptable(currentTetrominos) == false);
}

public void updateBoard() {
int removedLine = tetrisBoard.arrange();
int point = calculatorScore(removedLine);
tetris.addSore(point);
}

private int calculatorScore(int removedLineCount) {
if (removedLineCount == 0) {
additionalPoint = 1;
return 0;
}
if (removedLineCount >= 4) {
removedLineCount = 4;
}
if (additionalPoint > 10000) {
additionalPoint = 10000;
}
additionalPoint <<= removedLineCount;
TetrisLog.d("calculatorScore : " + additionalPoint + " : " + removedLineCount);
return (removedLineCount * 10 * additionalPoint);
}

public Tetrominos getCurrentTetrominos() {
return currentTetrominos;
}

public Tetrominos getNextTetrominos() {
return nextTetrominos;
}
}

3.4 Board

3.5 Observer pattern

3.6 Tetris


3.7 Source 코드로 부터 생성한 UML






4. Reference

* Head first design pattern


* 질문은 언제나 환영 합니다.

Posted by chobocho

댓글을 달아 주세요

  1. 자바처보

    잘 봤습니다 우와! 혹시 시간이 될때 주석으로 기능 설명 좀 해주 실 수 있너요^^

    2018.06.19 16:59 [ ADDR : EDIT/ DEL : REPLY ]
    • 안녕하세요. 이해가 잘 안가는 부분을 알려주시면 그 부분 설명을 추가하겠습니다 ^^

      2018.06.19 18:33 신고 [ ADDR : EDIT/ DEL ]
  2. 왕십리 살쾡이

    안녕하세요
    현재 자바를 공부하는 학생입니다. 테트리스 관련해서 검색하다가 우연히 이곳에 들리게 되었습니다.
    정리가 매우잘되어있어서 (클래스 다이어그램이나 이전 글에서의 알고리즘들) 테트리스 공부 참고용으로 사용해두 될까 싶어서 댓글남겨봅니다.(__)
    영리적인 목적은 사용하지않고 개인 자바프로젝트때문이라서댓글 남겨봅니다

    2019.09.02 16:32 [ ADDR : EDIT/ DEL : REPLY ]
    • 주인장

      안녕하세요.
      관심을 가져주셔서 감사합니다.
      모든 자료는 편하게 쓰셔도 됩니다.

      2019.09.10 22:36 [ ADDR : EDIT/ DEL ]
  3. 비밀댓글입니다

    2020.11.06 17:11 [ ADDR : EDIT/ DEL : REPLY ]
    • 방문해 주셔서 감사합니다.
      저는 xml을 쓰지않고, view를 상속받아서 canvas 에 직접 그리는 방식으로 구현했습다.
      시작 버튼을 눌렀을 때의 동작은 PlayerInputImplForN8.java 의 touch()함수를 보시면 됩니다.

      2020.11.07 00:21 신고 [ ADDR : EDIT/ DEL ]
    • 제가 만든 코드는 Tetris 로직 부분하고
      안드로이드에 게임 화면을 그리는 부분이 분리되어 있습니다. 안드로이드에서 게임 화면을 그리는 부분을 직접 구현하지 않으실거라면 모든 파일이 다 있어야 합니다.

      원하시는걸 하시려면, startActivity로 직접 제 코드의 ChoboTetrisActivity 를 호출 하는게 제일 간단한 방법 일겁니다.

      2020.11.07 17:59 신고 [ ADDR : EDIT/ DEL ]
    • 비밀댓글입니다

      2020.11.07 18:35 [ ADDR : EDIT/ DEL ]
    • TetrisViewForN8.java 에 보시면
      public boolean onTouchEvent(MotionEvent event) {
      // ...
      return playerInput.touch(x, y);
      }


      PlayerInputImplForN8.java
      public boolean touch(int touchX, int touchY) {
      // 입력 좌표가 down 버튼이면 아래로

      if (downArrowBtn.in(touchX, touchY)) {
      Log.d(TAG, "down()";);
      down();
      return true;
      }
      }

      위 와 같은 원리로 동작합니다.
      원하시는 걸 하시려면, PlayerInputImplForN8에 down()을 호출 하시는 함수를 하나 선언해서
      TetrisViewForN8.java에서 부르게 하면 됩니다.

      2020.11.07 19:09 신고 [ ADDR : EDIT/ DEL ]
    • 비밀댓글입니다

      2020.11.09 15:42 [ ADDR : EDIT/ DEL ]
  4. 비밀댓글입니다

    2020.11.12 23:07 [ ADDR : EDIT/ DEL : REPLY ]
  5. 재미있는 내용 정말 잘 배우고 가여

    2020.11.19 00:09 [ ADDR : EDIT/ DEL : REPLY ]
  6. 비밀댓글입니다

    2020.11.25 15:12 [ ADDR : EDIT/ DEL : REPLY ]
    • 방문해 주셔서 감사합니다.

      https://github.com/chobocho/ClassBlockGame/blob/master/src/ChoboTetrisActivity/app/src/main/java/com/chobocho/tetrisgame/ChoboTetrisActivity.java

      여기에서, 화면 해상도 값을 얻어와서,
      그 값을 기준으로 이미지를 그렸습니다.

      int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
      int screenHeight = getWindowManager().getDefaultDisplay().getHeight();

      2020.11.25 23:31 신고 [ ADDR : EDIT/ DEL ]
    • Canvas 해상도 버그를 수정한 버전은
      아래 링크에 올려 두었습니다.

      https://github.com/chobocho/ClassBlockGame

      2020.11.26 09:24 신고 [ ADDR : EDIT/ DEL ]

Coding/Java 삽질기2016. 3. 17. 02:44



심심해서 다시 만들어 보는 테트리스


'Coding > Java 삽질기' 카테고리의 다른 글

Android studio 디바이스 연결  (0) 2016.08.20
Tetris  (0) 2016.03.17
1. 온라인 테트리스 만들기 ( 이클립스 설치 )  (1) 2014.01.03
초간단 보이스 레코더  (0) 2013.03.08
Posted by chobocho
TAG Java, Tetris

댓글을 달아 주세요

Coding/Java 삽질기2014. 1. 3. 02:26

* 맥에서 이클립스 개발환경을 만드는 제일 간단한 방법


1) 아래 사이트에서 안드로이드 개발툴을 다운 받아서 설치한다.

http://developer.android.com/sdk/index.html

2) 이클립스를 실행하면 자동으로 자바를 다운 받는다.

3) 자바 설치 후 이클립스 실행



Next-> http://chobocho.tistory.com/2461355

'Coding > Java 삽질기' 카테고리의 다른 글

Tetris  (0) 2016.03.17
1. 온라인 테트리스 만들기 ( 이클립스 설치 )  (1) 2014.01.03
초간단 보이스 레코더  (0) 2013.03.08
ChoboSMS  (0) 2013.02.26
Posted by chobocho
TAG Tetris

댓글을 달아 주세요

  1. 도움되는 내용 정말 잘 배우고 가요

    2020.11.18 04:05 [ ADDR : EDIT/ DEL : REPLY ]

Coding/Java 삽질기2010. 3. 10. 00:13


자바로 만든 테트리스

* 소스가 필요하신 분은 댓글을 남겨 주세요 ^^

'Coding > Java 삽질기' 카테고리의 다른 글

Text2Memo  (0) 2010.05.09
Tetris  (2) 2010.03.10
Fruit Game  (4) 2010.03.06
[Java] 숫자 세기 게임  (0) 2009.10.22
Posted by chobocho

댓글을 달아 주세요

  1. 비밀댓글입니다

    2016.11.27 17:18 [ ADDR : EDIT/ DEL : REPLY ]