はーちゃんdays 2

大学生の娘と高校3年生の二人の子供の父親。

ChatGPT4oでテトリスを作ってもらう。

2024年06月23日 | おやじの思考回路
私はプログラミングは全くやろうとしたことがなく、中学時代にBASICという言語をPC-8001mk IIで勉強しようとして挫折した記憶があります。ベーシックマガジンに載っているプログラムのリストを手打ちで打ってゲームを楽しむ程度でした。”こんにちはマイコン”を読んで懐かしく思います。
あれから40年近く経ってしまい今では私が自分でテトリスを作れるようになってしまいました。作ってもらうと言ったほうがいいと思います。Macを使ってゲームを作るにはから始まって、、、テトリスのゲームを作ってと打ち込めばどうしたら良いのか?
PythonとPygameのインストールのやり方から始まり、至れり尽くせりです。ただ初めから思ったようなテトリスができないので何度か修正を繰り返すことが必要です。毎回違うテトリスができるのも事実です。
元々Python何?から始まっているので、ここまでできただけでも感動です。

chatGPTが教えてくれたこと↓



その後最終的にできたのがこちらのコード。

import pygame
import random

pygame.init()

# 定数
SCREEN_WIDTH, SCREEN_HEIGHT = 300, 600
GRID_SIZE = 30
GRID_WIDTH, GRID_HEIGHT = SCREEN_WIDTH // GRID_SIZE, SCREEN_HEIGHT // GRID_SIZE

# 色の定義
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
CYAN = (0, 255, 255)
MAGENTA = (255, 0, 255)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)

COLORS = [RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW, ORANGE]

# テトリミノの形
SHAPES = [
[[1, 1, 1, 1]], # I
[[1, 1], [1, 1]], # O
[[0, 1, 0], [1, 1, 1]], # T
[[1, 1, 0], [0, 1, 1]], # S
[[0, 1, 1], [1, 1, 0]], # Z
[[1, 0, 0], [1, 1, 1]], # J
[[0, 0, 1], [1, 1, 1]] # L
]

# ゲームスクリーンの設定
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Tetris")

# テトリミノクラス
class Tetromino:
def __init__(self):
self.shape = random.choice(SHAPES)
self.color = random.choice(COLORS)
self.x = GRID_WIDTH // 2 - len(self.shape[0]) // 2
self.y = 0

def rotate(self):
self.shape = [list(row) for row in zip(*self.shape[::-1])]

# グリッドの初期化
grid = [[BLACK for _ in range(GRID_WIDTH)] for _ in range(GRID_HEIGHT)]

def draw_grid():
for y in range(GRID_HEIGHT):
for x in range(GRID_WIDTH):
pygame.draw.rect(screen, grid[y][x], (x * GRID_SIZE, y * GRID_SIZE, GRID_SIZE, GRID_SIZE), 0)
pygame.draw.rect(screen, WHITE, (x * GRID_SIZE, y * GRID_SIZE, GRID_SIZE, GRID_SIZE), 1)

def check_collision(shape, offset):
off_x, off_y = offset
for y, row in enumerate(shape):
for x, cell in enumerate(row):
if cell:
if x + off_x < 0 or x + off_x >= GRID_WIDTH or y + off_y >= GRID_HEIGHT or grid[y + off_y][x + off_x] != BLACK:
return True
return False

def merge(shape, offset, color):
off_x, off_y = offset
for y, row in enumerate(shape):
for x, cell in enumerate(row):
if cell:
grid[y + off_y][x + off_x] = color

def remove_line():
global grid
lines_removed = 0
new_grid = [row for row in grid if any(cell == BLACK for cell in row)]
lines_removed = len(grid) - len(new_grid)
grid = [[BLACK for _ in range(GRID_WIDTH)] for _ in range(lines_removed)] + new_grid
return lines_removed

def game_over():
for cell in grid[0]:
if cell != BLACK:
return True
return False

def draw_text(text, size, color, x, y):
font = pygame.font.Font(pygame.font.get_default_font(), size)
surface = font.render(text, True, color)
rect = surface.get_rect()
rect.topleft = (x, y)
screen.blit(surface, rect)

# スコア
score = 0
# 経過時間
elapsed_time = 0

# メインゲームループ
def game_loop():
global grid, score, elapsed_time
clock = pygame.time.Clock()
fall_time = 0
speed_increase_time = 0 # 速度を増加させる時間を計測
speed_reset_interval = 60000 # 60秒ごとに速度をリセット
current_piece = Tetromino()

