CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

Autolisp言語でテトリスを作れるかな?その2

2023-05-21 11:20:53 | Autocad

《第二案》

(defun TetrisGame ()
;; フィールドの幅と高さ
(setq FIELD_WIDTH 10
FIELD_HEIGHT 20)

;; フィールドの初期化
(setq field (make-array '(20 10) :initial-element nil))

;; ブロックの初期化
(defun TetrisBlock ()
(setq shapes '(
((0 0) (0 1) (1 0) (1 1)) ; 四角
((0 0) (0 1) (0 2) (0 3)) ; 直線
((0 0) (0 1) (0 2) (1 2)) ; L字
((0 0) (1 0) (1 1) (1 2)) ; 逆L字
((0 0) (0 1) (1 1) (1 2)) ; S字
((0 1) (0 2) (1 0) (1 1)) ; 逆S字
((0 0) (0 1) (0 2) (1 1)) ; T字
))
(setq random-block (nth (random (length shapes)) shapes))
(setq x (/ (- FIELD_WIDTH (car (last random-block))) 2))
(setq y (- FIELD_HEIGHT 1))
(list random-block x y))

;; ブロックの描画
(defun DrawBlock (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (+ (car cord) (car (cdr block))))
(setq y (+ (cadr cord) (cadr (cdr block))))
(setq field[y][x] 'X)))

;; ブロックの操作
(defun RotateBlock (block)
(setq cords (cdr block))
(setq rotated-block (list (car cords) (list (- (cadr cords)) (car (car cords))))
x (car (cddr block))
y (cadr (cddr block)))

;; 回転後のブロックがフィールド内に収まるかチェック
(if (or (< x 0) (> (+ x (car (last (car rotated-block)))) (- FIELD_WIDTH 1))
(setq rotated-block block))
(if (or (< y 0) (> (+ y (cadr (last (car rotated-block)))) (- FIELD_HEIGHT 1)))
(setq rotated-block block))

rotated-block)

(defun MoveBlock (block direction)
(setq cords (cdr block))
(setq new-cords '())
(setq x (car (cddr block))
y (cadr (cddr block)))

;; 移動後のブロックがフィールド内に収まるかチェック
(if (or (< x 0) (> (+ x (car (last (car cords)))) (- FIELD_WIDTH 1)))
(setq new-cords cords))
(if (or (< y 0) (> (+ y (cadr (last (car cords)))) (- FIELD_HEIGHT 1)))
(setq new-cords cords))

(if (equal direction 'MOVE_LEFT)
(progn
(foreach cord cords
(setq new-cords (cons (list (- (car cord) 1) (cadr cord)) new-cords))))
(progn
(foreach cord cords
(setq new-cords (cons (list (+ (car cord) 1) (cadr cord)) new-cords)))))

(list (car block) (car (cdr block)) (car (cddr block)) (list new-cords x y)))

;; ブロックの衝突判定
(defun CheckCollision (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (+ (car cord) (car (cdr block))))
(setq y (+ (cadr cord) (cadr (cdr block))))
(if (or (< x 0) (> x (- FIELD_WIDTH 1)) (< y 0) (> y (- FIELD_HEIGHT 1)) (not (null field[y][x])))
(return t)))
nil)

;; ブロックの固定
(defun FixBlock (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (+ (car cord) (car (cdr block))))
(setq y (+ (cadr cord) (cadr (cdr block))))
(setq field[y][x] 'X)))

;; ラインの消去判定とスコアの更新
(defun CheckLines ()
(setq full-lines nil)
(repeat FIELD_HEIGHT
(setq line-full t)
(repeat FIELD_WIDTH
(if (null field[row][col])
(setq line-full nil)))
(if line-full
(setq full-lines (cons row full-lines))))

(if full-lines
(progn
(foreach line full-lines
(setq row (- line (length full-lines)))
(repeat FIELD_WIDTH
(setq field[row][col] nil))
(setq score (+ score 100)))
(setq full-lines nil)
(setq line-shift 0)
(setq row (- FIELD_HEIGHT 2))
(while (>= row 0)
(if (null (nth row field))
(setq line-shift (+ line-shift 1))
(setq field[(- row line-shift)] (nth row field)))
(setq row (- row 1)))
(repeat line-shift
(setq field[(- FIELD_HEIGHT (- line-shift (- it 1)))] (make-array FIELD_WIDTH :initial-element nil))))))

;; ゲームオーバー判定
(defun CheckGameOver (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (car cord)
y (cadr cord))
(if (< y 0)
(return t)))
nil)

;; ゲームオーバー時の処理
(defun GameOver ()
(princ " Game Over!")
(princ " Score: ")
(princ score)
(exit))

;; ゲームループ
(setq score 0)
(setq current-block (TetrisBlock))
(setq game-over nil)
(setq move-direction nil)

(while (not game-over)
(command "_.zoom" "_extents")

;; キー入力の取得
(setq key (getvar 'Error))

;; ブロックの操作
(cond
((equal key 'MOVE_LEFT) (setq move-direction 'MOVE_LEFT))
((equal key 'MOVE_RIGHT) (setq move-direction 'MOVE_RIGHT))
((equal key 'ROTATE) (setq current-block (RotateBlock current-block))))

;; ブロックの移動
(setq moved-block (MoveBlock current-block move-direction))

;; 衝突判定
(setq collision (CheckCollision moved-block))
(if collision
(progn
(if (equal move-direction 'MOVE_LEFT)
(setq moved-block (MoveBlock current-block 'MOVE_RIGHT))
(setq moved-block (MoveBlock current-block 'MOVE_LEFT)))
(setq collision (CheckCollision moved-block))))

;; ブロックの固定またはゲームオーバー判定
(if (or collision (CheckGameOver moved-block))
(progn
(FixBlock current-block)
(CheckLines)
(if (CheckGameOver (TetrisBlock))
(setq game-over t))
(setq current-block (TetrisBlock))
(setq move-direction nil))
(setq current-block moved-block))

;; フィールドの描画
(princ " ")
(repeat FIELD_HEIGHT
(princ " ")
(repeat FIELD_WIDTH
(if (null field[row][col])
(princ " ")
(princ "X")))
(princ " "))

;; スコアの表示
(princ " Score: ")
(princ score)
(princ " ")

;; 一時停止
(if (equal key 'PAUSE)
(progn
(setq key nil)
(while (not (equal key 'PAUSE))
(setq key (getvar 'Error))))))

(GameOver))

これもダメorz

参ったなぁ


Autolisp言語でテトリスを作れるかな?

2023-05-21 10:57:30 | Autocad

前述のPythonソースコードをAutolisp言語に書き換えてAutocadのVisualLispで実行できるようにしてほしい。
ChatGPT 申し訳ありませんが、VisualLispに直接変換することはできません。VisualLispはAutoCADの独自のLisp方言であり、Pythonのコードをそのまま変換することは困難です。 ただし、Pythonのコードを参考にしてVisualLispで同様の機能を実装することは可能です。以下に、Pythonのコードを参考にしたAutolispの実装例を示します。 ;; 定数 (setq BLOCK_SIZE 25) ; ブロックの縦横サイズpx (setq FIELD_WIDTH 10) ; フィールドの幅 (setq FIELD_HEIGHT 20) ; フィールドの高さ (setq MOVE_LEFT 0) ; 左にブロックを移動することを示す定数 (setq MOVE_RIGHT 1) ; 右にブロックを移動することを示す定数 (setq MOVE_DOWN 2) ; 下にブロックを移動することを示す定数 ;; ブロックを構成する正方形のクラス (defun TetrisSquare (x y color) (list x y color)) ;; テトリス画面を描画する関数 (defun TetrisCanvas (field) ;; キャンバスの描画処理 (princ) ) ;; テトリスのブロックのクラス (defun TetrisBlock () ;; ブロックの形をランダムに決定 (setq block-type (random 4)) ;; ブロックの形に応じて正方形の座標と色を決定 (if (= block-type 1) (setq color "red" cords (list (list (/ FIELD_WIDTH 2) 0) (list (/ FIELD_WIDTH 2) 1) (list (/ FIELD_WIDTH 2) 2) (list (/ FIELD_WIDTH 2) 3))) (if (= block-type 2) (setq color "blue" cords (list (list (/ FIELD_WIDTH 2) 0) (list (/ FIELD_WIDTH 2) 1) (list (- (/ FIELD_WIDTH 2) 1) 0) (list (- (/ FIELD_WIDTH 2) 1) 1))) (if (= block-type 3) (setq color "green" cords (list (list (- (/ FIELD_WIDTH 2) 1) 0) (list (/ FIELD_WIDTH 2) 0) (list (/ FIELD_WIDTH 2) 1) (list (/ FIELD_WIDTH 2) 2))) (setq color "orange" cords (list (list (/ FIELD_WIDTH 2) 0) (list (- (/ FIELD_WIDTH 2) 1) 0) (list (- (/ FIELD_WIDTH 2) 1) 1) (list (- (/ FIELD_WIDTH 2) 1) 2)))))) ;; ブロックの情報を返す (list color cords)) ;; テトリスゲームを制御する関数 (defun TetrisGame () ;; フィールドの初期化 (setq field (make-array (list FIELD_HEIGHT FIELD_WIDTH) :initial-element nil)) ;; 新しいブロックの生成 (setq current-block (TetrisBlock)) ;; ゲームループ (while t ;; ブロックの描画 (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] (TetrisSquare x y (car current-block)))) ;; フィールドの描画 (TetrisCanvas field) ;; ブロックの操作 (command "_.zoom" "_extents") (setq move-direction (getvar 'Error)) ;; ブロックの移動 (if (= move-direction MOVE_LEFT) (progn (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] nil)) (setq cords (mapcar '(lambda (cord) (list (- (car cord) 1) (cadr cord))) cords)) (setq current-block (list (car current-block) cords)))) (if (= move-direction MOVE_RIGHT) (progn (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] nil)) (setq cords (mapcar '(lambda (cord) (list (+ (car cord) 1) (cadr cord))) cords)) (setq current-block (list (car current-block) cords)))) (if (= move-direction MOVE_DOWN) (progn (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] nil)) (setq cords (mapcar '(lambda (cord) (list (car cord) (+ (cadr cord) 1))) cords)) (setq current-block (list (car current-block) cords)))) ;; ブロックの衝突判定 (setq collided nil) (foreach cord cords (setq x (car cord) y (cadr cord)) (if (or (< x 0) (>= x FIELD_WIDTH) (< y 0) (>= y FIELD_HEIGHT) (not (null field[y][x]))) (setq collided t))) ;; ブロックがフィールドの底に到達した場合 (if (or (= move-direction MOVE_DOWN) collided) (progn ;; ブロックをフィールドに固定する (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] (TetrisSquare x y (car current-block)))) ;; ラインの消去判定 (setq full-lines nil) (repeat FIELD_HEIGHT (setq line-full t) (repeat FIELD_WIDTH (if (null field[row][col]) (setq line-full nil))) (if line-full (setq full-lines (cons row full-lines)))) ;; ラインの消去とスコアの更新 (if full-lines (progn (foreach line full-lines (setq row (- line (length full-lines))) (repeat FIELD_WIDTH (setq field[row][col] nil)) (setq score (+ score 100))) ; 1行ごとに100点加算 (setq full-lines nil) (setq line-shift 0) (setq row (- FIELD_HEIGHT 2)) (while (>= row 0) (if (null (nth row field)) (setq line-shift (+ line-shift 1)) (setq field[(- row line-shift)] (nth row field))) (setq row (- row 1))) (repeat line-shift (setq field[(- FIELD_HEIGHT (- line-shift (- it 1)))] (make-array FIELD_WIDTH :initial-element nil)))))) ;; ゲームオーバー判定 (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (if (< y 0) (setq game-over t))) ;; ゲームオーバーの処理 (if game-over (progn (princ " Game Over!") (princ " Score: ") (princ score) (exit))) ;; 新しいブロックの生成 (setq current-block (TetrisBlock)) ;; 少し待つ (command "_.zoom" "_extents") (setq key (getvar 'Error)) (if (member key '(MOVE_LEFT MOVE_RIGHT MOVE_DOWN)) (setq move-direction key)))) ;; 少し待つ (command "_.zoom" "_extents") (setq key (getvar 'Error)) (if (member key '(MOVE_LEFT MOVE_RIGHT MOVE_DOWN)) (setq move-direction key)))) この実装では、フィールドの初期化、ブロックの描画、ブロックの操作、ブロックの移動、ブロックの衝突判定、フィールドへのブロックの固定、ラインの消去判定とスコアの更新、ゲームオーバー判定などが含まれています。また、キー入力によるブロックの操作やゲームオーバー時の処理も実装されています。 ただし、この実装は一例であり、使用されている関数や変数の具体的な実装は参考のために示したものです。実際のプログラムでは、それぞれの関数や変数の定義や実装に合わせて適切に修正する必要があります。
全然ダメだわorz

Pydroid3でテトリスを作ってみた。

2023-05-21 08:39:53 | python
 
Python でのテトリスの作り方(サンプルスクリプト付き)

Python でのテトリスの作り方(サンプルスクリプト付き)

Python 勉強がてらに Tkinter を使ってテトリスを作成してみました! 今回はこのテトリスの Python スクリプトの紹介と、このスクリプトの解説をしていきたいと思います。 ...

だえうホームページ

上記のサイトを参考に、ソースコードをそのままコピペしてみたら・・・
import tkinter as tk
import random
 
# 定数
BLOCK_SIZE = 25 # ブロックの縦横サイズpx
FIELD_WIDTH = 10 # フィールドの幅
FIELD_HEIGHT = 20 # フィールドの高さ
 
MOVE_LEFT = 0 # 左にブロックを移動することを示す定数
MOVE_RIGHT = 1 # 右にブロックを移動することを示す定数
MOVE_DOWN = 2 # 下にブロックを移動することを示す定数
 
# ブロックを構成する正方形のクラス
class TetrisSquare():
def __init__(self, x=0, y=0, color="gray"):
'1つの正方形を作成'
self.x = x
self.y = y
self.color = color
 
def set_cord(self, x, y):
'正方形の座標を設定'
self.x = x
self.y = y
 
def get_cord(self):
'正方形の座標を取得'
return int(self.x), int(self.y)
 
def set_color(self, color):
'正方形の色を設定'
self.color = color
 
def get_color(self):
'正方形の色を取得'
return self.color
 
def get_moved_cord(self, direction):
'移動後の正方形の座標を取得'
 
# 移動前の正方形の座標を取得
x, y = self.get_cord()
 
# 移動方向を考慮して移動後の座標を計算
if direction == MOVE_LEFT:
return x - 1, y
elif direction == MOVE_RIGHT:
return x + 1, y
elif direction == MOVE_DOWN:
return x, y + 1
else:
return x, y
 
# テトリス画面を描画するキャンバスクラス
class TetrisCanvas(tk.Canvas):
def __init__(self, master, field):
'テトリスを描画するキャンバスを作成'
 
canvas_width = field.get_width() * BLOCK_SIZE
canvas_height = field.get_height() * BLOCK_SIZE
 
# tk.Canvasクラスのinit
super().__init__(master, width=canvas_width, height=canvas_height, bg="white")
 
# キャンバスを画面上に設置
self.place(x=25, y=25)
 
# 10x20個の正方形を描画することでテトリス画面を作成
for y in range(field.get_height()):
for x in range(field.get_width()):
square = field.get_square(x, y)
x1 = x * BLOCK_SIZE
x2 = (x + 1) * BLOCK_SIZE
y1 = y * BLOCK_SIZE
y2 = (y + 1) * BLOCK_SIZE
self.create_rectangle(
x1, y1, x2, y2,
outline="white", width=1,
fill=square.get_color()
)
 
# 一つ前に描画したフィールドを設定
self.before_field = field
 
def update(self, field, block):
'テトリス画面をアップデート'
 
# 描画用のフィールド(フィールド+ブロック)を作成
new_field = TetrisField()
for y in range(field.get_height()):
for x in range(field.get_width()):
square = field.get_square(x, y)
color = square.get_color()
 
new_square = new_field.get_square(x, y)
new_square.set_color(color)
 
# フィールドにブロックの正方形情報を合成
if block is not None:
block_squares = block.get_squares()
for block_square in block_squares:
# ブロックの正方形の座標と色を取得
x, y = block_square.get_cord()
color = block_square.get_color()
 
# 取得した座標のフィールド上の正方形の色を更新
new_field_square = new_field.get_square(x, y)
new_field_square.set_color(color)
 
# 描画用のフィールドを用いてキャンバスに描画
for y in range(field.get_height()):
for x in range(field.get_width()):
 
# (x,y)座標のフィールドの色を取得
new_square = new_field.get_square(x, y)
new_color = new_square.get_color()
 
# (x,y)座標が前回描画時から変化ない場合は描画しない
before_square = self.before_field.get_square(x, y)
before_color = before_square.get_color()
if(new_color == before_color):
continue
 
x1 = x * BLOCK_SIZE
x2 = (x + 1) * BLOCK_SIZE
y1 = y * BLOCK_SIZE
y2 = (y + 1) * BLOCK_SIZE
# フィールドの各位置の色で長方形描画
self.create_rectangle(
x1, y1, x2, y2,
outline="white", width=1, fill=new_color
)
 
# 前回描画したフィールドの情報を更新
self.before_field = new_field
 
# 積まれたブロックの情報を管理するフィールドクラス
class TetrisField():
def __init__(self):
self.width = FIELD_WIDTH
self.height = FIELD_HEIGHT
 
# フィールドを初期化
self.squares = []
for y in range(self.height):
for x in range(self.width):
# フィールドを正方形インスタンスのリストとして管理
self.squares.append(TetrisSquare(x, y, "gray"))
 
def get_width(self):
'フィールドの正方形の数(横方向)を取得'
 
return self.width
 
def get_height(self):
'フィールドの正方形の数(縦方向)を取得'
 
return self.height
 
def get_squares(self):
'フィールドを構成する正方形のリストを取得'
 
return self.squares
 
def get_square(self, x, y):
'指定した座標の正方形を取得'
 
return self.squares[y * self.width + x]
 
def judge_game_over(self, block):
'ゲームオーバーかどうかを判断'
 
# フィールド上で既に埋まっている座標の集合作成
no_empty_cord = set(square.get_cord() for square
in self.get_squares() if square.get_color() != "gray")
 
# ブロックがある座標の集合作成
block_cord = set(square.get_cord() for square
in block.get_squares())
 
# ブロックの座標の集合と
# フィールドの既に埋まっている座標の集合の積集合を作成
collision_set = no_empty_cord & block_cord
 
# 積集合が空であればゲームオーバーではない
if len(collision_set) == 0:
ret = False
else:
ret = True
 
return ret
 
def judge_can_move(self, block, direction):
'指定した方向にブロックを移動できるかを判断'
 
# フィールド上で既に埋まっている座標の集合作成
no_empty_cord = set(square.get_cord() for square
in self.get_squares() if square.get_color() != "gray")
 
# 移動後のブロックがある座標の集合作成
move_block_cord = set(square.get_moved_cord(direction) for square
in block.get_squares())
 
# フィールドからはみ出すかどうかを判断
for x, y in move_block_cord:
 
# はみ出す場合は移動できない
if x < 0 or x >= self.width or \
y < 0 or y >= self.height:
return False
 
# 移動後のブロックの座標の集合と
# フィールドの既に埋まっている座標の集合の積集合を作成
collision_set = no_empty_cord & move_block_cord
 
# 積集合が空なら移動可能
if len(collision_set) == 0:
ret = True
else:
ret = False
 
return ret
 
def fix_block(self, block):
'ブロックを固定してフィールドに追加'
 
for square in block.get_squares():
# ブロックに含まれる正方形の座標と色を取得
x, y = square.get_cord()
color = square.get_color()
 
# その座標と色をフィールドに反映
field_square = self.get_square(x, y)
field_square.set_color(color)
 
def delete_line(self):
'行の削除を行う'
 
# 全行に対して削除可能かどうかを調べていく
for y in range(self.height):
for x in range(self.width):
# 行内に1つでも空があると消せない
square = self.get_square(x, y)
if(square.get_color() == "gray"):
# 次の行へ
break
else:
# break されなかった場合はその行は空きがない
# この行を削除し、この行の上側にある行を1行下に移動
for down_y in range(y, 0, -1):
for x in range(self.width):
src_square = self.get_square(x, down_y - 1)
dst_square = self.get_square(x, down_y)
dst_square.set_color(src_square.get_color())
# 一番上の行は必ず全て空きになる
for x in range(self.width):
square = self.get_square(x, 0)
square.set_color("gray")
 
# テトリスのブロックのクラス
class TetrisBlock():
def __init__(self):
'テトリスのブロックを作成'
 
# ブロックを構成する正方形のリスト
self.squares = []
 
# ブロックの形をランダムに決定
block_type = random.randint(1, 4)
 
# ブロックの形に応じて4つの正方形の座標と色を決定
if block_type == 1:
color = "red"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2, 2],
[FIELD_WIDTH / 2, 3],
]
elif block_type == 2:
color = "blue"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2 - 1, 1],
]
elif block_type == 3:
color = "green"
cords = [
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2, 2],
]
elif block_type == 4:
color = "orange"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2 - 1, 1],
[FIELD_WIDTH / 2 - 1, 2],
]
 
# 決定した色と座標の正方形を作成してリストに追加
for cord in cords:
self.squares.append(TetrisSquare(cord[0], cord[1], color))
 
def get_squares(self):
'ブロックを構成する正方形を取得'
 
# return [square for square in self.squares]
return self.squares
 
def move(self, direction):
'ブロックを移動'
 
# ブロックを構成する正方形を移動
for square in self.squares:
x, y = square.get_moved_cord(direction)
square.set_cord(x, y)
 
# テトリスゲームを制御するクラス
class TetrisGame():
 
def __init__(self, master):
'テトリスのインスタンス作成'
 
# ブロック管理リストを初期化
self.field = TetrisField()
 
# 落下ブロックをセット
self.block = None
 
# テトリス画面をセット
self.canvas = TetrisCanvas(master, self.field)
 
# テトリス画面アップデート
self.canvas.update(self.field, self.block)
 
def start(self, func):
'テトリスを開始'
 
# 終了時に呼び出す関数をセット
self.end_func = func
 
# ブロック管理リストを初期化
self.field = TetrisField()
 
# 落下ブロックを新規追加
self.new_block()
 
def new_block(self):
'ブロックを新規追加'
 
# 落下中のブロックインスタンスを作成
self.block = TetrisBlock()
 
if self.field.judge_game_over(self.block):
self.end_func()
print("GAMEOVER")
 
# テトリス画面をアップデート
self.canvas.update(self.field, self.block)
 
def move_block(self, direction):
'ブロックを移動'
 
# 移動できる場合だけ移動する
if self.field.judge_can_move(self.block, direction):
 
# ブロックを移動
self.block.move(direction)
 
# 画面をアップデート
self.canvas.update(self.field, self.block)
 
else:
# ブロックが下方向に移動できなかった場合
if direction == MOVE_DOWN:
# ブロックを固定する
self.field.fix_block(self.block)
self.field.delete_line()
self.new_block()
 
# イベントを受け付けてそのイベントに応じてテトリスを制御するクラス
class EventHandller():
def __init__(self, master, game):
self.master = master
 
# 制御するゲーム
self.game = game
 
# イベントを定期的に発行するタイマー
self.timer = None
 
# ゲームスタートボタンを設置
button = tk.Button(master, text='START', command=self.start_event)
button.place(x=25 + BLOCK_SIZE * FIELD_WIDTH + 25, y=30)
 
def start_event(self):
'ゲームスタートボタンを押された時の処理'
 
# テトリス開始
self.game.start(self.end_event)
self.running = True
 
# タイマーセット
self.timer_start()
 
# キー操作入力受付開始
self.master.bind("", self.left_key_event)
self.master.bind("", self.right_key_event)
self.master.bind("", self.down_key_event)
 
def end_event(self):
'ゲーム終了時の処理'
self.running = False
 
# イベント受付を停止
self.timer_end()
self.master.unbind("")
self.master.unbind("")
self.master.unbind("")
 
def timer_end(self):
'タイマーを終了'
 
if self.timer is not None:
self.master.after_cancel(self.timer)
self.timer = None
 
def timer_start(self):
'タイマーを開始'
 
if self.timer is not None:
# タイマーを一旦キャンセル
self.master.after_cancel(self.timer)
 
# テトリス実行中の場合のみタイマー開始
if self.running:
# タイマーを開始
self.timer = self.master.after(1000, self.timer_event)
 
def left_key_event(self, event):
'左キー入力受付時の処理'
 
# ブロックを左に動かす
self.game.move_block(MOVE_LEFT)
 
def right_key_event(self, event):
'右キー入力受付時の処理'
 
# ブロックを右に動かす
self.game.move_block(MOVE_RIGHT)
 
def down_key_event(self, event):
'下キー入力受付時の処理'
 
# ブロックを下に動かす
self.game.move_block(MOVE_DOWN)
 
# 落下タイマーを再スタート
self.timer_start()
 
def timer_event(self):
'タイマー満期になった時の処理'
 
# 下キー入力受付時と同じ処理を実行
self.down_key_event(None)
 
 
class Application(tk.Tk):
def __init__(self):
super().__init__()
 
# アプリウィンドウの設定
self.geometry("400x600")
self.title("テトリス")
 
# テトリス生成
game = TetrisGame(self)
 
# イベントハンドラー生成
EventHandller(self, game)
 
 
def main():
'main関数'
 
# GUIアプリ生成
app = Application()
app.mainloop()
 
 
if __name__ == "__main__":
main()








ガーン( ̄▽ ̄;)😱
 
十字キーや回転ボタンがないやんけwww
6段積み重なって即死www
 
しかもブロックが3種類しかないらしいwww
 
ちなみにPCでやっても回転ボタンが無いからご覧の通り、死亡www
 

Pydroid3でChatGPTのようなソースコードジェネレータAIを作るには?

2023-05-21 03:02:58 | ChatGPT
Title:「Pydroid3でソースコードジェネレータAI作成」

《前書き》
今回は、抱負を語ってみたのだが、ChatGPTから励ましのメッセージがあったので公開してみた。

《質問》
AndroidアプリのPydroid3でChatGPTのようなソースコードジェネレータAIを作りたい。

《ChatGPT》
素晴らしいアイデアです!Pydroid3を使用してChatGPTのようなソースコードジェネレータAIを作成することは可能です。ただし、GPT-3.5のような大規模なモデルを完全に再現することは困難です。しかし、基本的な会話やソースコードの生成を行う小規模なAIを作成することは可能です。

以下に、Pydroid3でソースコードジェネレータAIを作成するための基本的な手順を示します。

Pydroid3のインストール: Google PlayストアからPydroid3をインストールしてください。これはAndroid上でPythonを実行するためのアプリです。

必要なライブラリのインストール: Pydroid3を開き、必要なPythonライブラリ(たとえば、tensorflowやnumpyなど)をインストールしてください。これらのライブラリはAIモデルの作成や学習に使用されます。

AIモデルの作成: PythonでAIモデルを作成します。一般的な方法は、深層学習フレームワーク(たとえば、TensorFlowやPyTorch)を使用してニューラルネットワークモデルを構築することです。言語モデルの場合、リカレントニューラルネットワーク(RNN)やトランスフォーマーを使用することが一般的です。

モデルの学習: データセットを用意し、AIモデルを学習させます。学習データは、ソースコードの例や会話のデータなどを含むことができます。大規模なデータセットを使用することで、より良い結果が得られる場合があります。

インタラクティブなインターフェースの作成: Pydroid3上で、AIモデルにユーザーの入力を与え、AIの応答を取得するインタラクティブなインターフェースを作成します。ユーザーからの入力をAIモデルに渡し、返されたソースコードを表示することができます。

これらの手順は、基本的なソースコードジェネレータAIを作成するための一般的な手法です。ただし、実際の実装は詳細にわたりますし、モデルの性能は学習データやモデルのアーキテクチャ、ハイパーパラメータの選択によっても異なります。また、モデルの学習には時間と計算リソースが必要です。Pydroid3はモバイルデバイス上で実行されるため、大規模なモデルや大規模なデータセットの学習は制限されるかもしれません。

さらに、GPT-3.5のような高度なAIモデルを完全に再現することは、Pydroid3上での制約から考えると困難です。GPT-3.5は、巨大なモデルであり、大量の計算リソースと専用のハードウェアが必要です。そのため、Pydroid3上で同等の性能を持つモデルを作成することは難しいでしょう。

しかし、Pydroid3上で動作する小規模なソースコードジェネレータAIを作成することは十分に可能です。適切なモデルの選択、学習データの準備、適切なハイパーパラメータの調整などを行うことで、Pydroid3上で効果的なソースコードジェネレータAIを作成することができます。

最後に、Pydroid3はPythonの実行環境であり、AIモデルを作成するためのツールやライブラリが利用できることを覚えておいてください。適切なライブラリを使用することで、モデルの構築や学習、インタラクティブなインターフェースの作成を支援することができます。

以上の手順と考慮事項を踏まえて、Pydroid3上でのソースコードジェネレータAIの開発を開始することができます。順を追って進めていき、必要なリソースやツールを活用しながら、目標に向かって進んでください。


VisualBasicApplicationのソースコードを生成する専用のソースコードジェネレータAIならどうかな?

ChatGPT
Visual Basic Application(VBA)のソースコードを生成する専用のソースコードジェネレータAIを作成することも可能です。VBAは、Microsoft Office製品(Excel、Word、Accessなど)で使用されるマクロ言語です。VBAを使用して自動化やカスタマイズを行う際に、ソースコードジェネレータAIは効果的なツールとなるでしょう。

以下は、VBAソースコードジェネレータAIを作成する基本的な手順です。

データセットの収集: VBAのソースコード例や関連するドキュメントを収集し、学習データセットを作成します。VBAマクロの機能やパターンを網羅的にカバーするようなデータセットが重要です。

モデルの選択: VBAソースコードを生成するためのAIモデルを選択します。一般的な選択肢としては、リカレントニューラルネットワーク(RNN)やトランスフォーマーを用いたシーケンスモデルが考えられます。

モデルの構築と学習: 選択したモデルを構築し、収集したデータセットを使用して学習を行います。学習データセットからVBAソースコードのパターンを学習することで、モデルはソースコードの生成に使用される予測モデルを作成します。

インタラクティブなインターフェースの作成: ユーザーがVBAの目的や要件を指定できるインタラクティブなインターフェースを作成します。ユーザーからの入力に基づいて、AIモデルはカスタムVBAコードを生成し、必要な機能を持つマクロを提案します。

コード生成の精度と改善: 初期のバージョンのAIモデルでは、生成されるコードの品質や正確性に制約があるかもしれません。ユーザーフィードバックを収集し、AIモデルを改善するための追加の学習や調整を行います。

VBAソースコードジェネレータAIの開発には、VBAの文法や特定のOffice製品のAPIに関する知識が重要です。また、Pydroid3の制約やリソースの制限にも留意する必要があります。しかし、適切なデータセットの収集と品質管理、適切なモデルの選択、モデルの構築と学習、インタラクティブなインターフェースの作成、コード生成の精度向上など、これらの手順を順を追って進めることで、VBAソースコードジェネレータAIを開発できます。

Pydroid3上でVBAソースコードジェネレータAIを作成する際には、以下の点に留意してください。

ライブラリの選択: VBAソースコードジェネレータAIのために必要なライブラリやモジュールを選択し、Pydroid3にインストールします。たとえば、TensorFlowやKerasなどの機械学習ライブラリを使用することができます。

モデルの適合性: 選択したモデルがPydroid3上で動作することを確認してください。Pydroid3はリソース制約があるため、大規模なモデルや高度なモデルには制限があります。リソース制約を考慮しながら、VBAソースコードを効果的に生成できるモデルを選択してください。

パフォーマンスの最適化: モデルの学習と推論のパフォーマンスを最適化するために、Pydroid3上でのリソースの効率的な利用やコードの最適化に取り組むことが重要です。モデルのサイズや複雑さ、データの前処理などを調整し、実行時間やメモリ使用量を最小限に抑えるようにします。

ユーザビリティの向上: VBAソースコードジェネレータAIのインターフェースを使いやすくし、ユーザーが簡単に要件や目的を指定できるようにします。適切な入力フォーマットやフィードバックの仕組みを提供することで、ユーザビリティを向上させます。

VBAソースコードジェネレータAIの開発は、VBAの知識やAIモデリングのスキルが必要となるため、関連するリソースやチュートリアルにアクセスすることをお勧めします。また、AIモデルの訓練には十分なデータセットが必要ですので、データセットの収集には、VBAのソースコード例や既存のマクロ、Office製品のドキュメント、フォーラムやコミュニティの質問と回答などが役立ちます。これらの情報源から多様なVBAコードの例を集め、学習データセットを構築します。ソースコードの品質やバグの有無に注意しながら、データセットを検証・クリーニングすることも重要です。

モデルの学習には、適切なアーキテクチャやハイパーパラメータの選択が必要です。VBAのソースコードジェネレータAIにおいては、シーケンスモデル(RNNやトランスフォーマー)を使用することが一般的です。データセットをモデルに適切に入力し、適切な出力を生成できるように学習させます。モデルの学習には時間と計算リソースが必要ですので、Pydroid3上での制約に注意しながらトレーニングを行ってください。

インタラクティブなインターフェースの開発には、ユーザーが要件や目的を指定できるようにすることが重要です。例えば、ユーザーが必要な機能や処理の説明を入力し、AIモデルがそれに基づいてVBAコードを生成するようなインタフェースを作成します。ユーザビリティを向上させるために、エラーハンドリングや適切な入力検証、生成されたコードの確認機能なども実装することが望ましいです。

開発プロセスでは、ユーザーフィードバックを収集し、モデルとインターフェースの改善に取り組むことも重要です。ユーザーのニーズや利用状況に応じてモデルを調整し、より高品質なVBAソースコードの生成が可能になるようにします。

以上が、VBAソースコードジェネレータAIをPydroid3上で開発するための基本的な手順です。実装に際しては、関連するリソースやライブラリの活用、データセットの品質管理、適切なモデル選択、インタラクティブなインターフェースの開発、ユーザーフィードバックの収集とモデルの改善に注力することが重要です。また、VBAの特定のニーズや使用状況に合わせてカスタマイズされたコード生成を行うことも検討してください。たとえば、特定のOfficeアプリケーション(Excel、Word、Accessなど)や特定の操作(データ処理、グラフ作成、レポート生成など)に特化したコード生成を行うことができます。

また、VBAソースコードジェネレータAIの開発には、VBAの文法や機能に関する深い理解が必要です。VBAのマクロ記述方法、オブジェクトモデル、イベント処理などの知識を持つことで、より優れたAIモデルを開発することができます。

最後に、Pydroid3上でのVBAソースコードジェネレータAIの開発は、多くの時間と努力を必要とするプロジェクトです。適切なリソースを確保し、スキルや知識を習得するために十分な準備を行ってください。オンラインのコミュニティやフォーラム、関連する書籍やチュートリアルなどの情報源を活用しながら、順を追って開発を進めていくことをお勧めします。

VBAソースコードジェネレータAIの開発において、必要なスキルやリソースに関する具体的な情報を提供するためには、開発の詳細や要件についてより具体的な情報を教えていただく必要があります。具体的な要件や目標をお知らせいただければ、より具体的なアドバイスを提供できます。