No older revisions available
No older revisions available
~cpp
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Tetris extends Applet implements Runnable {
Thread clock;
Image mem;
Graphics memG;
Random r;
boolean [][]board;
Color [][]colorMap;
Color []colorType;
int blockType;
int []blockX;
int []blockY;
int blockDirection;
int delayTime;
boolean runGame;
public void init() {
mem=createImage(181,316);
memG = mem.getGraphics();
memG.setColor(Color.white);
memG.fillRect(0,0,192,192);
board = new boolean[12][21];
blockX = new int[4];
blockY = new int[4];
blockDirection = 0;
r = new Random();
blockType = Math.abs(r.nextInt() % 7);
setBlock(blockType);
drawBlock();
drawMap();
drawGrid();
delayTime=1000;
runGame=true;
this.requestFocus();
addKeyListener(new MyKeyHandler());
}
private void drawMap() {
for(int i=0;i<12;i++) {
for(int j=0;j<21;j++) {
if(board[i][j]) {
memG.setColor(Color.blue);
memG.fillRect(i*15,j*15,15,15);
}
else {
memG.setColor(Color.white);
memG.fillRect(i*15,j*15,15,15);
}
}
}
}
private void drawBlock() {
for(int i=0;i<4;i++) {
board[blockX[i]][blockY[i]] = true;
}
}
private void drawGrid() {
memG.setColor(new Color(190,190,190));
for(int i=0;i<12;i++) {
for(int j=0;j<21;j++) {
memG.drawRect(i*15,j*15,15,15);
}
}
}
private void dropBlock() {
removeBlock();
if(checkDrop()) {
for(int i=0;i<4;i++) {
// blockX[i]+=1;
blockY[i]+=1;
}
}
else {
drawBlock();
nextBlock();
}
}
private void nextBlock() {
blockType=Math.abs(r.nextInt() % 7);
blockDirection=0;
delLine();
setBlock(blockType);
}
private void removeBlock() {
for(int i=0;i<4;i++) {
board[blockX[i]][blockY[i]] = false;
}
}
public void delLine()
{
boolean delOk;
for(int row=20; row>=0; row--) {
delOk=true;
for(int col=0;col<12;col++) {
if(!board[col][row])
delOk=false;
}
if(delOk) {
for(int delRow=row;delRow>0;delRow--) {
for(int delCol=0;delCol<12;delCol++) {
board[delCol][delRow] = board[delCol][delRow-1];
}
}
for(int i=0;i<12;i++) {
board[0][i]=false;
}
row++;
}
}
}
private boolean checkDrop() {
boolean dropOk=true;
for(int i=0;i<4;i++) {
if( (blockY[i]+1)!=21) {
if(board[blockX[i]] [blockY[i]+1] )
dropOk = false;
}
else {
dropOk=false;
}
}
return dropOk;
}
private void setBlock(int bType) {
switch(bType) {
case 0:
blockX[0]=5; blockY[0]=0;
blockX[1]=5; blockY[1]=1;
blockX[2]=5; blockY[2]=2;
blockX[3]=6; blockY[3]=2;
break;
case 1:
blockX[0]=5; blockY[0]=0;
blockX[1]=5; blockY[1]=1;
blockX[2]=6; blockY[2]=0;
blockX[3]=6; blockY[3]=1;
break;
case 2:
blockX[0]=6; blockY[0]=0;
blockX[1]=5; blockY[1]=0;
blockX[2]=5; blockY[2]=1;
blockX[3]=5; blockY[3]=2;
break;
case 3:
blockX[0]=5; blockY[0]=0;
blockX[1]=5; blockY[1]=1;
blockX[2]=4; blockY[2]=1;
blockX[3]=6; blockY[3]=1;
break;
case 4:
blockX[0]=5; blockY[0]=0;
blockX[1]=5; blockY[1]=1;
blockX[2]=5; blockY[2]=2;
blockX[3]=5; blockY[3]=3;
break;
case 5:
blockX[0]=4; blockY[0]=0;
blockX[1]=5; blockY[1]=0;
blockX[2]=5; blockY[2]=1;
blockX[3]=6; blockY[3]=1;
break;
case 6:
blockX[0]=6; blockY[0]=0;
blockX[1]=5; blockY[1]=0;
blockX[2]=5; blockY[2]=1;
blockX[3]=4; blockY[3]=1;
break;
}
}
public void start() {
if(clock==null) {
clock = new Thread(this);
clock.start(); // 쓰레드 시작
}
this.setSize(200,333);
}
public void stop() {
if((clock!=null) && (clock.isAlive())) {
clock=null; // 시계 정지
}
}
public void paint(Graphics g) {
g.drawImage(mem, 0, 0, this); //
}
public void update(Graphics g) {
paint(g);
}
public void run() {
while(true)
{
try {
clock.sleep(delayTime);
}catch(InterruptedException ie) { }
dropBlock();
if(runGame) {
drawBlock();
drawMap();
drawGrid();
} else {
}
repaint();
}
}
public boolean checkTurn() {
boolean turnOk = true;
for(int i=0;i<4;i++) {
if( blockX[i]>=0 && blockX[i]<12 && blockY[i]>=0 && blockY[i]<21 ) {
if(board[blockX[i]][blockY[i]])
turnOk=false;
}
else {
turnOk= false;
}
}
return turnOk;
}
public boolean checkMove(int dir)
{
boolean moveOk=true;
removeBlock();
for(int i=0; i<4; i++) {
if( (blockX[i]+dir)>=0 && (blockX[i]+dir)<12 ) {
if( board[blockX[i]+dir][ blockY[i]])
moveOk = false;
}
else moveOk=false;
}
if(!moveOk) drawBlock();
return moveOk;
}
public void turnBlock()
{
switch(blockType) {
case 1:
switch(blockDirection) {
case 0:
blockX[3]-=1; blockY[3]-=1;
break;
case 1:
blockX[1]+=1; blockY[1]-=1;
blockX[2]+=1; blockY[2]-=1;
blockY[3]-=1;
break;
case 2:
blockX[0]+=1;
blockY[1]+=1;
blockY[2]+=1;
blockY[3]+=1;
break;
case 3:
blockX[1]-=1;
blockX[2]-=1;
blockX[3]+=1; blockY[3]-=1;
break;
}
break;
case 2:
switch(blockDirection) {
case 0:
blockX[0]-=2;
blockX[1]+=1; blockY[1]-=1;
blockX[3]-=1; blockY[3]+=1;
break;
case 1:
blockX[2]+=1; blockY[2]-=1;
blockX[3]-=1; blockY[3]-=1;
break;
case 2:
blockX[0]+=1;
blockY[1]+=1;
blockX[1]-=1;blockY[2]+=2;
blockX[3]+=2;blockY[3]+=1;
break;
case 3:
blockX[0]+=1;
blockX[1]-=1;
blockY[2]-=1;
blockY[3]-=1;
break;
}
break;
case 4:
switch(blockDirection) {
case 0:
case 2:
blockX[1]+=1; blockY[1]-=1;
blockX[2]+=2; blockY[2]-=2;
blockX[3]+=3; blockY[3]-=3;
break;
case 1:
case 3:
blockX[1]-=1; blockY[1]+=1;
blockX[2]-=2; blockY[2]+=2;
blockX[3]-=3; blockY[3]+=3;
break;
}
break;
}
}
class MyKeyHandler extends KeyAdapter
{
public void keyPressed(KeyEvent e) {
String keyCode = KeyEvent.getKeyText(e.getKeyCode());
if( keyCode == "Left" ) {
// if(blockX[0]!=0 && blockX[1]!=0 && blockX[2]!=0 && blockX[3]!=0) {
if(checkMove(-1)) {
blockX[0] -= 1;
blockX[1] -= 1;
blockX[2] -= 1;
blockX[3] -= 1;
}
}
if( keyCode == "Right" ) {
// if(blockX[0]!=11 && blockX[1]!=11 && blockX[2]!=11 && blockX[3]!=11) {
if(checkMove(1)) {
blockX[0] += 1;
blockX[1] += 1;
blockX[2] += 1;
blockX[3] += 1;
}
}
if( keyCode == "Down" ) {
removeBlock();
if(checkDrop()) {
blockY[0] += 1;
blockY[1] += 1;
blockY[2] += 1;
blockY[3] += 1;
}
else {
drawBlock();
}
}
if( keyCode == "Up" ) {
int []tempX= new int[4];
int []tempY= new int[4];
for(int i=0;i<4;i++) {
tempX[i]=blockX[i];
tempY[i]=blockY[i];
}
removeBlock();
turnBlock();
if(checkTurn()) {
if(blockDirection<4) {
blockDirection++;
}
else {
blockDirection=0;
}
}
else {
for(int i=0; i<4; i++) {
blockX[i]=tempX[i];
blockY[i]=tempY[i];
board[blockX[i]][blockY[i]]=true;
}
}
}
drawBlock();
drawMap();
drawGrid();
repaint();
}
}
}