running = True
while running:
screen.fill(BLACK)
fall_speed = max(100, 500 - (speed_increase_time // 1000) * 10) # 時間経過で落下速度が速くなる

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
if not check_collision(current_piece.shape, (current_piece.x - 1, current_piece.y)):
current_piece.x -= 1
elif event.key == pygame.K_RIGHT:
if not check_collision(current_piece.shape, (current_piece.x + 1, current_piece.y)):
current_piece.x += 1
elif event.key == pygame.K_DOWN:
if not check_collision(current_piece.shape, (current_piece.x, current_piece.y + 1)):
current_piece.y += 1
elif event.key == pygame.K_UP:
rotated_shape = [list(row) for row in zip(*current_piece.shape[::-1])]
if not check_collision(rotated_shape, (current_piece.x, current_piece.y)):
current_piece.shape = rotated_shape

fall_time += clock.get_rawtime()
elapsed_time += clock.get_rawtime()
speed_increase_time += clock.get_rawtime()
clock.tick()

if speed_increase_time > speed_reset_interval:
speed_increase_time = 0 # 速度増加時間をリセット

if fall_time > fall_speed:
if not check_collision(current_piece.shape, (current_piece.x, current_piece.y + 1)):
current_piece.y += 1
else:
merge(current_piece.shape, (current_piece.x, current_piece.y), current_piece.color)
lines_removed = remove_line()
score += lines_removed * 100
if game_over():
running = False
current_piece = Tetromino()
fall_time = 0

draw_grid()
for y, row in enumerate(current_piece.shape):
for x, cell in enumerate(row):
if cell:
pygame.draw.rect(screen, current_piece.color, ((current_piece.x + x) * GRID_SIZE, (current_piece.y + y) * GRID_SIZE, GRID_SIZE, GRID_SIZE), 0)
for y in range(GRID_HEIGHT):
for x in range(GRID_WIDTH):
if grid[y][x] != BLACK:
pygame.draw.rect(screen, grid[y][x], (x * GRID_SIZE, y * GRID_SIZE, GRID_SIZE, GRID_SIZE), 0)
draw_text(f"Score: {score}", 20, WHITE, 10, 10)
pygame.display.flip()

pygame.quit()

game_loop()


デスクトップに置いてターミナルに打ち込めばpython3 tetris.pyでプレイできます。

いちばんやさしい Python入門教室 改訂第2版
ただ根本的なことは何一つわかっていないので、何度修正をお願いしても、いつまで経っても変わらないことはわかります。ブロックが消えてしまったり、スコアーが表示されなかったり、、そういうところは本を読んでchatGPTと二人三脚で勉強していくのがベストかと思います。

アマゾン漫画

2024年06月18日 | 買った本、読んだ本
縦読みマンガならAmazon Kindle。人気の無料漫画も気軽にダウンロード。人気マンガの無料試し読みも簡単。Kindle端末だけでなくスマホ・タブレットのアプリやウェブブラウザでも読めます。
アマゾンが結構本気で漫画、Kindleでの読書を進めている模様。個人的にはeBOOKjpanで漫画を買うことが多い。PayPayで払うことが多いのと、Ymobileを使っているのも理由にある。アマゾンの会員になったのは田舎に住んでいた私が近くに本屋もなく、結構本を買うのに年会費を数千払うことで送料が無料になるということでプライム会員になったという20年前ごろの話に遡る。今では当たり前の送料が無料だが、、、コンビニで受け取ると無料になるとか、いろいろなバリエーションがあったような、、すでにそうなっているかもしれないが、漫画の吹き出しを自動で多言語に変換できる仕組みができたら、擬音、オノマトぺ以外は海外へ一気に広めることができる世界だと思う。



漫画では限界がある世界もあると思う。小説で頭の中で想像する方がまだ面白いこともある。そんな中では”神々の歩法”は私の好きな短編SFだ。以前、オーディオブックで聞いて面白いと思って、小説自体は読んでいなかったのだが、この度、神々の歩法を含めた短編集を購入して読んで見た。神々の歩法 (創元日本SF叢書)これもやっぱり面白かった。漫画にするには画力が問われると思う、映画化した方が良いかもだが、ウクライナ、中国など登場する都市、舞台をどうするかという問題もあるのではと思う。SFが苦手な私でも読めたSFなので万人におすすめだと思います。










アニメオタクの一級建築士が建築の面白さを徹底解剖する本。

2024年06月08日 | 買った本、読んだ本
アニメオタクの一級建築士が建築の面白さを徹底解剖する本。


世界遺産検定を勉強した人なら、ル・コルビュジエは超重要人物。絶対試験に出る人物。
そして国立西洋美術館に行きたくなる。そしてこの本を読むと「魔法少女まどか☆マギカ」をみたくなる。本当に近代建築の五原則がアニメで適用されているのか?気になり出す。サブスクを駆使してアニメに辿り着き、第一話をみている私。


国立西洋美術館(The National Museum of Western Art, Tokyo)は、日本の東京・上野に位置する美術館で、西洋美術のコレクションを中心に展示しています。この美術館は、ル・コルビュジエによって設計された建物であり、2016年にユネスコの世界遺産に登録されました。

### 概要
- **所在地**:東京都台東区上野公園
- **開館**:1959年
- **設計**:ル・コルビュジエ
- **コレクション**:西洋美術、特にフランス印象派の作品が多く含まれる

### 歴史
国立西洋美術館は、松方幸次郎のコレクションを基に設立されました。松方幸次郎は日本の実業家であり、美術品収集家としても知られています。彼がヨーロッパで集めた多くの美術品が第二次世界大戦後に日本に戻り、これらの作品が展示される場として国立西洋美術館が設立されました。

### 建築
ル・コルビュジエによる設計で、モダニズム建築の重要な一例とされています。美術館の設計には、彼の「近代建築の五原則」が反映されており、特にピロティの使用や自由な平面構成が特徴です。館内は螺旋状のラセン構造を持ち、来館者が自然に作品を鑑賞しながら進むことができる設計となっています。

### コレクションと展示
国立西洋美術館のコレクションは、主に中世から20世紀にかけての西洋美術作品を収蔵しています。特にフランスの印象派やポスト印象派の作品が豊富で、クロード・モネ、エドゥアール・マネ、ポール・セザンヌ、ヴィンセント・ヴァン・ゴッホなどの名画が展示されています。

また、常設展だけでなく、国内外の重要な美術展や企画展も頻繁に開催され、多様な美術体験を提供しています。

### アクセス
国立西洋美術館は東京の中心部に位置し、公共交通機関でのアクセスも良好です。最寄り駅はJR上野駅で、美術館は上野恩賜公園内に位置しています。

国立西洋美術館は、日本国内で西洋美術を鑑賞するための主要なスポットの一つであり、その建築とコレクションの両方が訪れる価値があります。



「魔法少女まどか☆マギカ」(Puella Magi Madoka Magica)は、2011年に放送された日本のテレビアニメで、魔法少女のジャンルに革新をもたらした作品です。以下は、作品の概要と主要な要素です:

### 概要
- **ジャンル**:ダークファンタジー、魔法少女
- **制作**:シャフト
- **監督**:新房昭之
- **脚本**:虚淵玄(ニトロプラス)
- **キャラクターデザイン**:蒼樹うめ
- **音楽**:梶浦由記

### あらすじ
「魔法少女まどか☆マギカ」は、平凡な中学生の鹿目まどかが、不思議な生物キュゥべえから「魔法少女になって願い事を叶えてもらう代わりに魔女と戦う使命を負う」という提案を受けるところから始まります。まどかの友人、美樹さやかを含む他の少女たちも魔法少女になるが、その運命には暗い側面があり、物語は次第にダークな展開を迎えます。

### 主要キャラクター
- **鹿目まどか(かなめ まどか)**:主人公の中学生。優しく、他人を思いやる性格。物語の中心となるキャラクター。
- **暁美ほむら(あけみ ほむら)**:謎の転校生。冷静で謎めいた存在。まどかを守ろうとする。
- **美樹さやか(みき さやか)**:まどかの親友。正義感が強く、魔法少女になる決意をする。
- **巴マミ(ともえ マミ)**:上級生の魔法少女。まどかたちに魔法少女の世界を教える。
- **佐倉杏子(さくら きょうこ)**:魔法少女の一人。自由奔放で食べることが好き。
- **キュゥべえ**:魔法少女に契約を持ちかける謎の生物。

### 作品の特徴
- **ストーリーテリング**:一般的な魔法少女アニメとは一線を画し、ダークでシリアスな物語が展開される。
- **テーマ**:希望と絶望、犠牲と対価、友情と信念など、深いテーマが描かれる。
- **ビジュアル**:シャフトの独特な演出とビジュアルスタイルが特徴。幻想的でありながらダークな映像美が特徴的。

「魔法少女まどか☆マギカ」は、その予想を覆すストーリー展開と視覚的な美しさで、多くのファンを魅了しました。アニメ放送後も、劇場版やスピンオフ作品が制作されるなど、人気の高いシリーズとなっています。


ないものはない!お買い物なら楽天市場