AIにnoteのネタを相談したら、なんやかんやで卓球をプログラムしてくれた件
前回は「卓球」を作ってみた。
今回は、noteのネタをAIに相談してみたら、いつの間にかAIが「卓球」のプログラムを書いてくれた。
Copilotに「noteの記事のネタ」を聞いてみた
今回お願いしたのは、Windowsに標準装備されたCopilotさん。
それではnoteの記事のネタを相談してみよう。
ゲーム作りについて、どんな記事が読まれやすいか教えて
ゲーム開発の基礎について記事にするなら、どんなものがおすすめ?
ゲームのプロトタイプのコードを書いて欲しい
卓球ゲームのコードを書いて欲しい
<!DOCTYPE html>
<html>
<head>
<title>卓球ゲーム</title>
<style>
canvas {
background: #000;
display: block;
margin: 0 auto;
}
</style>
</head>
<body>
<canvas id="pong" width="800" height="400"></canvas>
<script>
const canvas = document.getElementById('pong');
const context = canvas.getContext('2d');
const player = {
x: 0,
y: (canvas.height - 100) / 2,
width: 10,
height: 100,
color: 'WHITE',
score: 0
};
const computer = {
x: canvas.width - 10,
y: (canvas.height - 100) / 2,
width: 10,
height: 100,
color: 'WHITE',
score: 0
};
const ball = {
x: canvas.width / 2,
y: canvas.height / 2,
radius: 10,
speed: 5,
velocityX: 5,
velocityY: 5,
color: 'WHITE'
};
function drawRect(x, y, w, h, color) {
context.fillStyle = color;
context.fillRect(x, y, w, h);
}
function drawCircle(x, y, r, color) {
context.fillStyle = color;
context.beginPath();
context.arc(x, y, r, 0, Math.PI * 2, false);
context.closePath();
context.fill();
}
function drawText(text, x, y, color) {
context.fillStyle = color;
context.font = "45px Arial";
context.fillText(text, x, y);
}
function render() {
drawRect(0, 0, canvas.width, canvas.height, 'BLACK');
drawRect(player.x, player.y, player.width, player.height, player.color);
drawRect(computer.x, computer.y, computer.width, computer.height, computer.color);
drawCircle(ball.x, ball.y, ball.radius, ball.color);
drawText(player.score, canvas.width / 4, canvas.height / 5, 'WHITE');
drawText(computer.score, 3 * canvas.width / 4, canvas.height / 5, 'WHITE');
}
function movePaddle(event) {
let rect = canvas.getBoundingClientRect();
player.y = event.clientY - rect.top - player.height / 2;
}
function update() {
ball.x += ball.velocityX;
ball.y += ball.velocityY;
if (ball.y + ball.radius > canvas.height || ball.y - ball.radius < 0) {
ball.velocityY = -ball.velocityY;
}
let playerOrComputer = (ball.x < canvas.width / 2) ? player : computer;
if (collision(ball, playerOrComputer)) {
ball.velocityX = -ball.velocityX;
}
if (ball.x - ball.radius < 0) {
computer.score++;
resetBall();
} else if (ball.x + ball.radius > canvas.width) {
player.score++;
resetBall();
}
}
function collision(b, p) {
p.top = p.y;
p.bottom = p.y + p.height;
p.left = p.x;
p.right = p.x + p.width;
b.top = b.y - b.radius;
b.bottom = b.y + b.radius;
b.left = b.x - b.radius;
b.right = b.x + b.radius;
return p.left < b.right && p.top < b.bottom && p.right > b.left && p.bottom > b.top;
}
function resetBall() {
ball.x = canvas.width / 2;
ball.y = canvas.height / 2;
ball.velocityX = -ball.velocityX;
ball.speed = 5;
}
canvas.addEventListener('mousemove', movePaddle);
function gameLoop() {
update();
render();
}
const framePerSecond = 50;
setInterval(gameLoop, 1000 / framePerSecond);
</script>
</body>
</html>
Copilotのプログラムをテキストエディタにコピーしてhtml形式で保存してブラウザで開いてみたら動いた。
ただ、敵が動かないなど色々直して欲しいことがあったのでお願いしてみた。
卓球をカスタマイズしてもらう
右側のプレイヤーを自動で動くようにして
これで、敵が動くようになった。
いくつかまとめてお願いしてみる
いくつかまとめてお願いすることもできた。凄いね。
一応、一つづつバグチェックした方が良いかもしれない。
というのも次のお願いで動かなくなってしまった。
お願いしたらバグったので自分で直す
このプログラムを実行したら、黒い画面になったので、直すようにお願いした。
この後、動くようにはなったが、何度お願いしても、ボールを失った方ではなく、得点した方に次のボールの発射権が移ってしまった。
指定の仕方が間違っているようで治らん。
時間かかりそうなので、自分でなおすために、以下の質問をした。
// 1. resetBall関数内でボールを発射するプレイヤーを決定しています。
function resetBall(lastLoss) {
ball.speed = 5; // ボールの速度をリセット
ball.velocityX = 0;
ball.velocityY = 0;
if (lastLoss === 'player') {
ball.x = player.x + player.width + ball.radius;
ball.y = player.y + player.height / 2;
} else {
ball.x = computer.x - ball.radius;
ball.y = computer.y + computer.height / 2;
}
gameStarted = false;
launchingPlayer = lastLoss; // ボールを発射するプレイヤーを設定
}
// 2. 左クリック時のイベントリスナー内で実際にボールを発射するプレイヤーの処理を行っています。
canvas.addEventListener('click', () => {
if (!gameStarted) {
gameStarted = true;
if (launchingPlayer === 'player') {
ball.velocityX = ball.speed;
} else {
ball.velocityX = -ball.speed;
}
ball.velocityY = (Math.random() * 2 - 1) * ball.speed; // ランダムなY方向の速度
launchingPlayer = null;
}
});
AIの作ってくれたプログラムを改造
・負けた方がサーブ権を得るように修正
・プレイヤーを青、敵を赤、ボールを黄色に修正
<!DOCTYPE html>
<html>
<head>
<title>卓球ゲーム</title>
<style>
canvas {
background: #000;
display: block;
margin: 0 auto;
}
</style>
</head>
<body>
<canvas id="pong" width="640" height="360"></canvas>
<script>
const canvas = document.getElementById('pong');
const context = canvas.getContext('2d');
let gameStarted = false;
let launchingPlayer = null; // ボールを発射するプレイヤー
const player = {
x: 20,
y: (canvas.height - 50) / 2,
width: 10,
height: 50,
color: 'AQUA',
score: 0
};
const computer = {
x: canvas.width - 30,
y: (canvas.height - 50) / 2,
width: 10,
height: 50,
color: 'RED',
score: 0,
dy: 5
};
const ball = {
x: canvas.width / 2,
y: canvas.height / 2,
radius: 10,
speed: 5,
velocityX: 0,
velocityY: 0,
color: 'YELLOW'
};
function drawRect(x, y, w, h, color) {
context.fillStyle = color;
context.fillRect(x, y, w, h);
}
function drawCircle(x, y, r, color) {
context.fillStyle = color;
context.beginPath();
context.arc(x, y, r, 0, Math.PI * 2, false);
context.closePath();
context.fill();
}
function drawText(text, x, y, color) {
context.fillStyle = color;
context.font = "45px Arial";
context.fillText(text, x, y);
}
function render() {
drawRect(0, 0, canvas.width, canvas.height, 'BLACK');
drawRect(player.x, player.y, player.width, player.height, player.color);
drawRect(computer.x, computer.y, computer.width, computer.height, computer.color);
drawCircle(ball.x, ball.y, ball.radius, ball.color);
drawText(player.score, canvas.width / 4, canvas.height / 5, 'WHITE');
drawText(computer.score, 3 * canvas.width / 4, canvas.height / 5, 'WHITE');
if (!gameStarted) {
drawText("Click to Start", canvas.width / 2 - 100, canvas.height / 2, 'WHITE');
}
}
function movePaddle(event) {
let rect = canvas.getBoundingClientRect();
player.y = event.clientY - rect.top - player.height / 2;
if (!gameStarted && launchingPlayer === 'player') {
ball.y = player.y + player.height / 2;
}
}
function moveComputerPaddle() {
if (ball.y < computer.y + computer.height / 2) {
computer.y -= computer.dy;
} else if (ball.y > computer.y + computer.height / 2) {
computer.y += computer.dy;
}
computer.y = Math.max(Math.min(computer.y, canvas.height - computer.height), 0);
if (!gameStarted && launchingPlayer === 'computer') {
ball.y = computer.y + computer.height / 2;
}
}
function update() {
if (!gameStarted) return;
ball.x += ball.velocityX;
ball.y += ball.velocityY;
if (ball.y + ball.radius > canvas.height || ball.y - ball.radius < 0) {
ball.velocityY = -ball.velocityY;
}
let playerOrComputer = (ball.x < canvas.width / 2) ? player : computer;
if (collision(ball, playerOrComputer)) {
ball.velocityX = -ball.velocityX;
ball.speed *= 1.1; // ボールのスピードを10%増加
ball.velocityX = (ball.velocityX > 0 ? 1 : -1) * ball.speed;
ball.velocityY = (ball.velocityY > 0 ? 1 : -1) * ball.speed;
}
if (ball.x - ball.radius < 0) {
computer.score++;
if (computer.score >= 5) {
alert("Computer Wins!");
resetGame();
} else {
resetBall('player');
}
} else if (ball.x + ball.radius > canvas.width) {
player.score++;
if (player.score >= 5) {
alert("Player Wins!");
resetGame();
} else {
resetBall('computer');
}
}
moveComputerPaddle();
}
function collision(b, p) {
p.top = p.y;
p.bottom = p.y + p.height;
p.left = p.x;
p.right = p.x + p.width;
b.top = b.y - b.radius;
b.bottom = b.y + b.radius;
b.left = b.x - b.radius;
b.right = b.x + b.radius;
return p.left < b.right && p.top < b.bottom && p.right > b.left && p.bottom > b.top;
}
function resetBall(lastLoss) {
ball.speed = 5; // ボールの速度をリセット
ball.velocityX = 0;
ball.velocityY = 0;
if (lastLoss === 'player') {
ball.x = player.x + player.width + ball.radius;
ball.y = player.y + player.height / 2;
} else {
ball.x = computer.x - ball.radius;
ball.y = computer.y + computer.height / 2;
}
gameStarted = false;
launchingPlayer = lastLoss; // ボールを発射するプレイヤーを設定
}
function resetGame() {
player.score = 0;
computer.score = 0;
resetBall();
}
canvas.addEventListener('mousemove', movePaddle);
canvas.addEventListener('click', () => {
if (!gameStarted) {
gameStarted = true;
if (launchingPlayer === 'player') {
ball.velocityX = ball.speed;
} else {
ball.velocityX = -ball.speed;
}
ball.velocityY = (Math.random() * 2 - 1) * ball.speed; // ランダムなY方向の速度
launchingPlayer = null;
}
});
function gameLoop() {
update();
render();
}
const framePerSecond = 50;
setInterval(gameLoop, 1000 / framePerSecond);
</script>
</body>
</html>
AIにプログラムを書いてもらうのは楽だった
なかなか使えそう。これでバグが頻発しなければな。バグを直してもらう方法も研究してみよう。俺のやり方が悪いだけで、絶対できる子だ。
Copilotさんは「絵」も描ける。
noteの絵は全部Copilotさんに描いてもらっている。
サイズを変えたり、ラフスケッチした絵を元に描いてもらったりするAIもあるらしいが、タダで使えるのは素晴らしい。