Manisa Celal Bayar Üniversitesi

GPT-4 PONG

Mehmet Batuhan Duman

GPT-4 PONG

Veri Bilimi
  • 08 Haziran 2024 22:48
  • Mehmet Batuhan Duman
  • 2022-2023 Proje Koordinatörü

Yazıya başlamadan önce Pong’un ne olduğundan bahsetmek istiyorum. Pong, 1972 yılında Atari firması tarafından piyasaya sürülen bir oyundur. Oyun tıpkı iki boyutlu bir tenis oyunu gibidir. Sağda ve solda iki raket ve ortada rastgele sağa ve sola zıplayan bir top. Sizi Pong’un sıkıcı tarihine sokmadan önce, bu basit ama bir dil modeli için harika kodlara hızlıca bir göz atalım.

Öncelikle yaklaşık 3 iterasyonda başarılı kod üretebildiğini belirtmeliyim. Her üç tekrarda da sağ raketi sol raketin üzerinde üretti ve aynı hatayı 2 kez verdi. Son, yani üçünçü iterasyonda başarılı oldu. Pong kodunu yazmamın sebebi basit olması ve iki yıl önce Arduino ile Processing kütüphanesini kullanarak küçük bir Pong oyunu yazmış olmamdır. Ancak burada sadece klavye fonsiyonlarını kullanacağız.

İki raket, bir top ve skor tabelası için toplam 9 değişken oluşturuyorum.

//Topun pozisyonu
int xPos;
int yPos;
//Topun hızı
int speed = 10;
int vx = speed;
int vy = speed;
//Skor tabelası
int countP1 = 0;
int countP2 = 0;
//Raketin konumu
float xpos, ypos;         

GPT-4 ise 11 adet değişken oluşturuyor.

int paddleWidth = 20;
int paddleHeight = 100;
int paddleSpeed = 4;

int leftPaddleX;
int leftPaddleY;
int rightPaddleX;
int rightPaddleY;

int ballSize = 20;
int ballX;
int ballY;
int ballSpeedX = 3;
int ballSpeedY = 2;

Benim setup() metodum

void setup() {

  fullScreen();
  frameRate(60);
  noStroke();      
  noCursor();
  xPos = width/2;
  yPos = height/2;
}

GPT-4 setup() metodu

void setup() {
  size(800, 600);
  noStroke();

  leftPaddleX = 30;
  leftPaddleY = height / 2 - paddleHeight / 2;
  rightPaddleX = width - 30 - paddleWidth;
  rightPaddleY = height / 2 - paddleHeight / 2;
  
  ballX = width / 2;
  ballY = height / 2;
}

Yukarıdaki kodlardaki benzerliklere bakacak olursak, ikisinde de noStroke() metodu kullanılmış ve topun ilk başlama noktasını ekranın ortası yapılmış.

Benim draw() metodum

void draw() {
  background(0);

// Raketlerin, topun ve skor tabelasını oluşturma
 if (start == true) {
    textSize(100);
    text(countP1/12, 100, 100);
    text(countP2/12, 1700, 100);
    rect(1820, xpos, 30, 200, 10);
    rect(100, ypos, 30, 200, 10);
    circle(xPos, yPos, 20);
    stroke(255);
    line(width/2, 0, width/2, height);
  }

//Topun yönünü tayin etme
  xPos+=vx;
  yPos+=vy;

  /*Aşağıdaki karar yapılarında kısaca eğer top belirtilen 
yükseklik ve genişlik değerlerinin arasında sahip olduğu yönün tam tersine
gitmesin sağlıyor. Skorun arttığı yerlerde ise o belirtilen değer sahip köşe-
lerden geçince puanın artmasını sağlıyor.
*/
  if ((yPos <= height+speed/2 && yPos >= height) || (yPos <=speed && yPos >= 0)) {
    vy= -vy;
    pulse.stop();
  }
  if (((xPos <= 130) && (xPos >=99)) && ((yPos <= ypos+200) && ((yPos >=ypos)))) {
    vx= -vx;
    pulse.play();
  }
  if (((xPos <= 1850) && (xPos >=1820)) && ((yPos <= xpos+200) && ((yPos >=xpos)))) {
    vx= -vx;
    pulse.play();
  }
  if ((xPos >= 1830)) {
    countP1++;
  }
  if ((xPos >= 0)&&(xPos<=130)) {
    countP2++;
  }
  if ((xPos > 150)&&(xPos<1800)) {
    pulse.stop();
  }
  if ((xPos <= 20)&&(xPos>=0)||(xPos >= 1900)&&(xPos<=1920)) {
    xPos = width/2;
    yPos = height/2;
  }
  if (countP1/12 == 10 && countP2/12<10) {
    start = false;
    text("P1 WINS", 100, 100);
  }
  if (countP2/12 == 10 && countP1/12<10) {
    start = false;
    text("P2 WINS", 100, 100);
  }
}

