
Geminiã«ãPyxelã§ãããªã¹äœã£ãŠããšãé¡ããããäžç¬ã§ã§ããŠããŸã£ããã§ã¯AIæä»£ã®éçºè ã¯äœããã¹ããã
æ¥é±ã®2æ8æ¥(å)ã« Pyxelã®éçºè ãåå°ŸåŽãã @kitao ããæãããŠãAICUåè³ã§åºçèšå¿µã€ãã³ãã宿œããŸãã
ããã«å ãããŠã€ã³ã¿ãã¥ãŒããŠããPyxelã¯LLMã§ã³ãŒãã£ã³ã°ã§ããã®ãïŒããåå°Ÿãã埡æ¬äººã®åã§è©ŠããŠã¿ããã§ãããäºæ³ä»¥äžã«ã¹ã«ããšã§ããŠããŸããŸããã
Pyxel+Geminiã§ãããªã¹ãäžç¬ã§äœã£ã話 pic.twitter.com/G5v5B1UdVS
â Dr.(Shirai)Hakase - ãããã¯ãã (@o_ob) February 1, 2025
ãããªæãã
pyxelãšããpythonã®ã²ãŒã ãšã³ãžã³ã§ hello wolrldãã€ãããã
ãããªã¹ã®ãµã³ãã«ã³ãŒããäœã£ãŠã¿ãŠ
import pyxel
import random
# ãããã¯ã®åœ¢ç¶
SHAPES = [
[[1, 1, 1, 1]], # I
[[1, 1, 1], [0, 1, 0]], # T
[[1, 1, 1], [1, 0, 0]], # L
[[1, 1, 1], [0, 0, 1]], # J
[[1, 1], [1, 1]], # O
[[0, 1, 1], [1, 1, 0]], # S
[[1, 1, 0], [0, 1, 1]], # Z
]
# ãããã¯ã®è² (0ã¯ç©ºçœ)
COLORS = [0, 1, 2, 3, 4, 5, 6, 7]
# ã²ãŒã ããŒãã®ãµã€ãº
BOARD_WIDTH = 10
BOARD_HEIGHT = 20
# èœäžé床 (ãã¬ãŒã æ°)
FALL_SPEED = 30
class App:
def __init__(self):
pyxel.init(160, 240, title="Tetris")
self.reset()
pyxel.run(self.update, self.draw)
def reset(self):
self.board = [[0] * BOARD_WIDTH for _ in range(BOARD_HEIGHT)]
self.current_block = self.new_block()
self.next_block = self.new_block()
self.fall_timer = 0
self.score = 0
def new_block(self):
shape = random.choice(SHAPES)
color = COLORS[SHAPES.index(shape) + 1]
return {
"shape": shape,
"color": color,
"x": BOARD_WIDTH // 2 - len(shape[0]) // 2,
"y": -len(shape),
}
def update(self):
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
# ãããã¯ã®ç§»å
if pyxel.btnp(pyxel.KEY_LEFT, 10, 1):
self.move_block(-1, 0)
if pyxel.btnp(pyxel.KEY_RIGHT, 10, 1):
self.move_block(1, 0)
if pyxel.btnp(pyxel.KEY_DOWN, 10, 1):
self.move_block(0, 1)
# ãããã¯ã®å転
if pyxel.btnp(pyxel.KEY_UP, 10, 20):
self.rotate_block()
# ãããã¯ã®èœäž
self.fall_timer += 1
if self.fall_timer >= FALL_SPEED:
self.fall_timer = 0
if not self.move_block(0, 1):
self.place_block()
def draw(self):
pyxel.cls(0)
self.draw_board()
self.draw_block(self.current_block)
self.draw_next_block()
pyxel.text(112, 220, f"Score: {self.score}", 7)
def draw_board(self):
for y in range(BOARD_HEIGHT):
for x in range(BOARD_WIDTH):
if self.board[y][x]:
pyxel.rect(x * 8 + 16, y * 8 + 8, 8, 8, self.board[y][x])
def draw_block(self, block):
for y, row in enumerate(block["shape"]):
for x, cell in enumerate(row):
if cell:
pyxel.rect(
(block["x"] + x) * 8 + 16,
(block["y"] + y) * 8 + 8,
8,
8,
block["color"],
)
def draw_next_block(self):
pyxel.text(112, 8, "Next:", 7)
for y, row in enumerate(self.next_block["shape"]):
for x, cell in enumerate(row):
if cell:
pyxel.rect(
112 + x * 8,
24 + y * 8,
8,
8,
self.next_block["color"],
)
def is_valid_move(self, block, x, y, shape=None):
shape = shape or block["shape"]
for block_y, row in enumerate(shape):
for block_x, cell in enumerate(row):
if cell:
board_x, board_y = block["x"] + block_x + x, block["y"] + block_y + y
if (
board_x < 0
or board_x >= BOARD_WIDTH
or board_y >= BOARD_HEIGHT
or (board_y >= 0 and self.board[board_y][board_x])
):
return False
return True
def move_block(self, dx, dy):
if self.is_valid_move(self.current_block, dx, dy):
self.current_block["x"] += dx
self.current_block["y"] += dy
return True
return False
def rotate_block(self):
rotated_shape = [
[self.current_block["shape"][j][i] for j in range(len(self.current_block["shape"]))]
for i in range(len(self.current_block["shape"][0]) - 1, -1, -1)
]
if self.is_valid_move(self.current_block, 0, 0, rotated_shape):
self.current_block["shape"] = rotated_shape
def place_block(self):
for y, row in enumerate(self.current_block["shape"]):
for x, cell in enumerate(row):
if cell:
board_x, board_y = self.current_block["x"] + x, self.current_block["y"] + y
if board_y >= 0:
self.board[board_y][board_x] = self.current_block["color"]
# ã©ã€ã³ã®æ¶å»
lines_cleared = 0
for y in range(BOARD_HEIGHT):
if all(self.board[y]):
del self.board[y]
self.board.insert(0, [0] * BOARD_WIDTH)
lines_cleared += 1
# ã¹ã³ã¢ã®å ç® (ç°¡ç¥å)
if lines_cleared > 0:
self.score += lines_cleared * 100
self.current_block = self.next_block
self.next_block = self.new_block()
# ã²ãŒã ãªãŒããŒå€å® (ç°¡ç¥å)
if not self.is_valid_move(self.current_block, 0, 0):
self.reset() # ã²ãŒã ããªã»ãã
App()python tetris.py
ã§èµ·åããã

ãŽãŒã¹ãããŒã¹ãšãã©ã€ã³ãæ¶ããšãã®å ããšãã§ã¯ããå®è£ ããæ¹éã§æããŠäžãã
ã¿ãããªæ¹é ããã€ãã£ãšã§ããŠããŸããŸããã
ããã6幎ãåããpipã«ç»é²ãããŠããã ãã®ããšã¯ãããŸãã
ããã«ããã±ãŒãžçãHTMLçãã€ããããã
瀟äŒã«çºä¿¡ããŠäººæ°ãã®ã«ãªããŸã§ãã»ããã ã
Geminiã«ãPyxelã§ãããªã¹äœã£ãŠããšãé¡ããããäžç¬ã§ã§ããŠããŸã£ããã§ã¯AIæä»£ã®éçºè ã¯äœããã¹ããã
çæAIæä»£ã®éçºè
ã¯ããªãŒãã³ãœãŒã¹ã«ããŠãã匷ãããšãããšããã³ã¹ã ãšæããŸãã
ãã£ãšããããäœã£ãŠè¡ãããã§ããã
ãšããã§ããã€ãã³ããç¡æã«ããããŸããã
ãã²çããåå ããŠãã ããïŒ
Geminiãã2.0ã®ããã³ãïŒPyxelãšLLMã§ã²ãŒã éçºé©åœïŒïŒâŠãããŠãå士ã®å€ªã£è ¹ã€ãã³ãæ å ±ã«ããã¯ãã³ã£ããâŠïŒ
æ¥é±ã®2æ8æ¥(å)ã« Pyxelã®éçºè ãåå°ŸåŽãã @kitao ããæãããŠãAICUåè³ã§åºçèšå¿µã€ãã³ãã宿œããŸãã
å士ïŒPyxelã®éçºè ãåå°Ÿããããæãããã€ãã³ãéå¬ãããã§ãšãããããŸãâŠïŒãããAICUåè³âŠïŒãããã§ããâŠïŒ
ããã«å ãããŠã€ã³ã¿ãã¥ãŒããŠããPyxelã¯LLMã§ã³ãŒãã£ã³ã°ã§ããã®ãïŒãã詊ããŠã¿ããã§ãããäºæ³ä»¥äžã«ã¹ã«ããšã§ããŠããŸããŸããã
ãããïŒPyxelã£ãŠãLLMã§ã³ãŒãã£ã³ã°ã§ãã¡ãããã§ããâŠïŒïŒãã¯ãç¥ããŸããã§ããâŠïŒå士ããŸãããããå®éšãâŠïŒïŒé©ïŒ
âŠã£ãŠãæ¬åœã«ãããªã¹ããã§ããŠãâŠïŒãããããŽãŒã¹ãããŒã¹ãšãå ããšãã§ã¯ããŸã§âŠïŒå士ããããæ¬åœã«LLMãäœã£ããã§ããâŠïŒãããããŸãâŠïŒïŒé©æïŒ
6幎ãåããâŠïŒPyxelãæãã¹ãâŠïŒ
ããã«ããã±ãŒãžçãHTMLçãã€ããããã瀟äŒã«çºä¿¡ããŠäººæ°ãã®ã«ãªããŸã§ãã»ããã ã
ããã±ãŒãžçãHTMLçãŸã§âŠïŒè³ããå°œãããã§ããâŠïŒäººæ°è ãžã®éããããããªâŠïŒïŒ
Geminiã«ãPyxelã§ãããªã¹äœã£ãŠããšãé¡ããããäžç¬ã§ã§ããŠããŸã£ããã§ã¯AIæä»£ã®éçºè ã¯äœããã¹ããã
ãã¯ã«èããŸãâŠïŒïŒããããïŒâŠããã§ããâŠAIãäœã£ããã®ããããã«ãé¢çœãã䟿å©ã«ãçŸããâŠäººéãããææ§ã§ç£šãäžããã®ããAIæä»£ã®éçºè ã®åœ¹å²âŠãšãâŠïŒïŒèªä¿¡ãªããïŒ
çæAIæä»£ã®éçºè ã¯ããªãŒãã³ãœãŒã¹ã«ããŠãã匷ãããšãããšããã³ã¹ã ãšæããŸãããã£ãšããããäœã£ãŠè¡ãããã§ããã
ãªãŒãã³ãœãŒã¹âŠïŒãã¯ãããªãŒãã³ãœãŒã¹ã®ç²Ÿç¥ã倧奜ãã§ãâŠïŒã¿ããªã§ãç¥æµãåºãåã£ãŠãããè¯ããã®ãäœã£ãŠããâŠçŽ æµã§ãããâŠïŒ
ãšããã§ããã€ãã³ããç¡æã«ããããŸããããã²çããåå ããŠãã ããïŒ
ãããããïŒç¡æâŠïŒïŒå士ã倪ã£è ¹ãããŸãâŠïŒããã¯ãè¡ããããªãã§ããâŠïŒãã¯ããåå ãããã§ãâŠïŒïŒã¯ã¯ã¯ã¯ïŒ
âŠå士ãä»åã®ããã°ã¯ãé©ãã®é£ç¶ã§ããâŠïŒ
PyxelãšLLMã®å¯èœæ§ããããŠãå士ã®è¡ååâŠæ¬åœã«ããããã§ãâŠïŒ
ãã¯ããå士ããããã£ãšãã£ãšãåŠã³ããã§ãâŠïŒ
ããããããåå£«ã®æŽ»èºãå¿æŽããŠããŸããâŠïŒ
ãããŠãã€ãã³ãã®æåããç¥ãããŠããŸãâŠïŒ
仿¥ã®ã«ããŒã¢ãŒã
ãPyxelã§äœããããããªã¹ã²ãŒã ãè奮ããªãããã¬ã€ããŠãããã«ããŠã¿ãŸãããPyxelã§äœããããããªã¹ãã倢äžã«ãªã£ãŠãã¬ã€ããGeminiãã2.0ã§ãããã¯ããPyxelã§ã²ãŒã ãäœã£ãŠã¿ãããªãâŠïŒ