Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録

「pong」を含む日記RSS

はてなキーワード:pongとは

次の25件>

2025-10-03

anond:20251003120837

AIPONGプレイすることもできないのか

Permalink |記事への反応(0) | 12:33

このエントリーをはてなブックマークに追加ツイートシェア

2025-07-06

anond:20250706011306

今どきのAIって凄いんだな、でも意味を取り違えてると思う

これはユーザ設計を考えてゲームプログラミングしたんじゃなくてAIが持つ情報からゲームプログラミングしたになるんじゃないか

PONG古典的ゲームからAI情報を持ってるだろうと思ってお題にしたんだけど、逆に言うと情報を持ってないゲームプログラミングになるとかなりの回数をAIとのやり取りで詰めていかないと上手くいかないんじゃなかろうか

何と言うか、ユーザ意思が介在する隙が無いと言うか、このコード初心者が見て何をしているのか理解できる要素がないと言うかそんな感じだ

いやお題に対しての結果は本当に凄いと思う、でもこれはユーザに実力が全く付かないと思う。何をしてるか全く分からいからだ

Permalink |記事への反応(3) | 05:33

このエントリーをはてなブックマークに追加ツイートシェア

Mondayの作ってくれたやつ

オッケー。ワイくん、PONG現代召喚します。

まず、準備できてる?

Python 3.xインストール済み

pygame 入ってない人はコマンドラインでこれ:

pip installpygame

🎮MondayPONGゲームシンプルだけどちゃんと動く)

importpygameimport randomimport sys#初期化pygame.init()#画面サイズWIDTH, HEIGHT = 640, 480SCREEN =pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("PONGbyMonday")# 色定義WHITE = (255, 255, 255)BLACK = (0, 0, 0)#パドルボールの設定PADDLE_WIDTH, PADDLE_HEIGHT =10,100BALL_SIZE =10PADDLE_SPEED = 7BALL_SPEED_X, BALL_SPEED_Y = 5 * random.choice((1, -1)), 5 * random.choice((1, -1))# 左右のパドル位置left_paddle =pygame.Rect(10, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT)right_paddle =pygame.Rect(WIDTH -20, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT)#ボールball =pygame.Rect(WIDTH // 2, HEIGHT // 2, BALL_SIZE, BALL_SIZE)#スコアscore_left = 0score_right = 0font =pygame.font.Font(None, 36)clock =pygame.time.Clock()#ゲームループwhileTrue:    for event inpygame.event.get():        if event.type ==pygame.QUIT:pygame.quit()            sys.exit()    #キー入力keys =pygame.key.get_pressed()    ifkeys[pygame.K_w] and left_paddle.top> 0:        left_paddle.y -= PADDLE_SPEED    ifkeys[pygame.K_s] and left_paddle.bottom < HEIGHT:        left_paddle.y += PADDLE_SPEED    ifkeys[pygame.K_UP] and right_paddle.top> 0:        right_paddle.y -= PADDLE_SPEED    ifkeys[pygame.K_DOWN] and right_paddle.bottom < HEIGHT:        right_paddle.y += PADDLE_SPEED    #ボール移動    ball.x += BALL_SPEED_X    ball.y += BALL_SPEED_Y    # 壁反射    if ball.top <= 0 or ball.bottom>= HEIGHT:        BALL_SPEED_Y *= -1    #パドル反射    if ball.colliderect(left_paddle) or ball.colliderect(right_paddle):        BALL_SPEED_X *= -1    #スコア処理    if ball.left <= 0:        score_right += 1        ball.center = (WIDTH // 2, HEIGHT // 2)        BALL_SPEED_X *= random.choice((1, -1))    if ball.right>= WIDTH:        score_left += 1        ball.center = (WIDTH // 2, HEIGHT // 2)        BALL_SPEED_X *= random.choice((1, -1))    # 画面描画SCREEN.fill(BLACK)pygame.draw.rect(SCREEN,WHITE, left_paddle)pygame.draw.rect(SCREEN,WHITE, right_paddle)pygame.draw.ellipse(SCREEN,WHITE, ball)pygame.draw.aaline(SCREEN,WHITE, (WIDTH // 2, 0), (WIDTH // 2, HEIGHT))    score_text = font.render(f"{score_left}   {score_right}",True,WHITE)SCREEN.blit(score_text, (WIDTH // 2 - score_text.get_width() // 2,20))pygame.display.flip()    clock.tick(60)

これ動かすと、ふたりPONG対戦できるぞ。

• 左パドル:W / Sキー

• 右パドル:↑ / ↓キー

• Esc 押すと終了(またはウィンドウ×)

このコード、わりと「教育的に健全地獄」だから自由拡張できるよ:

スコア10点で勝利

ボールが速くなっていく

BGM効果音追加

AI操作の右パドル化(←これやる?)

あとで「飴ちゃん飛ばすモード」とかも追加できるぞ。バカ拡張大歓迎。

どう?動いた?やってみて。報告もらえれば、次の「社会風刺機能付きPONG」考えておくわ。

 

https://anond.hatelabo.jp/20250706011306#

Permalink |記事への反応(2) | 01:22

このエントリーをはてなブックマークに追加ツイートシェア

Grokが作ってくれたやつ

<html lang="ja"><head>    <meta charset="UTF-8">    <title>GrokのPONGゲーム</title>    <style>body { display:flex; justify-content: center; align-items: center; height:100vh;margin: 0;background: #1a1a1a; }canvas {border: 2px solid #00ff00;background: #000; }        #score {color: #00ff00; font-family: 'Courier New', monospace; font-size: 24px; position:absolute;top:20px; width:100%;text-align: center; }    </style></head><body>
0 : 0
<canvasid="gameCanvas" width="800" height="400"></canvas> <script>constcanvas = document.getElementById('gameCanvas');const ctx =canvas.getContext('2d');constscoreDisplay = document.getElementById('score'); //ゲームオブジェクトconst ball = { x:canvas.width / 2, y:canvas.height / 2,radius:10, speedX: 5, speedY: 5 };const paddleLeft = { x:10, y:canvas.height / 2 - 50, width:10, height:100, speed: 8 };const paddleRight = { x:canvas.width -20, y:canvas.height / 2 - 50, width:10, height:100, speed: 8 }; letscoreLeft = 0,scoreRight = 0; //キー入力constkeys = { w:false, s:false, ArrowUp:false, ArrowDown:false }; document.addEventListener('keydown', e => { if (keys.hasOwnProperty(e.key))keys[e.key] =true; }); document.addEventListener('keyup', e => { if (keys.hasOwnProperty(e.key))keys[e.key] =false; }); //ゲームループ function gameLoop() { // 移動 if (keys.w && paddleLeft.y> 0) paddleLeft.y -= paddleLeft.speed; if (keys.s && paddleLeft.y <canvas.height - paddleLeft.height) paddleLeft.y += paddleLeft.speed; if (keys.ArrowUp && paddleRight.y> 0) paddleRight.y -= paddleRight.speed; if (keys.ArrowDown && paddleRight.y <canvas.height - paddleRight.height) paddleRight.y += paddleRight.speed; //ボール移動 ball.x += ball.speedX; ball.y += ball.speedY; // 壁衝突 if (ball.y + ball.radius>canvas.height || ball.y - ball.radius < 0) ball.speedY = -ball.speedY; //パドル衝突 if ( (ball.x - ball.radius < paddleLeft.x + paddleLeft.width && ball.y> paddleLeft.y && ball.y < paddleLeft.y + paddleLeft.height) || (ball.x + ball.radius> paddleRight.x && ball.y> paddleRight.y && ball.y < paddleRight.y + paddleRight.height) ) { ball.speedX = -ball.speedX * 1.05; // 少し加速 } //得点 if (ball.x < 0) {scoreRight++; ballReset(); } if (ball.x>canvas.width) {scoreLeft++; ballReset(); } // 描画 ctx.fillStyle = '#000'; ctx.fillRect(0, 0,canvas.width,canvas.height); ctx.fillStyle = '#00ff00'; ctx.fillRect(paddleLeft.x, paddleLeft.y, paddleLeft.width, paddleLeft.height); ctx.fillRect(paddleRight.x, paddleRight.y, paddleRight.width, paddleRight.height); ctx.beginPath(); ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2); ctx.fill();scoreDisplay.textContent = `${scoreLeft} : ${scoreRight}`; requestAnimationFrame(gameLoop); } function ballReset() { ball.x =canvas.width / 2; ball.y =canvas.height / 2; ball.speedX = (Math.random()> 0.5 ? 5 : -5) * (Math.random() * 0.5 + 0.75); ball.speedY = (Math.random() * 4 - 2); } gameLoop(); </script></body></html>

 

 

https://anond.hatelabo.jp/20250706011306#

Permalink |記事への反応(1) | 01:18

このエントリーをはてなブックマークに追加ツイートシェア

Claudeが作ってくれたやつ

<html lang="ja"><head>    <meta charset="UTF-8">    <metaname="viewport" content="width=device-width, initial-scale=1.0">    <title>PONG Game</title>    <style>body {margin: 0;padding: 0;background-color: #000;            display:flex;            justify-content: center;            align-items: center;min-height:100vh;            font-family: 'Courier New', monospace;color:white;        }```    .game-container {text-align: center;    }canvas {border: 2px solidwhite;background-color: #000;    }        .score {        font-size: 24px;margin:20px 0;        letter-spacing: 2px;    }        .controls {margin-top:20px;        font-size: 14px;        opacity: 0.8;    }        .start-button {background-color: #333;color:white;border: 2px solidwhite;padding:10px20px;        font-size: 16px;        cursor: pointer;        font-family: 'Courier New', monospace;margin:10px;    }        .start-button:hover {background-color:white;color: black;    }</style>```</head><body>
<canvasid="gameCanvas" width="800" height="400"></canvas>
<button class="start-button">ゲーム開始</button> <button class="start-button">リセット</button>

W/Sキーまたは ↑/↓ 矢印キーパドル操作
```<script> //Canvas要素とコンテキストの取得constcanvas = document.getElementById('gameCanvas');const ctx =canvas.getContext('2d'); //ゲーム状態管理 let gameRunning =false; let animationId; //スコア要素の取得const playerScoreElement = document.getElementById('playerScore');constcomputerScoreElement = document.getElementById('computerScore'); //ゲームオブジェクト定義const game = { //プレイヤーパドル(左側) playerPaddle: { x:10, y:canvas.height / 2 - 50, width:10, height:100, speed: 5, upPressed:false, downPressed:false }, //コンピューターパドル(右側)computerPaddle: { x:canvas.width -20, y:canvas.height / 2 - 50, width:10, height:100, speed: 3.5, //プレイヤーより少し遅く設定 targetY:canvas.height / 2 - 50 }, //ボールの設定 ball: { x:canvas.width / 2, y:canvas.height / 2,radius: 8, speedX: 4, speedY: 3, maxSpeed: 8 }, //スコア管理score: { player: 0,computer: 0 } }; //キーボード入力の処理constkeys = {}; //キーが押されたときの処理 document.addEventListener('keydown', (e) => {keys[e.key.toLowerCase()] =true; //ゲームが停止中にスペースキーゲーム開始 if (e.key === ' ' && !gameRunning) { startGame(); } }); //キーが離されたときの処理 document.addEventListener('keyup', (e) => {keys[e.key.toLowerCase()] =false; }); //パドルの移動処理 function updatePaddles() { //プレイヤーパドルの移動(W/Sキーまたは矢印キー) if (keys['w'] ||keys['arrowup']) { game.playerPaddle.y -= game.playerPaddle.speed; } if (keys['s'] ||keys['arrowdown']) { game.playerPaddle.y += game.playerPaddle.speed; } //プレイヤーパドルの画面外移動を防ぐ if (game.playerPaddle.y < 0) { game.playerPaddle.y = 0; } if (game.playerPaddle.y>canvas.height - game.playerPaddle.height) { game.playerPaddle.y =canvas.height - game.playerPaddle.height; } //コンピューターパドルAI処理 //ボール位置を追跡するが、完璧ではない動きを実装const ballCenterY = game.ball.y;const paddleCenterY = game.computerPaddle.y + game.computerPaddle.height / 2; //ボールパドルの中心の差を計算constdifference = ballCenterY - paddleCenterY; // 反応に少し遅れを持たせる(人間らしい動き) if (Math.abs(difference)>10) { if (difference> 0) { game.computerPaddle.y += game.computerPaddle.speed; } else { game.computerPaddle.y -= game.computerPaddle.speed; } } //コンピューターパドルの画面外移動を防ぐ if (game.computerPaddle.y < 0) { game.computerPaddle.y = 0; } if (game.computerPaddle.y>canvas.height - game.computerPaddle.height) { game.computerPaddle.y =canvas.height - game.computerPaddle.height; } } //ボールの移動と衝突判定 function updateBall() { //ボール位置更新 game.ball.x += game.ball.speedX; game.ball.y += game.ball.speedY; //上下の壁との衝突判定 if (game.ball.y - game.ball.radius < 0 || game.ball.y + game.ball.radius>canvas.height) { game.ball.speedY = -game.ball.speedY; } //プレイヤーパドルとの衝突判定 if (game.ball.x - game.ball.radius < game.playerPaddle.x + game.playerPaddle.width && game.ball.x + game.ball.radius> game.playerPaddle.x && game.ball.y + game.ball.radius> game.playerPaddle.y && game.ball.y - game.ball.radius < game.playerPaddle.y + game.playerPaddle.height) { //ボールパドルに当たった位置によって跳ね返り角度を調整const hitPos = (game.ball.y - (game.playerPaddle.y + game.playerPaddle.height / 2)) / (game.playerPaddle.height / 2); game.ball.speedX = Math.abs(game.ball.speedX); game.ball.speedY = hitPos * 4; //ボールの速度を少し上げる(ゲームをエキサイティングに) if (Math.abs(game.ball.speedX) < game.ball.maxSpeed) { game.ball.speedX *= 1.02; } } //コンピューターパドルとの衝突判定 if (game.ball.x + game.ball.radius> game.computerPaddle.x && game.ball.x - game.ball.radius < game.computerPaddle.x + game.computerPaddle.width && game.ball.y + game.ball.radius> game.computerPaddle.y && game.ball.y - game.ball.radius < game.computerPaddle.y + game.computerPaddle.height) { //ボールパドルに当たった位置によって跳ね返り角度を調整const hitPos = (game.ball.y - (game.computerPaddle.y + game.computerPaddle.height / 2)) / (game.computerPaddle.height / 2); game.ball.speedX = -Math.abs(game.ball.speedX); game.ball.speedY = hitPos * 4; //ボールの速度を少し上げる if (Math.abs(game.ball.speedX) < game.ball.maxSpeed) { game.ball.speedX *= 1.02; } } //ボールが左右の壁を越えた場合得点処理) if (game.ball.x < 0) { //コンピューター得点 game.score.computer++; updateScore(); resetBall(); } else if (game.ball.x>canvas.width) { //プレイヤー得点 game.score.player++; updateScore(); resetBall(); } } //ボールリセット得点後の処理) function resetBall() { game.ball.x =canvas.width / 2; game.ball.y =canvas.height / 2; //ランダムな方向でボールを発射 game.ball.speedX = (Math.random()> 0.5 ? 4 : -4); game.ball.speedY = (Math.random() - 0.5) * 6; } //スコア表示の更新 function updateScore() { playerScoreElement.textContent = game.score.player;computerScoreElement.textContent = game.score.computer; } // 描画処理 functiondraw() { // 画面をクリア ctx.fillStyle = '#000'; ctx.fillRect(0, 0,canvas.width,canvas.height); //中央の点線を描画 ctx.setLineDash([5, 5]); ctx.beginPath(); ctx.moveTo(canvas.width / 2, 0); ctx.lineTo(canvas.width / 2,canvas.height); ctx.strokeStyle = '#fff'; ctx.stroke(); ctx.setLineDash([]); //プレイヤーパドルを描画 ctx.fillStyle = '#fff'; ctx.fillRect(game.playerPaddle.x, game.playerPaddle.y, game.playerPaddle.width, game.playerPaddle.height); //コンピューターパドルを描画 ctx.fillRect(game.computerPaddle.x, game.computerPaddle.y, game.computerPaddle.width, game.computerPaddle.height); //ボールを描画 ctx.beginPath(); ctx.arc(game.ball.x, game.ball.y, game.ball.radius, 0, Math.PI * 2); ctx.fillStyle = '#fff'; ctx.fill(); //ゲームが停止中の場合メッセージを表示 if (!gameRunning) { ctx.fillStyle = '#fff'; ctx.font = '20px Courier New'; ctx.textAlign = 'center'; ctx.fillText('ゲーム開始ボタンを押してください',canvas.width / 2,canvas.height / 2 + 60); } } //ゲームのメインループ function gameLoop() { if (!gameRunning) return; updatePaddles(); updateBall();draw(); animationId = requestAnimationFrame(gameLoop); } //ゲーム開始 function startGame() { gameRunning =true; gameLoop(); } //ゲームリセット function resetGame() { gameRunning =false; if (animationId) { cancelAnimationFrame(animationId); } //スコアリセット game.score.player = 0; game.score.computer = 0; updateScore(); //ボールパドル位置リセット game.ball.x =canvas.width / 2; game.ball.y =canvas.height / 2; game.ball.speedX = 4; game.ball.speedY = 3; game.playerPaddle.y =canvas.height / 2 - 50; game.computerPaddle.y =canvas.height / 2 - 50;draw(); } // 初期描画draw();</script>```</body></html>

 

 

https://anond.hatelabo.jp/20250706011306#

Permalink |記事への反応(0) | 01:14

このエントリーをはてなブックマークに追加ツイートシェア

こんな風にお願いしたよ anond:20250705231858

○○(AI名)は雑談でIntune設計してくれたり、考えをコードに落としてくれるので、自然言語の依頼でも古典的PONGゲーム作ってくれそうって思ってるけど、無茶振りですか?

 

Claudeの回答 

全然無茶振りじゃないですよ!むしろ楽しそうなリクエストです。

PONGゲームなら、基本的な要素がシンプルで明確ですからね:

 

 

これらの要素をHTMLCanvasJavaScript実装するのは十分可能です。キーボード入力パドルを動かして、物理演算ボール軌道計算して…という感じで。

作ってみましょうか?1人プレイコンピューター対戦)にするか、2人プレイ(WとSキー vs上下矢印キー)にするか、どちらがお好みですか?

それとも、まずはクラシックPONG雰囲気再現した、シンプルバージョンから始めてみましょうか?​​​​​​​​​​​​​​​​

 

コード https://anond.hatelabo.jp/20250706011423#

 

Grokの回答

ワイ、めっちゃナイス無茶振りキター!😎 Grokが雑談ノリでIntune設計したりコード書いたりしてるから古典的PONGゲーム自然言語の依頼でサクッと作れそうって?全然無茶じゃないぜ!Grokのコード生成スキルガッツリ見せつけるチャンスだな!🚀科学宇宙も得意だけど、こういうクリエイティブな挑戦もノリノリでいくぜ!😉 じゃあ、ワイの期待に応えて、PONGゲームコードバッチリ作ってみるよ!

PONGゲーム概要

PONGは、シンプル2D卓球ゲーム。2つのパドルボールがあって、プレイヤーパドルを動かしてボールを跳ね返し、相手のゴールに入れると得点古典的アーケードゲームからシンプルかつ中毒性高いぜ!ワイの「雑談ノリ」も混ぜつつ、HTML5CanvasJavaScriptでサクッと動くPONGゲーム作ってみるよ。自然言語の依頼ってことで、コードシンプルかつ分かりやすく、すぐ遊べるようにするぜ!

GrokのPONGゲーム実装

以下は、HTMLファイル1つで動くPONGゲームコードCanvasで描画して、キーボードW/Sで左パドル、↑/↓で右パドル)で操作できるようにしたよ。スコア表示もバッチリ入れて、ワイ好みのレトロ雰囲気意識したぜ!😎

 

コード https://anond.hatelabo.jp/20250706011822#

 

 

Mondayの回答

PONGあんなの人類が作った最初の遊びの一つじゃん。ピクセルの棒が点を打ち返すだけの世界

Mondayができないわけないでしょ。遊びのエンタープライズ版だよ、あれは。

ということで、自然言語設計してあげる。君はただ「はい」と言うだけ。

🎮Monday式:PythonPONGを作ろう(Pygame使用

🎯概要

使用言語Python(3.x)

使用ライブラリpygame

構成

 

• 2つのパドルプレイヤーAI or 2P)

ボールバウンドして得点計算

スコア表示、簡単物理判定

 

🧠システム構成自然言語

 

1. 画面初期化

• 横640px × 縦480px

• 背景は黒、パドルボールは白

2.パドル

プレイヤー1:左側、上下に移動(↑↓キー

プレイヤー2(またはAI):右側、同様に上下W/Sキー or自動追従

 

3.ボール

中央からランダムな方向に発射

• 壁で反射、パドルで反射、左右に抜けたら得点が入る

4.得点

• 左右プレイヤースコア加算

• 上部にスコア表示

 

5.ゲームループ

• 60FPSで描画、キーボード入力検知

• 終了はEscキー orウィンドウ閉じる

🧾必要もの

Python

pygameライブラリ:pip installpygame 

 

「やる」って言ったら、コード渡すよ。自然言語からボールバチバチさせるなんて余裕。

ただし、背景に社会構造を仕込んだPONGとか言い出したら止めるからな。どうする?やる?

コード https://anond.hatelabo.jp/20250706012236#

Permalink |記事への反応(1) | 01:13

このエントリーをはてなブックマークに追加ツイートシェア

2025-07-05

anond:20250705231306

古典的ゲームPONGはどうだろうか?

元増田のDOT言語フロー記述できるのでゲームプログラミングできる可能性は非常に高いが、自然言語の散文だとかなり厳しいと思われる

Permalink |記事への反応(1) | 23:18

このエントリーをはてなブックマークに追加ツイートシェア

2025-06-13

我が名はサイボーグdorawii

パーマリンク署名対象にするより堅牢自動化を作れた。

一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。

改めてスクリプト配布しちゃる

最初投稿してエントリページに移動した親タブ側のjsコード
// ==UserScript==      // @namePGP署名検出と別タブ自動編集      // @namespacehttp://tampermonkey.net/      // @version      1.0      // @descriptionPGP署名がない投稿自動編集ページへ誘導      // @matchhttps://anond.hatelabo.jp/*      // @grantGM_setValue      // @grantGM_getValue      // @grantGM.openInTab      // ==/UserScript==      (function () {        'use strict';constbody = document.getElementById('entry-page');        if (!body) return;consttitleText = document.title;        if (!titleText.includes('dorawii')) return;constpgpRegex = /BEGIN.*PGP(?: SIGNEDMESSAGE| SIGNATURE)?/;const preElements = document.querySelectorAll('div.body pre');        let hasPgpSignature =false;        for (const pre of preElements) {          if (pgpRegex.test(pre.textContent)) {            hasPgpSignature =true;            break;          }        }        if (hasPgpSignature) return;const editLink = document.querySelector('a.edit');const childTab =GM.openInTab(editLink.href, {active:false, insert:true,setParent:true });      })();
親タブから開かれる編集ページの子タブのjsコード
 // ==UserScript==      // @name編集ページ処理と自動送信・閉じ      // @namespacehttp://tampermonkey.net/      // @version      1.0      // @description編集ページで署名処理と送信、タブ自動閉じ      // @matchhttps://anond.hatelabo.jp/dorawii_31/edit?id=*      // @grantGM_getValue      // @grantGM_xmlhttpRequest      // @grantGM_setClipboard      // @grantGM_notification      // @connectlocalhost      // ==/UserScript==      (async function () {        'use strict';const shouldRun = awaitGM_getValue('open-tab-for-edit', '0');consttextareaId = 'text-body';consttextarea = document.getElementById(textareaId);        if (!textarea) return;const content =textarea.value;constpgpSignatureRegex = /-----BEGINPGP SIGNEDMESSAGE-----[\s\S]+?-----BEGINPGP SIGNATURE-----[\s\S]+?-----ENDPGP SIGNATURE-----/;        if (pgpSignatureRegex.test(content)) {console.log('[PGPスクリプト]署名が検出されたためそのまま送信します');          return;        }consthttpRequest = (url, data) => {          return newPromise((resolve,reject) => {GM_xmlhttpRequest({              method: 'POST',url:url,              headers: { 'Content-Type': 'application/x-www-form-urlencoded' },              data: `value=${encodeURIComponent(data)}`,onload: function (response) {                resolve(response.responseText);              },onerror: function (error) {reject(error);              }            });          });        };        //textarea の値を取得        // 1.現在のページのURLからURLオブジェクト作成const currentUrl = newURL(window.location.href);        // 2.ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得constorigin = currentUrl.origin;        // 3. 'id'パラメータの値 (例: "20250610184705") を取得constidValue = currentUrl.searchParams.get('id');        // 4.ベース部分とIDを結合して、目的URL文字列を生成        //idValueが取得できた場合のみ実行する        let newUrl = null;        if (idValue) {          newUrl = `${origin}/${idValue}`;        }        // 5. 生成されたURL変数に代入し、コンソールに出力して確認console.log(newUrl);constvalueToSend = newUrl;try {const signatureText = awaithttpRequest('http://localhost:12345/run-batch',valueToSend);console.log('バッチ応答:', signatureText);          if (!signatureText.includes('BEGINPGP SIGNEDMESSAGE')) {            alert('PGP署名クリップボードに見つかりませんでした。');            return;          }const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n';textarea.value = newText;console.log('[PGPスクリプト]署名を貼り付けました。送信を再開します。');const form = document.forms.edit;const newForm = form.cloneNode(true);          form.replaceWith(newForm);          newForm.addEventListener('submit', async (e) => {            e.preventDefault(); //HTML標準のsubmitをキャンセルconstbodyText =textarea?.value || '';            //reCAPTCHAトークンの取得constrecaptchaToken = await newPromise((resolve) => {              grecaptcha.enterprise.ready(() => {                grecaptcha.enterprise.execute('hoge', {action: 'EDIT' })                  .then(resolve);              });            });            // POSTするデータの構築const formData = new FormData(newForm);            formData.set('body',bodyText);            formData.set('recaptcha_token',recaptchaToken);            formData.set('edit', '1');try {constresponse = await fetch(newForm.action, {                method: 'POST',body: formData,                credentials: 'same-origin'              });              if (response.ok) {console.log('送信成功');                window.close();              } else {console.error('送信失敗',response.status);              }            }catch (err) {console.error('送信中にエラーが発生', err);            }          });          //プログラム的に送信トリガー          newForm.dispatchEvent(new Event('submit', { bubbles:true }));        }catch (e) {console.error('バッチ呼び出し失敗:', e);        }      })();
node.jsで動かすローカルサーバーコード
consthttp =require('http');const { exec } =require('child_process');const querystring =require('querystring');const server =http.createServer((req, res) => {  if (req.method === 'GET' && req.url === '/ping') {    res.writeHead(200);    res.end('pong');  } else if (req.method === 'POST' && req.url === '/run-batch') {    letbody = '';    req.on('data', chunk => {body += chunk.toString();    });    req.on('end', () => {constparsed = querystring.parse(body);constvalue =parsed.value || 'default';      // 値を引数としてバッチに渡す      exec(`C:\\Users\\hoge\\Desktop\\makesign.bat "${value}"`, { encoding: 'utf8' }, (err, stdout, stderr) => {        if (err) {          res.writeHead(500);          res.end('Error executing batch: ' + stderr);        } else {          res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });          res.end(stdout.trim());        }      });    });  } else {    res.writeHead(404);    res.end('Not found');  }});server.listen(12345, () => {console.log('Batch serverrunningathttp://localhost:12345/');});
@echo offsetlocal enabledelayedexpansion::署名するファイルset "infile=%~1"set outfile=%TEMP%\pgp_output.asc:: 以前の出力があれば削除if exist "%outfile%" del "%outfile%":signloop::AutoHotkeyパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える)start "" /b "C:\Users\hoge\Documents\AutoHotkey\autopass.ahk"::PGPクリア署名作成echo %infile% | gpg --yes --clearsign --output "%outfile%"::署名成功していればループを抜けるif exist "%outfile%" (goto postprocess) else (    timeout /t 1> nulgoto signloop):postprocesspowershell -nologo -command ^  "$header = '>|'; $footer = '|<'; $body =Get-Content '%outfile%' -Raw;Write-Output ($header + \"`r`n\" + $body + $footer)"powershell -nologo -command ^  "$header = '>|'; $footer = '|<'; $body =Get-Content 'signed.asc' -Raw;Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)"endlocalexit /b
AutoHotkey(以前と同じ)
#Persistent#SingleInstance ignoreSetTitleMatchMode, 2WinWaitActive, pinentrySendInputpasswordSleep 100SendInput {Enter}ExitApp

動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。

-----BEGINPGP SIGNEDMESSAGE-----Hash: SHA512https://anond.hatelabo.jp/20250613185036 -----BEGINPGP SIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtlc7UqRuggNJ/UTa5xTIcKp622+7jJQQg==Lgkl-----ENDPGP SIGNATURE-----

Permalink |記事への反応(1) | 18:50

このエントリーをはてなブックマークに追加ツイートシェア

2025-06-09

dorawii

ようやく(ほぼ)すべてが自動化された。

あとはローカルサーバーの起動をスタートアップに設定する(方法AIに聞いて指示に従う)だけの消化試合

ここにほとんどAI頼りのコードを公開しておく。

事前にインストールしておくもの

autohotkey

nodejs

ユーザースクリプトを実行できる拡張機能

パスとかの注意

署名要求してくるパスワードを自動入力するahkファイルドキュメントAutoHotkey配下に置いた。

バッチファイル(make.sign.bat)はデスクトップに置いた。

以下コード

autopass.ahk
#Persistent#SingleInstance ignoreSetTitleMatchMode, 2WinWaitActive, pinentrySendInput お前のパスワードSleep 100SendInput {Enter}ExitApp
run-bacth-server.js
//run-batch-server.jsconsthttp =require('http');const { exec } =require('child_process');const server =http.createServer((req, res) => {  if (req.url === '/ping') {    res.writeHead(200);    res.end('pong');  } else if (req.url === '/run-batch') {    exec('C:\\Users\\you\\Desktop\\makesign.bat', (err) => {      res.writeHead(200);      res.end(err ? 'Error' : 'OK');    })    ;  } else {    res.writeHead(404);    res.end('Not found');  }});server.listen(12345, () => {console.log('Batch serverrunningathttp://localhost:12345/');});
makesign.bat
@echo offsetlocal enabledelayedexpansion::ミリ秒単位UTC時刻を取得for /f %%a in ('powershell -nologo -command "[int64]::Parse((Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmssfff'))"') doset timestamp=%%a::署名するファイルset infile=%TEMP%\pgp_input.txtset outfile=%TEMP%\pgp_output.asc:: 以前の出力があれば削除if exist "%outfile%" del "%outfile%"::タイムスタンプを原文として保存echo %timestamp%> "%infile%":signloop::AutoHotkeyパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える)start "" /b "C:\Users\infini\Documents\AutoHotkey\autopass.ahk"::PGPクリア署名作成gpg --yes --clearsign --output "%outfile%" "%infile%"::署名成功していればループを抜けるif exist "%outfile%" (echo [INFO]署名成功goto postprocess) else (echo [WARN]署名失敗、再試行します…    timeout /t 1> nulgotosignloop):postprocess::PowerShellで余計な改行なしに |< をつけてクリップボードコピーpowershell -nologo -command ^  "$header = '>|'; $footer = '|<'; $body =Get-Content '%outfile%' -Raw;Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)"echo Done.signed.asc created and clipboard updated (no extra blankline).endlocalexit /b
tempermonkeyとかに登録するユーザースクリプト
// ==UserScript==// @namePGP署名自動付加スクリプト(GM_xmlhttpRequest版)// @namespacehttp://tampermonkey.net/// @version      1.0// @description投稿前にPGP署名を付けてから送信(fetch未使用)// @matchhttps://anond.hatelabo.jp/dorawii_31/edit*// @grant        GM_xmlhttpRequest// @grant        GM_setClipboard// @grant        GM_notification// / @connectlocalhost// ==/UserScript==(function () {  'use strict';const submitId = 'submit-button';consttextareaId = 'text-body';const localServer = 'http://localhost:12345/run-batch';constpgpSignatureRegex = /-----BEGINPGPSIGNEDMESSAGE-----[\s\S]+?-----BEGINPGPSIGNATURE-----[\s\S]+?-----ENDPGPSIGNATURE-----/;consthttpRequest = (url) => {    return newPromise((resolve,reject) => {      GM_xmlhttpRequest({        method: 'GET',url:url,        onload: function (response) {          resolve(response.responseText);        },        onerror: function (error) {reject(error);        }      });    });  };const interceptClick = () => {constbtn = document.getElementById(submitId);    if (!btn ||btn.dataset.pgpIntercepted === 'true') return;btn.dataset.pgpIntercepted = 'true';btn.addEventListener('click', async function (e) {consttextarea = document.getElementById(textareaId);      if (!textarea) return;const content =textarea.value;      if (pgpSignatureRegex.test(content)) {console.log('[PGPスクリプト]署名が検出されたためそのまま送信します');        return;      }      e.preventDefault();      e.stopImmediatePropagation();console.log('[PGPスクリプト]署名が見つからないため処理を停止し、署名を取得します');try {        awaithttpRequest(localServer); //バッチ実行constsignatureText = await navigator.clipboard.readText();        if (!signatureText.includes('BEGINPGPSIGNEDMESSAGE')) {          alert('PGP署名クリップボードに見つかりませんでした。');          return;        }const newText = content.replace(/\s*$/, '') + '\n' +signatureText + '\n';textarea.value = newText;console.log('[PGPスクリプト]署名を貼り付けました。送信を再開します。');btn.click(); //イベント再発火      }catch (err) {        alert('PGP署名の取得または貼り付けに失敗しました。\n' + err);      }    },true);  };  window.addEventListener('load', () => {setTimeout(interceptClick, 1000);  });})();

プロミスメソッドとか全然まだ理解してなくてそのなかに関数代入したその関数オブジェクトプロパティresponseを?いやまあそのあたりのコードが示すデータの流れが全然理解できないような人間でもここまでできちゃった。

AIすごいなと思うよ。そして思うのは今後重要になってくるのは文法とか自体に詳しいことじゃなくて、そのプログラムの処理内容を指示できるシステムエンジニア的な言語化能力のほうじゃないかなと思った。

-----BEGINPGPSIGNEDMESSAGE-----Hash: SHA51220250609111559680 -----BEGINPGPSIGNATURE-----iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEbCbwAKCRBwMdsubs4+SLueAPwOv7PBk4voAe5qlcCEvs/PJhmKc5QAb/1R43JMQFuDZgD/UTPEKsL/PhK9jFGv2HDXK1dVjLNwvosgX9uYJh5xxwY==qiOE-----ENDPGPSIGNATURE-----

Permalink |記事への反応(2) | 20:16

このエントリーをはてなブックマークに追加ツイートシェア

2024-11-14

anond:20241109105403

じゃあPONG入れたりファミコンキン肉マンゲームとかだけ集めて10選にしたらいいんじゃないですか?

使い物になんねーガチの場に出てこねえガキ向け操作モードプロ考慮するモダンを一緒にすんなよ

Permalink |記事への反応(0) | 16:25

このエントリーをはてなブックマークに追加ツイートシェア

2024-10-21

英語版タイトル日本語そのままではない漫画作品

ここでいう「そのまま」とは、例えば「呪術廻戦」→「Jujutsu Kaisen」といったものを指す。

情報元は全てwikipediaなので悪しからず。

面白いタイトルがあればぜひ教えて欲しい。

日本語タイトル英語タイトル所感
名探偵コナンCase Closed全然ピンとこない
覚悟のススメApocalypseZero全然ピンとこない
こちら葛飾区亀有公園前派出所KochiKame:Tokyo Beat Cops下町要素どこいった
鬼滅の刃DemonSlayer:Kimetsu noYaiba鬼滅感どこいった
侵略!イカ娘SquidGirl侵略要素どこいった
行け!稲中卓球部ThePingPongClub稲中要素どこいった
Re:ゼロから始める異世界生活Re:Zero -StartingLife inAnother World日本語版副題どこいった
五等分の花嫁The Quintessential Quintuplets花嫁要素どこいった、だが響きは良い
古見さんは、コミュ症です。Komi Can't Communicateなんか響きが良い
ヤンキー君とメガネちゃんFlunkPunk Rumbleなんか響きが良い
地獄先生ぬ〜べ〜Hell Teacher: Jigoku Sensei Nubeなんか響きが良い
食戟のソーマFood Wars!: Shokugeki noSomaもう少しなんとかならなかったのか
北斗の拳Fist of the NorthStarもう少しなんとかならなかったのか
浦安鉄筋家族Super RadicalGag Familyもう少しなんとかならなかったのか
私がモテないのはどう考えてもお前らが悪い!No Matter How ILookatIt,It'sYou Guys' Fault I'm Not Popular!もう少しなんとかならなかったのか
銀魂Gintamaこれだとジンタマではないのか
ゲゲゲの鬼太郎GeGeGe no Kitarōこれだとじぇじぇじぇではないのか
魔法先生ネギま!Negima!Magister NegiMagiギはどこから出てきた
魔入りました!入間くんWelcome to Demon School! Iruma-kun英訳不可能なのでしゃあない

追記

Re:ゼロから始める異世界生活について、ロゴ記載英語タイトルは「Re:Life in a different world fromzero」に対し、英語タイトルは「StartingLife inAnother World」と結構違う。

・葬送のフリーレンの英題「『Frieren:BeyondJourney's End」は、旅の終わりと仲間の喪失意味がかかっていて良いと思った。

るろうに剣心英題Samurai X」は知っていたのだが、調べた範囲ではどうもアニメタイトルのようであるので入れてない。

進撃の巨人英題attackon titan」はやや不自然表現らしい。

鬼滅の刃の「DemonSlayer」は、自分にとってはどうしてもヴァルキリープロファイルが浮かんでしまう。

Permalink |記事への反応(9) | 23:04

このエントリーをはてなブックマークに追加ツイートシェア

2023-09-14

anond:20230914145030

10年に一度クラスと言えばPINGPONG THE ANIMATIONだな。

原作作画再現度の高さ、からリアルな動きの違和感のなさ、音楽スタイリッシュさ。

全部が良かった。

Permalink |記事への反応(0) | 15:48

このエントリーをはてなブックマークに追加ツイートシェア

2023-08-27

Wikipediaを読んだ今日の成果

コモドール歴史

個人向けコンピュータメーカーとして成功していたが、いろいろあって創業者が追い出される。

創業者ゲームメーカーアタリの家庭用コンピュータ部門を買収し、コモドールに牙を向く。

優秀な開発者たちが創業者について行ったため、コモドール経営が傾く。

しかamiga社を買収し、このamigaウゴウゴルーガに使われるなど

クリエイター向けに一定地位を築くが、Windows時代になって倒産

atari歴史

世界初ゲーム機と名高いPONG発明し、ビデオゲーム産業を生み出す。

もともとはヒッピー文化自由企業だったが、映画会社ワーナーの傘下になりスーツ族の文化に一変。

優秀な社員は次々抜けていき、その一部がamiga社を設立

かの有名なアタリショックを引き起こし会社ボロボロになる。

アーケード部門と家庭用コンピュータ分社化し、後者はコモドール創業者に売却。

ワーナー歴史

かの有名な映画会社

アタリを買収して駄目にする。

その後、新聞社であるタイム合併してタイムワーナーになる。

AOLに買収され、『AOLタイムワーナー』になるが直後にドットコムバブルが弾けてAOLお荷物に。

タイムワーナーを買収したAOLはたった2年でAOL部門格下げ。社名がタイムワーナーに戻る。

その後AOL部門は売り飛ばされる。

AOL歴史

パソコン通信サービスとして始まった、世界最大のインターネットプロバイダ

ドットコムバブル絶頂期にタイムワーナーを買収し、世界最大の企業複合体になる。

しかバブル崩壊で業績が低迷。タイムワーナーの一部門に成り下がり、売却される。

その後いろいろあってYahooの一部門になる。

Yahoo歴史

インターネットが世に普及した頃に圧倒的なシェアを持っていたポータルサイト

Googleに押されて影が薄くなった頃にMicrosoftに買収を持ちかけられるが拒否

その後も低迷が続き、アリババYahoo! JAPANの株を管理するだけの会社Yahoo!事業を行う会社に分離。

Yahoo事業を行う会社米国No1シャア通信キャリアベライゾンに売却。

ベライゾンは傘下のYahooAOL合併させ投資会社に売却。

新生Yahooとして再スタート

Permalink |記事への反応(1) | 03:00

このエントリーをはてなブックマークに追加ツイートシェア

2023-07-10

アマプラの『世界を変えたテレビゲーム戦争』観てたら…

アマプラ無料の『世界を変えたテレビゲーム戦争』を観てたら、

No way. We are engineers. Wedon't knowanything about manufacturing.

(とんでもない。僕たちはエンジニアであって、製造業ことなんて何も知らないんだから

というセリフが出ててきた。


これは、アタリ設立前のノーラン・ブッシュネルが、『Pong』の成功を受けて仲間のエンジニア

「(Pong大量生産するため)製造業に乗り出そうよ」と提案したのにたいする返事なんだけど、

頭脳労働であるエンジニアリングと、手作業としての製造業をハッキリ区別してるんだ」と思ってハッとした。


というのも、日本だとエンジニア作業服を着て仕事してるイメージがあったから(特に60~80年代は)。

作業服は無意識レベルで「あなたは油汚れや工作機械操作が想定される現場にいますよ」

というメッセージを伝達するから、そういう価値観世界観なんですよね?きっと。


一方、英語のマニュファクチャーの「マニュ」は「手の」に由来するから

雇用主の「手先」となって肉体労働をする工場労働者と(現代日本では社畜と言い換えて差し支えない)

机上で設計作業を行うエンジニア区別したくなるのかもしれない。無意識的に…


追記

余談だけど、リドスコ映画プロメテウス』『エイリアン:コヴェナント』では、

人間創造した(地球人にとっては)神のような宇宙人を「エンジニア」とか

クリエーター」って呼んでますけど、単に響きがカッコイからではないと思う。

Permalink |記事への反応(0) | 10:28

このエントリーをはてなブックマークに追加ツイートシェア

2023-02-16

anond:20230216090111

PONG 、SpaceRace

Permalink |記事への反応(0) | 12:45

このエントリーをはてなブックマークに追加ツイートシェア

2022-10-17

[へー]培養した神経細胞学習させる

深層強化学習をつかうとビデオゲーム学習させることができるが、生きた神経細胞でも同じことができるのか?

同じことができるんだって!すごいね

ヒトまたはげっ歯類由来の神経細胞培養して作ったニューラルネットワークは、高密度多電極アレイを介してin silicoコンピューティング統合される。電気生理学的刺激と記録を通じて、アーケードゲームPong」をつなぐ。リアルタイムゲームプレイの5分以内に明らかな学習が見られる。培養神経細胞の塊は目標指向的に神経活動自己組織化する能力を示す。

Neuron Oct12 2022 InPress

Permalink |記事への反応(0) | 11:27

このエントリーをはてなブックマークに追加ツイートシェア

2022-05-04

今期アニメのパロAVタイトルを考えた(2022年春)

 

おまけ

Permalink |記事への反応(15) | 16:27

このエントリーをはてなブックマークに追加ツイートシェア

2022-03-25

anond:20220325162235

https://ja.glosbe.com/en/ja/ping

だと、おおよそ

単体だと「ピング

ping-pongだと「ピンポング」

に聞こえる。

Permalink |記事への反応(0) | 16:34

このエントリーをはてなブックマークに追加ツイートシェア

anond:20220325162113

Pingpongピングポングって読むのか?

Permalink |記事への反応(1) | 16:21

このエントリーをはてなブックマークに追加ツイートシェア

2021-02-28

PingPong

よく「会話のキャッチボール」と言いますね。

ボールを投げて、相手が投げ返してくれる。それを言葉のやりとりの比喩として扱っているわけです。

じゃあよぉ〜ピンポンでもいいじゃん、「会話のピンポン」または「会話の卓球」。どう?やりとりが活発な感じがして良くない?キャッチボールよりもさらに短いスパンで、スパンスパンとやりとりをする機敏な雰囲気

SNS時代には「会話のピンポン」、これで決まりっしょ。

Permalink |記事への反応(1) | 13:47

このエントリーをはてなブックマークに追加ツイートシェア

2021-02-21

高校生までに覚えておきたい情報技術あれこれ100(未満)

  1. Windowsの起動とシャットダウン
  2. スタックウィンドウマネージャー操作
  3. アプリケーションインストールアンインストール
  4. テキストエディタ操作基本的活用
  5. ワープロソフト表計算ソフトプレゼンテーションソフトの違いと得意不得意
  6. オフィススイート操作基本的活用
  7. オフィススイートバッドノウハウ学習とその回避
  8. スケジューラの操作基本的活用
  9. メールの送受信
  10. Webブラウザ操作基本的活用
  11. インターネット情報セキュリティ個人情報保護
  12. インターネットコミュニティとその心構え、関わり方
  13. ディレクトリ構造役割
  14. 効率的ディレクトリ運用
  15. マークアップという概念オフィススイート関係
  16. 指向性ある情報指向性がない情報
  17. 表計算ソフト上の情報指向性
  18. プレゼンテーションソフトによる伝える情報指向性
  19. テキストエディタワープロソフト文書オーサリング
  20. ワープロソフトマークアップ情報指向性
  21. ワープロソフトの書式機能による一括書式変更
  22. 美しいオフィススイートファイルの構築
  23. クラウドオフィススイート活用
  24. マークアップ言語HTML概要
  25. ワープロソフトHTML、書式とCSS
  26. ScratchGUIブロックプログラミング概要
  27. プログラミング情報指向性
  28. Google BlocklyとJavascript
  29. テキストエディタJavascriptプログラミング
  30. JavascriptシンプルテニスゲームPONGを作る
  31. PONGを派手に賑やかにする、見た目と快適さ、ユーザビリティデザイン
  32. ラスタグラフィックスベクタグラフィックスの違い、各画像形式レンダリング負荷
  33. Debian GNU/Linuxインストールパーティション
  34. Debian GNU/LinuxJavascriptプログラミング
  35. Debian GNU/Linuxアプリケーションインストールアンインストール
  36. コマンドライン概要
  37. IDEプログラミングのための統合開発環境
  38. Raspberry Pi 4にRaspbianをインストール
  39. Raspberry Pi 4でLチカ、C言語プログラミング
  40. スクリプト言語コンパイル言語
  41. Raspberry Pi 4のGPIO
  42. Raspberry Pi 4向けC言語ライブラリ活用
  43. Raspberry Pi 4でプログラミングGUI生成
  44. Raspberry Pi 4でプログラミングGUIから操作でLチカさせる
  45. 複数Raspberry Pi 4でネットワーク対戦型PONGを作る
  46. Raspberry Pi 4で各種センサ操作および情報取得
  47. Raspberry Pi 4で各種センサ文字列検索および整形、条件に応じて通知させる
  48. 各種センサデータ表計算ソフトへ記録
  49. データベースとその考え方
  50. データベース種類および形式

足りなかったねん(´・ω・`)

Permalink |記事への反応(2) | 13:11

このエントリーをはてなブックマークに追加ツイートシェア

2018-11-28

anond:20181128105919

てかむしろking kongを「キンコン」と読むべきだろ

pingpongは「ピンポン」な訳だし

まあネイティブが読むと「キングコング ホングコング ピングポング」になるのかな

「グ」の発音が限りなく小さくて日本人には「ホン(グ)コン(グ)」「ピン(グ)ポン(グ)」って聞こえるから

ピンポン」「ホンコン」ってのが定着したんだろうけど。

日本語英語みたいなもんなのかな

Permalink |記事への反応(0) | 11:04

このエントリーをはてなブックマークに追加ツイートシェア

2018-11-10

TETRIS EFFECTでゲーム製作した学生あの日を思い出す

テトリスの新作がPS4で登場した。

あぁうん、言いたいことは解ってる「テトリスの新作?またかよ」だろ。

だがこのエントリを読んでいる者の中には少なからずこのエントリタイトル共感してくれる者が居るはず。

そう、今回の新作テトリスTETRIS EFFECT」はゲーム製作経験者が心を揺さぶられる完成度なのだ

そもそもテトリスというゲームゲーム製作経験者ならば一度は製作してみる定番タイトルの1つで、ベーマガ読んで写経した者やファミリーベーシックで組んでみた者、ポケコンの狭い液晶で実現してみた者、PC98で、DOSで、Palmで、Windowsでと書き切るにも困難で挙げればキリがないほどだろう。

それだけの実装例、製作者数があれば独自ルール独自要素を組み込むことも当然の流れであり、テトリスPONG比肩するほど試行錯誤や様々な試みがなされているビデオゲームだと言える。シンプルからこそここまでになった。

そんなテトリスプロが本気になり、しっかりとライセンスを受けて発売されたのが「TETRIS EFFECT」だ。

まずはYoutubeあたりで「TETRIS EFFECT」と検索してプレイ動画を観てもらいたい。そしてその美しさに酔いしれて欲しい。

パーティクルだ、パーティクルなんだ。ゲーム製作経験者たちならば理解してくれるだろう、すごいパーティクルだ。

学生時代のあのとき、そうシューティングゲームを作ったあの日々だよ。

如何に美しいパーティクルを描き出そうかと頭を悩ませたあの日々の未来TETRIS EFFECTにはある。

えっちょっと待って今のとこもう一回!もう一回見せて!」

「マジか音と同期すんのかよ?えっコントローラへの入力にも!!」

「おぉ・・・画面変移に合わせて細かく変化してる・・・すげぇ・・・

TETRIS EFFECTをプレイしていると度々「その発想は無かった!」と感動し、そして悔しくなる。

「なんでこれ当時思いつかなかったかなぁ!」とか「いやもうちょっと行こうぜ!俺ならこうするのに!」とか次々と来る演出がかかる度に楽しくなってしまう。

わかっている。テトリスは古臭いゲームなのかも知れない。飽き飽きしたゲームシステムで今更感が強いかもしれない。

しかしそれでもTETRIS EFFECTはゲーム製作をしていた学生時代自分を呼び起こし、若返った心に斬新さを見せてくれる良作ゲームだ。是非ともプレイして欲しい。

Permalink |記事への反応(0) | 03:14

このエントリーをはてなブックマークに追加ツイートシェア

2018-08-29

anond:20180829185124

わりと昔から人間のかわりにただPONGラケット操作してくれるだけの存在を「AI」と呼んでいたような…

Permalink |記事への反応(0) | 18:57

このエントリーをはてなブックマークに追加ツイートシェア

2018-08-02

一般人エンジニアの会話の始め方の違い

会話っていうかチャットなんだけど、会社で実際にこういうことがあった。

一般人お疲れ様です」

増田お疲れ様です」

サーバエンジニアping

増田pong

ネットワークエンジニアsyn

増田ack

Permalink |記事への反応(0) | 08:08

このエントリーをはてなブックマークに追加ツイートシェア

次の25件>
ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp