{"id":104,"date":"2026-04-24T13:42:59","date_gmt":"2026-04-24T13:42:59","guid":{"rendered":"https:\/\/theroyalscode.com\/students\/c_menhart\/?p=104"},"modified":"2026-04-24T13:42:59","modified_gmt":"2026-04-24T13:42:59","slug":"4-24","status":"publish","type":"post","link":"https:\/\/theroyalscode.com\/students\/c_menhart\/2026\/04\/24\/4-24\/","title":{"rendered":"4\/24"},"content":{"rendered":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>port java.awt.*;\nimport java.awt.event.*;\nimport java.util.ArrayList;\nimport java.util.Random;\nimport javax.swing.*;\n\npublic class SnakeGame extends JPanel implements ActionListener, KeyListener {\n    private class Tile {\n        int x;\n        int y;\n\n        Tile(int x, int y) {\n            this.x = x;\n            this.y = y;\n        }\n    }  \n\n    int boardWidth;\n    int boardHeight;\n    int tileSize = 25;\n    \n    \/\/snake\n    Tile snakeHead;\n    ArrayList&lt;Tile> snakeBody;\n\n    \/\/food\n    Tile food;\n    Random random;\n\n    \/\/game logic\n    int velocityX;\n    int velocityY;\n    Timer gameLoop;\n\n    boolean gameOver = false;\n\n    SnakeGame(int boardWidth, int boardHeight) {\n        this.boardWidth = boardWidth;\n        this.boardHeight = boardHeight;\n        setPreferredSize(new Dimension(this.boardWidth, this.boardHeight));\n        setBackground(Color.black);\n        addKeyListener(this);\n        setFocusable(true);\n\n        snakeHead = new Tile(5, 5);\n        snakeBody = new ArrayList&lt;Tile>();\n\n        food = new Tile(10, 10);\n        random = new Random();\n        placeFood();\n\n        velocityX = 1;\n        velocityY = 0;\n        \n\t\t\/\/game timer\n\t\tgameLoop = new Timer(100, this); \/\/how long it takes to start timer, milliseconds gone between frames \n        gameLoop.start();\n\t}\t\n    \n    public void paintComponent(Graphics g) {\n\t\tsuper.paintComponent(g);\n\t\tdraw(g);\n\t}\n\n\tpublic void draw(Graphics g) {\n        \/\/Grid Lines\n        for(int i = 0; i &lt; boardWidth\/tileSize; i++) {\n            \/\/(x1, y1, x2, y2)\n            g.drawLine(i*tileSize, 0, i*tileSize, boardHeight);\n            g.drawLine(0, i*tileSize, boardWidth, i*tileSize); \n        }\n\n        \/\/Food\n        g.setColor(Color.red);\n        \/\/ g.fillRect(food.x*tileSize, food.y*tileSize, tileSize, tileSize);\n        g.fill3DRect(food.x*tileSize, food.y*tileSize, tileSize, tileSize, true);\n\n        \/\/Snake Head\n        g.setColor(Color.green);\n        \/\/ g.fillRect(snakeHead.x, snakeHead.y, tileSize, tileSize);\n        \/\/ g.fillRect(snakeHead.x*tileSize, snakeHead.y*tileSize, tileSize, tileSize);\n        g.fill3DRect(snakeHead.x*tileSize, snakeHead.y*tileSize, tileSize, tileSize, true);\n        \n        \/\/Snake Body\n        for (int i = 0; i &lt; snakeBody.size(); i++) {\n            Tile snakePart = snakeBody.get(i);\n            \/\/ g.fillRect(snakePart.x*tileSize, snakePart.y*tileSize, tileSize, tileSize);\n            g.fill3DRect(snakePart.x*tileSize, snakePart.y*tileSize, tileSize, tileSize, true);\n\t\t}\n\n        \/\/Score\n        g.setFont(new Font(\"Arial\", Font.PLAIN, 16));\n        if (gameOver) {\n            g.setColor(Color.red);\n            g.drawString(\"Game Over: \" + String.valueOf(snakeBody.size()), tileSize - 16, tileSize);\n        }\n        else {\n            g.drawString(\"Score: \" + String.valueOf(snakeBody.size()), tileSize - 16, tileSize);\n        }\n\t}\n\n    public void placeFood(){\n        food.x = random.nextInt(boardWidth\/tileSize);\n\t\tfood.y = random.nextInt(boardHeight\/tileSize);\n\t}\n\n    public void move() {\n        \/\/eat food\n        if (collision(snakeHead, food)) {\n            snakeBody.add(new Tile(food.x, food.y));\n            placeFood();\n        }\n\n        \/\/move snake body\n        for (int i = snakeBody.size()-1; i >= 0; i--) {\n            Tile snakePart = snakeBody.get(i);\n            if (i == 0) { \/\/right before the head\n                snakePart.x = snakeHead.x;\n                snakePart.y = snakeHead.y;\n            }\n            else {\n                Tile prevSnakePart = snakeBody.get(i-1);\n                snakePart.x = prevSnakePart.x;\n                snakePart.y = prevSnakePart.y;\n            }\n        }\n        \/\/move snake head\n        snakeHead.x += velocityX;\n        snakeHead.y += velocityY;\n\n        \/\/game over conditions\n        for (int i = 0; i &lt; snakeBody.size(); i++) {\n            Tile snakePart = snakeBody.get(i);\n\n            \/\/collide with snake head\n            if (collision(snakeHead, snakePart)) {\n                gameOver = true;\n            }\n        }\n\n        if (snakeHead.x*tileSize &lt; 0 || snakeHead.x*tileSize > boardWidth || \/\/passed left border or right border\n            snakeHead.y*tileSize &lt; 0 || snakeHead.y*tileSize > boardHeight ) { \/\/passed top border or bottom border\n            gameOver = true;\n        }\n    }\n\n    public boolean collision(Tile tile1, Tile tile2) {\n        return tile1.x == tile2.x &amp;&amp; tile1.y == tile2.y;\n    }\n\n    @Override\n    public void actionPerformed(ActionEvent e) { \/\/called every x milliseconds by gameLoop timer\n        move();\n        repaint();\n        if (gameOver) {\n            gameLoop.stop();\n        }\n    }  \n\n    @Override\n    public void keyPressed(KeyEvent e) {\n        \/\/ System.out.println(\"KeyEvent: \" + e.getKeyCode());\n        if (e.getKeyCode() == KeyEvent.VK_UP &amp;&amp; velocityY != 1) {\n            velocityX = 0;\n            velocityY = -1;\n        }\n        else if (e.getKeyCode() == KeyEvent.VK_DOWN &amp;&amp; velocityY != -1) {\n            velocityX = 0;\n            velocityY = 1;\n        }\n        else if (e.getKeyCode() == KeyEvent.VK_LEFT &amp;&amp; velocityX != 1) {\n            velocityX = -1;\n            velocityY = 0;\n        }\n        else if (e.getKeyCode() == KeyEvent.VK_RIGHT &amp;&amp; velocityX != -1) {\n            velocityX = 1;\n            velocityY = 0;\n        }\n    }\n\n    \/\/not needed\n    @Override\n    public void keyTyped(KeyEvent e) {}\n\n    @Override\n    public void keyReleased(KeyEvent e) {}\n}<\/code><\/pre>\n\n\n\n<p>and for the app.java is <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.swing.*;\n\npublic class App {\n    public static void main(String&#91;] args) throws Exception {\n        int boardWidth = 600;\n        int boardHeight = boardWidth;\n\n        JFrame frame = new JFrame(\"Snake\");\n        frame.setVisible(true);\n\tframe.setSize(boardWidth, boardHeight);\n        frame.setLocationRelativeTo(null);\n        frame.setResizable(false);\n        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n\n        SnakeGame snakeGame = new SnakeGame(boardWidth, boardHeight);\n        frame.add(snakeGame);\n        frame.pack();\n        snakeGame.requestFocus();\n    }\n}<\/code><\/pre>\n\n\n\n<p>Source: <a href=\"https:\/\/www.youtube.com\/watch?v=Y62MJny9LHg\">Code Snake Game in Java<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>and for the app.java is Source: Code Snake Game in Java<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-104","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts\/104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/comments?post=104"}],"version-history":[{"count":1,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts\/104\/revisions"}],"predecessor-version":[{"id":105,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts\/104\/revisions\/105"}],"wp:attachment":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/media?parent=104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/categories?post=104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/tags?post=104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}