一、 Processing简介
Processing 在 2001 年诞生于麻省理工学院(MIT)的媒体实验室,主创者为 Ben Fry 和 Casey Reas,项目发起的初衷,本是为了满足他们自身的教学和学习需要。后来,当Casey在意大利的伊夫雷亚交互设计学院(Interaction Design Institute Ivrea)进行教学的时候,基于Processing,衍生出了Wiring和Arduino项目。随着时间的推移,又诞生了多个语言的版本,比如基于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;
}
三、实现效果
欢迎发表意见!!!