見出し画像

ゼロから始めるCursorを無料で1日1500回まで利用できる裏技

Cursorの使い方

皆さんは「Cursor」というAIツールをご存じでしょうか?

Cursorは、プログラミング関連の業務全般を自動化できるAIツールです。Cursorを活用すれば、コードを自動で生成できるのはもちろん、チャットで質問したりエラーを自動で修正したりもできるんです!

まずはこのページからCursor本体をインストールしてください。

次に用意するのは、こちらのGoogle AI Studioこれは、Gemini 1.5 Proという
AIを無料で使用出来る環境になります。
いつまで無料なのかはわかりませんが、現在(2024年7月8日)では無料で使えます。

使い方は、たとえば、Googleアカウントでログインして下の画像の
赤枠の所にチャット形式でやって欲しい事を入力してCtrlキー + ENTERなどENTER+何かのボタンを押すと質問が出来ます。
ENTERキーだけなら押しても、改行になるだけなので地味に便利です。


次に今回の目玉機能の一日1500回使う裏技の方法は、Google AI StudioのGet API Keyというボタンを押して下さい。
ここでAPIというプログラムの連携をやってくれる鍵を手に入れて下さい。


APIキーを作成ボタンを押して下さい

作成出来たら下の画像のAPIキーをクリックしてAPIキーをコピーしてください。

次はCursorを起動したら、歯車マークが右上にあるので、
これをクリックしてGoogle API Keyに先ほどコピーしたファイルを張り付けて、Verifyボタンを押したら準備完了です。

Cursorを起動したら、自分が編集したいフォルダかファイルを選択して下さい。

ファイルが開けたら、右クリックして新しいファイルを作成してください。
すでにファイルがあれば、それを使用してください。

Ctrl + K ボタンでプログラムを書いてもらう


Ctrlキー+kボタンでどのAIを使うか選択出来ます。
今回はAPIキーがあれば無料で一日1500回使える
Gemini 1.5 flashを選択して下さい。

使用出来るAIは、perplexityに聞いたら下記のような図を出してくれました。
Claude 3.5 Sonnetが制限無かったとしたら、それを使うのもありかもしれません。
しかし今回は、Gemini 1.5 flashの話なので、Gemini 1.5 flashを使用します。

Claude 3.5 Sonnetは無料だと50回で制限来ました。

今回はsample.pyというPythonのファイルを作成してオセロのプログラムを作成してもらいました。
Ctrlキーを押したら改行ではなく実行されるので、改行をしたい時にはSHIFT+ENTERキーを押して下さい。
指示文は下記です。

指示文: 

オセロのプログラムをPythonを実行したら、GUIでアプリとして起動してきて、
実際にゲームが出来る画面を作って下さい。
なお先行は黒から順番に黒の次は白となるようにして、空いている置けるマスの部分を薄く表示して、
その範囲をカーソルで指定してクリックしたら実際にオセロのゲームが出来るようにして下さい。
なおゲームを最後まで実行したら、白か黒のどちらかの勝利宣言を画面で表示してください。
そして画面をもう一度クリックしたら最初からゲームが始まるように実装してください。
以下の手順で行動してください:
1. タスクを一連の具体的なステップに分解し、初期計画を立てます。
2. 各ステップについて:
a. 必要なコードや説明を生成します。
b. 「このアプローチに問題はないか?代替案は?」と自問し、予期的反省を行います。
c. コードや説明を提示し、結果を想定します。
d. その行動が現在のステップの目的に合致しているか評価します。
e. 問題がある場合、代替案を検討するかバックトラックします。
3. 行き詰まったり、計画がうまくいかないと判断した場合、計画を修正します。
4. タスクが完了するまで繰り返します。

実際の画面はこれ

この時コードを確定したい時は、Ctrl+ENTERキーを押して確定して下さい。
実際のコードはこちら

import tkinter as tk
from tkinter import messagebox
import random

class Othello:
    def __init__(self, master):
        self.master = master
        master.title("オセロ")

        self.board_size = 8
        self.board = [[' ' for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.board[3][3] = 'B'
        self.board[3][4] = 'W'
        self.board[4][3] = 'W'
        self.board[4][4] = 'B'

        self.current_player = 'B'
        self.game_over = False

        self.canvas = tk.Canvas(master, width=500, height=500, bg="green")
        self.canvas.pack()

        self.draw_board()

        self.canvas.bind("<Button-1>", self.handle_click)

    def draw_board(self):
        self.canvas.delete("all")
        cell_size = 500 / self.board_size

        for i in range(self.board_size):
            for j in range(self.board_size):
                x1 = j * cell_size
                y1 = i * cell_size
                x2 = x1 + cell_size
                y2 = y1 + cell_size

                if self.board[i][j] == 'B':
                    self.canvas.create_oval(x1 + 5, y1 + 5, x2 - 5, y2 - 5, fill="black", outline="black")
                elif self.board[i][j] == 'W':
                    self.canvas.create_oval(x1 + 5, y1 + 5, x2 - 5, y2 - 5, fill="white", outline="white")
                else:
                    self.canvas.create_rectangle(x1, y1, x2, y2, fill="lightgray", outline="gray")

        self.highlight_valid_moves()

    def highlight_valid_moves(self):
        valid_moves = self.get_valid_moves()
        cell_size = 500 / self.board_size

        for i, j in valid_moves:
            x1 = j * cell_size
            y1 = i * cell_size
            x2 = x1 + cell_size
            y2 = y1 + cell_size
            self.canvas.create_rectangle(x1, y1, x2, y2, fill="lightblue", outline="lightblue")

    def get_valid_moves(self):
        valid_moves = []
        for i in range(self.board_size):
            for j in range(self.board_size):
                if self.board[i][j] == ' ':
                    if self.is_valid_move(i, j):
                        valid_moves.append((i, j))
        return valid_moves

    def is_valid_move(self, row, col):
        # 隣接するマスが相手の石で、その先に自分の石があるか確認
        directions = [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]
        for dr, dc in directions:
            r = row + dr
            c = col + dc
            if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] != ' ' and self.board[r][c] != self.current_player:
                while 0 <= r < self.board_size and 0 <= c < self.board_size:
                    r += dr
                    c += dc
                    if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                        return True
        return False

    def handle_click(self, event):
        if self.game_over:
            self.reset_game()
            return

        cell_size = 500 / self.board_size
        row = int(event.y // cell_size)
        col = int(event.x // cell_size)

        if (row, col) in self.get_valid_moves():
            self.make_move(row, col)
            self.switch_player()
            self.draw_board()
            self.check_game_over()

    def make_move(self, row, col):
        self.board[row][col] = self.current_player
        self.flip_pieces(row, col)

    def flip_pieces(self, row, col):
        directions = [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]
        for dr, dc in directions:
            r = row + dr
            c = col + dc
            if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] != ' ' and self.board[r][c] != self.current_player:
                flip_pieces = []
                while 0 <= r < self.board_size and 0 <= c < self.board_size:
                    r += dr
                    c += dc
                    if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                        for i in range(len(flip_pieces)):
                            self.board[flip_pieces[i][0]][flip_pieces[i][1]] = self.current_player
                        break
                    elif 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == ' ':
                        break
                    else:
                        flip_pieces.append((r, c))

    def switch_player(self):
        if self.current_player == 'B':
            self.current_player = 'W'
        else:
            self.current_player = 'B'

    def check_game_over(self):
        if not self.get_valid_moves():
            self.switch_player()
            if not self.get_valid_moves():
                self.game_over = True
                black_count = sum(row.count('B') for row in self.board)
                white_count = sum(row.count('W') for row in self.board)
                if black_count > white_count:
                    messagebox.showinfo("ゲーム終了", "黒の勝利!")
                elif white_count > black_count:
                    messagebox.showinfo("ゲーム終了", "白の勝利!")
                else:
                    messagebox.showinfo("ゲーム終了", "引き分け!")

    def reset_game(self):
        self.board = [[' ' for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.board[3][3] = 'B'
        self.board[3][4] = 'W'
        self.board[4][3] = 'W'
        self.board[4][4] = 'B'
        self.current_player = 'B'
        self.game_over = False
        self.draw_board()

root = tk.Tk()
game = Othello(root)
root.mainloop()

オセロのプログラムを実行してみる

Cursorの表示からターミナルを開いて下さい。


ターミナルからPythonを実行してください。
以下実行例

python .\sample.py

しかし先ほどのソースではうごきません
次はチャット形式で改善していきましょう。

Ctrl+Lボタンでチャットする


コードの部分をCtrl+Aで全選択して、Ctrl+Lボタンでチャット欄に下記の文章を書いてENTERキーを押して下さい。

指示文:

pythonを実行してもGUIが表示されずゲームが出来ないので修正してゲームを出来るようにして下さい。

コードの修正が終わったら、右端のCopyボタンを押して、
sample.pyの中身をCtrl+Aで全選択してCtrl+Vで貼り付けて、保存してください。


コードはこちら

import tkinter as tk
from tkinter import messagebox
import random

class Othello:
    def __init__(self, master):
        self.master = master
        master.title("オセロ")

        self.board_size = 8
        self.board = [[' ' for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.board[3][3] = 'B'
        self.board[3][4] = 'W'
        self.board[4][3] = 'W'
        self.board[4][4] = 'B'

        self.current_player = 'B'
        self.game_over = False

        self.canvas = tk.Canvas(master, width=500, height=500, bg="green")
        self.canvas.pack()

        self.draw_board()

        # イベントハンドラをバインド
        self.canvas.bind("<Button-1>", self.handle_click)

    def draw_board(self):
        self.canvas.delete("all")
        cell_size = 500 / self.board_size

        for i in range(self.board_size):
            for j in range(self.board_size):
                x1 = j * cell_size
                y1 = i * cell_size
                x2 = x1 + cell_size
                y2 = y1 + cell_size

                if self.board[i][j] == 'B':
                    self.canvas.create_oval(x1 + 5, y1 + 5, x2 - 5, y2 - 5, fill="black", outline="black")
                elif self.board[i][j] == 'W':
                    self.canvas.create_oval(x1 + 5, y1 + 5, x2 - 5, y2 - 5, fill="white", outline="white")
                else:
                    self.canvas.create_rectangle(x1, y1, x2, y2, fill="lightgray", outline="gray")

        self.highlight_valid_moves()

    def highlight_valid_moves(self):
        valid_moves = self.get_valid_moves()
        cell_size = 500 / self.board_size

        for i, j in valid_moves:
            x1 = j * cell_size
            y1 = i * cell_size
            x2 = x1 + cell_size
            y2 = y1 + cell_size
            self.canvas.create_rectangle(x1, y1, x2, y2, fill="lightblue", outline="lightblue")

    def get_valid_moves(self):
        valid_moves = []
        for i in range(self.board_size):
            for j in range(self.board_size):
                if self.board[i][j] == ' ':
                    if self.is_valid_move(i, j):
                        valid_moves.append((i, j))
        return valid_moves

    def is_valid_move(self, row, col):
        # 隣接するマスが相手の石で、その先に自分の石があるか確認
        directions = [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]
        for dr, dc in directions:
            r = row + dr
            c = col + dc
            if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] != ' ' and self.board[r][c] != self.current_player:
                while 0 <= r < self.board_size and 0 <= c < self.board_size:
                    r += dr
                    c += dc
                    if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                        return True
        return False

    def handle_click(self, event):
        if self.game_over:
            self.reset_game()
            return

        cell_size = 500 / self.board_size
        row = int(event.y // cell_size)
        col = int(event.x // cell_size)

        if (row, col) in self.get_valid_moves():
            self.make_move(row, col)
            self.switch_player()
            self.draw_board()
            self.check_game_over()

    def make_move(self, row, col):
        self.board[row][col] = self.current_player
        self.flip_pieces(row, col)

    def flip_pieces(self, row, col):
        directions = [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]
        for dr, dc in directions:
            r = row + dr
            c = col + dc
            if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] != ' ' and self.board[r][c] != self.current_player:
                flip_pieces = []
                while 0 <= r < self.board_size and 0 <= c < self.board_size:
                    r += dr
                    c += dc
                    if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                        for i in range(len(flip_pieces)):
                            self.board[flip_pieces[i][0]][flip_pieces[i][1]] = self.current_player
                        break
                    elif 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == ' ':
                        break
                    else:
                        flip_pieces.append((r, c))

    def switch_player(self):
        if self.current_player == 'B':
            self.current_player = 'W'
        else:
            self.current_player = 'B'

    def check_game_over(self):
        if not self.get_valid_moves():
            self.switch_player()
            if not self.get_valid_moves():
                self.game_over = True
                black_count = sum(row.count('B') for row in self.board)
                white_count = sum(row.count('W') for row in self.board)
                if black_count > white_count:
                    messagebox.showinfo("ゲーム終了", "黒の勝利!")
                elif white_count > black_count:
                    messagebox.showinfo("ゲーム終了", "白の勝利!")
                else:
                    messagebox.showinfo("ゲーム終了", "引き分け!")

    def reset_game(self):
        self.board = [[' ' for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.board[3][3] = 'B'
        self.board[3][4] = 'W'
        self.board[4][3] = 'W'
        self.board[4][4] = 'B'
        self.current_player = 'B'
        self.game_over = False
        self.draw_board()

root = tk.Tk()
game = Othello(root)
root.mainloop()

まだバグがありますので修正していきましょう。

下記の文章をチャットで送って下さい。

指示文:

GUIは表示されるようになりましたが、
まだバグがあります。
オセロの背景のマスは緑色で表示して、ちゃんとオセロがオセロの
黒なら黒、白なら白をはさむとマスがちゃんとひっくり返るように修正してください。

しかしまだバグがありましたので、コードを全文選択してから
コメント欄にCtrl+Vで貼り付けてから
次の指示文を出しましょう。

指示文:

オセロの全マスを緑色にして、置ける範囲は薄い緑色にして表示するように改善してください。
そしてコマとコマを黒なら黒、白なら白のそのターンにマスをオセロのルール通りにマスの色をひっくり返して下さい。

以下の手順で行動してください:

1. タスクを一連の具体的なステップに分解し、初期計画を立てます。
2. 各ステップについて:
a. 必要なコードや説明を生成します。
b. 「このアプローチに問題はないか?代替案は?」と自問し、予期的反省を行います。
c. コードや説明を提示し、結果を想定します。
d. その行動が現在のステップの目的に合致しているか評価します。
e. 問題がある場合、代替案を検討するかバックトラックします。
3. 行き詰まったり、計画がうまくいかないと判断した場合、計画を修正します。
4. タスクが完了するまで繰り返します。

これでもダメだったので次の指示文を与えます。

指示文:

オセロの全マスが緑色になり、置ける範囲が薄い緑色で表示され、コマの色が正しく表示されるようになりましたが、肝心のオセロの色を変更する処理が正常に動いていません。
オセロのルール通りにマスがひっくり返るように次の手順で修正してください。

以下の手順で行動してください:

1. タスクを一連の具体的なステップに分解し、初期計画を立てます。
2. 各ステップについて:
a. 必要なコードや説明を生成します。
b. 「このアプローチに問題はないか?代替案は?」と自問し、予期的反省を行います。
c. コードや説明を提示し、結果を想定します。
d. その行動が現在のステップの目的に合致しているか評価します。
e. 問題がある場合、代替案を検討するかバックトラックします。
3. 行き詰まったり、計画がうまくいかないと判断した場合、計画を修正します。
4. タスクが完了するまで繰り返します。

この指示文で完成しました。
コードはこちらになります。

import tkinter as tk
from tkinter import messagebox
import random

class Othello:
    def __init__(self, master):
        self.master = master
        master.title("オセロ")

        self.board_size = 8
        self.board = [[' ' for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.board[3][3] = 'B'
        self.board[3][4] = 'W'
        self.board[4][3] = 'W'
        self.board[4][4] = 'B'

        self.current_player = 'B'
        self.game_over = False

        self.canvas = tk.Canvas(master, width=500, height=500, bg="green")  # 背景を緑色に変更
        self.canvas.pack()

        self.draw_board()

        # イベントハンドラをバインド
        self.canvas.bind("<Button-1>", self.handle_click)

    def draw_board(self):
        self.canvas.delete("all")
        cell_size = 500 / self.board_size

        for i in range(self.board_size):
            for j in range(self.board_size):
                x1 = j * cell_size
                y1 = i * cell_size
                x2 = x1 + cell_size
                y2 = y1 + cell_size

                if self.board[i][j] == 'B':
                    self.canvas.create_oval(x1 + 5, y1 + 5, x2 - 5, y2 - 5, fill="black", outline="black")
                elif self.board[i][j] == 'W':
                    self.canvas.create_oval(x1 + 5, y1 + 5, x2 - 5, y2 - 5, fill="white", outline="white")
                else:  # 空のマス
                    self.canvas.create_rectangle(x1, y1, x2, y2, fill="green", outline="gray")

        self.highlight_valid_moves()

    def highlight_valid_moves(self):
        valid_moves = self.get_valid_moves()
        cell_size = 500 / self.board_size

        for i, j in valid_moves:
            x1 = j * cell_size
            y1 = i * cell_size
            x2 = x1 + cell_size
            y2 = y1 + cell_size
            self.canvas.create_rectangle(x1, y1, x2, y2, fill="lightgreen", outline="lightgreen")

    def get_valid_moves(self):
        valid_moves = []
        for i in range(self.board_size):
            for j in range(self.board_size):
                if self.board[i][j] == ' ':
                    if self.is_valid_move(i, j):
                        valid_moves.append((i, j))
        return valid_moves

    def is_valid_move(self, row, col):
        # 隣接するマスが相手の石で、その先に自分の石があるか確認
        directions = [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]
        for dr, dc in directions:
            r = row + dr
            c = col + dc
            if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] != ' ' and self.board[r][c] != self.current_player:
                while 0 <= r < self.board_size and 0 <= c < self.board_size:
                    r += dr
                    c += dc
                    if 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] == self.current_player:
                        return True
        return False

    def handle_click(self, event):
        if self.game_over:
            self.reset_game()
            return

        cell_size = 500 / self.board_size
        row = int(event.y // cell_size)
        col = int(event.x // cell_size)

        if (row, col) in self.get_valid_moves():
            self.make_move(row, col)
            self.switch_player()
            self.draw_board()
            self.check_game_over()

    def make_move(self, row, col):
        self.board[row][col] = self.current_player
        self.flip_pieces(row, col)

    def flip_pieces(self, row, col):
        directions = [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]
        for dr, dc in directions:
            r = row + dr
            c = col + dc
            flip_pieces = []
            while 0 <= r < self.board_size and 0 <= c < self.board_size and self.board[r][c] != ' ':
                if self.board[r][c] == self.current_player:
                    for i in range(len(flip_pieces)):
                        self.board[flip_pieces[i][0]][flip_pieces[i][1]] = self.current_player
                    break
                else:
                    flip_pieces.append((r, c))
                r += dr
                c += dc
        self.draw_board()

    def switch_player(self):
        if self.current_player == 'B':
            self.current_player = 'W'
        else:
            self.current_player = 'B'

    def check_game_over(self):
        if not self.get_valid_moves():
            self.switch_player()
            if not self.get_valid_moves():
                self.game_over = True
                black_count = sum(row.count('B') for row in self.board)
                white_count = sum(row.count('W') for row in self.board)
                if black_count > white_count:
                    messagebox.showinfo("ゲーム終了", "黒の勝利!")
                elif white_count > black_count:
                    messagebox.showinfo("ゲーム終了", "白の勝利!")
                else:
                    messagebox.showinfo("ゲーム終了", "引き分け!")

    def reset_game(self):
        self.board = [[' ' for _ in range(self.board_size)] for _ in range(self.board_size)]
        self.board[3][3] = 'B'
        self.board[3][4] = 'W'
        self.board[4][3] = 'W'
        self.board[4][4] = 'B'
        self.current_player = 'B'
        self.game_over = False
        self.draw_board()

root = tk.Tk()
game = Othello(root)
root.mainloop()

上記のプログラムをコピーしてPythonを実行すると下記のような画面のアプリが起動します。

実際のゲーム画面

決着がついたら、下記のポップアップが表示されます。


最終局面の画像はこちら


汎用的に使用出来る指示文

命令文を最初に書いて下記の文章を下に貼り付けて使用してください。
役に立つ事間違いなしです。

以下の手順で行動してください:

1. タスクを一連の具体的なステップに分解し、初期計画を立てます。
2. 各ステップについて:
a. 必要なコードや説明を生成します。
b. 「このアプローチに問題はないか?代替案は?」と自問し、予期的反省を行います。
c. コードや説明を提示し、結果を想定します。
d. その行動が現在のステップの目的に合致しているか評価します。
e. 問題がある場合、代替案を検討するかバックトラックします。
3. 行き詰まったり、計画がうまくいかないと判断した場合、計画を修正します。
4. タスクが完了するまで繰り返します。

何度か使ってましたが、これは使えます。
この指示文を使ってゲームなど作成してみて下さい。

AIを使う側になりましょう!
記事自体は全文無料ですが、参考になったという人は支援として購入して頂けるとありがたいです。


Xのアカウントはこれです。
3日で10万稼いだ方法を発信していく予定です。
この記事が良かったら、フォローとスキしてください。


ここから先は

297字

¥ 1,000

この記事が気に入ったらサポートをしてみませんか?