📄 ch_4u.~cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ch_4u.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tsg *sg; //Search Game
int g[3][3]={0};
int t=0,v=0,h=0;
int i=-1,j=-1;
int n=0;
bool ok=false;
//---------------------------------------------------------------------------
__fastcall Tsg::Tsg(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall Tsg::startClick(TObject *Sender) //游戏开始
{
t++; //场次累加
g00->Glyph->LoadFromFile("\graph\\empty.BMP");//按钮图案设置为空
g01->Glyph->LoadFromFile("\graph\\empty.BMP");
g02->Glyph->LoadFromFile("\graph\\empty.BMP");
g10->Glyph->LoadFromFile("\graph\\empty.BMP");
g11->Glyph->LoadFromFile("\graph\\empty.BMP");
g12->Glyph->LoadFromFile("\graph\\empty.BMP");
g20->Glyph->LoadFromFile("\graph\\empty.BMP");
g21->Glyph->LoadFromFile("\graph\\empty.BMP");
g22->Glyph->LoadFromFile("\graph\\empty.BMP");
g00->Enabled=true; //九宫按钮功能设为能够使用状态
g01->Enabled=true;
g02->Enabled=true;
g10->Enabled=true;
g11->Enabled=true;
g12->Enabled=true;
g20->Enabled=true;
g21->Enabled=true;
g22->Enabled=true;
tout->Caption="第 "+IntToStr(t)+" 局"; //显示棋局次数
lv->Visible=true;
lvout->Caption=IntToStr(v)+" 场"; //挑战者胜场
start->Enabled=false;
for(int y=0;y<3;y++) //九宫棋数组归零
for(int z=0;z<3;z++)
g[y][z]=0;
//g11->Caption="R"; //计算机先下
g11->Glyph->LoadFromFile("\graph\\computer.BMP");
g11->Enabled=false;
g[1][1]=1; //计算机棋值为1
}
//---------------------------------------------------------------------------
void any() //随机下法
{ //当函数过多时,可点鼠标鼠右键选用ToggleBookmarks功能
int y,z;
do{
randomize(); //随机数的取法
y=random(3); //取0、1、2随机数
z=random(3);
}while(g[y][z]!=0); //若所取值非零则继续取数
g[y][z]=1; //计算机下这一步随机步
if(y==0&&z==0)
{
sg->g00->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g00->Enabled=false;
return;
}
if(y==0&&z==1) //设置九宫按钮属性功能
{
sg->g01->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g01->Enabled=false;
return;
}
if(y==0&&z==2)
{
sg->g02->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g02->Enabled=false;
return;
}
if(y==1&&z==0) //设置九宫按钮属性功能
{
sg->g10->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g10->Enabled=false;
return;
}
if(y==1&&z==1)
{
sg->g11->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g11->Enabled=false;
return;
}
if(y==1&&z==2) //设置九宫按钮属性功能
{
sg->g12->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g12->Enabled=false;
return;
}
if(y==2&&z==0)
{
sg->g20->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g20->Enabled=false;
return;
}
if(y==2&&z==1)
{
sg->g21->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g21->Enabled=false;
return;
}
if(y==2&&z==2) //设置九宫按钮属性功能
{
sg->g22->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g22->Enabled=false;
return;
}
}
//---------------------------------------------------------------------------
void fsh(int n) //第一手应对方法
{
switch(n) //n为用户落棋对应位置
{
case 1: //设定上方为电脑落子处
sg->g01->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g01->Enabled=false; //使该按键停止功能
g[0][1]=1; //将值存入数组
ok=true; //电脑下好了
break;
case 2://设定左方为电脑落子处
sg->g10->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g10->Enabled=false;
g[1][0]=1;
ok=true;
break;
case 3://设定右方为电脑落子处
sg->g12->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g12->Enabled=false;
g[1][2]=1;
ok=true;
break;
case 4://设定上方为电脑落子处
sg->g01->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g01->Enabled=false;
g[0][1]=1;
ok=true;
break;
case 6://设定下方为电脑落子处
sg->g21->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g21->Enabled=false;
g[2][1]=1;
ok=true;
break;
case 7://设定下方为电脑落子处
sg->g21->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g21->Enabled=false;
g[2][1]=1;
ok=true;
break;
case 8://设定右方为电脑落子处
sg->g12->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g12->Enabled=false;
g[1][2]=1;
ok=true;
break;
case 9://设定右方为电脑落子处
sg->g12->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g12->Enabled=false;
g[1][2]=1;
ok=true;
break;
}
}
//------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------
void sch(int n) //第二手应对方法
{
switch(n) //n为用户落棋对应位置
{
case 2:if(g[2][0]==0) //用户落于上方,电脑应左下方
{
sg->g20->Glyph->LoadFromFile("\graph\\computer.BMP"); //设置电脑下棋图形
sg->g20->Enabled=false; //使该按键停止功能
g[2][0]=1; //电脑决策存入数组
ok=true; //电脑下好了
}
break;
case 4:if(g[0][2]==0) //用户落于左方,电脑应右上方
{
sg->g02->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g02->Enabled=false;
g[0][2]=1;
ok=true;
}
break;
case 6:if(g[2][0]==0) //用户落于右方,电脑应左下方
{
sg->g20->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g20->Enabled=false;
g[2][0]=1;
ok=true;
}
break;
case 8:if(g[0][0]==0) //用户落于下方,电脑应左上方
{
sg->g00->Glyph->LoadFromFile("\graph\\computer.BMP");
sg->g00->Enabled=false;
g[0][0]=1;
ok=true;
}
break;
}
}
//------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------
void atk() //攻击决胜
{
if(sg->to2->Enabled==false) //如果挑战者还未被击败
{
if((g[0][0]+g[0][1]+g[0][2])==2) //如果上横线有两点为电脑所据且挑战者无子
{
for(j=0;j<3;j++) //寻找缺空处
{
if(g[0][j]==0)
{
g[0][j]=1; //电脑取得该位址
i=0; //数组索引i值为0(此处i为表单变量专取位址)
return; //找到即跳出
}
}
}
if((g[1][0]+g[1][1]+g[1][2])==2) //如果中横线有两点为电脑所据且挑战者无子
{
for(j=0;j<3;j++)
{
if(g[1][j]==0)
{
g[1][j]=1;
i=1; //数组索引i值为1
return;
}
}
}
if((g[2][0]+g[2][1]+g[2][2])==2) //如果下横线有两点为电脑所据且挑战者无子
{
for(j=0;j<3;j++)
{
if(g[2][j]==0)
{
g[2][j]=1;
i=2; //数组索引i值为2
return;
}
}
}
if((g[0][0]+g[1][0]+g[2][0])==2) //如果左直线有两点为电脑所据且挑战者无子
{
for(i=0;i<3;i++)
{
if(g[i][0]==0)
{
g[i][0]=1;
j=0; //数组索引j值为0
return;
}
}
}
if((g[0][1]+g[1][1]+g[2][1])==2) //如果中直线有两点为电脑所据且挑战者无子
{
for(i=0;i<3;i++) //变量为i
{
if(g[i][1]==0)
{
g[i][1]=1;
j=1;
return;
}
}
}
if((g[0][2]+g[1][2]+g[2][2])==2) //如果右直线有两点为电脑所据且挑战者无子
{
for(i=0;i<3;i++)
{
if(g[i][2]==0) //找到空位
{
g[i][2]=1;
j=2;
return;
}
}
}
if((g[0][0]+g[1][1]+g[2][2])==2) //如果左斜线有两点为电脑所据且挑战者无子
{
for(j=0;j<3;j++)
{
if(g[j][j]==0)
{
g[j][j]=1;
i=j;
return;
}
}
}
if((g[0][2]+g[1][1]+g[2][0])==2) //如果右斜线有两点为电脑所据且挑战者无子
{
if(g[0][2]==0) //空位在右上方
{
g[0][2]=1;
i=0;
j=2;
}
if(g[2][0]==0) //空位在左下方
{
g[2][j]=1;
i=2;
j=0;
}
}
}
}
//------------------------------------------------------------------------------------------------------
void pvt() //电脑防御挑战者取胜
{
if((g[0][0]+g[0][1]+g[0][2])==10) //如果上横线有两点为挑战者所据且电脑无子
{
for(j=0;j<3;j++)
{
if(g[0][j]==0)
{
g[0][j]=1;
i=0;
return;
}
}
}
if((g[1][0]+g[1][1]+g[1][2])==10) //如果中横线有两点为挑战者所据且电脑无子
{
for(j=0;j<3;j++)
{
if(g[1][j]==0)
{
g[1][j]=1;
i=1;
return;
}
}
}
if((g[2][0]+g[2][1]+g[2][2])==10) //如果下横线有两点为挑战者所据且电脑无子
{
for(j=0;j<3;j++)
{
if(g[2][j]==0)
{
g[2][j]=1;
i=2;
return;
}
}
}
if((g[0][0]+g[1][0]+g[2][0])==10) //如果左直线有两点为挑战者所据且电脑无子
{
for(i=0;i<3;i++)
{
if(g[i][0]==0)
{
g[i][0]=1;
j=0;
return;
}
}
}
if((g[0][1]+g[1][1]+g[2][1])==10) //如果中直线有两点为挑战者所据且电脑无子
{
for(i=0;i<3;i++)
{
if(g[i][1]==0)
{
g[i][1]=1;
j=1;
return;
}
}
}
if((g[0][2]+g[1][2]+g[2][2])==10) //如果右直线有两点为挑战者所据且电脑无子
{
for(i=0;i<3;i++)
{
if(g[i][2]==0)
{
g[i][2]=1;
j=2;
return;
}
}
}
if((g[0][0]+g[1][1]+g[2][2])==10) //如果左斜线有两点为挑战者所据且电脑无子
{
for(j=0;j<3;j++)
{
if(g[j][j]==0)
{
g[j][j]=1;
i=j;
return;
}
}
}
if((g[0][2]+g[1][1]+g[2][0])==10) //如果右斜线有两点为挑战者所据且电脑无子
{
if(g[0][2]==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -