axsoft
版主
發表:681 回覆:1056 積分:969 註冊:2002-03-13
發送簡訊給我
|
無敵井字遊戲 資料來源:http://neuron.et.ntust.edu.tw/homework/89/PL/89homework#1/A8902123/C .htm //---------------------------------------------------------------------------
// 程式名稱:無敵井字遊戲(目前為止)
// 開發環境:Borland C Builder 4.0 (Professional)
// 作業系統:Windows 95,98,2000,NT40
// 設 計 者:蘇坤明 (Allen or Su Kwan-Ming.)
// 伊 媚 兒:allen@xsun.com.tw
// 網站位址:http://www.xsun.com.tw
//
// 我是很支持OpenSource的作法,所以我寫的程式都會儘量公開原始程式
// 2000/8月份,我的第三套遊戲【超級比一比~絕色經典】預計上市
// 同時也會公開原始程式、工具軟體及出版此遊戲的製作說明書
// 歡迎對遊戲程式設計有興趣的玩家,踴躍上網訂購(預計8月初開放)(粉便宜哦!^-^)
// 請多多上我的網站,陸續會有很多好東西公開哦!!
// 願與大家一同成長! Allen. 2000/05/22.
//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
//
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm" TForm1 *Form1;
const int CCBox[48]={// -|\/連線,其餘二格的座標位移
-2, 0,-1, 0,-1, 0, 1, 0, 1, 0, 2, 0, 0,-1, 0,-2, 0,-1, 0, 1, 0, 1, 0, 2,
1, 1, 2, 2,-1,-1, 1, 1,-1,-1,-2,-2, 1,-1, 2,-2,-1, 1, 1,-1,-1, 1,-2, 2};
//---------------------------------------------------------------------------
// 建構者
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//初始亂數
srand(GetTickCount());
while( int(GetTickCount()%5) != int(random(100)%5) );
}
//---------------------------------------------------------------------------
// 建立時
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//建立9格按鈕
for(int y=0;y<3;y )
for(int x=0;x<3;x )
{
SB[y*3 x]=new TSpeedButton(Panel1);
SB[y*3 x]->Parent=Panel1;
SB[y*3 x]->Left=x*64 8;
SB[y*3 x]->Top =y*64 8;
SB[y*3 x]->Width =56;
SB[y*3 x]->Height=56;
SB[y*3 x]->SBClick;
} //初始分數
iHumanScore=0;
iComputerScore=0;
iSameScore=0; //建立新局
SpeedButton1Click( SpeedButton1 );
}
//---------------------------------------------------------------------------
// 移除時
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
for(int i=0; i<9; i ) delete SB[i];
}
//---------------------------------------------------------------------------
// 玩家下棋動作
//---------------------------------------------------------------------------
void __fastcall TForm1::SBClick(TObject *Sender)
{
//本局已結束
if( iGameState==2 )
{
MessageBox(Handle,"本局已結束,請重開新局!","提示!",MB_OK|MB_ICONINFORMATION);
return;
} //若不是空位
if( ((TSpeedButton *)Sender)->Caption!="" )
{
MessageBox(Handle,"此位不是空位!","提示!",MB_OK|MB_ICONINFORMATION);
return;
} //空位則玩家可下
((TSpeedButton *)Sender)->Caption="O";
((TSpeedButton *)Sender)->Refresh(); if( CheckResult() ) return;//已有結果,電腦不必下,返回 ComputerAI();
if( CheckResult()==false ) //若未有結果,請玩家下
Panel2->Caption="請人類下"; }
//---------------------------------------------------------------------------
// 重開新局
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
for(int i=0; i<9; i ) SB[i]->Caption="";
iGameState=random(100)%2;//以亂數決定誰先下
ShowInfo();
if( iGameState==1 )//電腦先下
{
ComputerAI();
Panel2->Caption="請人類下";
}
}
//---------------------------------------------------------------------------
// 電腦人工智慧
//---------------------------------------------------------------------------
void __fastcall TForm1::ComputerAI(void)
{
int i,j,x,y,max;
int ccvalue[9];
int sameidx[9],samecount;
AnsiString s; //電腦思考中
Panel2->Caption="電腦思考中";
for(i=0;i<10;i )
{
Panel2->Caption=Panel2->Caption ".";
Sleep(60);
Panel2->Refresh();
} //特殊情形,依經驗法則來下
s="";
for(i=0;i<9;i ) s =( SB[i]->Caption=="" ) ? AnsiString(".") : SB[i]->Caption;
if( s=="O...X...O" || s=="..O.X.O.." )
{
i=random(4)*2 1;
SB[i]->Caption="X";
SB[i]->Refresh();
return;
} //權值歸0
for(i=0; i<9; i ) ccvalue[i]=0; //計算各空位的權值
for(i=0; i<9; i )
if( SB[i]->Caption=="" )//若是空位則計算
{
x=i%3;
y=i/3;
for(j=0; j<12; j )
ccvalue[i] =WhatValueIs(x CCBox[j*4 0],y CCBox[j*4 1],x CCBox[j*4 2],y CCBox[j*4 3]);
} //找出最高權值
max=-1;
for(i=0; i<9; i )
if( ccvalue[i]>max ) max=ccvalue[i]; //找出所有最高的權值
samecount=0;
for(i=0; i<9; i )
if( ccvalue[i]==max )
{
sameidx[ samecount ]=i;//記錄位置
samecount ;//個數加1
} //從最高權值位置,以亂數決定下於何處
i=random(samecount);
SB[ sameidx[i] ]->Caption="X";
SB[ sameidx[i] ]->Refresh();
}
//---------------------------------------------------------------------------
// 檢查並顯示結果,若為false代表結果未定
//---------------------------------------------------------------------------
bool __fastcall TForm1::CheckResult(void)
{
AnsiString tmp;//可連接的8條線所形成的字串
>>>>>>>> >->>>>>>>>> >->>> >->>>>>>>>>>>>>>>Caption="人類">Caption="請人類下";}
else if( iGameState==1 ) {LabelWho->Caption="電腦"; Panel2->Caption="";}
else {LabelWho->Caption="結束"; Panel2->Caption="本局結束";}
Refresh();
}
//---------------------------------------------------------------------------
// 閃爍Panel2訊息
//---------------------------------------------------------------------------
void __fastcall TForm1::FlashMsg(AnsiString s1,AnsiString s2)
{
for(int i=0; i<20; i )
{
Panel2->Caption=(i&1)?s1:s2;
Panel2->Refresh();
Sleep(100);
} ListBox1->Items->Add( "第 " AnsiString(ListBox1->Items->Count 1) " 次:" s1 );
ListBox1->ItemIndex=ListBox1->Items->Count-1;
}
//---------------------------------------------------------------------------
// End
//---------------------------------------------------------------------------
時間就是金錢---[ 發問前請先找找舊文章]
|