{"id":11642,"date":"2020-10-02T21:07:16","date_gmt":"2020-10-03T03:07:16","guid":{"rendered":"https:\/\/sanuja.com\/blog\/?p=11642"},"modified":"2020-10-03T20:46:30","modified_gmt":"2020-10-04T02:46:30","slug":"tic-tac-toe-game-in-java","status":"publish","type":"post","link":"https:\/\/sanuja.com\/blog\/tic-tac-toe-game-in-java","title":{"rendered":"Tic Tac Toe game in Java"},"content":{"rendered":"<p>This is an example of using nested while loops, char arrays and if statements. Please note this is <b>based on tutorial by <a href=\"https:\/\/www.youtube.com\/channel\/UC_fFL5jgoCOrwAVoM_fBYwA\" target=\"_blank\" rel=\"noopener noreferrer\">Alex Lee<\/a><\/b>. However, a modification was made to the code to remove a bug. The original code by the author would allow the player to place the position on top of the CPU position. Please subscribe to Alex&#8217;s YouTube channel and support him.<\/p>\n<p><!--more--><br \/>\n<iframe width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/gQb3dE-y1S4\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><br \/>\n<div class=\"alert alert-warning\" role=\"alert\"><p class=\"printonly\"><strong>Warning!<\/strong><\/p> Please import selected Java packages or use <em>import java.util.*;<\/em>. Do not copy the following code as per copyright and plagiarism regulations. This Java code is provided as it is for demonstration purposes.<\/div><\/p>\n<p><b>Complete code<\/b><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npublic class TicTacToe {    \r\n    static ArrayList&lt;Integer&gt; playerPositions = new ArrayList&lt;Integer&gt;();    \r\n    static ArrayList&lt;Integer&gt; cpuPositions = new ArrayList&lt;Integer&gt;();\r\n    \r\n    public static void main (String &#x5B;] args) {\r\n        \/\/ Create a Scanner object attached to the keyboard\r\n        Scanner scan = new Scanner (System.in);\r\n        \/\/ Gameboard print\r\n        char&#x5B;]&#x5B;] gameBoard = {\r\n                    {' ', '|', ' ', '|', ' '}, \r\n                    {'-', '+', '-', '+', '-'},\r\n                    {' ', '|', ' ', '|', ' '},\r\n                    {'-', '+', '-', '+', '-'},\r\n                    {' ', '|', ' ', '|', ' '}};\r\n        \r\n        printGameBoard(gameBoard);\r\n        \r\n        \/\/User input requests\r\n        while(true) {\r\n            System.out.println(&quot;Enter your placement (1-9):&quot;);\r\n            int playerPos = scan.nextInt();\r\n            while(playerPositions.contains(playerPos) || cpuPositions.contains(playerPositions) || cpuPositions.contains(playerPos)){\r\n                System.out.println(&quot;Position taken! Enter another position:&quot;);\r\n                playerPos = scan.nextInt();\r\n                \/\/Prevent user from printing on top of CPU\r\n                while(playerPositions.contains(playerPos) || cpuPositions.contains(playerPos)){\r\n                    System.out.println(&quot;Position taken! Enter another position:&quot;);\r\n                    playerPos= scan.nextInt();\r\n                }\r\n            }\r\n        \r\n            placePiece(gameBoard, playerPos, &quot;player&quot;);\r\n            \r\n            String result = checkWinner();\r\n            if(result.length() &gt; 0) {\r\n                System.out.println(result);\r\n                break;            \r\n            }\r\n            \/\/CPU random positions\r\n            Random rand = new Random();\r\n            int cpuPos = rand.nextInt(9) + 1;\r\n            while(playerPositions.contains(cpuPos) || cpuPositions.contains(cpuPos)){\r\n                cpuPos = rand.nextInt(9) + 1;\r\n            }\r\n            \r\n            placePiece(gameBoard, cpuPos, &quot;cpu&quot;);\r\n        \r\n            printGameBoard(gameBoard);\r\n            \r\n            result = checkWinner();\r\n            if(result.length() &gt; 0){\r\n                System.out.println(result);\r\n                break;\r\n            }\r\n        }\r\n\r\n          }\r\n    public static void placePiece(char&#x5B;]&#x5B;] gameBoard, int pos, String user){\r\n        \r\n        char symbol = ' ';\r\n        \r\n        if(user.equals(&quot;player&quot;)){\r\n            symbol = 'X';\r\n            playerPositions.add(pos);\r\n        } else if(user.equals(&quot;cpu&quot;)){\r\n            symbol = 'O';\r\n            cpuPositions.add(pos);\r\n        }\r\n\r\n        switch(pos){\r\n            case 1:\r\n                gameBoard&#x5B;0]&#x5B;0] = symbol;\r\n                break;\r\n            case 2:\r\n                gameBoard&#x5B;0]&#x5B;2] = symbol;\r\n                break;\r\n            case 3:\r\n                gameBoard&#x5B;0]&#x5B;4] = symbol;\r\n                break;\r\n            case 4:\r\n                gameBoard&#x5B;2]&#x5B;0] = symbol;\r\n                break;\r\n            case 5:\r\n                gameBoard&#x5B;2]&#x5B;2] = symbol;\r\n                break;\r\n            case 6:\r\n                gameBoard&#x5B;2]&#x5B;4] = symbol;\r\n                break;\r\n            case 7:\r\n                gameBoard&#x5B;4]&#x5B;0] = symbol;\r\n                break;\r\n            case 8:\r\n                gameBoard&#x5B;4]&#x5B;2] = symbol;\r\n                break;\r\n            case 9:\r\n                gameBoard&#x5B;4]&#x5B;4] = symbol;\r\n                break;                          \r\n            default:\r\n                break;\r\n        }\r\n    }\r\n    public static String checkWinner(){        \r\n        List topRow = Arrays.asList(1, 2, 3);\r\n        List midRow = Arrays.asList(4, 5, 6);\r\n        List botRow = Arrays.asList(7, 8, 9);\r\n        List leftCol = Arrays.asList(1, 4, 7);\r\n        List midCol = Arrays.asList(2, 5, 8);\r\n        List rightCol = Arrays.asList(3, 6, 9);\r\n        List cross1 = Arrays.asList(1, 5, 9);\r\n        List cross2 = Arrays.asList(7, 5, 3);\r\n        \r\n        List&lt;List&gt; winning = new ArrayList&lt;List&gt;();\r\n        winning.add(topRow);\r\n        winning.add(midRow);\r\n        winning.add(botRow);\r\n        winning.add(leftCol);\r\n        winning.add(midCol);\r\n        winning.add(rightCol);\r\n        winning.add(cross1);\r\n        winning.add(cross2);\r\n        \r\n        for(List l : winning){\r\n            if(playerPositions.containsAll(l)){\r\n                return &quot;Congraduations you won!&quot;;\r\n            } else if(cpuPositions.containsAll(l)){\r\n                return &quot;CPU wins! Sorry!&quot;;\r\n            } else if(playerPositions.size() + cpuPositions.size() == 9){\r\n                return &quot;We are tied!&quot;;\r\n            }\r\n        }\r\n        \r\n        return &quot;&quot;;       \r\n    }\r\n    public static void printGameBoard (char &#x5B;]&#x5B;] gameBoard){ \r\n        for(char&#x5B;] row : gameBoard) {\r\n            for(char c : row) {\r\n                System.out.print(c);              \r\n            }\r\n            System.out.println();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p><b>Modification:<\/b> The following code was modified from the original code to prevent the user from entering a position on top of the CPU position. The modification is inside the user input while loop.<\/p>\n<pre class=\"brush: java; highlight: [1,5,6,7,8]; title: ; notranslate\" title=\"\">\r\n            while(playerPositions.contains(playerPos) || cpuPositions.contains(playerPositions) || cpuPositions.contains(playerPos)){\r\n                System.out.println(&quot;Position taken! Enter another position:&quot;);\r\n                playerPos = scan.nextInt();\r\n                \/\/Prevent user from printing on top of CPU\r\n                while(playerPositions.contains(playerPos) || cpuPositions.contains(playerPos)){\r\n                    System.out.println(&quot;Position taken! Enter another position:&quot;);\r\n                    playerPos= scan.nextInt();\r\n                }\r\n            }\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>This is an example of using nested while loops, char arrays and if statements. Please note this is based on tutorial by Alex Lee. However, a modification was made to the code to remove a bug. The original code by the author would allow the player to place the position on top of the CPU &hellip; <a href=\"https:\/\/sanuja.com\/blog\/tic-tac-toe-game-in-java\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Tic Tac Toe game in Java<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11646,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[48],"class_list":["post-11642","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-computer-science","tag-java"],"jetpack_featured_media_url":"https:\/\/sanuja.com\/blog\/wp-content\/uploads\/2020\/10\/java_code_tictactoe.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/posts\/11642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/comments?post=11642"}],"version-history":[{"count":0,"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/posts\/11642\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/media\/11646"}],"wp:attachment":[{"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/media?parent=11642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/categories?post=11642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sanuja.com\/blog\/wp-json\/wp\/v2\/tags?post=11642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}