상세 컨텐츠

본문 제목

벽돌깨기 게임 만들기

Chat GPT 물어봅시다.

by 기술자놈 2023. 4. 2. 20:10

본문

반응형
SMALL

안녕하세요.

#기술자놈 입니다.

오늘은 벽돌깨기를 #ChatGPT 를 이용해서 만들어 봣습니다.

일단 메모장에서 기본 확장자TXT 를 HTML로 변경만하면

실행이 되는 파일로 만드는 겁니다.


<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>블록 깨기</title>

<style>

canvas {

border: 1px solid black;

}

</style>

</head>

<body>

<canvas id="gameCanvas" width="480" height="320"></canvas>

<script>

var canvas = document.getElementById("gameCanvas");

var ctx = canvas.getContext("2d");


var ballRadius = 10;

var x = canvas.width/2;

var y = canvas.height-30;

var dx = 2;

var dy = -2;


var paddleHeight = 10;

var paddleWidth = 75;

var paddleX = (canvas.width-paddleWidth)/2;

var rightPressed = false;

var leftPressed = false;


var brickRowCount = 3;

var brickColumnCount = 5;

var brickWidth = 75;

var brickHeight = 20;

var brickPadding = 10;

var brickOffsetTop = 30;

var brickOffsetLeft = 30;


var score = 0;


var bricks = [];

for(var c=0; c<brickColumnCount; c++) {

bricks[c] = [];

for(var r=0; r<brickRowCount; r++) {

bricks[c][r] = { x: 0, y: 0, status: 1 };

}

}


document.addEventListener("keydown", keyDownHandler, false);

document.addEventListener("keyup", keyUpHandler, false);

document.addEventListener("mousemove", mouseMoveHandler, false);


function keyDownHandler(e) {

if(e.keyCode == 39) {

rightPressed = true;

}

else if(e.keyCode == 37) {

leftPressed = true;

}

}


function keyUpHandler(e) {

if(e.keyCode == 39) {

rightPressed = false;

}

else if(e.keyCode == 37) {

leftPressed = false;

}

}


function mouseMoveHandler(e) {

var relativeX = e.clientX - canvas.offsetLeft;

if(relativeX > 0 && relativeX < canvas.width) {

paddleX = relativeX - paddleWidth/2;

}

}


function collisionDetection() {

for(var c=0; c<brickColumnCount; c++) {

for(var r=0; r<brickRowCount; r++) {

var b = bricks[c][r];

if(b.status == 1) {

if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) {

dy = -dy;

b.status = 0;

score++;

if(score == brickRowCount*brickColumnCount) {

alert("YOU WIN, CONGRATS!");

document.location.reload();

}

}

}

}

}

}


function drawBall() {

ctx.beginPath();

ctx.arc(x, y, ballRadius, 0, Math.PI*2);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}


function drawPaddle() {

ctx.beginPath();

ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}


function drawBricks() {

for(var c=0; c<brickColumnCount; c++) {

for(var r=0; r<brickRowCount; r++) {

if(bricks[c][r].status == 1) {

var brickX = (c*(brickWidth+brickPadding))+brickOffsetLeft;

var brickY = (r*(brickHeight+brickPadding))+brickOffsetTop;

bricks[c][r].x = brickX;

bricks[c][r].y = brickY;

ctx.beginPath();

ctx.rect(brickX, brickY, brickWidth, brickHeight);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}

}

}

}


function drawScore() {

ctx.font = "16px Arial";

ctx.fillStyle = "#0095DD";

ctx.fillText("Score: "+score, 8, 20);

}


function draw() {

ctx.clearRect(0, 0, canvas.width, canvas.height);

drawBricks();

drawBall();

drawPaddle();

drawScore();

collisionDetection();


if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) {

dx = -dx;

}

if(y + dy < ballRadius) {

dy = -dy;

}

else if(y + dy > canvas.height-ballRadius) {

if(x > paddleX && x < paddleX + paddleWidth) {

dy = -dy;

}

else {

alert("GAME OVER");

document.location.reload();

clearInterval(interval); // Needed for Chrome to end game

}

}


if(rightPressed && paddleX < canvas.width-paddleWidth) {

paddleX += 7;

}

else if(leftPressed && paddleX > 0) {

paddleX -= 7;

}


x += dx;

y += dy;

}


var interval = setInterval(draw, 10);

</script>

</body>

</html>

 

완성된 게임입니다.

 

뭔가 좀 아쉬움이 생겨 추가로 업그레이드 했습니다.

난이도를 조절하고 시작 버튼을 넣었습니다.


<!DOCTYPE html>

<html>

<head>

<title>벽돌깨기 게임</title>

<style>

canvas {

border:1px solid #000000;

}

</style>

</head>

<body>

<div>

<label for="difficulty">난이도 선택:</label>

<select id="difficulty">

<option value="easy">어려움</option>

<option value="medium">보통</option>

<option value="hard">쉬움</option>

</select>

<button id="start">시작</button>

