井字游戏c语言简化版,井字游戏(C++版)终级版隆重推出!

前两个版本都多多少少有些缺陷,经过本人仔细研究,终于克服重重困难,编写出了井字游戏终结版,经过大量实验,应该没什么问题了,大家试试吧!!!!!不知道这个游戏能不能评为精品呀???同时还推出了C语言版

#include

#include

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<

cout<

cout<

cout<

cout<

cout<

cout<

}

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;

case 3:n1=n1+1;break;

case 4:c1=c1+1;break;

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<

cin>>j;

while((j<1)||(j>9)||(j!=arr[j]-48))

{

cout<

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<

cout<

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<

cout<

suc=0;

}

}

else

suc=0;

}

int main()

{

cout<

cout<

cout<

string s=”y”;

string ch;

while(s==”y”||s==”Y”)

{

inarrdata(arr);          //棋盘坐标编号

display(arr);            //显示初始棋盘

suc=1;

cout<

cin>>ch;

while(ch!=”y”&&ch!=”Y”&&ch!=”n”&&ch!=”N”)

{

cout<

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<

cout<

cin>>s;

while(s!=”y”&&s!=”Y”&&s!=”n”&&s!=”N”)

{

cout<

cin>>s;

}

}

return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值