java tictactoe_一个井字棋tictactoe游戏的java实现 | Soo Smart!-程序员宅基地

技术标签: java tictactoe  

这是一个井字棋游戏的java实现。摘录于stackoverflow。

游戏规则很简单,只要一方棋子在水平线,垂直线或者对角线任意一条线上排列成功即为获胜。

作者原先的代码存在着一些问题:

代码如下:

一共有几个类: play, player, human, computer, set

Play类:

import java.util.Scanner;

public class play {

public static void main(String[] args) {

System.out.println("Welcome to Tickle Tackle Toe!!! :D");

System.out.println();

//creat markers

String marker1 = "x";

String marker2 = "o";

boolean playAgain = true;

Scanner s = new Scanner(System.in);

//create player objects

Human human = new Human();

Computer computer = new Computer();

while(playAgain){

//run board setup

set Setup = new set();

Setup.createBoard();

Setup.printBoard();

System.out.println("please choose your marker");

System.out.println("type 1 for 'x' or 2 for 'o'");

//set markers

if(s.nextInt() == 1){

// create player objects

human.setMarker("x");

computer.setMarker("o");

}

else

{

human.setMarker("o");

computer.setMarker("x");

}

// determine who goes first

int first = (int) (Math.random() * 2);

boolean won = false;

int turns = 0;

if(first == 0){

System.out.println("You go first!");

System.out.println();

while(!won){

human.takeTurn(Setup.getBoard());

turns++;

Setup.printBoard();

if(Setup.hasWon(Setup.getBoard())){

won = true;

System.out.println("Congrats you won!");

}

if(turns == 9){

won = true;

System.out.println("Its a draw!");

break;

}

if(!won){

computer.takeTurn(Setup.getBoard(), human);

turns++;

System.out.println();

Setup.printBoard();

System.out.println();

if(Setup.hasWon(Setup.getBoard())){

won = true;

System.out.println("You lost!");

}

if(turns == 9){

won = true;

System.out.println("Its a draw!");

break;

}

}

} // close while 1

}

else {

System.out.println("Computer goes first!");

System.out.println();

while(!won){

computer.takeTurn(Setup.getBoard(), human);

turns++;

Setup.printBoard();

if(Setup.hasWon(Setup.getBoard())){

won = true;

System.out.println("You lost!");

}

if(!won){

human.takeTurn(Setup.getBoard());

turns++;

System.out.println();

Setup.printBoard();

System.out.println();

if(Setup.hasWon(Setup.getBoard())){

won = true;

System.out.println("Congrats you won!");

}

}

} // close while 2

}

System.out.println("Would you like to play again? Type 1 for yes or 2 to quit");

System.out.println();

if(s.nextInt() == 2){

playAgain = false;

}

}

}

}

Player类

public class player {

public String Marker;

// set marker method

public void setMarker(String marker){

Marker = marker;

}

//get marker method

public String getMarker(){

return Marker;

}

}

棋局Set类:

import java.util.Random;

import java.util.Scanner;

public class set {

// setup variables default board size and board

private int N = 3;

public String[][] board = new String [N][N];

public boolean hasWon (String [] [] board){

//horizontal

for(int i = 0; i<3; i++){

if(board[i][0].equals(board[i][1]) && board[i][1].equals(board[i][2])){

return true;

}

}

//vertical

for(int i = 0; i<3; i++){

if(board [0][i].equals(board[1][i]) && board[1][i].equals(board[2][i])){

return true;

}

}

//diagonal

if(board[0][0].equals(board[1][1]) && board[1][1].equals(board[2][2]) || board[2][0].equals(board[1][1]) && board[1][1].equals(board[0][2]))

return true;

return false;

}

int x = 1;

public void createBoard(){

for(int i = 0; i < board.length; i++){

for(int j = 0; j < board.length; j++){

board[i][j] = "" + (x);

x++;

}

}

}

public void printBoard(){

for(int i = 0; i < board.length; i++){

for(int j = 0; j < board.length; j++){

System.out.print("[" + board[i][j] + "]" + " ");

}

System.out.println();

}

}

public String[][] getBoard(){

return board;

}

}

Computer类

class Computer extends player {

public Computer(){

}

int boardsize = 3;

public void takeTurn(String[][] board, Human human) {

int vertical = 0;

int horizontal = 0;

int diagonal = 0;

boolean mademove = false;

// check if you can take a win horizontally

for(int i = 0; i<3; i++){

if(board[0][i].equals(board[1][i]) && board[0][i].equals(Marker)){

if(board[2][i] != human.getMarker()){

board[2][i] = Marker;

mademove = true;

return;

}

}

}

for(int i = 0; i<3; i++){

if(board[2][i].equals(board[1][i]) && board[2][i].equals(Marker)){

if(board[0][i] != human.getMarker()){

board[0][i] = Marker;

mademove = true;

return;

}

}

}

// check if you can take a win vertically

for(int i = 0; i<3; i++){

if(board[i][0].equals(board[i][1]) && board[i][0].equals(Marker)){

if(board[i][2] != human.getMarker()){

board[i][2] = Marker;

mademove = true;

return;

}

}

}

for(int i = 0; i<3; i++){

if(board[i][2].equals(board[i][1]) && board[i][2].equals(Marker)){

if(board[i][0] != human.getMarker()){

board[i][0] = Marker;

mademove = true;

return;

}

}

}

// check if you can take a win diagonally

if(board[0][0].equals(board[1][1]) && board[0][0].equals(Marker)){

if(board[2][2] != human.getMarker()){

board[2][2] = Marker;

mademove = true;

return;

}

}

if(board[2][2].equals(board[1][1]) && board[2][2].equals(Marker)){

if(board[0][0] != human.getMarker()){

board[0][0] = Marker;

mademove = true;

return;

}

}

if(board[0][0].equals(board[1][1]) && board[0][0].equals(Marker)){

if(board[2][2] != human.getMarker()){

board[2][2] = Marker;

mademove = true;

return;

}

}

if(board[0][2].equals(board[1][1]) && board[0][2].equals(Marker)){

if(board[2][0] != human.getMarker()){

board[2][0] = Marker;

mademove = true;

return;

}

}

if(board[2][0].equals(board[1][1]) && board[2][0].equals(Marker)){

if(board[0][2] != human.getMarker()){

board[0][2] = Marker;

mademove = true;

return;

}

}

// BLOCKS!!!! //

// check if you can block a win horizontally

for(int i = 0; i<3; i++){

if(board[0][i].equals(board[1][i]) && board[0][i].equals(human.getMarker())){

if(board[2][i] != Marker){

board[2][i] = Marker;

mademove = true;

return;

}

}

}

for(int i = 0; i<3; i++){

if(board[2][i].equals(board[1][i]) && board[0][i].equals(human.getMarker())){

if(board[0][i] != Marker){

board[0][i] = Marker;

mademove = true;

return;

}

}

}

// check if you can block a win horizontally

for(int i = 0; i<3; i++){

if(board[i][0].equals(board[i][1]) && board[i][0].equals(human.getMarker())){

if(board[i][2] != Marker){

board[i][2] = Marker;

mademove = true;

return;

}

}

}

for(int i = 0; i<3; i++){

if(board[i][2].equals(board[i][1]) && board[i][2].equals(human.getMarker())){

if(board[i][0] != Marker){

board[i][0] = Marker;

mademove = true;

return;

}

}

}

// check if you can block a win diagonally

if(board[0][0].equals(board[1][1]) && board[0][0].equals(human.getMarker())){

if(board[2][2] != Marker){

board[2][2] = Marker;

mademove = true;

return;

}

}

if(board[2][2].equals(board[1][1]) && board[2][2].equals(human.getMarker())){

if(board[0][0] != Marker){

board[0][0] = Marker;

mademove = true;

return;

}

}

if(board[0][0].equals(board[1][1]) && board[0][0].equals(human.getMarker())){

board[2][2] = Marker;

mademove = true;

return;

}

if(board[0][2].equals(board[1][1]) && board[0][2].equals(human.getMarker())){

if(board[2][0] != Marker){

board[2][0] = Marker;

mademove = true;

return;

}

}

if(board[2][0].equals(board[1][1]) && board[2][0].equals(human.getMarker())){

if(board[0][2] != Marker){

board[0][2] = Marker;

mademove = true;

return;

}

}

// make random move if above rules dont apply

for(int i = 0; i<3; i++){

if(board[i][0] != "x" && board[i][0] != "o"){

board[i][0] = Marker;

return;

}

}

for(int i = 0; i<3; i++){

if(board[i][1] != "x" && board[i][0] != "o"){

board[i][1] = Marker;

return;

}

}

for(int i = 0; i<3; i++){

if(board[i][2] != "x" && board[i][0] != "o"){

board[i][2] = Marker;

return;

}

}

}

}

Human类

import java.util.Scanner;

class Human extends player {

public Human(){

}

public void takeTurn(String[][] board) {

Scanner s = new Scanner(System.in);

boolean turn = true;

while(turn){

System.out.println("please enter row");

int row = s.nextInt();

System.out.println("please enter col");

int col = s.nextInt();

System.out.print("you entered "+row+" "+col);

System.out.println();

if(board[row - 1][col - 1] != "x" && board[row - 1][col - 1] != "o"){

board[row - 1][col - 1] = Marker;

turn = false;

} // closes if

else {

System.out.println("Already Marker here! please guess again!");

}

} // ends while

} // ends method

} // ends class

这段代码需要进一步调试。摘录此仅供参考。

原文出处:https://stackoverflow.com/questions/10645381/tictactoe-ai-java

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39929595/article/details/114561311

智能推荐

全卷积网络 Fully Convolutional Networks-程序员宅基地

文章浏览阅读1.1w次,点赞9次,收藏45次。CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题。神经网络大神Jonathan Long发表了《Fully Convolutional Networks for Semantic Segmentation》在图像语义分割挖了一个坑,于是无穷无尽的人往坑里面跳。全卷积网络 Fully Convolutional Networks_fully convolutional networks

签证上的mult是什么意思_申根签证中mult是什么意思-程序员宅基地

文章浏览阅读789次。展开全部申根签证中mult是是多次的意思,指可以在有效期内多次往返申根国家。类型申根签证分62616964757a686964616fe78988e69d8331333431373939为入境和过境两类。1.入境签证有一次入境和多次入境两种。签证持有者分别可一次连续停留90天或每半年多次累计不超过3个月。如需长期停留,可向某一成员国申请只在该国使用的国别签证;2.过境签证指过境前往协定国以外国家的..._mult是什么意思?

webpack 配置_webpack设置 require-程序员宅基地

文章浏览阅读602次。corejs处理,在项目根目录下的 babel.config.js 文件配置。webpack.config.js文件。babel.config.js文件。记录学习 webpack 的过程。.eslintrc.js 文件。_webpack设置 require

Vue组件详解-程序员宅基地

文章浏览阅读454次。文章目录什么是组件?模块化与组件化组件定义命名规则创建组件的方式方式一方式二方式三组件的唯一性什么是组件?什么是组件:组件的出现,就是为了拆分vue实例的代码里的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可模块化与组件化名称概念模块化是从代码逻辑角度进行划分的;方便代码的分层开发,保证每个功能模块的职能单一组件化是从UI界面的角度进行划分的;前端的组件化,方便UI组件重用组件定义命名规则推荐全小写,然后

图像分类篇——使用pytorch搭建ResNet网络_resnet实战:使用resnet实现图像分类(pytorch)-程序员宅基地

文章浏览阅读2.7k次,点赞6次,收藏40次。目录1. ResNet网络详解1.1 ResNet网络概述1.2 Batch Normalization1.3 residual结构1.4 ResNet结构和详细参数1.5 迁移学习2. Pytorch搭建本文为学习记录和备忘录,对代码进行了详细注释,以供学习。内容来源:★github:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing★b站:https://space.bilibili.com/18161609/chan_resnet实战:使用resnet实现图像分类(pytorch)

Beautiful Soup之find()和find_all()的基本使用_soup.find_all-程序员宅基地

文章浏览阅读1w次,点赞17次,收藏66次。1.HTML文本这里以官方文档提供的html代码来演示Beautiful Soup中find_all()和find()的基本使用。<html><head><title>The Dormouse's story</title></head><body><p class="title"><b>The Dormouse's story</b></p><p class="stor_soup.find_all

随便推点

for input String "id"错误解决_for input string: "id-程序员宅基地

文章浏览阅读1.3w次。出现这个问题,Idea报错说明是 类型转换错误,可是之前这么做事没错的,类似于我就是这么展示在jsp页面上的,这次居然报类型转换错误,Google了一圈之后,发现不应该这么写,应该用数组下标去获取值。类似下面这种。这里面的下标顺序就是数据库当中对应的显示顺序。比如id是第一位,那么要想取到id,数组下标就是0,依次类推。..._for input string: "id

python heapq 优先队列数组内部不单调递增,但是单独一个个出队列单调递增_python heapq 维护单调-程序员宅基地

文章浏览阅读65次。在使用heapq的优先队列时,发现了标题中的现象,一度怀疑优先队列出错了。总之,使用heapq访问q[0]后面的内容时要注意。具体原因没有深究,有知道的大佬可以指点指点。_python heapq 维护单调

phpStudy环境安装SSL证书教程(apache)-程序员宅基地

文章浏览阅读85次。https://cloud.tencent.com/product/ssl此链接是检测域名 证书的可以检测一下下面是证书配置 小白呢亲测作为PHP程序员,我们一定要学会使用phpStudy环境集成包,PHPstudy用起来方便,快捷,对于刚入门的PHP初学者来说phpStudy是个好东西,我本文我们就和大家分享一下phpStudy环境如何安装SSL证书。第一步:修改apache目录..._d:/phpstudy/apache/conf/ssl/ca.key do not match

Python之小词典应用-程序员宅基地

文章浏览阅读5.9k次,点赞5次,收藏41次。Python之小词典应用这个学期专业开了python课,最后老师布置了一个作业:用python制作一个英语小词典的应用,遂做了一下。题目要求:制作英文学习词典。编写程序制作英文学习词典,词典有三个基本功能:添加、查询、和退出。程序读取源文件路径下的txt格式词典文件,若没有就创建一个。词典文件存储格式为“英文单词 中文单词”,每行仅有一对中英释义。程序会根据用户的选择进入相应的功能...

【轮式平衡机器人】——TMS320F28069片内外设之Timer_IT(补:CCS程序烧录方法)_机器人人烧录程序调试过程-程序员宅基地

文章浏览阅读1.1k次,点赞27次,收藏24次。TMS320F28069 的定时器中断功能。在微控制器或数字信号控制器中,定时器是一个非常重要的外设,它可以用来产生固定时间间隔的中断,或者用来精确计算时间。_机器人人烧录程序调试过程

计算机输入法无法启动,Win7系统开机后输入法总是消失如何解决-程序员宅基地

文章浏览阅读1.2k次。输入法是我们在使用电脑的时候经常会用来输入文字的工具,一般在开机的时候都会自动启动并在任务栏右下角显示,可是有不少win7系统用户却遇到开机后输入法总是消失的情况,要怎么解决呢?现在为大家带来Win7系统开机后输入法总是消失的详细解决步骤。1、在win7系统中点击“开始”--“运行”输入--regedit,打开“注册表编辑器”,找到“HKEY_USERS\.DEFAULT\ControlPanel..._开机输入法消失

推荐文章

热门文章

相关标签