1. 시작하기

   1.1. 테트리스 게임 소개

테트리스는 누구나 한 번쯤 들어 본 게임이기에, 설명은 생략 합니다.

테트리스에 대한 자세한 사항은 아래 링크를 참고 하시기 바랍니다.

 

   1.2. 구현 할 테트리스 게임의 요구사항 정의

우리가 만들 테트리스 게임은 아래 사이트에서 플레이 할 수 있습니다.

 

Chobosho's tetris

Tetris!

chobocho.com

 

안드로이드로 포팅한 버전은 아래 사이트에서 플레이 할 수 있습니다.

 

Classic Block Game V2 - Google Play 앱

안드로이드용 클래식 블록 게임입니다.

play.google.com

 

그리고, 전체 소스는 아래에서 다운 받을 수 있습니다.

 

이번에 구현 할 테트리스 게임은 아케이드 모드, 퍼즐 모드, 아이템 모드 총 3개의 모드로 구성이 됩니다.

 

1.2.1 아케이드 모드

테트리스의 기본 형태로, 모두가 잘 알고 있는 내용이라, 자세한 설명은 생략합니다.

1.2.2 퍼즐모드

퍼즐 모드 테트리스는 고전적인 테트리스 게임을 벗어나, 플레이어의 두뇌와 반응 속도를 동시에 시험하는 독특한 경험을 제공합니다. 이 게임에는 70가지 이상의의 다양한 퍼즐이 포함되어 있어, 게임을 진행하면서 플레이어의 전략적 사고력을 향상시키는 동시에 문제 해결 능력을 증진시키는 데 도움이 됩니다.
각 스테이지의 목표는 화면에 보이는 색상이 있는 블록을 모두 제거하는 것입니다. 이는 단순히 블록을 빠르게 쌓는 것을 넘어서, 플레이어가 어떻게 블록을 배치하고 어떤 블록을 사용할지를 신중하게 고려해야 하는 전략적인 요소를 게임에 도입합니다.

1.2.3 아이템 모드

아이템 모드는 다양한 아이템들이 포함된 전략적인 게임을 제공 합니다. 이 모드의 주요 아이템들은 Yellow Thunder, Black Thunder, Orange Thunder, Red Thunder, Blue Boom, Black Boom, Green Boom, 그리고 Red Boom입니다.

Yellow Thunder는 화면의 모든 검은 폭탄을 폭발시키며, Black Thunder는 최대 3개의 폭탄을 화면에 추가합니다. Orange Thunder는 아이콘이 바닥에 닿을 때 중심을 기준으로 3x3 영역을 지웁니다. 단, 아이콘이 포함된 줄이 꽉 차있다면 작동하지 않습니다. Red Thunder는 아이콘이 바닥에 닿으면 현재 위치한 세로 라인과 오른쪽 세로 라인을 지웁니다.

Blue Boom은 아이콘이 바닥에 닿았을 때 중심 주변 3x3 크기를 회색 블록으로 채웁니다. Black Boom은 폭탄이 포함된 줄이 블록으로 꽉 차면 위 아래 한 줄씩 총 3줄을 삭제합니다. Green Boom은 원형의 회색 블록을 추가합니다. 단, 아이콘이 포함된 줄이 꽉 차있다면 작동하지 않습니다. Orange Boom은 아이콘 중심으로 빈 3x3 사각형을 그립니다. 마찬가지로, 아이콘이 포함된 줄이 꽉 차있다면 작동하지 않습니다. Red Boom은 아이콘이 위치한 한 줄을 지웁니다.

아이템 테트리스는 이러한 독특한 아이템들을 활용해 주어진 판의 블록들을 모두 제거하면서, 전략적으로 높은 점수를 달성하는 것이 목표입니다.

플레이어들은 다양한 아이템을 사용하여 게임을 더욱 재미있게 즐길 수 있습니다.

 

Posted by chobocho
Coding/JavsScript 삽질기2023. 4. 18. 00:16

게임 플레이 해보기
http://www.chobocho.com/game/tetris/

 

Chobosho's tetris

Tetris!

chobocho.com

 

자바스크립트를 공부하면서 만든 아이템 테트리스 소스 입니다.
인터넷을 대충 뒤져 보니, 간단한 테트리스 소스는 많으나,
퍼즐 테트리스, 아이템 테트리스 소스는 없어서 공개 합니다.


 



소스코드 위치
https://github.com/chobocho/webTetris/tree/item_tetris

 

GitHub - chobocho/webTetris: Javascript tetris

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

github.com

좋아요, 추천은 힘이 됩니다! ^^
 

Posted by chobocho
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
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
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

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

Java Hexa (자바 헥사 게임 만들기 1)  (0) 2018.06.25
Java Tetris (자바 테트리스 만들기 1)  (7) 2018.04.28
UML of Alarm clock  (0) 2018.04.06
Posted by chobocho
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
UML of Alarm clock  (0) 2018.04.06
Android 화면 녹화 방법  (0) 2018.01.04
Posted by chobocho
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


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

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

Android 화면 녹화 방법  (0) 2018.01.04
[Android] Image match game ( V 0.627 )  (0) 2016.08.25
SimpleDraw update  (0) 2016.08.23
Posted by chobocho
Coding/Java 삽질기2016. 3. 17. 02:44



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


Posted by chobocho
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
초간단 보이스 레코더  (0) 2013.03.08
ChoboSMS  (0) 2013.02.26
Posted by chobocho
Coding/Java 삽질기2010. 3. 10. 00:13


자바로 만든 테트리스

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

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

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