</div>

<script>

var canvas = document.createElement("canvas");

canvas.width = 480;

canvas.height = 320;

document.body.appendChild(canvas);

var ctx = canvas.getContext("2d");


var ballRadius = 10;

var x = canvas.width/2;

var y = canvas.height-30;

var dx = 2;

var dy = -2;


var paddleHeight = 10;

var paddleWidth = 75;

var paddleX = (canvas.width-paddleWidth)/2;


var rightPressed = false;

var leftPressed = false;


var brickRowCount = 3;

var brickColumnCount = 5;

var brickWidth = 75;

var brickHeight = 20;

var brickPadding = 10;

var brickOffsetTop = 30;

var brickOffsetLeft = 30;


var bricks = [];

for(var c=0; c<brickColumnCount; c++) {

bricks[c] = [];

for(var r=0; r<brickRowCount; r++) {

bricks[c][r] = { x: 0, y: 0, status: 1 };

}

}


var score = 0;

var lives = 3;


function drawBricks() {

for(var c=0; c<brickColumnCount; c++) {

for(var r=0; r<brickRowCount; r++) {

if(bricks[c][r].status == 1) {

var brickX = (c*(brickWidth+brickPadding))+brickOffsetLeft;

var brickY = (r*(brickHeight+brickPadding))+brickOffsetTop;

bricks[c][r].x = brickX;

bricks[c][r].y = brickY;

ctx.beginPath();

ctx.rect(brickX, brickY, brickWidth, brickHeight);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}

}

}

}


function drawBall() {

ctx.beginPath();

ctx.arc(x, y, ballRadius, 0, Math.PI*2);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}


function drawPaddle() {

ctx.beginPath();

ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}


function collisionDetection() {

for(var c=0; c<brickColumnCount; c++) {

for(var r=0; r<brickRowCount; r++) {

var b = bricks[c][r];

if(b.status == 1) {

if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) {

dy = -dy;

b.status = 0;

score++;

if(score == brickRowCount*brickColumnCount) {

alert("축하합니다! 모든 벽돌을 깼습니다!");

document.location.reload();

}

}

}

}

}

}


document.addEventListener("keydown", keyDownHandler, false);

document.addEventListener("keyup", keyUpHandler, false);


function keyDownHandler(e) {

if(e.keyCode == 39) {

rightPressed = true;

}

else if(e.keyCode == 37) {

leftPressed = true;

}

}


function keyUpHandler(e) {

if(e.keyCode == 39) {

rightPressed = false;

}

else if(e.keyCode == 37) {

leftPressed = false;

}

}


function drawScore() {

ctx.font = "16px Arial";

ctx.fillStyle = "#0095DD";

ctx.fillText("점수: "+score, 8, 20);

}


function drawLives() {

ctx.font = "16px Arial";

ctx.fillStyle = "#0095DD";

ctx.fillText("남은 생명: "+lives, canvas.width-95, 20);

}


function draw() {

ctx.clearRect(0, 0, canvas.width, canvas.height);

drawBricks();

drawBall();

drawPaddle();

drawScore();

drawLives();

collisionDetection();


if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) {

dx = -dx;

}


if(y + dy < ballRadius) {

dy = -dy;

}

else if(y + dy > canvas.height-ballRadius) {

if(x > paddleX && x < paddleX + paddleWidth) {

dy = -dy;

}

else {

lives--;

if(!lives) {

alert("게임 오버! 다시 시작하려면 확인을 누르세요.");

document.location.reload();

}

else {

x = canvas.width/2;

y = canvas.height-30;

dx = 2;

dy = -2;

paddleX = (canvas.width-paddleWidth)/2;

}

}

}


if(rightPressed && paddleX < canvas.width-paddleWidth) {

paddleX += 7;

}

else if(leftPressed && paddleX > 0) {

paddleX -= 7;

}


x += dx;

y += dy;

requestAnimationFrame(draw);


}


document.getElementById("start").addEventListener("click", function() {

draw();

});


</script>

</body>

</html>

 

다들 심심할때 취미로 코딩을 #ChatGPT 와 함께 해봐요.

 

벽돌깨기.html
0.00MB
벽돌깨기(난이도,시작버튼).html
0.00MB

 

 

  1. #벽돌깨기게임
  2. #게임개발
  3. #HTML5
  4. #Canvas
  5. #자바스크립트
  6. #애니메이션
  7. #게임그래픽
  8. #게임물리엔진
  9. #게임디자인
  10. #게임코딩
  11. #게임프로그래밍
  12. #게임모션그래픽
  13. #게임미디어아트
  14. #모바일게임
  15. #브라우저게임
  16. #키보드조작
  17. #마우스조작
  18. #게임레벨디자인
  19. #게임배경음악
  20. #게임소리효과
  21. #게임유저인터페이스
  22. #게임캐릭터디자인
  23. #게임인공지능
  24. #게임서버
  25. #게임발표회
반응형
LIST

관련글 더보기

댓글 영역