Mac って何?それって美味しいの?

マイコンと呼ばれた時代から現在まで、使用記から何から何でも。

Python知識ゼロから始めるchatGPTを利用した超簡単ゲームプログラミング(応用編)

 

yummac.hatenablog.jp

 

前回作成?生成?した、CUIで遊べるカードゲームをGUI画面で遊べるようにする。

Pythonの知識がない私が頼るのはchatGPT様だ。

とりあえずわがまま言ってみる。

「このゲームをGUI画面で遊べるようにコードを作成してください」

回答:

以下は、Tkinterを使用して作成したカードバトルゲームのGUIの一部です。このコードを基にして、GUI画面で遊べるカードバトルゲームを構築することができます。

import tkinter as tk
import random

# カードデッキを作成
suits = ['ハート', 'ダイヤ', 'スペード', 'クラブ']
ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
deck = [{'スート': suit, 'ランク': rank} for suit in suits for rank in ranks]

# プレイヤーを作成
player1 = {'名前': 'プレイヤー1', '手札': []}
player2 = {'名前': 'コンピュータ', '手札': []}

# ゲームを初期化
def initialize_game():
    player1['手札'] = []
    player2['手札'] = []
    for _ in range(5):
        player1['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
        player2['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    update_display()

# ゲームの進行
def play_round():
    player1_card = player1['手札'].pop(random.randint(0, len(player1['手札']) - 1))
    player2_card = player2['手札'].pop(random.randint(0, len(player2['手札']) - 1))
    winner = battle(player1_card, player2_card)
    if winner == player1:
        result_label.config(text=f"{player1['名前']}の勝利!")
    elif winner == player2:
        result_label.config(text=f"{player2['名前']}の勝利!")
    else:
        result_label.config(text="引き分け")
    update_display()

# カードのバトル
def battle(player1_card, player2_card):
    rank_order = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
    if rank_order.index(player1_card['ランク']) > rank_order.index(player2_card['ランク']):
        return player1
    elif rank_order.index(player1_card['ランク']) < rank_order.index(player2_card['ランク']):
        return player2
    else:
        return None

# 画面の更新
def update_display():
    player1_label.config(text=f"{player1['名前']}の手札: {', '.join([card['ランク'] for card in player1['手札']])}")
    player2_label.config(text=f"{player2['名前']}の手札: {', '.join([card['ランク'] for card in player2['手札']])}")

# Tkinterウィンドウを作成
root = tk.Tk()
root.title("カードバトルゲーム")

# ボタンとラベルを配置
start_button = tk.Button(root, text="ゲームを始める", command=initialize_game)
start_button.pack()
play_button = tk.Button(root, text="ラウンドをプレイ", command=play_round)
play_button.pack()
result_label = tk.Label(root, text="")
result_label.pack()
player1_label = tk.Label(root, text="")
player1_label.pack()
player2_label = tk.Label(root, text="")
player2_label.pack()

# ゲームを初期化
initialize_game()

# Tkinterウィンドウを表示
root.mainloop()

こりゃ楽ちんだぜ!と喜んだのも束の間、実行してみるとコレジャナイ感が。

でも、これをベースにカスタマイズして作り上げるってことだね。

どんどんchatGPTに要望や質問を投げてコードをカスタマイズしていく。

「手札のカードを横に並べて表示し、その中からプレイヤーが選んでバトルするようにしたい」

「プレイヤー1のカードをマウスでクリックして選択できるようにしたい」

「カードに画像を表示したい」

カード画像はStableDiffusionで生成しますが、サイズが小さいとコレジャナイ画像が生成されてしまうので、512 x 768で生成しました。

ゲームで表示するにはデカすぎるので縮小します。

画像変形ツールを使って縮小しておくのが常套手段ですが、

ここはあえてPythonでやります。

「カードの画像サイズを幅128、高さ192にしたい」

回答:

〜 Pillow(PIL)ライブラリを使用して画像をリサイズすることができます。

ここで、生成されたコードの動作には、追加のライブラリをインストールする作業が必要となりました。

Windowsならコマンドプロンプトから、Macならターミナルから、Pillowライブラリをインストールします。

pip install Pillow

うまくいかないときはググってみましょう。

まだまだchatGPT様のお世話になります。

canvasの背景色を深緑にしたい」

「カード画像5枚横に並べて表示し、クリックされたカード画像に外枠を表示、前にクリックし表示していた枠は消すようにしてください」

「それぞれのカード画像の下にランクを表示したい」

・・・

そんなこんなで出来上がった「ドラゴンカードゲーム」

ドラゴンカードゲーム
import tkinter as tk
from tkinter import messagebox
from tkinter import PhotoImage
from PIL import Image, ImageTk  # Pillowライブラリをインポート
import random

# カードデッキを作成
suits = ['ハート', 'ダイヤ', 'スペード', 'クラブ']
ranks = ['ドラコ', 'リザードマン', 'ドレイク', 'ヒドラ', 'サーペント', 'ワイバーン', 'アジュールドラゴン', 'クリムゾンドラゴン', '西洋ドラゴン', '東洋ドラゴン']
deck = [{'スート': suit, 'ランク': rank} for suit in suits for rank in ranks]
card_width = 128
card_height = 192
card_interval = 20
card_p1_y = 310
card_p2_y = 40

# プレイヤーを作成
player1 = {'名前': 'あなた', '手札': []}
player2 = {'名前': 'コンピュータ', '手札': []}

#プレイヤー1カード(表示用)
player1_cards = {}

# 選択されたカードを格納する変数
selected_card = None

# 外枠の色を指定
frame_color = "red"

# 選択されたカードのインデックスを保持する変数
selected_card_index = None

# ゲームの設定
rounds = 5  # ラウンド数を指定
round_num = 0
player1_score = 0
player2_score = 0

# 各ランクに対応する画像ファイルを辞書に格納
original_images = {}
card_images = {}
text_objects = []

# ゲームを初期化
def initialize_game():
    global round_num
    global player1_score
    global player2_score
    global player1_cards
    round_num = 0
    player1_score = 0
    player2_score = 0
    player1_cards = []
    player1['手札'] = []
    player2['手札'] = []
    deck = []
    deck = [{'スート': suit, 'ランク': rank} for suit in suits for rank in ranks]
    for _ in range(5):
        player1['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
        player2['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))

    # 選択されたカードをクリア
    global selected_card
    selected_card = None
    global selected_card_index
    canvas.delete(selected_card_index)
    selected_card_index = None
    global text_objects
    for text_object in text_objects:
        canvas.delete(text_object)
    text_objects = []

    #update_display()
    # プレイヤー1の手札を描画
    canvas.delete("player1_hand")
    x = card_interval
    for card in player1['手札']:
        draw_card(canvas, x, card_p1_y, card, 1)
        x += (card_width + card_interval)

    # プレイヤー2(コンピュータ)の手札を描画
    canvas.delete("player2_hand")
    x = card_interval
    for card in player2['手札']:
        draw_card(canvas, x, card_p2_y, card, 0)
        x += (card_width + card_interval)
    
    result_label1.config(text="")
    result_label2.config(text="")
    result_label3.config(text="")

# ゲームの進行
def play_round():
    global player1_score
    global player2_score
    global round_num

    if round_num > rounds:
        messagebox.showinfo("エラー", "「ゲームを始める」をクリックしてください")
        return

    # プレイヤー1(人間)がカードを選ぶ
    global selected_card  # グローバル変数として選択されたカードを保持
    if selected_card is None:
        messagebox.showinfo("エラー", "カードを選択してください。")
        return
    player1_card = selected_card

    round_num += 1

    # プレイヤー2(コンピュータ)が一番強いカードを選ぶ
    player2_card = select_strongest_card(player2['手札'])

    result_label1.config(text=f"{player2['名前']}のカード : {player2_card['ランク']} " + "★" * (ranks.index(player2_card['ランク']) + 1))
    result_label2.config(text=f"{player1['名前']}のカード : {player1_card['ランク']} " + "★" * (ranks.index(player1_card['ランク']) + 1))
    winner = battle(player1_card, player2_card)
    if winner == player1:
        player1_score += 1
        result_label3.config(text=f"{player1['名前']}の勝利!")
    elif winner == player2:
        player2_score += 1
        result_label3.config(text=f"{player2['名前']}の勝利!")
    else:
        result_label3.config(text="引き分け")

    if round_num >= rounds:
        round_num += 1
        # 最終結果を表示
        if player1_score > player2_score:
            messagebox.showinfo("ゲーム終了",f"結果発表\n{player1['名前']} : {player1_score}勝\n{player2['名前']} : {player2_score}勝\n{player1['名前']}の勝利!")
        elif player1_score < player2_score:
            messagebox.showinfo("ゲーム終了",f"結果発表\n{player1['名前']} : {player1_score}勝\n{player2['名前']} : {player2_score}勝\n{player2['名前']}の勝利!")
        else:
            messagebox.showinfo("ゲーム終了",f"結果発表\n{player1['名前']} : {player1_score}勝\n{player2['名前']} : {player2_score}勝\n引き分け!")
        return
    
    # プレイヤー1の手札から選択されたカードを削除
    player1['手札'].remove(selected_card)
    
    # プレイヤー2の手札から選択されたカードを削除
    player2['手札'].remove(player2_card)

    # カードをデッキからランダムに選び、手札に加える
    player1['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    player2['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))

    # 選択されたカードをクリア
    selected_card = None
    global selected_card_index
    canvas.delete(selected_card_index)
    selected_card_index = None
    global text_objects
    for text_object in text_objects:
        canvas.delete(text_object)
    text_objects = []

    # プレイヤー1の手札を描画
    canvas.delete("player1_hand")
    x = card_interval
    for card in player1['手札']:
        draw_card(canvas, x, card_p1_y, card, 1)
        x += (card_width + card_interval)

    # プレイヤー2(コンピュータ)の手札を描画
    canvas.delete("player2_hand")
    x = card_interval
    for card in player2['手札']:
        draw_card(canvas, x, card_p2_y, card, 0)
        x += (card_width + card_interval)

def battle(player1_card, player2_card):
    global ranks
    if ranks.index(player1_card['ランク']) > ranks.index(player2_card['ランク']):
        return player1
    elif ranks.index(player1_card['ランク']) < ranks.index(player2_card['ランク']):
        return player2
    else:
        return None

def select_strongest_card(player_hand):
    global ranks
    strongest_card = None
    for card in player_hand:
        if not strongest_card or ranks.index(card['ランク']) > ranks.index(strongest_card['ランク']):
            strongest_card = card
    return strongest_card

def draw_card(canvas, x, y, card, sw):
    suit = card['スート']
    rank = card['ランク']
    rank_i = "★" * (ranks.index(rank) + 1)
    card_text = f"{rank}\n{rank_i}"

    # カード画像を配置
    card_object = canvas.create_image(x, y, anchor=tk.NW, image=card_images[rank])
    if sw > 0:
        canvas.tag_bind(card_object, "", select_card)

    # カードテキストを配置
    text_object = canvas.create_text(x, (y + card_height + 5), text=card_text, anchor="nw", fill="white", font=("Helvetica", 12))
    text_objects.append(text_object)

# クリックされたカードの処理
def select_card(event):
    global selected_card_index
    # 前に選択されたカードの外枠を削除
    if selected_card_index is not None:
        canvas.delete(selected_card_index)
    
    global selected_card
    x, y = event.x, event.y  # クリックされた位置のx座標とy座標を取得
    for card in player1['手札']:
        card_x, card_y = get_card_position(player1['手札'].index(card))
        if card_x <= x <= card_x + card_width and card_y <= y <= card_y + card_height:
            selected_card = card
            break

    # クリックされたカードの外枠を表示
    selected_card_index = canvas.create_rectangle((card_x - 2), (card_y - 2), (card_x + card_width + 2), (card_y + card_height + 2), outline=frame_color, width=2)

def get_card_position(index):
    x = card_interval + index * (card_width + card_interval)
    return x, card_p1_y

# Tkinterウィンドウを作成
root = tk.Tk()
root.title("カードバトルゲーム")

# Canvasを作成
canvas = tk.Canvas(root, width=800, height=550, bg="dark green")
canvas.pack()

# デフォルトカードに対応する画像ファイルを読み込む
default_card_image = Image.open('default.png')

# Stable Diffusion で生成した画像のサイズが大きいため縮小します
# 幅と高さ比2:3で512*768とかで生成(サイズ小さいとコレジャナイ画像になるため)
# 各ランクの画像ファイルを読み込み、Tkinter PhotoImageオブジェクトに変換して格納
for rank in ranks:
    image_file = f"{rank}.png"  # ランクごとの画像ファイル名を生成
    original_images[rank] = Image.open(image_file)

    # 対応するランクの画像を辞書から取得
    original_image = original_images.get(rank)
    
    if original_image:
        # 画像を指定のサイズにリサイズ
        resized_image = original_image.resize((card_width, card_height), Image.LANCZOS)

        # リサイズした画像をTkinter PhotoImageオブジェクトに変換
        card_images[rank] = ImageTk.PhotoImage(resized_image)
    else:
        # デフォルト画像を指定のサイズにリサイズ
        resized_image = default_card_image.resize((card_width, card_height), Image.LANCZOS)

        # リサイズした画像をTkinter PhotoImageオブジェクトに変換
        card_images[rank] = ImageTk.PhotoImage(resized_image)

#テキスト配置
canvas.create_text(card_interval, card_p1_y - 20, text=f"{player1['名前']}のカード", anchor="w", fill="white", font=("Helvetica", 14))
canvas.create_text(card_interval, card_p2_y - 20, text=f"{player2['名前']}のカード", anchor="w", fill="white", font=("Helvetica", 14))

# ボタンとラベルを配置
play_button = tk.Button(root, text="選んだカードで対決!", command=play_round)
play_button.pack()
start_button = tk.Button(root, text="ゲームを始める", command=initialize_game)
start_button.pack()
result_label1 = tk.Label(root, text="")
result_label1.pack()
result_label2 = tk.Label(root, text="")
result_label2.pack()
result_label3 = tk.Label(root, text="")
result_label3.pack()

# ゲームを初期化
initialize_game()

# Tkinterウィンドウを表示
root.mainloop()

生成されたコードを付け加えたり変更したりで大変だった感じはあるが

これを知識が無いところから作成することを考えたら

もう、素晴らしいね。

出来上がったコードは、まだ変なところとかあったり、

コンピュータのカードを隠せるようにするなど、改良の余地はあるけど、

なんか、標題の目的を達成できた感がある。

今回はドラゴンで男の子向けだが、女の子向けの画像も用意したいなと思っている。

オトナ向けは・・・やめておこう。

Fusion DriveのMacにOSがインストールできない問題の解決

Mac mini Late 2014 ジャンクを手に入れた。

なんでも、macOSのインストールができないらしい。

実機を起動してみる。

macOS 復旧 は問題なく起動した。

でも、いざインストールしようとすると「復旧サーバに接続できません」となる。

じゃUSBインストーラで、と電源押すと禁止マーク(丸に斜線)が表示され 、

macOS 復旧も起動しない。High sierra でも Catalina でも。

もちろんPROMクリアはやってる。それでダメってことはEFIくさい。

Fusion Drive ってのもなんかあやしい。

OCLPのUSBインストーラでVenturaの復旧メニュー起動できた。

ターミナルのdiskutilでFusion Driveを再作成してみる。

Fusion Drive が分割された場合の修復方法 - Apple サポート (日本)

diskutil resetFusion

なんだか、いい感じに再作成された気がする。

が、やはりUSBインストーラは禁止マークで止まる。

再度、OCLPのUSBインストーラでVenturaの復旧メニュー起動し、

今度はFusion Driveを解除してSSDとHDDに分離、初期化をする。

diskutil list
diskutil apfs deleteContainer disk2

disk2の部分は環境によって異なる場合があります。

diskutil list の結果から適切な値を指定してください。

 

分離したSSD、HDDそれぞれHFS+で初期化する。

SSD128GBのやつだ。ここで初めてSSDの容量がはっきりした。

今度はUSBインストーラのCatalina復旧メニュー起動。

分離したまま128GBのSSDにインストールしてみる。

 

インストール完了後、やはり「このMacについて」を確認。

同型の i7 をちょっと期待してたけど i5 だった。

2.8GHzだからi5でも上位機種だね。

不具合も解消し、スペック的にも悪くないし、どうしようかな。

 

Python知識ゼロから始めるchatGPTを利用した超簡単ゲームプログラミング(実践編)

chatGPTや画像生成AIで遊んでいるうち、何か実のあるものができないかな?

と思うようになってきた。

ただ、めんどくさがりな私は凝ったものは作れないし、途中で飽きてしまう可能性が高い。

ふと、画像生成AIの環境を作る時にPythonというプログラミング言語を見たことを思い出した。

読み方は「ぱいそん」でいいのかな?これってどういう言語?

Wikipediaを参照した。ふーん。

インデントでソースを見やすくするのは同意。ネストが深くなったりソース長くなると面倒で適当になっちゃうけど。

やっぱりモンティパイソンね。

OpenCoreでHackintoshを作るときのツールにも使われていた言語だったな。

じゃあ、Python学習がてらAIでゲームでも作ってみようかな。

 

WebのchatGPTで質問してみる。

「python3で出来る対戦ゲームのアイデアを考えてください」

回答:

説明文付きで5つ考えてくれた。

サクッと作れそうなのがいいな。

うーん、この中だったら、対戦カードゲームならカードのイラストを画像生成AIで作るってことでいいかも。

「python3でカードバトルゲームのコードを生成してください」

回答:

カードバトルゲームのPythonコードを生成するには、いくつかのステップが必要です。以下に基本的なステップを示しますが~省略

...ステップを説明してくれた。そんなのはいい。コードをくれ。

だが、コード生成の前にゲームの遊び方を考える必要があるようだ。

「最初のステップのアイデアを作成してください」

回答:

カードバトルゲームを作成する最初のステップは、基本的なカードとプレイヤークラスを作成することです。

  1. カードクラスの作成:
  2. デッキの作成:
  3. プレイヤークラスの作成:
  4. 基本ゲームルールの設計:
  5. テスト:

丁寧に説明してくれているがなんだかイメージ湧かず。たまらず

「もっと簡単なカードバトルゲームにしたい」

回答のルールはシンプルな感じになったのを提示されたがまだピンとこない。

が、もうこれでとりあえず

「このルールでコードを生成してください」

回答:

以下は、Pythonで簡単なカードバトルゲームのコードの一例です。このコードでは、2つのプレイヤーが1ラウンドのカードバトルを行います。各プレイヤーにはランダムにカードが配布され、カードのランクを比較して勝者を決定します。


import random

# カードデッキを作成
suits = ['ハート', 'ダイヤ', 'スペード', 'クラブ']
ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
deck = [{'スート': suit, 'ランク': rank} for suit in suits for rank in ranks]

# プレイヤーを作成
player1 = {'名前': 'プレイヤー1', '手札': []}
player2 = {'名前': 'プレイヤー2', '手札': []}

# カードを配布
random.shuffle(deck)
player1['手札'] = deck[:len(deck) // 2]
player2['手札'] = deck[len(deck) // 2:]

# カードバトルのルールを定義
def battle(player1_card, player2_card):
    rank_order = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
    if rank_order.index(player1_card['ランク']) > rank_order.index(player2_card['ランク']):
        return player1
    elif rank_order.index(player1_card['ランク']) < rank_order.index(player2_card['ランク']):
        return player2
    else:
        return None

# ゲームをプレイ
rounds = 3  # ラウンド数を指定
player1_score = 0
player2_score = 0

for round_num in range(1, rounds + 1):
    print(f"ラウンド {round_num}")
    player1_card = random.choice(player1['手札'])
    player2_card = random.choice(player2['手札'])
    
    print(f"{player1['名前']}のカード: {player1_card['スート']}の{player1_card['ランク']}")
    print(f"{player2['名前']}のカード: {player2_card['スート']}の{player2_card['ランク']}")
    
    winner = battle(player1_card, player2_card)
    
    if winner:
        print(f"{winner['名前']}の勝利!\n")
        if winner == player1:
            player1_score += 1
        else:
            player2_score += 1
    else:
        print("引き分け\n")

# 最終結果を表示
if player1_score > player2_score:
    print(f"{player1['名前']}の勝利!")
elif player1_score < player2_score:
    print(f"{player2['名前']}の勝利!")
else:
    print("引き分け!")
  

実行すると、勝手に対戦が進んで結果が表示された。

ここから変更したいところをchatGPTに投げてコードを生成してもらう。

「1ラウンドごとにデッキからカードを選べるようにしたい」

「バトルするカードをプレイヤーが手札から選べるようにしたい」

「最初に各プレイヤーに5枚ずつ手札に配りたい」

「プレイヤー1は人間、プレイヤー2はコンピュータがバトルするカードを選ぶようにしたい」

「プレイヤー2のコンピュータは手札の中で一番強いカードをバトルで選ぶようにしたい」

そして生成されたコードとわずかの変更でできたコード:


import random

# カードデッキを作成
suits = ['ハート', 'ダイヤ', 'スペード', 'クラブ']
ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']
deck = [{'スート': suit, 'ランク': rank} for suit in suits for rank in ranks]

# プレイヤーを作成
player1 = {'名前': 'プレイヤー1', '手札': []}
player2 = {'名前': 'プレイヤー2', '手札': []}

# 初期手札を配る
initial_hand_size = 4
for _ in range(initial_hand_size):
    player1['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    player2['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))

# ゲームをプレイ
rounds = 5  # ラウンド数を指定
player1_score = 0
player2_score = 0
rank_order = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース']

def battle(player1_card, player2_card):
    if rank_order.index(player1_card['ランク']) > rank_order.index(player2_card['ランク']):
        return player1
    elif rank_order.index(player1_card['ランク']) < rank_order.index(player2_card['ランク']):
        return player2
    else:
        return None

def select_strongest_card(player_hand):
    strongest_card = None
    for card in player_hand:
        if not strongest_card or rank_order.index(card['ランク']) > rank_order.index(strongest_card['ランク']):
            strongest_card = card
    return strongest_card

for round_num in range(1, rounds + 1):
    print(f"ラウンド {round_num}")
    
    # カードをデッキからランダムに選び、手札に加える
    player1['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    player2['手札'].append(deck.pop(random.randint(0, len(deck) - 1)))
    
    # プレイヤー1(人間)がカードを選ぶ
    print(f"{player1['名前']}の手札:")
    for i, card in enumerate(player1['手札']):
        print(f"{i + 1}: {card['スート']}の{card['ランク']}")
    player1_choice = int(input("選ぶカードの番号を入力してください: ")) - 1
    
    player1_card = player1['手札'].pop(player1_choice)
    
    # プレイヤー2(コンピュータ)が一番強いカードを選ぶ
    player2_card = select_strongest_card(player2['手札'])
    player2['手札'].remove(player2_card)
    
    print(f"{player1['名前']}のカード: {player1_card['スート']}の{player1_card['ランク']}")
    print(f"{player2['名前']}のカード: {player2_card['スート']}の{player2_card['ランク']}")
    
    winner = battle(player1_card, player2_card)
    
    if winner:
        print(f"{winner['名前']}の勝利!\n")
        if winner == player1:
            player1_score += 1
        else:
            player2_score += 1
    else:
        print("引き分け\n")

# 最終結果を表示
print("*** 最終結果 ***")
print(f"{player1['名前']}: {player1_score}勝")
print(f"{player2['名前']}: {player2_score}勝")
if player1_score > player2_score:
    print(f"{player1['名前']}の勝利!")
elif player1_score < player2_score:
    print(f"{player2['名前']}の勝利!")
else:
    print("引き分け!")

CUIでシンプルに遊べます。

コンピュータが選ぶカードのアルゴリズムを工夫するとか、いじれる余地があるけど。

次はこれをGUIで遊べるようにしていきます。

もちろんAIで。

Python知識ゼロから始めるchatGPTを利用した超簡単ゲームプログラミング(準備編)

Pythonはプログラミング初心者からプロまで幅広い人々に支持される人気のあるプログラミング言語です。そして、chatGPTは自然言語処理に優れたAIモデルで、コンピュータと自然な対話を行うことができます。この記事では、Pythonの基本的な知識がなくても、chatGPTを活用してゲームプログラミングを始める方法を紹介します。

1. Pythonのインストール

Pythonを使ってゲームを作成するには、まずPythonをインストールする必要があります。Pythonは公式ウェブサイトからダウンロードできます。最新バージョンをダウンロードし、インストールプロセスに従ってください。

https://www.python.org/

2. テキストエディタの選択

Pythonコードを書くためにテキストエディタが必要です。初心者向けにおすすめのテキストエディタは「Visual Studio Code」や「PyCharm」です。どちらもPythonに特化した機能を提供しており、使いやすいです。

3. chatGPTの活用

chatGPTはOpenAIが提供するモデルで、Pythonから利用できますが、OpenAI APIキーの取得、ライブラリのインストールの手順を踏む必要があります。しかし、今回はPythonから呼び出すのではなく、ブラウザでchatGPTを利用してゲームの作成をしたいと思います。

https://chat.openai.com/

4. ゲームプログラミングの開始

PythonとchatGPTの準備が整ったら、ゲームプログラミングを始める準備ができています。chatGPTに質問を投げて、プログラムのアイデアやコーディングのヒントを得ることができます。ゲームのジャンルや難易度を選んで、Pythonでゲームを作成してみましょう!

yummac.hatenablog.jp

 

yummac.hatenablog.jp

 

5. コミュニティと学習リソース

Pythonゲームプログラミングに関する学習リソースは豊富です。ウェブ上にはチュートリアル、コース、フォーラムなどがたくさんあります。また、Pythonコミュニティも非常に活発で、質問や疑問を共有する場所として利用できます。

Python知識ゼロから始めるゲームプログラミングは大いに楽しい冒険です。chatGPTを利用してアイデアを得たり、Pythonコミュニティのサポートを受けたりしながら、自分だけのゲームを作成しましょう。楽しさと学びが待っています!

Mac mini Core i5 Late 2014 のファームウェアロックを解除する

ヤフオクで手に入れたジャンクの Mac mini

OS起動するもののログインパスワードが判らず使えない。

「パスワードのヒント」を手がかりにいろいろ試したがダメ。

じゃあ、パスワードをリセットしようと公式ページにある手順を試みる。

Mac の電源を入れて、すぐに「command (⌘) + R」キーを長押し

すると鍵マークとパスワード入力欄が中央に。

チキショウ、ファームウェアパスワードが設定されているのか!

ファームウェアロックがかかっていると、

パスワードのリセットどころか、

別ドライブから起動とか、OS初期化とかの手段も使えない。

いわゆる文鎮化。まさにジャンクだった。

 

パスワード探しも諦め、ファームウェアロックの解除方法を探す。

すると、iMacmacbook airとかの解除動画がyoutubeにあるではないか。

CMOSチップを書き換えたり、交換したりすれば解除できる。

でも、ハンダ付されているCMOSチップを外す方法はやりたくない。いや無理。

チップを外さずに書き換える方法は...あった!macbookだけど。

Mac miniでもできるのでは?とツールをAliExpressで漁る。

mac専用のツールが2万円以上の値段で売られていたが

できるかわからないし、あまりお金はかけたくない。

あまり安すぎても信用度低く感じるので、2千円くらいのをチョイス。

ダメもとで、できたらラッキー的な考えで。

 

セットアップはインド人?のyoutube動画を参考にした。

CMOSチップはファンの下にあるけど、

Mac miniの解体はめっちゃ最小限で済んだのが幸せだった。

 

チップへのアクセス写真(横着してWi-Fiアンテナやファンはコネクタ繋いだまま)

書き換えるCMOSチップはMX25L6406E

 

1発目からRead成功!これはいけるのでは?

と思ったが、バイナリエディタで変更しWriteしようとしたらエラー。

そこから、いろいろ試したり繋ぎ直したりしたができずに1日目終了。

2日目も惜しい感じはあるのだが成功に至らず。

3日目、心もとないPDFマニュアルを読み返す。

25系はEraseしてからWriteしろだって。でもそれも試したんだけどなぁ。

PCは前日まで使っていたノートがなんかおかしいので、別のノートPCで挑む。

そして、PCを変えたのが良かったのかWrite成功!

これでファームウェアロックか解除になったはず!

Mac miniを仮組みして option + command + P + RでPRAM をリセット(ハードウェアロックが有効だとコレもできなかった)

command (⌘) + R でもパスワード入力なしで「mac OS 復旧」メニューに行けたよ!

あとはターミナルで resetpassword を実行しログインパスワードを再設定。

再設定したパスワードで無事、既存のmacOSにログインできました。

 

覗いてみると、個人ファイルが残ったままで、

ダウンロードフォルダに何やら

「女性がバスルームで...」な画像が複数あるんですが。

 

iPhoneで文字化け←[OBJ]文字の原因がわかった!

iPhoneFacebookとかSNSなどに投稿したときに起こる、文字化け[OBJ]

iPhoneで閲覧しているときは無いのに、

PCで見ると「なんじゃこりゃー」って思っちゃう。

すごくガッカリな文字化け。

どうしたら起こるの?って不思議だったけど、

ようやく事象を再現する方法がわかった。

 

iPhone音声入力を終わらせるときに、

マイクアイコンをタップすると行の先頭にカーソルが移動する。

この動きをしたときは、[OBJ]文字が入力されたってことだと思う。

ちなみに英語入力でも(マイクアイコンではないが画面をタップで終了すると)再現できた。

 

で、対処方法は?なんだが、

キーボード入力設定で、自動入力オフとか何かで回避できないか試したがだめだった。

今のところ唯一の回避方法は、

音声入力を終わらせるときマイクアイコンをタップするのではなく、

スクリーンキーボードの右上の「完了」をタップして

入力自体を終了することで、[OBJ]文字入力を防げた。

 

続きを入力するときは、

またマイクアイコンをタップするなりしなきゃなんだけどね。

 

OpenCore で Hackintosh NEC VersaPro i3-7100U

2台目のASUSノートPCも途中ながら、ヤフオクでまた仕入れてしまった。

ジャンクじゃない、NEC VersaPro ノートPC。ACアダプタ無しだけど。

前回、成功したマシンの姉妹機?CPUがCore i3-7100Uで1世代後になります。

あと違いは、今回はWifiBluetoothがあります。

yummac.hatenablog.jp

 

 

Specification

NEC VersaPro J VJ24L/AA-V フレームモデル
15.6型ワイドTFTカラー液晶(HD)

─ CPU
  └── Intel(R) Core(TM) i3-7100U CPU @ 2.40GHz
      ├── Cores: 2
      ├── Threads: 4
      └── Codename: Kaby Lake

─ GPU
  └── Intel(R) HD Graphics 620

─ Network
  ├── Ethernet Connection (4) I219-V
  └── Wireless 8265 / 8275

─ Audio
  ├── Intel(R) Display Audio
  └── Realtek ALC293

 

インストールUSB作成も、前回のを流用し、USBマッピングしたくらいの変更でインストールできた。

WiFiBluetoothは、ちんぷんかんぷんだったけど、ネットを徘徊して他の人のを見て参考にしたら成功した。

Windows10をインストールするときにブルースクリーンがでてできない。

MATサポートが関係してる?

Kernel Issues | OpenCore Install Guide

でも1日明けたらインストールできたので原因不明。

 

macOSとWin10環境を整え終わり、あっけなかったので何かないかと情報収集していると、OCATなる OpenCore Hackintoshツールの情報を得る。

www.tonymacx86.com

ちくしょう、先に知ってればコレ試せたのに。

 

追記

OCATを使い始めるも、Laptopは現時点では未対応のようだった。