ゼロから始めるCursorを無料で1日1500回まで利用できる裏技
Cursorの使い方
皆さんは「Cursor」というAIツールをご存じでしょうか?
Cursorは、プログラミング関連の業務全般を自動化できるAIツールです。Cursorを活用すれば、コードを自動で生成できるのはもちろん、チャットで質問したりエラーを自動で修正したりもできるんです!
まずはこのページからCursor本体をインストールしてください。
次に用意するのは、こちらのGoogle AI Studioこれは、Gemini 1.5 Proという
AIを無料で使用出来る環境になります。
いつまで無料なのかはわかりませんが、現在(2024年7月8日)では無料で使えます。
2024年10月27日追記
Modelの追加方法を書き足しました。
GeminiのModelを最新のVersionのものを追加しました。
役立てて下さい。
下記のモデルが追加出来るモデルです。
gemini-1.5-flash
gemini-1.5-flash-002
gemini-1.5-flash-exp-0827
gemini-1.5-pro-002
gemini-1.5-pro-exp-0827
gemini-exp-1114
gemini-exp-1114が追加されました。
細かい追加方法は下で解説しています。
GeminiのURLは下記です。
google ai studioと検索したら出てきます。
使い方は、たとえば、Googleアカウントでログインして下の画像の
赤枠の所にチャット形式でやって欲しい事を入力してCtrlキー + ENTERなどENTER+何かのボタンを押すと質問が出来ます。
ENTERキーだけなら押しても、改行になるだけなので地味に便利です。
次に今回の目玉機能の一日1500回使う裏技の方法は、Google AI StudioのGet API Keyというボタンを押して下さい。
ここでAPIというプログラムの連携をやってくれる鍵を手に入れて下さい。
APIキーを作成ボタンを押して下さい
作成出来たら下の画像のAPIキーをクリックしてAPIキーをコピーしてください。
次はCursorを起動したら、歯車マークが右上にあるので、
これをクリックしてGoogle API Keyに先ほどコピーしたファイルを張り付けて、Verifyボタンを押したら準備完了です。
歯車マークを押して下記のModelsっていう所をクリックして下さい。
そしたら↓の画像のような画面になるので、
Add modelで下記のAPIを追加して下さい。
最新のモデルは下記の2点です。
gemini-1.5-pro-002
gemini-1.5-flash-002
ちょっと前までのモデルを使用したい時は下記です。
gemini-1.5-flash-exp-0827
gemini-1.5-pro-exp-0827
Cursorを起動したら、自分が編集したいフォルダかファイルを選択して下さい。
ファイルが開けたら、右クリックして新しいファイルを作成してください。
すでにファイルがあれば、それを使用してください。
Ctrl + K ボタンでプログラムを書いてもらう
文章作成も出来るのでまずは、gemini-1.5-pro-002を使用して下さい。
下の記事は古いので、参考程度に見て下さい。
Ctrlキー+kボタンでどのAIを使うか選択出来ます。
今回はAPIキーがあれば無料で一日1500回使える
Gemini 1.5 flashを選択して下さい。
使用出来るAIは、perplexityに聞いたら下記のような図を出してくれました。
Claude 3.5 Sonnetが制限無かったとしたら、それを使うのもありかもしれません。
しかし今回は、Gemini 1.5 flashの話なので、Gemini 1.5 flashを使用します。
よく使うショートカットキーの一覧です。
こちらのCursorの記事もおすすめです。
Claude 3.5 Sonnetは無料だと50回で制限来ました。
Ctrl + i でComposer機能機能を使おう!
便利な使い方は以下のツイートを見て下さい。
他にも追加された機能で良く使うのがComposer機能と言って
Ctrl + k よりも長くコードを修正してくれる機能があります。
複数のファイルを同時に編集出来ます
ショートカットキー
Ctrl + i
or
Ctrl + Shift + i
今回はsample.pyというPythonのファイルを作成してオセロのプログラムを作成してもらいました。
Ctrlキーを押したら改行ではなく実行されるので、改行をしたい時にはSHIFT+ENTERキーを押して下さい。
指示文は下記です。
指示文:
実際の画面はこれ
この時コードを確定したい時は、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キーを押して下さい。
指示文:
コードの修正が終わったら、右端の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()
まだバグがありますので修正していきましょう。
下記の文章をチャットで送って下さい。
指示文:
しかしまだバグがありましたので、コードを全文選択してから
コメント欄に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="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を実行すると下記のような画面のアプリが起動します。
実際のゲーム画面
決着がついたら、下記のポップアップが表示されます。
最終局面の画像はこちら
汎用的に使用出来る指示文
命令文を最初に書いて下記の文章を下に貼り付けて使用してください。
役に立つ事間違いなしです。
何度か使ってましたが、これは使えます。
この指示文を使ってゲームなど作成してみて下さい。
AIを使う側になりましょう!
記事自体は全文無料ですが、参考になったという人は支援として購入して頂けるとありがたいです。
Xのアカウントはこれです。
3日で10万稼いだ方法を発信していく予定です。
この記事が良かったら、フォローとスキしてください。
ここから先は
¥ 1,000
この記事が気に入ったらチップで応援してみませんか?