#include <iostream>
#include <string>
using namespace std;
typedef char chess[10]; //字符陣列
typedef int temparr[10]; //整型陣列
chess arr; //定義字符陣列變數
temparr brr; //定義整型陣列變數
int number,suc,n3,c3,n2,c2,n1,c1;
void inarrdata(chess a) //初始化棋盤編號
{
a[1]='1';a[2]='2';a[3]='3';
a[4]='4';a[5]='5';a[6]='6';
a[7]='7';a[8]='8';a[9]='9';
}
void display(chess a) //輸出棋盤狀態
{
cout<<endl;cout<<endl;
cout<<" "<<a[1]<<" "<<'|'<<" "<<a[2]<<" "<<'|'<<" "<<a[3]<<endl;
cout<<" -----------"<<endl;
cout<<" "<<a[4]<<" "<<'|'<<" "<<a[5]<<" "<<'|'<<" "<<a[6]<<endl;
cout<<" -----------"<<endl;
cout<<" "<<a[7]<<" "<<'|'<<" "<<a[8]<<" "<<'|'<<" "<<a[9]<<endl;
cout<<endl;cout<<endl;
}
int arrfull() //判斷還有沒有下棋的位置
{
int i;
int arrf=0;
for(i=1;i<=9;i++)
if(i==arr[i]-48) //如果字符arr[i]-48等于i
arrf=1; //那么arrf=1,也就是可以走棋
return arrf;
}
void cn(int line) //判斷狀態
{
switch(line)
{
case 0:c3=c3+1;break;//電腦贏
case 1:n2=n2+1;break;
case 2:c2=c2+1;break;//2個x
case 3:n1=n1+1;break;
case 4:c1=c1+1;break;//一個x
case 5:n3=n3+1;break;
}
}
int linenum(char a,char b,char c) //判斷狀態
{
int ln=6;
if((a=='X')&&(b=='X')&&(c=='X'))
ln=0;
if(((a=='O')&&(b=='O')&&(c!='O'))||((a=='O')&&(b!='O')&&(c=='O'))||((a!='O')&&(b=='O')&&(c=='O')))
ln=1;
if(((a=='X')&&(b=='X')&&(c!='X'))||((a=='X')&&(b!='X')&&(c=='X'))||((a!='X')&&(b=='X')&&(c=='X')))
ln=2;
if(((a=='O')&&(b!='O')&&(c!='O'))||((a!='O')&&(b=='O')&&(c!='O'))||((a!='O')&&(b!='O')&&(c=='O')))
ln=3;
if(((a=='X')&&(b!='X')&&(c!='x'))||((a!='X')&&(b=='X')&&(c!='X'))||((a!='X')&&(b!='X')&&(c=='X')))
ln=4;
if((a=='O')&&(b=='O')&&(c=='O'))
ln=5;
return ln;
}
int maxbrr(int *br) //判斷最大權值
{
int temp,i,mb;
temp=-888;
for(i=1;i<=9;i++)
{
if(temp<=br[i])
{
temp=br[i];
mb=i;
}
}
return mb;
}
void manstep() //人走棋處理模塊
{
int j;
display(arr);
if(arrfull()) //如果棋盤上還有下棋的位置,人走一步棋
{
cout<<"您要走哪一步?請輸入數字(1--9):";
cin>>j;
while((j<1)||(j>9)||(j!=arr[j]-48))
{
cout<<"對不起,您輸入的數字不對,請重新輸入(1--9):";
cin>>j;
}
arr[j]='O';
n3=0;c3=0;n2=0;c2=0;n1=0;c1=0;
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
if(n3!=0) //您贏了
{
display(arr);
cout<<endl;
cout<<"恭喜您贏了!!!"<<endl;
suc=0;
}
}
}
void computerstep() //計算機走棋處理模塊
{
int i;
if(arrfull()) //如果棋盤上還有可下棋的位置,則計算機走棋
{
for(i=1;i<=9;i++) //對每一步可走的棋進行計算
{
if(i==arr[i]-48)
{
c3=0;n2=0;c2=0;n1=0;c1=0;
arr[i]='X';
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
brr[i]=(128*c3-63*n2+31*c2-15*n1+7*c1); //計算此步權值
arr[i]=i+48;
}
else
brr[i]=-999;
}
arr[maxbrr(brr)]='X'; //確定計算機走哪一步,權值最大的一步
c3=0;n2=0;c2=0;n1=0;c1=0;
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
if(c3!=0) //計算機已贏
{
display(arr);
cout<<endl;
cout<<"計算機贏了!!!"<<endl;
suc=0;
}
}
else
suc=0;
}
int main()
{
cout<<"游戲規則:"<<endl<<"棋盤格式如圖,人和計算機在棋盤上交替走棋"<<endl;
cout<<"約定計算機使用符號X,人使用符號O"<<endl;
cout<<"誰先使一橫行或一豎行或對角線上有三個自己的符號,就勝利了!"<<endl;
string s="y";
string ch;
while(s=="y"||s=="Y")
{
inarrdata(arr); //棋盤坐標編號
display(arr); //顯示初始棋盤
suc=1;
cout<<"請選擇您是否先走?(y/n)";
cin>>ch;
while(ch!="y"&&ch!="Y"&&ch!="n"&&ch!="N")
{
cout<<"錯誤!請輸入y或n:";
cin>>ch;
}
if((ch=="y")||(ch=="Y")) //輸入Y,表示人先走棋
{
while(suc)
{
manstep();
computerstep();
}
}
else //計算機先走棋
{
while(suc)
{
computerstep();
if(suc)
manstep();
}
}
if(n3==0&&c3==0)
cout<<endl<<"和棋!"<<endl<<endl;
cout<<endl<<"再來一盤(y/n)?";
cin>>s;
while(s!="y"&&s!="Y"&&s!="n"&&s!="N")
{
cout<<"錯誤!請輸入y或n:";
cin>>s;
}
}
return 0;
}
uj5u.com熱心網友回復:
計算權值那里看不懂,128,63,31,15,7這幾個數是怎么來的?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/97266.html
標籤:茶館