GPT-4 draw() metodu

void draw() {
  background(0);
// Keep paddles inside the screen.
  leftPaddleY = constrain(leftPaddleY, 0, height - paddleHeight);
  rightPaddleY = constrain(rightPaddleY, 0, height - paddleHeight);

  // Update ball position.
  ballX += ballSpeedX;
  ballY += ballSpeedY;

  // Bounce ball off top and bottom of the screen.
  if (ballY < 0 || ballY > height - ballSize) {
    ballSpeedY = -ballSpeedY;
  }

  // Bounce ball off paddles.
  if ((ballX <= leftPaddleX + paddleWidth && ballY + ballSize >= leftPaddleY && ballY <= leftPaddleY + paddleHeight) || (ballX + ballSize >= rightPaddleX && ballY + ballSize >= rightPaddleY && ballY <= rightPaddleY + paddleHeight)) {
    ballSpeedX = -ballSpeedX;
  }

  // Reset ball if it goes off the screen.
  if (ballX < 0 || ballX > width) {
    ballX = width / 2;
    ballY = height / 2;
    ballSpeedX = -ballSpeedX;
  }

  // Draw paddles and ball.
  fill(255);
  rect(leftPaddleX, leftPaddleY, paddleWidth, paddleHeight);
  rect(rightPaddleX, rightPaddleY, paddleWidth, paddleHeight);
  ellipse(ballX, ballY, ballSize, ballSize);
}
  • İki kod arasında dikkatimi ilk çeken şey background(0) oldu. Fakat haliyle klasikleşmiş bir oyun olduğu için Pong’un arka planı siyah olmalıydı.
  • Bir farklılık olarak benim raketleri içeride tutmaya yarayan bir kodum yok.
  • İkinci benzerlik topun hareketinin güncellenmesi fakat bunun içinde spesifik bir şey yazılamazdı kanaatimce.
  • Üçüncü benzerlik ise eğer top sağ ve sol köşelerden çıktığı takdirde ortadan tekrar başlaması. Bu da Pong’un bir diğer özelliği.

Sohbete ait bir Ekran Görüntüsü

Github ve çoğu kod paylaşımı yapılan sitelerdeki Processing ile yazılmış Pong oyunları bu ve buna benzer kodlar. Hem benim hem de GPT-4’ün yapmış olduğu Pong’un Github linklerini ve videolarını aşağıya ekledim.

 

Benim yapmış olduğum Pong

 

GPT-4'ün yapmış olduğu Pong

Github Linkleri ve sohbetin linki:

dmn_ProcessingandArduinoGames/realPongProcessing.pde at main ·…

Basic Atari Breakout game using Processing and Arduino - dmn_ProcessingandArduinoGames/realPongProcessing.pde at main ·…

github.com

dmn_ProcessingandArduinoGames/GPT4Pong.pde at main · bthndmn12/dmn_ProcessingandArduinoGames

Basic Atari Breakout game using Processing and Arduino - dmn_ProcessingandArduinoGames/GPT4Pong.pde at main ·…

github.com

dmn_ProcessingandArduinoGames/GPT4Chat.txt at main · bthndmn12/dmn_ProcessingandArduinoGames

Basic Atari Breakout game using Processing and Arduino - dmn_ProcessingandArduinoGames/GPT4Chat.txt at main ·…

github.com

Topluluğumuza Üye Ol: