使用Processing实现井字棋

一、 Processing简介

Processing 在 2001 年诞生于麻省理工学院(MIT)的媒体实验室,主创者为 Ben Fry 和 Casey Reas,项目发起的初衷,本是为了满足他们自身的教学和学习需要。后来,当Casey在意大利的伊夫雷亚交互设计学院(Interaction Design Institute Ivrea)进行教学的时候,基于Processing,衍生出了WiringArduino项目。随着时间的推移,又诞生了多个语言的版本,比如基于JavaScript的Processing.js,还有基于Python、Ruby、ActionScript以及Scala等版本。而当前的Processing,成立了相应的基金会,由基金会负责软件的开发和维护工作。

二、井字棋功能实现

井字棋逻辑十分简单,就是横、竖、斜三个方向凑齐三个棋子就获得胜利。

1、绘制棋盘

2、实现鼠标点击绘制棋子

3、根据flag值,判断游戏胜负

4、展示每局游戏情况。

由于逻辑十分简单,所以直接上代码。

int maps[][] = new int[][]{{0,0,0},{0,0,0},{0,0,0}};//井字棋
int ClickedNum=0;//有效点击次数
int flag=0;//状态
int red=0;//红方获胜局数
int green=0;//绿方获胜局数
int tie;//平局局数
int mark=0;
PFont font;
void setup()
{
  size(800,800);
  background(255,255,255);
  //smooth(8);
  surface.setResizable(true);//手动调节窗口大小
  pixelDensity(displayDensity());//高分辨率时自动调节
  font = createFont("黑体",12);
}

void init()//初始化
{
  if(flag == 1)//flag=1,红方胜利;flag=2,绿方胜利;flag=3,平局
    red++;
  else if(flag == 2) 
    green++;
  else if(flag == 3)
    tie++;
  flag=0;
  mark++;
  if(mark%2==1)
    ClickedNum=1;
  else
    ClickedNum=0;
  for(int i=0;i<3;i++)
    for(int j=0;j<3;j++)
       maps[i][j]=0; 
}

void draw()
{
  background(255,255,255);
  DrawLine();
  DrawChess();
  GameResult();
}

void DrawLine()
{
  if(mark % 2 == 0)
  {
    fill(255,0,0);
    textFont(font,20);
    textAlign(CENTER);
    text("红方先",740,80);
    noFill();
   }
   else
   {
     fill(0,255,0);
      textFont(font,20);
      textAlign(CENTER);
      text("绿方先",740,80);
      noFill();
   }
  stroke(0,0,0);
  strokeWeight(5);
  line(150,200,600,200);//划四根井字棋的线条
  line(150,350,600,350);
  line(300,50,300,500);
  line(450,50,450,500);
  fill(255,0,0);
  textFont(font,20);
  textAlign(CENTER);
  text("红方:"+red,740,20);
  noFill();
  fill(0,255,0);
  textFont(font,20);
  textAlign(CENTER);
  text("绿方:"+green,740,40);
  noFill();
  fill(0,0,0);
  textFont(font,20);
  textAlign(CENTER);
  text("平局:"+tie,740,60);
  noFill();
  if(flag > 0)
  {
    stroke(255,255,255);
    fill(255,0,0);
    rect(330,560,100,30);
    noFill();
    fill(255,255,255);
    textFont(font,20);
    textAlign(CENTER);
    text("继续游戏",380,582);
    noFill();
  }
}

void mouseClicked()
{
  if(flag<=0)
  {
    int x=(mouseX-150)/150;
    int y=(mouseY-50)/150;
    if(x<3 && y<3){
      if(ClickedNum%2 == 0 && maps[x][y] == 0)
      {
        ClickedNum++;
        maps[x][y]=1;
      }
      else if(ClickedNum%2 == 1 && maps[x][y] == 0)
      {
        ClickedNum++;
        maps[x][y]=2;
      } 
    }
  }else if(flag>0)
  {
    if(mouseX>= 330 && mouseX <= 430 && mouseY >= 560 && mouseY <= 590)
       init();
  }
}

void DrawChess()
{
  for(int i=0;i<3;i++)
  {
    for(int j=0;j<3;j++)
    {
      if(maps[i][j]==1)
      {//红画圈圈  
        stroke(255,0,0);
        ellipse(225+150*i,125+150*j,100,100);
        noFill();
      }else if(maps[i][j]==2){
        //画绿方块
         stroke(0,255,0);
         rect(175+150*i,75+150*j,100,100);
         noFill();
      }
    }
  }
}

void GameResult()//判断游戏结果  flag=1,红方胜利,flag=2,绿方胜利,flag=3,平局
{
  flag=JudgeResult();
  if(flag==-1 && ((ClickedNum > 9 && (mark%2 == 1)) || (ClickedNum == 9 && mark%2 == 0)))
  {
    flag=3;
    fill(0,0,0);
    textFont(font,20);
    textAlign(CENTER);
    text("游戏结束,平局!",380,550);
    noFill();
  }
  else if(flag == 1)
  {
    fill(255,0,0);
    textFont(font,20);
    textAlign(CENTER);
    text("游戏结束,红方胜利!",380,550);
    noFill();
  }
  else if(flag == 2)
  {
    fill(0,255,0);
    textFont(font,20);
    textAlign(CENTER);
    text("游戏结束,绿方胜利!",380,550);
    noFill();
  }
}

int JudgeResult()
{
  for(int i=0;i<3;i++)//横
  {
    if(maps[i][0] == maps[i][1] && maps[i][1] == maps[i][2])
      return maps[i][0];
  }
  for(int j=0;j<3;j++)//列
  {
    if(maps[0][j] == maps[1][j] && maps[1][j] == maps[2][j])
      return maps[0][j];
  }
  if(maps[0][0] == maps[1][1] && maps[1][1] == maps[2][2])
    return maps[0][0];
  if(maps[0][2] == maps[1][1] && maps[1][1] == maps[2][0])
    return maps[0][2];
   return -1;
}

三、实现效果

欢迎发表意见!!!

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值