| PYTHON = """ |
| import keyboard |
| import random |
| from dataclasses import dataclass |
| |
| |
| class View: |
| def __init__(self, game): |
| self.game = game |
| |
| def render(self): |
| # Print the game state |
| for y in range(10): |
| for x in range(10): |
| if Point(x, y) in self.game.snake: |
| print('S', end='') |
| elif Point(x, y) == self.game.food: |
| print('F', end='') |
| else: |
| print('.', end='') |
| print() |
| print() |
| |
| |
| @dataclass |
| class Point: |
| x: int |
| y: int |
| |
| class Game: |
| def __init__(self): |
| self.snake = [Point(5, 5)] |
| self.food = self.generate_food() |
| self.is_running = True |
| |
| def generate_food(self): |
| return Point(random.randint(0, 10), random.randint(0, 10)) |
| |
| def update(self): |
| # Move the snake |
| self.snake.move() |
| |
| # Check for collision with food |
| if self.snake.head == self.food: |
| self.snake.grow() |
| self.food = self.generate_food() |
| |
| # Check for collision with boundaries |
| if not (0 <= self.snake.head.x < 10 and 0 <= self.snake.head.y < 10): |
| self.is_running = False |
| |
| class Controller: |
| def __init__(self, game, view): |
| self.game = game |
| self.view = view |
| |
| def handle_input(self): |
| if keyboard.is_pressed('up'): |
| self.game.move('up') |
| elif keyboard.is_pressed('down'): |
| self.game.move('down') |
| elif keyboard.is_pressed('left'): |
| self.game.move('left') |
| elif keyboard.is_pressed('right'): |
| self.game.move('right') |
| |
| def main(): |
| game = Game() |
| view = View(game) |
| controller = Controller(game, view) |
| |
| while game.is_running: |
| controller.handle_input() |
| game.update() |
| view.render() |
| |
| if __name__ == "__main__": |
| main() |
| """ |
|
|
|
|
| HTML = """ |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Snake Game</title> |
| <link rel="stylesheet" type="text/css" href="styles.css"> |
| </head> |
| <body> |
| <h1>Snake Game</h1> |
| <canvas id="gameCanvas" width="400" height="400"></canvas> |
| <h2 id="score">Score: 0</h2> |
| <script src="script.js"></script> |
| </body> |
| </html> |
| """ |
|
|
| CSS = """ |
| body { |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| height: 100vh; |
| background-color: #000; |
| color: #fff; |
| font-family: Arial, sans-serif; |
| } |
| |
| #gameCanvas { |
| border: 1px solid #fff; |
| } |
| |
| h1, h2 { |
| text-align: center; |
| } |
| |
| """ |
|
|
| JAVASCRIPT = """ |
| var canvas = document.getElementById('gameCanvas'); |
| var context = canvas.getContext('2d'); |
| |
| var box = 20; |
| var score = 0; |
| var food = null; |
| |
| var snake = []; |
| snake[0] = { x: 10 * box, y: 10 * box }; |
| |
| document.addEventListener('keydown', direction); |
| var d; |
| |
| function direction(event) { |
| if (event.keyCode == 37 && d != "RIGHT") { |
| d = "LEFT"; |
| } else if (event.keyCode == 38 && d != "DOWN") { |
| d = "UP"; |
| } else if (event.keyCode == 39 && d != "LEFT") { |
| d = "RIGHT"; |
| } else if (event.keyCode == 40 && d != "UP") { |
| d = "DOWN"; |
| } |
| } |
| |
| function draw() { |
| context.clearRect(0, 0, canvas.width, canvas.height); |
| for (var i = 0; i < snake.length; i++) { |
| context.fillStyle = (i == 0) ? "green" : "white"; |
| context.fillRect(snake[i].x, snake[i].y, box, box); |
| } |
| |
| if (food == null) { |
| food = { |
| x: Math.floor(Math.random() * 19 + 1) * box, |
| y: Math.floor(Math.random() * 19 + 1) * box |
| } |
| } |
| |
| context.fillStyle = "red"; |
| context.fillRect(food.x, food.y, box, box); |
| |
| var snakeX = snake[0].x; |
| var snakeY = snake[0].y; |
| |
| if (d == "LEFT") snakeX -= box; |
| if (d == "UP") snakeY -= box; |
| if (d == "RIGHT") snakeX += box; |
| if (d == "DOWN") snakeY += box; |
| |
| if (snakeX == food.x && snakeY == food.y) { |
| score++; |
| food = null; |
| } else { |
| snake.pop(); |
| } |
| |
| var newHead = { |
| x: snakeX, |
| y: snakeY |
| } |
| |
| if (snakeX < 0 || snakeY < 0 || snakeX > 19 * box || snakeY > 19 * box || collision(newHead, snake)) { |
| clearInterval(game); |
| } |
| |
| snake.unshift(newHead); |
| |
| document.getElementById('score').innerHTML = "Score: " + score; |
| } |
| |
| function collision(head, array) { |
| for (var i = 0; i < array.length; i++) { |
| if (head.x == array[i].x && head.y == array[i].y) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| var game = setInterval(draw, 100); |
| """ |
|
|
| JAVA = """ |
| import java.awt.Color; |
| import java.awt.Dimension; |
| import java.awt.Font; |
| import java.awt.FontMetrics; |
| import java.awt.Graphics; |
| import java.awt.Image; |
| import java.awt.Toolkit; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.awt.event.KeyAdapter; |
| import java.awt.event.KeyEvent; |
| import javax.swing.ImageIcon; |
| import javax.swing.JPanel; |
| import javax.swing.Timer; |
| |
| public class SnakeGame extends JPanel implements ActionListener { |
| |
| private final int B_WIDTH = 300; |
| private final int B_HEIGHT = 300; |
| private final int DOT_SIZE = 10; |
| private final int ALL_DOTS = 900; |
| private final int RAND_POS = 29; |
| private final int DELAY = 140; |
| |
| private final int x[] = new int[ALL_DOTS]; |
| private final int y[] = new int[ALL_DOTS]; |
| |
| private int dots; |
| private int apple_x; |
| private int apple_y; |
| |
| private boolean leftDirection = false; |
| private boolean rightDirection = true; |
| private boolean upDirection = false; |
| private boolean downDirection = false; |
| private boolean inGame = true; |
| |
| private Timer timer; |
| private Image ball; |
| private Image apple; |
| private Image head; |
| |
| public SnakeGame() { |
| |
| initBoard(); |
| } |
| |
| private void initBoard() { |
| |
| addKeyListener(new TAdapter()); |
| setBackground(Color.black); |
| setFocusable(true); |
| |
| setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT)); |
| loadImages(); |
| initGame(); |
| } |
| |
| private void loadImages() { |
| |
| ImageIcon iid = new ImageIcon("src/resources/dot.png"); |
| ball = iid.getImage(); |
| |
| ImageIcon iia = new ImageIcon("src/resources/apple.png"); |
| apple = iia.getImage(); |
| |
| ImageIcon iih = new ImageIcon("src/resources/head.png"); |
| head = iih.getImage(); |
| } |
| |
| private void initGame() { |
| |
| dots = 3; |
| |
| for (int z = 0; z < dots; z++) { |
| x[z] = 50 - z * 10; |
| y[z] = 50; |
| } |
| |
| locateApple(); |
| |
| timer = new Timer(DELAY, this); |
| timer.start(); |
| } |
| |
| @Override |
| public void paintComponent(Graphics g) { |
| super.paintComponent(g); |
| |
| doDrawing(g); |
| } |
| |
| private void doDrawing(Graphics g) { |
| |
| if (inGame) { |
| |
| g.drawImage(apple, apple_x, apple_y, this); |
| |
| for (int z = 0; z < dots; z++) { |
| if (z == 0) { |
| g.drawImage(head, x[z], y[z], this); |
| } else { |
| g.drawImage(ball, x[z], y[z], this); |
| } |
| } |
| |
| Toolkit.getDefaultToolkit().sync(); |
| |
| } else { |
| |
| gameOver(g); |
| } |
| } |
| |
| private void gameOver(Graphics g) { |
| |
| String msg = "Game Over"; |
| Font small = new Font("Helvetica", Font.BOLD, 14); |
| FontMetrics metr = getFontMetrics(small); |
| |
| g.setColor(Color.white); |
| g.setFont(small); |
| g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2); |
| } |
| |
| private void checkApple() { |
| |
| if ((x[0] == apple_x) && (y[0] == apple_y)) { |
| |
| dots++; |
| locateApple(); |
| } |
| } |
| |
| private void move() { |
| |
| for (int z = dots; z > 0; z--) { |
| x[z] = x[(z - 1)]; |
| y[z] = y[(z - 1)]; |
| } |
| |
| if (leftDirection) { |
| x[0] -= DOT_SIZE; |
| } |
| |
| if (rightDirection) { |
| x[0] += DOT_SIZE; |
| } |
| |
| if (upDirection) { |
| y[0] -= DOT_SIZE; |
| } |
| |
| if (downDirection) { |
| y[0] += DOT_SIZE; |
| } |
| } |
| |
| private void checkCollision() { |
| |
| for (int z = dots; z > 0; z--) { |
| |
| if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) { |
| inGame = false; |
| } |
| } |
| |
| if (y[0] >= B_HEIGHT) { |
| inGame = false; |
| } |
| |
| if (y[0] < 0) { |
| inGame = false; |
| } |
| |
| if (x[0] >= B_WIDTH) { |
| inGame = false; |
| } |
| |
| if (x[0] < 0) { |
| inGame = false; |
| } |
| |
| if (!inGame) { |
| timer.stop(); |
| } |
| } |
| |
| private void locateApple() { |
| |
| int r = (int) (Math.random() * RAND_POS); |
| apple_x = ((r * DOT_SIZE)); |
| |
| r = (int) (Math.random() * RAND_POS); |
| apple_y = ((r * DOT_SIZE)); |
| } |
| |
| @Override |
| public void actionPerformed(ActionEvent e) { |
| |
| if (inGame) { |
| |
| checkApple(); |
| checkCollision(); |
| move(); |
| } |
| |
| repaint(); |
| } |
| |
| private class TAdapter extends KeyAdapter { |
| |
| @Override |
| public void keyPressed(KeyEvent e) { |
| |
| int key = e.getKeyCode(); |
| |
| if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) { |
| leftDirection = true; |
| upDirection = false; |
| downDirection = false; |
| } |
| |
| if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) { |
| rightDirection = true; |
| upDirection = false; |
| downDirection = false; |
| } |
| |
| if ((key == KeyEvent.VK_UP) && (!downDirection)) { |
| upDirection = true; |
| rightDirection = false; |
| leftDirection = false; |
| } |
| |
| if ((key == KeyEvent.VK_DOWN) && (!upDirection)) { |
| downDirection = true; |
| rightDirection = false; |
| leftDirection = false; |
| } |
| } |
| } |
| } |
| """ |
|
|
| C_SHARP = """ |
| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.Threading; |
| using System.Threading.Tasks; |
| |
| namespace SnakeGame |
| { |
| // Model |
| public class Game |
| { |
| public Snake Snake { get; set; } |
| public Point Food { get; set; } |
| public int Score { get; set; } |
| public bool Over { get; set; } |
| |
| public Game() |
| { |
| Snake = new Snake(); |
| Food = new Point(); |
| Score = 0; |
| Over = false; |
| } |
| } |
| |
| public class Snake |
| { |
| public Queue<Point> Body { get; set; } |
| public Direction Direction { get; set; } |
| |
| public Snake() |
| { |
| Body = new Queue<Point>(); |
| Direction = Direction.Right; |
| } |
| } |
| |
| public class Point |
| { |
| public int X { get; set; } |
| public int Y { get; set; } |
| } |
| |
| public enum Direction |
| { |
| Up, |
| Down, |
| Left, |
| Right |
| } |
| |
| // View |
| public class GameView |
| { |
| public void Draw(Game game) |
| { |
| Console.Clear(); |
| foreach (var point in game.Snake.Body) |
| { |
| Console.SetCursorPosition(point.X, point.Y); |
| Console.Write("O"); |
| } |
| Console.SetCursorPosition(game.Food.X, game.Food.Y); |
| Console.Write("F"); |
| Console.SetCursorPosition(0, 0); |
| Console.Write("Score: " + game.Score); |
| } |
| } |
| |
| // Controller |
| public class GameController |
| { |
| private Game game; |
| private GameView view; |
| |
| public GameController(Game game, GameView view) |
| { |
| this.game = game; |
| this.view = view; |
| } |
| |
| public void Start() |
| { |
| while (!game.Over) |
| { |
| Thread.Sleep(100); |
| MoveSnake(); |
| CheckCollision(); |
| view.Draw(game); |
| } |
| } |
| |
| private void MoveSnake() |
| { |
| var head = game.Snake.Body.Last(); |
| var newHead = new Point { X = head.X, Y = head.Y }; |
| switch (game.Snake.Direction) |
| { |
| case Direction.Up: |
| newHead.Y--; |
| break; |
| case Direction.Down: |
| newHead.Y++; |
| break; |
| case Direction.Left: |
| newHead.X--; |
| break; |
| case Direction.Right: |
| newHead.X++; |
| break; |
| } |
| game.Snake.Body.Enqueue(newHead); |
| if (newHead.X == game.Food.X && newHead.Y == game.Food.Y) |
| { |
| game.Score++; |
| game.Food = new Point { X = new Random().Next(1, 10), Y = new Random().Next(1, 10) }; |
| } |
| else |
| { |
| game.Snake.Body.Dequeue(); |
| } |
| } |
| |
| private void CheckCollision() |
| { |
| var head = game.Snake.Body.Last(); |
| if (head.X < 0 || head.Y < 0 || head.X >= 10 || head.Y >= 10) |
| { |
| game.Over = true; |
| } |
| if (game.Snake.Body.Take(game.Snake.Body.Count - 1).Any(p => p.X == head.X && p.Y == head.Y)) |
| { |
| game.Over = true; |
| } |
| } |
| } |
| |
| class Program |
| { |
| static void Main(string[] args) |
| { |
| var game = new Game(); |
| var view = new GameView(); |
| var controller = new GameController(game, view); |
| controller.Start(); |
| } |
| } |
| } |
| """ |
|
|
| TYPESCRIPT = """ |
| // Importing necessary modules |
| import { Application, Graphics, Keyboard } from 'pixi.js'; |
| |
| // Defining the Model class |
| class Model { |
| // The snake's body is represented as an array of points |
| body: Array<{x: number, y: number}>; |
| |
| constructor() { |
| this.body = [{x: 0, y: 0}]; |
| } |
| |
| // Method to move the snake |
| move(direction: {x: number, y: number}) { |
| // Add a new head in the direction of movement |
| this.body.unshift({ |
| x: this.body[0].x + direction.x, |
| y: this.body[0].y + direction.y |
| }); |
| |
| // Remove the tail |
| this.body.pop(); |
| } |
| } |
| |
| // Defining the View class |
| class View { |
| // The view needs a reference to the model and the PIXI application |
| model: Model; |
| app: Application; |
| graphics: Graphics; |
| |
| constructor(model: Model, app: Application) { |
| this.model = model; |
| this.app = app; |
| this.graphics = new Graphics(); |
| this.app.stage.addChild(this.graphics); |
| } |
| |
| // Method to render the snake |
| render() { |
| // Clear the previous frame |
| this.graphics.clear(); |
| |
| // Draw each part of the snake's body |
| for (let part of this.model.body) { |
| this.graphics.beginFill(0xFFFFFF); |
| this.graphics.drawRect(part.x * 10, part.y * 10, 10, 10); |
| this.graphics.endFill(); |
| } |
| } |
| } |
| |
| // Defining the Controller class |
| class Controller { |
| // The controller needs a reference to the model and the view |
| model: Model; |
| view: View; |
| direction: {x: number, y: number}; |
| |
| constructor(model: Model, view: View) { |
| this.model = model; |
| this.view = view; |
| this.direction = {x: 1, y: 0}; |
| |
| // Set up keyboard controls |
| window.addEventListener('keydown', (e) => this.handleKeydown(e)); |
| } |
| |
| // Method to handle keyboard input |
| handleKeydown(event: KeyboardEvent) { |
| switch (event.key) { |
| case 'ArrowUp': |
| this.direction = {x: 0, y: -1}; |
| break; |
| case 'ArrowDown': |
| this.direction = {x: 0, y: 1}; |
| break; |
| case 'ArrowLeft': |
| this.direction = {x: -1, y: 0}; |
| break; |
| case 'ArrowRight': |
| this.direction = {x: 1, y: 0}; |
| break; |
| } |
| } |
| |
| // Method to update the game state |
| update() { |
| this.model.move(this.direction); |
| this.view.render(); |
| } |
| } |
| |
| // Create the PIXI application |
| let app = new Application({width: 800, height: 600}); |
| |
| // Create the MVC components |
| let model = new Model(); |
| let view = new View(model, app); |
| let controller = new Controller(model, view); |
| |
| // Start the game loop |
| setInterval(() => controller.update(), 100); |
| """ |
|
|
| RUBY = """ |
| require 'io/console' |
| |
| # Model |
| class Game |
| attr_accessor :score, :snake, :food |
| |
| def initialize |
| @score = 0 |
| @snake = [[2, 2]] |
| @food = [6, 4] |
| end |
| |
| def move(direction) |
| head = @snake.first.dup |
| case direction |
| when 'up' |
| head[0] -= 1 |
| when 'down' |
| head[0] += 1 |
| when 'left' |
| head[1] -= 1 |
| when 'right' |
| head[1] += 1 |
| end |
| @snake.unshift(head) |
| |
| if @snake.first == @food |
| @score += 1 |
| @food = [rand(1..8), rand(1..8)] |
| else |
| @snake.pop |
| end |
| end |
| |
| def game_over? |
| head = @snake.first |
| @snake[1..-1].include?(head) || head[0] == 0 || head[1] == 0 || head[0] == 9 || head[1] == 9 |
| end |
| end |
| |
| # View |
| class View |
| def render(game) |
| system('clear') |
| puts "Score: #{game.score}" |
| (0..9).each do |i| |
| (0..9).each do |j| |
| if game.snake.include?([i, j]) |
| print 'S' |
| elsif game.food == [i, j] |
| print 'F' |
| else |
| print '.' |
| end |
| end |
| puts |
| end |
| end |
| end |
| |
| # Controller |
| class Controller |
| def initialize |
| @game = Game.new |
| @view = View.new |
| @direction = 'right' |
| end |
| |
| def play |
| loop do |
| @view.render(@game) |
| break if @game.game_over? |
| |
| input = IO.console.getch |
| case input |
| when 'w' |
| @direction = 'up' |
| when 's' |
| @direction = 'down' |
| when 'a' |
| @direction = 'left' |
| when 'd' |
| @direction = 'right' |
| end |
| @game.move(@direction) |
| end |
| puts "Game Over! Your score was #{@game.score}." |
| end |
| end |
| |
| Controller.new.play |
| |
| """ |
|
|
| PHP = """ |
| <?php |
| // Model |
| class Snake { |
| public $body; |
| public $direction; |
| |
| public function __construct() { |
| $this->body = array(array(2, 0), array(1, 0), array(0, 0)); |
| $this->direction = 'right'; |
| } |
| |
| public function move() { |
| $head = current($this->body); |
| switch($this->direction) { |
| case 'right': |
| $this->body[] = array($head[0] + 1, $head[1]); |
| break; |
| case 'left': |
| $this->body[] = array($head[0] - 1, $head[1]); |
| break; |
| case 'up': |
| $this->body[] = array($head[0], $head[1] - 1); |
| break; |
| case 'down': |
| $this->body[] = array($head[0], $head[1] + 1); |
| break; |
| } |
| array_shift($this->body); |
| } |
| |
| public function changeDirection($new_direction) { |
| $this->direction = $new_direction; |
| } |
| } |
| |
| // View |
| class GameView { |
| public function render($snake) { |
| $output = ''; |
| for ($y=0; $y<20; $y++) { |
| for ($x=0; $x<20; $x++) { |
| if (in_array(array($x, $y), $snake->body)) { |
| $output .= 'X'; |
| } else { |
| $output .= ' '; |
| } |
| } |
| $output .= "\n"; |
| } |
| echo $output; |
| } |
| } |
| |
| // Controller |
| class GameController { |
| public $snake; |
| public $view; |
| |
| public function __construct() { |
| $this->snake = new Snake(); |
| $this->view = new GameView(); |
| } |
| |
| public function start() { |
| while (true) { |
| $this->view->render($this->snake); |
| $this->snake->move(); |
| sleep(1); |
| } |
| } |
| |
| public function changeDirection($new_direction) { |
| $this->snake->changeDirection($new_direction); |
| } |
| } |
| |
| // Game loop |
| $game = new GameController(); |
| $game->start(); |
| ?> |
| """ |
|
|
| SWIFT = """ |
| import Foundation |
| import Cocoa |
| |
| // MARK: - Model |
| struct Point { |
| var x: Int |
| var y: Int |
| } |
| |
| class Snake { |
| var body: [Point] |
| var direction: Direction |
| |
| init(startPoint: Point) { |
| body = [startPoint] |
| direction = .right |
| } |
| |
| func move() { |
| let head = body.first! |
| var newHead = head |
| |
| switch direction { |
| case .up: |
| newHead.y += 1 |
| case .down: |
| newHead.y -= 1 |
| case .left: |
| newHead.x -= 1 |
| case .right: |
| newHead.x += 1 |
| } |
| |
| body.insert(newHead, at: 0) |
| body.removeLast() |
| } |
| |
| func grow() { |
| let tail = body.last! |
| body.append(tail) |
| } |
| } |
| |
| enum Direction { |
| case up |
| case down |
| case left |
| case right |
| } |
| |
| // MARK: - View |
| class GameView { |
| func draw(snake: Snake) { |
| for point in snake.body { |
| print("O", terminator: "") |
| } |
| print("\n") |
| } |
| } |
| |
| // MARK: - Controller |
| class GameController { |
| var snake: Snake |
| var view: GameView |
| |
| init() { |
| snake = Snake(startPoint: Point(x: 0, y: 0)) |
| view = GameView() |
| } |
| |
| func start() { |
| while true { |
| snake.move() |
| view.draw(snake: snake) |
| sleep(1) |
| } |
| } |
| |
| func handleKey(key: String) { |
| switch key { |
| case "w": |
| snake.direction = .up |
| case "s": |
| snake.direction = .down |
| case "a": |
| snake.direction = .left |
| case "d": |
| snake.direction = .right |
| default: |
| break |
| } |
| } |
| } |
| |
| // MARK: - Main |
| let gameController = GameController() |
| gameController.start() |
| """ |
|
|
| GO = """ |
| package main |
| |
| import ( |
| "fmt" |
| "os" |
| "os/exec" |
| "time" |
| "math/rand" |
| "bufio" |
| "syscall" |
| "unsafe" |
| ) |
| |
| // Model |
| type Point struct { |
| X int |
| Y int |
| } |
| |
| type Snake struct { |
| Body []Point |
| Dir string |
| } |
| |
| type Game struct { |
| Snake Snake |
| Food Point |
| Score int |
| Width int |
| Height int |
| } |
| |
| // View |
| func (game *Game) Render() { |
| clearScreen() |
| for y := 0; y < game.Height; y++ { |
| for x := 0; x < game.Width; x++ { |
| point := Point{X: x, Y: y} |
| switch { |
| case point == game.Food: |
| fmt.Print("F") |
| case game.Snake.Contains(point): |
| fmt.Print("S") |
| default: |
| fmt.Print(" ") |
| } |
| } |
| fmt.Println() |
| } |
| fmt.Println("Score:", game.Score) |
| } |
| |
| // Controller |
| func (game *Game) Update() { |
| head := game.Snake.Body[0] |
| switch game.Snake.Dir { |
| case "up": |
| head.Y-- |
| case "down": |
| head.Y++ |
| case "left": |
| head.X-- |
| case "right": |
| head.X++ |
| } |
| |
| if head.X < 0 || head.Y < 0 || head.X >= game.Width || head.Y >= game.Height { |
| game.Score = -1 |
| return |
| } |
| |
| if game.Snake.Contains(head) { |
| game.Score = -1 |
| return |
| } |
| |
| if head == game.Food { |
| game.Score++ |
| game.Food = Point{rand.Intn(game.Width), rand.Intn(game.Height)} |
| } else { |
| game.Snake.Body = game.Snake.Body[:len(game.Snake.Body)-1] |
| } |
| |
| game.Snake.Body = append([]Point{head}, game.Snake.Body...) |
| } |
| |
| func (snake *Snake) Contains(point Point) bool { |
| for _, bodyPoint := range snake.Body { |
| if bodyPoint == point { |
| return true |
| } |
| } |
| return false |
| } |
| |
| func clearScreen() { |
| cmd := exec.Command("clear") |
| cmd.Stdout = os.Stdout |
| cmd.Run() |
| } |
| |
| func main() { |
| game := &Game{ |
| Snake: Snake{ |
| Body: []Point{{10, 10}}, |
| Dir: "right", |
| }, |
| Food: Point{15, 15}, |
| Score: 0, |
| Width: 20, |
| Height: 20, |
| } |
| |
| go func() { |
| reader := bufio.NewReader(os.Stdin) |
| for { |
| char, _, err := reader.ReadRune() |
| if err != nil { |
| panic(err) |
| } |
| |
| switch char { |
| case 'w': |
| game.Snake.Dir = "up" |
| case 's': |
| game.Snake.Dir = "down" |
| case 'a': |
| game.Snake.Dir = "left" |
| case 'd': |
| game.Snake.Dir = "right" |
| } |
| } |
| }() |
| |
| for game.Score >= 0 { |
| game.Render() |
| time.Sleep(time.Second / 5) |
| game.Update() |
| } |
| } |
| """ |
|
|
| KOTLIN = """ |
| import java.awt.Color |
| import java.awt.Dimension |
| import java.awt.Font |
| import java.awt.FontMetrics |
| import java.awt.Graphics |
| import java.awt.Image |
| import java.awt.Toolkit |
| import java.awt.event.ActionEvent |
| import java.awt.event.ActionListener |
| import java.awt.event.KeyAdapter |
| import java.awt.event.KeyEvent |
| import javax.swing.ImageIcon |
| import javax.swing.JPanel |
| import javax.swing.Timer |
| |
| class Board : JPanel(), ActionListener { |
| |
| private val B_WIDTH = 300 |
| private val B_HEIGHT = 300 |
| private val DOT_SIZE = 10 |
| private val ALL_DOTS = 900 |
| private val RAND_POS = 29 |
| private val DELAY = 140 |
| |
| private val x = IntArray(ALL_DOTS) |
| private val y = IntArray(ALL_DOTS) |
| |
| private var dots: Int = 0 |
| private var apple_x: Int = 0 |
| private var apple_y: Int = 0 |
| |
| private var leftDirection = false |
| private var rightDirection = true |
| private var upDirection = false |
| private var downDirection = false |
| private var inGame = true |
| |
| private lateinit var timer: Timer |
| private lateinit var apple: Image |
| private lateinit var dot: Image |
| private lateinit var head: Image |
| |
| init { |
| initBoard() |
| } |
| |
| private fun initBoard() { |
| |
| addKeyListener(TAdapter()) |
| background = Color.black |
| isFocusable = true |
| |
| preferredSize = Dimension(B_WIDTH, B_HEIGHT) |
| loadImages() |
| initGame() |
| } |
| |
| private fun loadImages() { |
| |
| val iid = ImageIcon("src/resources/apple.png") |
| apple = iid.image |
| |
| val iid2 = ImageIcon("src/resources/dot.png") |
| dot = iid2.image |
| |
| val iid3 = ImageIcon("src/resources/head.png") |
| head = iid3.image |
| } |
| |
| private fun initGame() { |
| |
| dots = 3 |
| |
| for (z in 0 until dots) { |
| x[z] = 50 - z * 10 |
| y[z] = 50 |
| } |
| |
| locateApple() |
| |
| timer = Timer(DELAY, this) |
| timer.start() |
| } |
| |
| override fun paintComponent(g: Graphics) { |
| super.paintComponent(g) |
| |
| doDrawing(g) |
| } |
| |
| private fun doDrawing(g: Graphics) { |
| |
| if (inGame) { |
| |
| g.drawImage(apple, apple_x, apple_y, this) |
| |
| for (z in 0 until dots) { |
| if (z == 0) { |
| g.drawImage(head, x[z], y[z], this) |
| } else { |
| g.drawImage(dot, x[z], y[z], this) |
| } |
| } |
| |
| Toolkit.getDefaultToolkit().sync() |
| |
| } else { |
| |
| gameOver(g) |
| } |
| } |
| |
| private fun gameOver(g: Graphics) { |
| |
| val msg = "Game Over" |
| val font = Font("Helvetica", Font.BOLD, 14) |
| val metrics: FontMetrics = this.getFontMetrics(font) |
| |
| g.color = Color.white |
| g.font = font |
| g.drawString(msg, (B_WIDTH - metrics.stringWidth(msg)) / 2, B_HEIGHT / 2) |
| } |
| |
| private fun checkApple() { |
| |
| if (x[0] == apple_x && y[0] == apple_y) { |
| |
| dots++ |
| locateApple() |
| } |
| } |
| |
| private fun move() { |
| |
| for (z in dots downTo 1) { |
| x[z] = x[z - 1] |
| y[z] = y[z - 1] |
| } |
| |
| if (leftDirection) { |
| x[0] -= DOT_SIZE |
| } |
| |
| if (rightDirection) { |
| x[0] += DOT_SIZE |
| } |
| |
| if (upDirection) { |
| y[0] -= DOT_SIZE |
| } |
| |
| if (downDirection) { |
| y[0] += DOT_SIZE |
| } |
| } |
| |
| private fun checkCollision() { |
| |
| for (z in dots downTo 1) { |
| if (z > 4 && x[0] == x[z] && y[0] == y[z]) { |
| inGame = false |
| } |
| } |
| |
| if (y[0] >= B_HEIGHT) { |
| inGame = false |
| } |
| |
| if (y[0] < 0) { |
| inGame = false |
| } |
| |
| if (x[0] >= B_WIDTH) { |
| inGame = false |
| } |
| |
| if (x[0] < 0) { |
| inGame = false |
| } |
| |
| if (!inGame) { |
| timer.stop() |
| } |
| } |
| |
| private fun locateApple() { |
| |
| val r = (Math.random() * RAND_POS).toInt() |
| apple_x = r * DOT_SIZE |
| |
| r = (Math.random() * RAND_POS).toInt() |
| apple_y = r * DOT_SIZE |
| } |
| |
| override fun actionPerformed(e: ActionEvent) { |
| |
| if (inGame) { |
| |
| checkApple() |
| checkCollision() |
| move() |
| } |
| |
| repaint() |
| } |
| |
| private inner class TAdapter : KeyAdapter() { |
| |
| override fun keyPressed(e: KeyEvent) { |
| |
| val key = e.keyCode |
| |
| if (key == KeyEvent.VK_LEFT && !rightDirection) { |
| leftDirection = true |
| upDirection = false |
| downDirection = false |
| } |
| |
| if (key == KeyEvent.VK_RIGHT && !leftDirection) { |
| rightDirection = true |
| upDirection = false |
| downDirection = false |
| } |
| |
| if (key == KeyEvent.VK_UP && !downDirection) { |
| upDirection = true |
| rightDirection = false |
| leftDirection = false |
| } |
| |
| if (key == KeyEvent.VK_DOWN && !upDirection) { |
| downDirection = true |
| rightDirection = false |
| leftDirection = false |
| } |
| } |
| } |
| } |
| """ |
| RUST = """ |
| extern crate termion; |
| |
| use std::io; |
| use std::io::stdout; |
| use std::io::Write; |
| use std::thread; |
| use std::time::Duration; |
| use termion::raw::IntoRawMode; |
| use termion::input::TermRead; |
| use termion::event::Key; |
| |
| // Define the size of the game board |
| const BOARD_SIZE: usize = 10; |
| |
| // Define the game state |
| struct GameState { |
| snake: Snake, |
| food: Food, |
| } |
| |
| // Define the snake |
| struct Snake { |
| body: Vec<(usize, usize)>, |
| direction: Direction, |
| } |
| |
| // Define the food |
| struct Food { |
| position: (usize, usize), |
| } |
| |
| // Define the possible directions the snake can move |
| enum Direction { |
| Up, |
| Down, |
| Left, |
| Right, |
| } |
| |
| // Implement the game state |
| impl GameState { |
| fn new() -> GameState { |
| GameState { |
| snake: Snake::new(), |
| food: Food::new(), |
| } |
| } |
| |
| // Update the game state |
| fn update(&mut self) { |
| self.snake.move(); |
| if self.snake.eats(&self.food) { |
| self.food = Food::new(); |
| } |
| } |
| } |
| |
| // Implement the snake |
| impl Snake { |
| fn new() -> Snake { |
| Snake { |
| body: vec![(BOARD_SIZE / 2, BOARD_SIZE / 2)], |
| direction: Direction::Right, |
| } |
| } |
| |
| // Move the snake in the current direction |
| fn move(&mut self) { |
| let (head_x, head_y) = self.body[0]; |
| match self.direction { |
| Direction::Up => self.body.insert(0, (head_x, head_y - 1)), |
| Direction::Down => self.body.insert(0, (head_x, head_y + 1)), |
| Direction::Left => self.body.insert(0, (head_x - 1, head_y)), |
| Direction::Right => self.body.insert(0, (head_x + 1, head_y)), |
| } |
| self.body.pop(); |
| } |
| |
| // Check if the snake eats the food |
| fn eats(&self, food: &Food) -> bool { |
| self.body[0] == food.position |
| } |
| } |
| |
| // Implement the food |
| impl Food { |
| fn new() -> Food { |
| Food { |
| position: (rand::random::<usize>() % BOARD_SIZE, rand::random::<usize>() % BOARD_SIZE), |
| } |
| } |
| } |
| |
| // Implement the view |
| fn render(game_state: &GameState) { |
| for y in 0..BOARD_SIZE { |
| for x in 0..BOARD_SIZE { |
| if game_state.snake.body.contains(&(x, y)) { |
| print!("S"); |
| } else if game_state.food.position == (x, y) { |
| print!("F"); |
| } else { |
| print!(" "); |
| } |
| } |
| println!(); |
| } |
| } |
| |
| // Implement the controller |
| fn controller(game_state: &mut GameState) { |
| let stdin = io::stdin(); |
| for c in stdin.keys() { |
| match c.unwrap() { |
| Key::Char('q') => break, |
| Key::Up => game_state.snake.direction = Direction::Up, |
| Key::Down => game_state.snake.direction = Direction::Down, |
| Key::Left => game_state.snake.direction = Direction::Left, |
| Key::Right => game_state.snake.direction = Direction::Right, |
| _ => {} |
| } |
| } |
| } |
| |
| fn main() { |
| let mut game_state = GameState::new(); |
| let mut stdout = stdout().into_raw_mode().unwrap(); |
| |
| loop { |
| write!(stdout, "{}", termion::clear::All).unwrap(); |
| render(&game_state); |
| stdout.flush().unwrap(); |
| game_state.update(); |
| thread::sleep(Duration::from_millis(1000)); |
| } |
| } |
| """ |
|
|
| C_PLUS_PLUS = """ |
| #include <iostream> |
| #include <conio.h> |
| #include <windows.h> |
| using namespace std; |
| |
| bool gameOver; |
| const int width = 20; |
| const int height = 20; |
| int x, y, fruitX, fruitY, score; |
| int tailX[100], tailY[100]; |
| int nTail; |
| enum eDirecton { STOP = 0, LEFT, RIGHT, UP, DOWN}; |
| eDirecton dir; |
| |
| void Setup() |
| { |
| gameOver = false; |
| dir = STOP; |
| x = width / 2; |
| y = height / 2; |
| fruitX = rand() % width; |
| fruitY = rand() % height; |
| score = 0; |
| } |
| void Draw() |
| { |
| system("cls"); |
| for (int i = 0; i < width+2; i++) |
| cout << "#"; |
| cout << endl; |
| |
| for (int i = 0; i < height; i++) |
| { |
| for (int j = 0; j < width; j++) |
| { |
| if (j == 0) |
| cout << "#"; |
| if (i == y && j == x) |
| cout << "*"; |
| else if (i == fruitY && j == fruitX) |
| cout << "%"; |
| else |
| { |
| |
| bool print = false; |
| for (int k = 0; k < nTail ; k++) |
| { |
| if (tailX[k] == j && tailY[k] == i) |
| { |
| cout << "*"; print = true; |
| } |
| } |
| if (!print) |
| cout << " "; |
| |
| } |
| |
| if (j == width - 1) |
| cout << "#"; |
| } |
| cout << endl; |
| } |
| |
| for (int i = 0; i < width+2; i++) |
| cout << "#"; |
| cout << endl; |
| cout << "Score:" << score << endl; |
| |
| } |
| |
| void Input() |
| { |
| if (_kbhit()) |
| { |
| switch (_getch()) |
| { |
| case 'a': |
| dir = LEFT; |
| break; |
| case 'd': |
| dir = RIGHT; |
| break; |
| case 'w': |
| dir = UP; |
| break; |
| case 's': |
| dir = DOWN; |
| break; |
| case 'x': |
| gameOver = true; |
| break; |
| } |
| } |
| } |
| |
| void algorithm() |
| { |
| int prevX = tailX[0]; |
| int prevY = tailY[0]; |
| int prev2X, prev2Y; |
| tailX[0] = x; |
| tailY[0] = y; |
| |
| for(int i = 1; i < nTail ; i++) |
| { |
| prev2X = tailX[i]; |
| prev2Y = tailY[i]; |
| tailX[i] = prevX; |
| tailY[i] = prevY; |
| prevX = prev2X; |
| prevY = prev2Y; |
| } |
| |
| switch (dir) |
| { |
| case LEFT: |
| x--; |
| break; |
| case RIGHT: |
| x++; |
| break; |
| case UP: |
| y--; |
| break; |
| case DOWN: |
| y++; |
| break; |
| default: |
| break; |
| } |
| if (x >= width) |
| x = 0; else if (x < 0) x = width - 1; |
| if (y >= height) |
| y = 0; else if (y < 0) y = height - 1; |
| |
| for (int i = 0; i < nTail ; i++) |
| if (tailX[i] == x && tailY[i] == y) |
| gameOver = true; |
| |
| if (x == fruitX && y == fruitY) |
| { |
| score += 10; |
| fruitX = rand() % width; |
| fruitY = rand() % height; |
| nTail++; |
| } |
| } |
| |
| int main() |
| { |
| Setup(); |
| while (!gameOver) |
| { |
| Draw(); |
| Input(); |
| algorithm(); |
| } |
| return 0; |
| } |
| """ |
|
|
| C = """ |
| #include <stdio.h> |
| #include <conio.h> |
| #include <windows.h> |
| #include <stdlib.h> |
| |
| #define WIDTH 20 |
| #define HEIGHT 20 |
| #define MAX_SNAKE_SIZE WIDTH *HEIGHT |
| |
| // Model |
| typedef struct { |
| int x, y; |
| } Point; |
| |
| typedef struct { |
| Point body[MAX_SNAKE_SIZE]; |
| int size; |
| Point direction; |
| } Snake; |
| |
| typedef struct { |
| Point position; |
| int isEaten; |
| } Fruit; |
| |
| // View |
| void gotoxy(int x, int y) { |
| COORD coord; |
| coord.X = x; |
| coord.Y = y; |
| SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); |
| } |
| |
| void drawBoard() { |
| int i; |
| for (i = 0; i < WIDTH + 2; i++) { |
| gotoxy(i, 0); |
| printf("#"); |
| gotoxy(i, HEIGHT + 1); |
| printf("#"); |
| } |
| for (i = 0; i < HEIGHT + 2; i++) { |
| gotoxy(0, i); |
| printf("#"); |
| gotoxy(WIDTH + 1, i); |
| printf("#"); |
| } |
| } |
| |
| void drawSnake(Snake* snake) { |
| int i; |
| for (i = 0; i < snake->size; i++) { |
| gotoxy(snake->body[i].x, snake->body[i].y); |
| printf("*"); |
| } |
| } |
| |
| void drawFruit(Fruit* fruit) { |
| gotoxy(fruit->position.x, fruit->position.y); |
| printf("@"); |
| } |
| |
| // Controller |
| void initGame(Snake* snake, Fruit* fruit) { |
| snake->size = 1; |
| snake->body[0].x = WIDTH / 2; |
| snake->body[0].y = HEIGHT / 2; |
| snake->direction.x = 0; |
| snake->direction.y = 1; |
| |
| fruit->position.x = rand() % WIDTH; |
| fruit->position.y = rand() % HEIGHT; |
| fruit->isEaten = 0; |
| } |
| |
| void updateSnake(Snake* snake) { |
| memmove(&snake->body[1], &snake->body[0], sizeof(Point) * (snake->size - 1)); |
| snake->body[0].x += snake->direction.x; |
| snake->body[0].y += snake->direction.y; |
| } |
| |
| void updateFruit(Snake* snake, Fruit* fruit) { |
| if (snake->body[0].x == fruit->position.x && snake->body[0].y == fruit->position.y) { |
| fruit->isEaten = 1; |
| snake->size++; |
| } |
| if (fruit->isEaten) { |
| fruit->position.x = rand() % WIDTH; |
| fruit->position.y = rand() % HEIGHT; |
| fruit->isEaten = 0; |
| } |
| } |
| |
| void updateDirection(Snake* snake, char key) { |
| switch (key) { |
| case 'w': |
| snake->direction.x = 0; |
| snake->direction.y = -1; |
| break; |
| case 's': |
| snake->direction.x = 0; |
| snake->direction.y = 1; |
| break; |
| case 'a': |
| snake->direction.x = -1; |
| snake->direction.y = 0; |
| break; |
| case 'd': |
| snake->direction.x = 1; |
| snake->direction.y = 0; |
| break; |
| } |
| } |
| |
| int isGameOver(Snake* snake) { |
| if (snake->body[0].x <= 0 || snake->body[0].x >= WIDTH || snake->body[0].y <= 0 || snake->body[0].y >= HEIGHT) |
| return 1; |
| int i; |
| for (i = 1; i < snake->size; i++) { |
| if (snake->body[0].x == snake->body[i].x && snake->body[0].y == snake->body[i].y) |
| return 1; |
| } |
| return 0; |
| } |
| |
| int main() { |
| Snake snake; |
| Fruit fruit; |
| char key; |
| |
| initGame(&snake, &fruit); |
| |
| while (1) { |
| drawBoard(); |
| drawSnake(&snake); |
| drawFruit(&fruit); |
| |
| if (_kbhit()) { |
| key = _getch(); |
| updateDirection(&snake, key); |
| } |
| |
| updateSnake(&snake); |
| updateFruit(&snake, &fruit); |
| |
| if (isGameOver(&snake)) { |
| break; |
| } |
| |
| Sleep(100); |
| system("cls"); |
| } |
| |
| printf("Game Over!\n"); |
| |
| return 0; |
| } |
| """ |
|
|