第一篇:C语言#字棋人人对战代码
#include
void panduan(char a[3][3]){ if(('X'==a[0][0]&&'X'==a[0][1]&&'X'==a[0][2])||('X'==a[1][0]&&'X'==a[1][1]&&'X'==a[1][2])||('X'==a[2][0]&&'X'==a[2][1]&&'X'==a[2][2])||
('X'==a[2][0]&&'X'==a[1][0]&&'X'==a[0][0])||('X'==a[2][1]&&'X'==a[1][1]&&'X'==a[0][1])||('X'==a[2][2]&&'X'==a[1][2]&&'X'==a[0][2])||
('X'==a[2][2]&&'X'==a[1][1]&&'X'==a[0][0])||('X'==a[2][0]&&'X'==a[1][1]&&'X'==a[0][2])){
printf(“甲方获胜!n”);} if((a[0][0]=='Y'&&a[0][1]=='Y'&&a[0][2]=='Y')||(a[1][0]=='Y'&&a[1][1]=='Y'&&a[1][2]=='Y')||(a[2][0]=='Y'&&a[2][1]=='Y'&&a[2][2]=='Y')||
(a[2][0]=='Y'&&a[1][0]=='Y'&&a[0][0]=='Y')||(a[2][1]=='Y'&&a[1][1]=='Y'&&a[0][1]=='Y')||(a[2][2]=='Y'&&a[1][2]=='Y'&&a[0][2]=='Y')||
(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y')||(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'))
{
printf(“乙方获胜!n”);
} }
void shuchu(char a[3][3]){
printf(“_________________________n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[0][0],a[0][1],a[0][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[1][0],a[1][1],a[1][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[2][0],a[2][1],a[2][2]);
printf(“|_______|_______|_______|n”);
printf(“n”);}
void qipu(){
int i,j;char a[3][3]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};shuchu(a);//第一次输入
printf(“甲方请输入:”);scanf(“%d %d”,&i,&j);// if(a[i][j]==' ')// {
a[i][j]='X';// }else // printf(“输入错误,”);shuchu(a);
printf(“乙方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='Y';shuchu(a);//第二次
printf(“甲方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='X';shuchu(a);
printf(“乙方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='Y';shuchu(a);//第三次
printf(“甲方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='X';shuchu(a);panduan(a);
printf(“乙方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='Y';shuchu(a);
panduan(a);//第四次
printf(“甲方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='X';
// shuchu(a);panduan(a);printf(“乙方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='Y';shuchu(a);printf(“甲方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='X';shuchu(a);panduan(a);
if(('X'==a[0][0]&&'X'==a[0][1]&&'X'==a[0][2])||('X'==a[1][0]&&'X'==a[1][1]&&'X'==a[1][2])||('X'==a[2][0]&&'X'==a[2][1]&&'X'==a[2][2])||
('X'==a[2][0]&&'X'==a[1][0]&&'X'==a[0][0])||('X'==a[2][1]&&'X'==a[1][1]&&'X'==a[0][1])||('X'==a[2][2]&&'X'==a[1][2]&&'X'==a[0][2])||
('X'==a[2][2]&&'X'==a[1][1]&&'X'==a[0][0])||('X'==a[2][0]&&'X'==a[1][1]&&'X'==a[0][2]))
printf(“甲方获胜!n”);
if((a[0][0]=='Y'&&a[0][1]=='Y'&&a[0][2]=='Y')||(a[1][0]=='Y'&&a[1][1]=='Y'&&a[1][2]=='Y')||(a[2][0]=='Y'&&a[2][1]=='Y'&&a[2][2]=='Y')||
(a[2][0]=='Y'&&a[1][0]=='Y'&&a[0][0]=='Y')||(a[2][1]=='Y'&&a[1][1]=='Y'&&a[0][1]=='Y')||(a[2][2]=='Y'&&a[1][2]=='Y'&&a[0][2]=='Y')||
(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y')||(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'))
printf(“乙方获胜!n”);else
printf(“和棋!”);printf(“n”);
}
void main(){ printf(“_________________________n”);printf(“|
|
|
|n”);printf(“| 0 0
| 0 1 | 0 2 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 1 0
| 1 1 | 1 2 |n”);
printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 2 0
| 2 1 | 2 2 |n”);printf(“|_______|_______|_______|n”);printf(“n”);printf(“对应的数字带表对应的位置,输入数字则带表选择对应的位置!X代表甲方,Y代表乙方n”);qipu();}
完美1
#include
void qipu();void shuru();void shuchu();void panduan();
void panduan(char a[3][3]){ if(('X'==a[0][0]&&'X'==a[0][1]&&'X'==a[0][2])||('X'==a[1][0]&&'X'==a[1][1]&&'X'==a[1][2])||('X'==a[2][0]&&'X'==a[2][1]&&'X'==a[2][2])||
('X'==a[2][0]&&'X'==a[1][0]&&'X'==a[0][0])||('X'==a[2][1]&&'X'==a[1][1]&&'X'==a[0][1])||('X'==a[2][2]&&'X'==a[1][2]&&'X'==a[0][2])||
('X'==a[2][2]&&'X'==a[1][1]&&'X'==a[0][0])||('X'==a[2][0]&&'X'==a[1][1]&&'X'==a[0][2])){
printf(“甲方获胜!n”);} if((a[0][0]=='Y'&&a[0][1]=='Y'&&a[0][2]=='Y')||(a[1][0]=='Y'&&a[1][1]=='Y'&&a[1][2]=='Y')||(a[2][0]=='Y'&&a[2][1]=='Y'&&a[2][2]=='Y')||
(a[2][0]=='Y'&&a[1][0]=='Y'&&a[0][0]=='Y')||(a[2][1]=='Y'&&a[1][1]=='Y'&&a[0][1]=='Y')||(a[2][2]=='Y'&&a[1][2]=='Y'&&a[0][2]=='Y')||
(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y')||(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'))
{
printf(“乙方获胜!n”);
} }
void shuchu(char a[3][3]){
printf(“_________________________n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[0][0],a[0][1],a[0][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[1][0],a[1][1],a[1][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[2][0],a[2][1],a[2][2]);
printf(“|_______|_______|_______|n”);
printf(“n”);}
void shuru(char a[3][3]){ int i,j;for(int m=0;m<9;m++){
if(m%2==0)
{
printf(“甲方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i][j]==' ')
{
a[i][j]='X';
shuchu(a);
}
else
{
printf(“输入错误,请重新输入!n”);
i--;
}
}
else
{
printf(“乙方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i][j]==' ')
{
a[i][j]='Y';
shuchu(a);
}
else
{
printf(“输入错误,请重新输入!n”);
m--;
}
} }
}
void qipu(){ int i,j;char a[3][3]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};shuchu(a);shuru(a);// printf(“甲方请输入:”);scanf(“%d %d”,&i,&j);a[i][j]='X';shuchu(a);panduan(a);
if(('X'==a[0][0]&&'X'==a[0][1]&&'X'==a[0][2])||('X'==a[1][0]&&'X'==a[1][1]&&'X'==a[1][2])||('X'==a[2][0]&&'X'==a[2][1]&&'X'==a[2][2])||
('X'==a[2][0]&&'X'==a[1][0]&&'X'==a[0][0])||('X'==a[2][1]&&'X'==a[1][1]&&'X'==a[0][1])||('X'==a[2][2]&&'X'==a[1][2]&&'X'==a[0][2])||
('X'==a[2][2]&&'X'==a[1][1]&&'X'==a[0][0])||('X'==a[2][0]&&'X'==a[1][1]&&'X'==a[0][2]))
printf(“甲方获胜!n”);
if((a[0][0]=='Y'&&a[0][1]=='Y'&&a[0][2]=='Y')||(a[1][0]=='Y'&&a[1][1]=='Y'&&a[1][2]=='Y')||(a[2][0]=='Y'&&a[2][1]=='Y'&&a[2][2]=='Y')||
(a[2][0]=='Y'&&a[1][0]=='Y'&&a[0][0]=='Y')||(a[2][1]=='Y'&&a[1][1]=='Y'&&a[0][1]=='Y')||(a[2][2]=='Y'&&a[1][2]=='Y'&&a[0][2]=='Y')||
(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y')||(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'))
printf(“乙方获胜!n”);else
printf(“和棋!”);printf(“n”);
}
void main(){ printf(“_________________________n”);printf(“|
|
|
|n”);printf(“| 0 0
| 0 1 | 0 2 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 1 0
| 1 1 | 1 2 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 2 0
| 2 1 | 2 2 |n”);printf(“|_______|_______|_______|n”);printf(“n”);printf(“对应的数字带表对应的位置,输入数字则带表选择对应的位置!X代表甲方,Y代表乙方n”);qipu();}
完美2 #include
void qipu();void shuru();void shuchu();void panduan();
void panduan(char a[3][3]){ if(('X'==a[0][0]&&'X'==a[0][1]&&'X'==a[0][2])||('X'==a[1][0]&&'X'==a[1][1]&&'X'==a[1][2])||('X'==a[2][0]&&'X'==a[2][1]&&'X'==a[2][2])||
('X'==a[2][0]&&'X'==a[1][0]&&'X'==a[0][0])||('X'==a[2][1]&&'X'==a[1][1]&&'X'==a[0][1])||('X'==a[2][2]&&'X'==a[1][2]&&'X'==a[0][2])||
('X'==a[2][2]&&'X'==a[1][1]&&'X'==a[0][0])||('X'==a[2][0]&&'X'==a[1][1]&&'X'==a[0][2])){
printf(“甲方获胜!n”);} if((a[0][0]=='Y'&&a[0][1]=='Y'&&a[0][2]=='Y')||(a[1][0]=='Y'&&a[1][1]=='Y'&&a[1][2]=='Y')||(a[2][0]=='Y'&&a[2][1]=='Y'&&a[2][2]=='Y')||
(a[2][0]=='Y'&&a[1][0]=='Y'&&a[0][0]=='Y')||(a[2][1]=='Y'&&a[1][1]=='Y'&&a[0][1]=='Y')||(a[2][2]=='Y'&&a[1][2]=='Y'&&a[0][2]=='Y')||
(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y')||(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'))
{
printf(“乙方获胜!n”);
} }
void shuchu(char a[3][3]){
printf(“_________________________n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[0][0],a[0][1],a[0][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[1][0],a[1][1],a[1][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[2][0],a[2][1],a[2][2]);
printf(“|_______|_______|_______|n”);
printf(“n”);}
void shuru(char a[3][3]){ int i,j;for(int m=0;m<9;m++){
if(m%2==0)
{
printf(“甲方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i][j]==' ')
{
a[i][j]='X';
shuchu(a);
panduan(a);
}
else
{
printf(“输入错误,请重新输入!n”);
m--;
} } else {
printf(“乙方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i][j]==' ')
{
a[i][j]='Y';
shuchu(a);
panduan(a);
}
else
{
printf(“输入错误,请重新输入!n”);
m--;
}
} }
}
void qipu(){ char a[3][3]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};shuchu(a);shuru(a);
if(('X'==a[0][0]&&'X'==a[0][1]&&'X'==a[0][2])||('X'==a[1][0]&&'X'==a[1][1]&&'X'==a[1][2])||('X'==a[2][0]&&'X'==a[2][1]&&'X'==a[2][2])||
('X'==a[2][0]&&'X'==a[1][0]&&'X'==a[0][0])||('X'==a[2][1]&&'X'==a[1][1]&&'X'==a[0][1])||('X'==a[2][2]&&'X'==a[1][2]&&'X'==a[0][2])||
('X'==a[2][2]&&'X'==a[1][1]&&'X'==a[0][0])||('X'==a[2][0]&&'X'==a[1][1]&&'X'==a[0][2]))
printf(“甲方获胜!n”);
if((a[0][0]=='Y'&&a[0][1]=='Y'&&a[0][2]=='Y')||(a[1][0]=='Y'&&a[1][1]=='Y'&&a[1][2]=='Y')||(a[2][0]=='Y'&&a[2][1]=='Y'&&a[2][2]=='Y')||
(a[2][0]=='Y'&&a[1][0]=='Y'&&a[0][0]=='Y')||(a[2][1]=='Y'&&a[1][1]=='Y'&&a[0][1]=='Y')||(a[2][2]=='Y'&&a[1][2]=='Y'&&a[0][2]=='Y')||
(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y')||(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'))
printf(“乙方获胜!n”);else
printf(“和棋!”);printf(“n”);
}
void main(){ printf(“_________________________n”);printf(“|
|
|
|n”);printf(“| 0 0
| 0 1 | 0 2 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 1 0
| 1 1 | 1 2 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 2 0
| 2 1 | 2 2 |n”);printf(“|_______|_______|_______|n”);printf(“n”);printf(“对应的数字带表对应的位置,输入数字则带表选择对应的位置!X代表甲方,Y代表乙方n”);qipu();}
完美 #include
int panduan(char a[3][3]){ if(('X'==a[0][0]&&'X'==a[0][1]&&'X'==a[0][2])||('X'==a[1][0]&&'X'==a[1][1]&&'X'==a[1][2])||('X'==a[2][0]&&'X'==a[2][1]&&'X'==a[2][2])||
('X'==a[2][0]&&'X'==a[1][0]&&'X'==a[0][0])||('X'==a[2][1]&&'X'==a[1][1]&&'X'==a[0][1])||('X'==a[2][2]&&'X'==a[1][2]&&'X'==a[0][2])||
('X'==a[2][2]&&'X'==a[1][1]&&'X'==a[0][0])||('X'==a[2][0]&&'X'==a[1][1]&&'X'==a[0][2])){
printf(“甲方获胜!n”);
return 1;} if((a[0][0]=='Y'&&a[0][1]=='Y'&&a[0][2]=='Y')||(a[1][0]=='Y'&&a[1][1]=='Y'&&a[1][2]=='Y')||(a[2][0]=='Y'&&a[2][1]=='Y'&&a[2][2]=='Y')||
(a[2][0]=='Y'&&a[1][0]=='Y'&&a[0][0]=='Y')||(a[2][1]=='Y'&&a[1][1]=='Y'&&a[0][1]=='Y')||(a[2][2]=='Y'&&a[1][2]=='Y'&&a[0][2]=='Y')||
(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y')||(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'))
{
printf(“乙方获胜!n”);
return 1;
} else
return 0;}
void shuchu(char a[3][3]){
printf(“_________________________n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[0][0],a[0][1],a[0][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[1][0],a[1][1],a[1][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[2][0],a[2][1],a[2][2]);
printf(“|_______|_______|_______|n”);
printf(“n”);}
void shuru(char a[3][3]){ int i,j,m;for(m=0;m<9;m++){
if(m%2==0)
{
printf(“甲方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i][j]==' ')
{
a[i][j]='X';
shuchu(a);
if(panduan(a))
{
break;
}
}
else
{
printf(“输入错误,请重新输入!n”);
m--;
}
}
else
{
printf(“乙方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i][j]==' ')
{
a[i][j]='Y';
shuchu(a);
if(panduan(a))
{
break;
}
}
else
{
printf(“输入错误,请重新输入!n”);
m--;
}
} } if(m-1==8){
if(panduan(a)==0)
printf(“和棋!n”);} }
void qipu(){ char a[3][3]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};shuchu(a);shuru(a);printf(“n”);
}
void main(){ printf(“_________________________n”);printf(“|
|
|
|n”);printf(“| 0 0
| 0 1 | 0 2 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 1 0
| 1 1 | 1 2 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 2 0
| 2 1 | 2 2 |n”);printf(“|_______|_______|_______|n”);printf(“n”);printf(“对应的数字带表对应的位置,输入数字则带表选择对应的位置!X代表甲方,Y代表乙方n”);qipu();}
调试完成
#include
void shuchu(char a[3][3]){
printf(“_________________________n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[0][0],a[0][1],a[0][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[1][0],a[1][1],a[1][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[2][0],a[2][1],a[2][2]);
printf(“|_______|_______|_______|n”);
printf(“n”);}
int panduan1(char a[3][3]){
for(int i=0;i<3;i++){
if(a[0][i]=='X'&&a[1][i]=='X'&&a[2][i]=='X')
{
return 1;
}
if(a[i][0]=='X'&&a[i][1]=='X'&&a[i][2]=='X')
{
return 1;
} } for(int j=0;j<3;j++){
if(a[0][j]=='Y'&&a[1][j]=='Y'&&a[2][j]=='Y')
{
return 2;
}
if(a[j][0]=='Y'&&a[j][1]=='Y'&&a[j][2]=='Y')
{
return 2;
} } if(a[2][2]=='X'&&a[1][1]=='X'&&a[0][0]=='X'){
return 1;} if(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y'){
return 2;} if(a[2][0]=='X'&&a[1][1]=='X'&&a[0][2]=='X'){
return 1;} if(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'){
return 2;} else return 0;}
int panduan(char a[3][3]){ if(panduan1(a)==1){
printf(“甲方获胜!n”);
return 1;} if(panduan1(a)==2){
printf(“乙方获胜!n”);
return 1;} else
return 0;}
void shuru(char a[3][3]){
int i,j,m;for(m=0;m<9;m++){ if(m%2==0){
printf(“甲方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i-1][j-1]==' ')
{
a[i-1][j-1]='X';
shuchu(a);
if(panduan(a)==1)
{
break;
}
}
else
{
printf(“输入错误,请按格式重新输入!n”);
m--;
} } else {
printf(“乙方请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i-1][j-1]==' ')
{
a[i-1][j-1]='Y';
shuchu(a);
if(panduan(a)==1)
{
break;
}
}
else
{
printf(“输入错误,请按格式重新输入!n”);
m--;
} } } if(m-1==8){
if(panduan(a)==0)
printf(“和棋!n”);} printf(“输入1则再来一次!n”);int k;scanf(“%d”,&k);if(k==1)
qipu();}
void qipu(){ char a[3][3]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};shuchu(a);shuru(a);printf(“n”);
}
void main(){ printf(“_________________________n”);printf(“|
|
|
|n”);printf(“| 1 1
| 1 2 | 1 3 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 2 1
| 2 2 | 2 3 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 3 1
| 3 2 | 3 3 |n”);printf(“|_______|_______|_______|n”);printf(“n”);printf(“对应的数字带表对应的位置,输入数字则带表选择对应的位置!X代表甲方,Y代表乙方n”);qipu();}
人机
#include
void shuchu(char a[3][3]){
printf(“_________________________n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[0][0],a[0][1],a[0][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[1][0],a[1][1],a[1][2]);
printf(“|_______|_______|_______|n”);
printf(“|
|
|
|n”);
printf(“| %3c
| %3c
| %3c
|n”,a[2][0],a[2][1],a[2][2]);
printf(“|_______|_______|_______|n”);
printf(“n”);} ////////////////////////////////////////////////////////////////////////////////////// void qipu(){ char a[3][3]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}};shuchu(a);shuru(a);printf(“n”);} //////////////////////////////////////////////////////////////////////////////////////// int panduan1(char a[3][3]){
for(int i=0;i<3;i++){
if(a[0][i]=='X'&&a[1][i]=='X'&&a[2][i]=='X')
{
return 1;
}
if(a[i][0]=='X'&&a[i][1]=='X'&&a[i][2]=='X')
{
return 1;
} } for(int j=0;j<3;j++){
if(a[0][j]=='Y'&&a[1][j]=='Y'&&a[2][j]=='Y')
{
return 2;
}
if(a[j][0]=='Y'&&a[j][1]=='Y'&&a[j][2]=='Y')
{
return 2;
} } if(a[2][2]=='X'&&a[1][1]=='X'&&a[0][0]=='X'){
return 1;} if(a[2][2]=='Y'&&a[1][1]=='Y'&&a[0][0]=='Y'){
return 2;} if(a[2][0]=='X'&&a[1][1]=='X'&&a[0][2]=='X'){
return 1;} if(a[2][0]=='Y'&&a[1][1]=='Y'&&a[0][2]=='Y'){
return 2;} else
return 0;} ////////////////////////////////////////////////////////////// int panduan(char a[3][3]){ if(panduan1(a)==1){
printf(“电脑方获胜!n”);
return 1;} if(panduan1(a)==2){
printf(“人方获胜!n”);
return 1;} else
return 0;} ///////////////////////////////////////////////////////////// int guzhi(char a[3][3]){ int p=0;for(int j=0;j<3;j++){
if(a[0][j]=='X'&&a[1][j]=='X'&&a[2][j]=='X')
{
p++;
}
if(a[j][0]=='X'&&a[j][1]=='X'&&'X'==a[j][2])
{
p++;
} } if(a[0][0]=='X'&&'X'==a[1][1]&&'X'==a[2][2]){
p++;} if(a[2][0]=='X'&&'X'==a[1][1]&&'X'==a[0][2]){
p++;} for(int i=0;i<3;i++){
if(a[0][i]=='Y'&&a[1][i]=='Y'&&a[2][i]=='Y')
{
p++;
}
if(a[i][0]=='Y'&&a[i][1]=='Y'&&'Y'==a[i][2])
{
p++;
} } if(a[0][0]=='Y'&&'Y'==a[1][1]&&'Y'==a[2][2]){
p++;} if(a[2][0]=='Y'&&'Y'==a[1][1]&&'Y'==a[0][2]){
p++;} return p;} //////////////////////////////////////////////////////////////////////// void zoufa(char a[3][3]){ int p=0,q=0,m,n,max1,max=-100;char b[3][3];strcpy(*b,*a);for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
{
if(b[i][j]==' ')
{
b[i][j]='X';
for(int m=0;m<3;m++)
{
for(int n=0;n<3;n++)
{
if(b[m][n]==' ')
{
b[m][n]='X';
}
}
}
p=guzhi(b);
strcpy(*b,*a);
for(int k=0;k<3;k++)
{
for(int h=0;h<3;h++)
{
if(b[k][h]==' ')
{
b[k][h]='Y';
}
}
}
q=guzhi(b);
max1=p-q;
if(max1>max)
{
max=max1;
m=i;
n=j;
}
}
} } a[m][n]='X';} /////////////////////////////////////////////////////////////////////////////// void shuru(char a[3][3]){ int i,j,m,n;printf(“输入1选择先手,输入2选择后手!n”);scanf(“%d”,&n);if(n==2){
for(m=0;m<9;m++)
{
if(m%2==0)
{
printf(“电脑方输入:n”);
zoufa(a);
shuchu(a);
if(panduan(a)==1)
{
break;
}
}
else
{
printf(“请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i-1][j-1]==' ')
{
a[i-1][j-1]='Y';
shuchu(a);
if(panduan(a)==1)
{
break;
} }
else {
printf(“输入错误,请按格式重新输入!n”);
m--;
}
}
} } if(n==1){
for(m=0;m<9;m++)
{
if(m%2==0)
{
printf(“请输入:”);
scanf(“%d %d”,&i,&j);
if(a[i-1][j-1]==' ')
{
a[i-1][j-1]='Y';
shuchu(a);
if(panduan(a)==1)
{
break;
}
}
else
{
printf(“输入错误,请按格式重新输入!n”);
m--;
}
}
else
{
printf(“电脑方输入:n”);
zoufa(a);
shuchu(a);
if(panduan(a)==1)
{
break;
}
}
} }
if(m-1==8){ if(panduan(a)==0)
printf(“和棋!n”);} printf(“输入1则再来一次!n”);int k;scanf(“%d”,&k);if(k==1){
qipu();} } ///////////////////////////////////////////////////////////// void main(){ printf(“_________________________n”);printf(“|
|
|
|n”);printf(“| 1 1
| 1 2 | 1 3 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 2 1
| 2 2 | 2 3 |n”);printf(“|_______|_______|_______|n”);printf(“|
|
|
|n”);printf(“| 3 1
| 3 2 | 3 3 |n”);printf(“|_______|_______|_______|n”);printf(“n”);printf(“对应的数字代表对应的位置,输入数字则代表选择对应的位置!X代表电脑,Y代表人方n”);qipu();}
第二篇:C语言课程设计代码
#include “stdio.h” #include
void main(){ int n=0;struct course *head=NULL;void insert(struct course **head,struct course *cou);void Print(struct course **head,int *n);void Modify(struct course **head,int *n);void Require(struct course **head);void Creat(struct course **head,int *n);void Delete(struct course **head,int *n);void Fun(struct course **head,int *n);
Fun(&head,&n);}
void insert(struct course **head,struct course *cou){ struct course *p0,*p1,*p2;p2=p1=*head;p0=cou;if(*head){
while((p0->semester>p1->semester)&&(p1->next))
{
p2=p1;
p1=p1->next;
}
if(p0->semester
semester)
{
if(*head==p1)*head=p0;
else p2->next=p0;
p0->next=p1;}
else
{
if(p0->semester==p1->semester){ while((p0->cID>p1->cID)&&(p1->next)&&(p0->semester==p1->semester))
{
} if(p0->semester!=p1->semester){
} else {
if(p0->cID<=p1->cID){
if(*head==p1)*head=p0;else p2->next=p0;p2=p1;p1=p1->next;p2->next=p0;p0->next=p1;
p0->next=p1;
}
else
{p1->next=p0;p0->next=NULL;}
}
}
else
{p1->next=p0;p0->next=NULL;}
} } else
{
*head=p0;
p0->next=NULL;} }
void Print(struct course **head,int *n){ struct course *p;p=*head;if(*head){
if(*n==1)printf(“nThis %d record is:n”,*n);
else printf(“nThese %d records are:n”,*n);
printf(“semester cID
name
creditn”);
do
{ printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
p=p->next;
}while(p!=NULL);} else printf(“nList null!n”);}
void Modify(struct course **head,int *n){ struct course *p,*p2;int cID;if(*head){
Print(head,n);while(1){ printf(“nPlease input the cID which you want to modify:”);
scanf(“%d”,&cID);p2=p=*head;while(p->next&&(cID!=p->cID)){
p2=p;
p=p->next;} if(cID==p->cID){
printf(“Please input the new cID(1~60):”);
scanf(“%d”,&p->cID);
while(p->cID<0||p->cID>60)
{
printf(“nError!”);
printf(“nPlease input the new cID(1~60):”);
scanf(“%d”,&p->cID);
}
printf(“Please input the new semester(1~8):”);
scanf(“%d”,&p->semester);while(p->semester<0||p->semester>8)
{
printf(“nError!”);
printf(“nPlease input the new semester(1~8):”);
scanf(“%d”,&p->semester);
}
printf(“Please input the new credit:”);
scanf(“%f”,&p->credit);
printf(“Please input the new name:”);
scanf(“%s”,p->name);
if(p==*head)*head=p->next;
else p2->next=p->next;
insert(head,p);
break;
}
else printf(“%d not been found!n”,cID);
} } else {printf(“nList null!n”);} }
void Require(struct course **head){ struct course *p;float sum=0;int sem,i=0;printf(“nPlease input the semester which is required:”);
scanf(“%d”,&sem);p=*head;while(p){
if(sem==p->semester)
{
i++;if(i==1)printf(“nsemester cID
name
creditn”);printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
sum=sum+p->credit;
}
p=p->next;} printf(“The sum of credit in this term is:%.1fn”,sum);}
void Creat(struct course **head,int *n){ struct course *p1;while(1){
p1=(struct course *)malloc(LEN);
printf(“Please input the cID(1~60):”);
scanf(“%d”,&p1->cID);
while(p1->cID<0||p1->cID>60)
{
printf(“nError!”);
printf(“nPlease input the cID(1~60):”);
scanf(“%d”,&p1->cID);
}
if(p1->cID==0)break;
printf(“Please input the semester(1~8):”);
scanf(“%d”,&p1->semester);
while(p1->semester<0||p1->semester>8)
{
printf(“nError!”);
printf(“nPlease input the semester(1~8):”);scanf(“%d”,&p1->semester);
}
} } printf(“Please input the credit:”);scanf(“%f”,&p1->credit);printf(“Please input the name:”);scanf(“%s”,p1->name);insert(head,p1);*n=*n+1;printf(“nYou can continue until the cID is ”0“!n”);Print(head,n);void Delete(struct course **head,int *n){
struct course *p1,*p2;int cID;Print(head,n);if(*head){ printf(“Please input the cID of the course which you want to delete:”);scanf(“%d”,&cID);p1=*head;
while(cID!=p1->cID&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(cID==p1->cID)
{
if(p1==*head)*head=p1->next;
else p2->next=p1->next;
printf(“Have delete cID:%dn”,cID);
*n=*n-1;
}
else printf(“%d not been found!n”,cID);} }
void Fun(struct course **head,int *n){ char num;
while(1)
{
system(“cls”);
puts(“**************** Main Menu ******************”);
puts(“* 1.Add Records
2.Print Records
*”);
puts(“* 3.Delete Records
4.Modify Records *”);
puts(“* 5.Require Records 6.Exit
*”);
printf(“Please input your choice: ”);
scanf(“%d”,&num);
switch(num)
{
case 1:Creat(head,n);break;
case 2:Print(head,n);break;
case 3:Delete(head,n);break;
case 4:Modify(head,n);break;
case 5:Require(head);break;case 6:exit(0);break;
default: break;
}
printf(“nPress ”Enter“ to continue!”);getchar();getchar();
} }
第三篇:三国杀武将语言代码~
内容三国杀武将语言代码~
神秘非主牛(9级)1楼
{3:1:1}这就是桃园吗
{3:2:1}什么 此地名叫麦城
{3:3:1}实在是 杀不动了
{3:4:1}将星陨落 天命难违
{3:5:1}这就是失败的滋味吗
{3:6:1}马超死
{3:7:1}亮
{3:8:1}父亲 大哥 仲谋 愧矣
{3:9:1}二十年后 又是一条好汉 {3:10:1}被看穿了吗
{3:11:1}失血过多了
{3:12:1}既生瑜何生。。
{3:13:1}伯符 我去了
{3:14:1}我还是太年轻了
{3:15:1}大爷胃疼 胃疼啊
{3:16:1}难道真是 天命难违
{3:17:1}两边 都看不见了
{3:18:1}真的没想到
{3:19:1}冷 好冷啊
{3:20:1}咳咳咳咳
{3:21:1}悼良会之永绝兮 哀一逝而异乡 {3:22:1}医者不能自医啊
{3:23:1}不可能
{3:24:1}父亲大人 对不起
{3:25:1}不 还不可以死
{3:26:1}不得不服老啦
{3:27:1}谁敢杀我 啊
{3:28:1}竟然 比我还快
{3:29:1}实在是守不住了
{3:30:1}公瑾 我先走一步
{3:31:1}已经 尽力了
{3:32:1}黄天也死啦
{3:33:1}竟然被猜到了
{3:34:1}主公 快走!
{3:35:1}主公要臣死 臣不得不死
{3:36:1}看来 我命中注定 将命丧于此 {3:37:1}我的计谋竟被。
{3:38:1}大丈夫当带三尺之剑 立不世之功 {3:39:1}四面都是水 我命休矣 {3:40:1}这红脸长须大将是。。{3:41:1}老天不助我袁家呀
{3:42:1}一顿不吃 饿得慌
{3:43:1}子建子建
{3:44:1}有埋伏 啊
{3:45:1}汉室衰弱 非我一人之罪
{3:46:1}大王 我先走一步了
{3:47:1}七纵之恩 来世再报了
{3:48:1}我的时辰 也到了
{3:49:1}此联盟已破 吴蜀休矣
{3:100:1}可恶 就差一步了
{3:101:1}我军将败 我已无颜苟活于世
{3:111:1}城在人在 城破人亡
{3:151:1}本是同根生 相煎何太急
{3:152:1}生死有命
{3:153:1}请出就戳
{3:154:1}蜀翼既折 蜀汉哀矣
{3:155:1}大丈夫 不惧死亡
{3:157:1}卿等 务必用心辅佐仲谋
{3:158:1}盛不能奋身出命 不亦辱乎
{3:159:1}娘 孩儿不孝 向您请罪了
{3:160:1}我无颜面对丞相
{3:161:1}怎能如此对我{3:202:1}劫数难逃 我们别无选择
{3:203:1}逝者不死 浴火重生
{3:204:1}今当远离 临表涕零 不知所言
{3:205:1}腾蛇乘雾 终为土灰
{3:206:1}我在修罗炼狱等着你们 哈哈哈哈哈
{2:209:1}将军,人家空虚寂寞冷嘛!
{2:209:2}大人莫走,再陪陪妾身嘛!
3-23 07:21评论
神秘非主牛(9级)2楼
张郃 {2:122:1}兵无常势,水无常形。{2:122:2}用兵之道,变化万千。死:{3:050:1}哎呀,膝盖中箭了!
孙策:
激昂:{2:130:1}吾乃江东小霸王孙伯符!
{2:130:2}江东子弟,何惧于天下!
魂姿:{2:131:1}父亲在上,魂佑江东。
{2:131:2}愿承父志与公瑾共谋天下
英姿:{2:55:4}尔等看好了!
{2:55:3}公瑾,助我决一死战!
制霸:{2:132:1}我若怕你,非孙伯符也!
{2:132:2}是友是敌,一探便知!
死:{3:054:1}内事不决问张昭,外事不决问周瑜
3-23 07:24评论
神秘非主牛(9级)3楼
姜维:
{2:125:1}汝等小儿,可敢杀我!
{2:125:2}贼将早降,可免一死!
志继,{2:162:1}先帝之志,丞相之托,不可忘也。{2:126:2}丞相之恩,维万死不能相报
死:{3:052:1}我计不成,乃天命也!
邓艾:
屯田:{2:123:2}锄禾日当午,汗滴禾下土。
{2:123:1}休养生息,备战待敌。
凿险:{2:124:1}屯田日久,当建奇功!
急袭:{2:124:2}开辟险路,急袭敌军!
{2:139:2}偷渡阴平,直取蜀汉!
{2:139:1}攻其不备,出其不意!
死:{3:051:1}吾克蜀破敌,竟丧于。。奸人之手。刘禅:享乐:{2:127:1}打打杀杀,真没意思!
{2:127:2}我爸爸是刘备!
放权:{2:128:1}这可如何是好啊!
{2:128:2}你办事,我放心!
若愚:{2:129:1}不装疯卖傻,岂能安然无恙?{2:129:2}世人皆看错我,唉!
{3:053:1}别打脸,我投降还不行吗!
3-23 07:24评论
神秘非主牛(9级)4楼
左慈:
化身:{2:135:1}万物苍生,幻化由心!
{2:135:2}哼,肉眼凡胎,岂能识我仙人变化!新生:{2:136:2}吐故纳新,施法天地!
{2:136:1}幻化无穷,生生不息!
死:{3:205:1}腾云跨风,飞升太虚。
二张:
直谏:{2:133:1}请恕老臣直言!
{2:133:2}为臣者,当冒死以谏!
固政:{2:134:2}固国安邦,居当如是!
{2:134:1}今当稳固内政,以御外患!
死:{3:055:1}竭力尽智,死而无憾。
蔡文姬:
悲歌:{2:137:1}制兹八拍兮拟排忧,何知曲成兮心转愁。{2:137:2}悲歌可以当泣,远望可以当归。
断肠:{2:138:2}流落异乡愁断肠。
{2:138:1}日东月西兮徒相望,不得相随兮空断肠。3-23 07:24评论
神秘非主牛(9级)5楼
{2:130:1}吾乃江东小王八孙泼妇!
{2:47:2}下次重一点。
{2:49:2}鼠辈,竟敢上我。
{3:15:1}大爷胃疼胃疼啊。
{2:73:1}取汝手机,犹如探囊取物!
{2:119:1}此妓上不到我!
{2:102:2}弓箭手,准备犯贱!
{2:38:2}全军偷鸡
{2:65:1}月老也要补啊
{2:62:2}请鞭笞我吧,宫颈。
{2:33:1}看二奶,插腰卖首。
{2:54:1}有乳抚搓,肾好
{2:73:2}吾善于千里骑人
{3:25:1}不…还不可以湿。
{2:92:1}借你只手,予他一勃吧
{3:38:1}大丈夫…当带三千支箭,你…不是英雄。{2:34:1}阉人张飞在此
{3:41:1}老天不助我远嫁呀
{3:32:1}黄天,爷死啦
{3:153:1}请操就操
{3:27:1}谁敢**,啊…………
{3:28:1}竟然 比我还……帅
3-23 07:25评论
神秘非主牛(9级)6楼
2 雕虫小技
310 1 山不厌高 海不厌深
310 2 周公吐哺 天下归心
{3:206:1}这才是活生生的地狱
{2:315:2} 凡人们 颤抖吧 这是神之怒火 211 2 百战不殆
301 1 还不速速领死
301 2 取汝狗头 犹如探囊取物
2 死罪可免 活罪难赦
1 仙福永享 寿与天齐
2 千秋万载 一统江山
2 雕虫小技
1 请助我一臂之力
2 我当要替天行道
1 你信吗
2 猜猜看呐
1 看我三步之内 取你小命
2 吃我一戟
1 敬你之手与他一搏吧
2 此乃驱虎吞狼之计
1 我 永不背弃
2 秉忠贞之志 守谦退之节
1 蜀将何在32 2 尔等敢应战否 33 1 看尔乃 插标卖首 33 2 关羽在此 尔等受死 34 1 燕人张飞在此 34 2 啊!
1 知天易 逆天难
2 观今夜天象 知天下大事 36 1 空城
2 空城
1 吾乃常上赵子龙也 37 2 能进能退 乃真正法器
第四篇:数据结构课程设计报告(井字棋)
目录
一、设计课题名„„„„„„„„„„„„„„„„„ 1
二、设计目的„„„„„„„„„„„„„„„„„„ 1
三、问题描述及需求分析………………………………… 1
四、概要设计„„„„„„„„„„„„„„„„„„
五、详细设计„„„„„„„„„„„„„„„„„„
六、测试数据及测试结果…………………………………
七、课程设计小结„„„„„„„„„„„„„„„„
八、用户手册……………………………………………… 1 5 7 8
一、设计课题名
井字棋(人机对弈)
二、设计目的
1、课程设计是《数据结构》课程教学必不可缺的一个重要环节;
2、通过课程设计加深课堂教学内容的理解和巩固;
3、将《数据结构》课程的教学内容与解决实际问题结合起来,培养理论联系实际的学风;
4、提高程序设计能力、培养自学能力 ;
5、提高分析问题、解决问题的能力;
6、提高收集资料、查找参考书的能力;
7、锻炼书写报告的能力。
三、问题描述及需求分析
本设计的主要完成的是井字棋的人机对弈问题,即计算机与人交替落子,当行、列或对角有连续三个相同一方棋时,则判定一方胜利,若无此情形则为和局。
要完成此设计则需一判定胜负函数及一计算机自行落子函数,一旦这两个函数完成则此程序主要部分可完成。
四、概要设计
完成此程序需一合理数据结构,因其为井字棋游戏程序则此结构中应包含一存储当前棋局的数组;又因计算机在判定在何位置落子最佳时,需一搜索树因而我在设计时设置了一PARENT域和CHILD域;
除了主程序外,它还包括具有以下功能的函数:(1)棋盘初始化函数:void Init();(2)打印棋盘函数:void PrintQP();
(3)用户输入落子位置函数:void UserInput();
(4)判断当前棋局是否有一方获胜,并判断哪一方获胜的函数:int IsWin(State s);(5)评估函数值计算函数:int e_fun(State s);(6)极大极小值算法主函数:int AutoDone()。
五、详细设计
设计步骤:
(1)选定算法;
(2)建立一个简单的应用程序(如字符界面程序)来测试算法;
(3)选定要实现的其他功能(如双人对弈、悔棋、难易级别选定、联机对战等);
第1页
共8页(4)实现井字棋程序。
数据结构设计:
struct
State
该结构表示棋盘的某个状态,也可看做搜索树中的一个节点 { int QP[3][3];
棋盘格局
int e_fun;
当前状态的评估函数值
int child[9];
儿女节点的下标
int parent;
双亲节点的下标
int bestChild;
最优节点(评估函数值最大或最小)的儿女节点下标 } States[MAX_NUM];用来保存搜索树中状态节点的数组
我使用了States[MAX_NUM]数组来保存生成的状态节点,通过State结构中的parent、child域构成了一个搜索树,并通过bestChild域保存了一条从根节点到叶节点的最优解路径。特别的,States[0]作为根节点保存了当前的棋局状态。为了保存当前对弈过程的状态信息,我定义了以下常量:
const int MAX_NUM=1000;
扩展生成状态节点的最大数目 const int NO_BLANK=-1001;表示没有空格 const int TREE_DEPTH=3;
搜索树的最大深度 const int NIL=1001;表示空
算法设计及算法分析:
本程序采用的核心算法是极大极小值算法,这种算法的思想是“考虑双方对弈若干步之后,从可能的走法中选一步相对较好的走法来走”,并且“在有限的搜索深度范围内进行求解”。整个算法在AutoDone函数中实现,其实现过程分为以下几步:
(1)为了获得最优的落子位置,在算法中首先要生成搜索树。其中,我把States[0]作为树根节点,根节点所在的层是极大层(MAX层),然后通过向棋盘中没有落子的空格添一个对方的棋子生成下一层(极小层,MIN层)的树节点,如果当前树的高度大于等于TREE_DEPTH(>=1)全局变量,则停止生成节点,否则则继续生成下一层节点(如果当前节点层为MIN层,则下一层为MAX层,否则,则下一层为MIN层)。生成每一层时可为每一层的属性(MAX或MIN)做标记,生成每个节点时,应计算这个节点的评估函数值,并将其保存在状态节点的e_fun域中。
(2)因为层次遍历会修改非叶节点的极大极小值,而且非叶节点原来的极大极小值会对其来自其子女节点的极大极小值产生影响(比如,如果一个非叶节点的极大极小值大于或小于其子女节点中的最大者或小于其中的最小者,则导致其评估函数值无法更新)。所以非叶节点没有必要也不能保存。这一步的源代码如下所示:
tag=States[s_count].parent;//设置最底层标志,以区分叶节点和非叶节点。
第2页
共8页 for(i=0;i<=s_count;i++){
if(i>tag)//保留叶节点的评估函数值
{
States[i].e_fun=e_fun(States[i]);
}
else //抹去非叶节点的评估函数值
States[i].e_fun=NIL;}(3)然后,通过层次遍历获得每个非叶节点的评估函数值,同时将非叶节点的bestChild域指向最佳子女,从而形成一条从根节点到叶节点的最佳解路径。这一步的源代码如下所示:
while(!IsOK)//寻找最佳落子的循环
{
for(int i=s_count;i>tag;i--)
{
if(max_min)//取子女节点的最大值
{
if(States[States[i].parent].e_fun { States[States[i].parent].e_fun=States[i].e_fun; //设置父母节点的最大最小值 States[States[i].parent].bestChild=i; //设置父母节点的最佳子女的下标 } } else//取子女节点的最小值 { if(States[States[i].parent].e_fun>States[i].e_fun||States[States[i].parent].e_fun==NIL) { States[States[i].parent].e_fun=States[i].e_fun; //设置父母节点的最大最小值 States[States[i].parent].bestChild=i; //设置父母节点的最佳子女的下标 } } } s_count=tag;//将遍历的节点上移一层 max_min=!max_min;//如果该层都是MAX节点,则它的上一层都是MIN节点,反之亦然。 if(States[s_count].parent!=NIL)//如果当前遍历的层中不包含根节点,//则tag标志设为上一层的最后一个节点的下标 第3页 共8页 tag=States[s_count].parent; else IsOK=true; //否则结束搜索 }(4)最后,将当前的棋局更新为其最优子女节点的棋局,并获得落子的位置。这一步的源代码如下所示: //取落子的位置,将x,y坐标保存在变量pos_x和pos_y中,//并将根(当前)节点中的棋局设为最佳子女节点的棋局 for(int x=0;x<3;x++){ for(int y=0;y<3;y++) { if(States[States[0].bestChild].QP[x][y]!=States[0].QP[x][y]) { pos_x=x;pos_y=y; } States[0].QP[x][y]=States[States[0].bestChild].QP[x][y]; } } 在我采用的算法中,可以通过增加生成树的层数,即增加TREE_DEPTH的值来提高计算机的智商。这相当于增加了计算机向前预测的步数。对井字棋来说,因为井字棋有9个格,所以TREE_DEPTH的最大值可以设为9。TREE_DEPTH=3时,计算机会综合考虑以后3步的走法。当TREE_DEPTH=3时,程序生成的最大状态节点数为:1+9+9×8+9×8×7=585个。 总结: 在本程序中的井字棋程序使用了极大极小值算法,这种算法的思想是“考虑双方对弈若干步之后,从可能的走法中选一步相对较好的走法来走”,并且“在有限的搜索深度范围内进行求解”。 最大最小值算法的核心是将搜索树的层分为MAX层和MIN层,MAX层和MIN层交替相邻(即,一个节点如果在MAX层,则其子女节点在MIN层;如果在MIN层,则其子女节点在MAX层),在MAX层的节点的评估函数值取其子女节点中的最大者,在MIN层的节点的评估函数值取其子女节点中的最小者。 此外,需要定义一个评估函数来计算叶节点的评估函数值,要注意将某方获胜的状态节点的评估函数值设为计算机能表示的最大数(无穷大)或最小数(无穷小)以表明在该状态下有一方获胜。 最后,还要“在有限的搜索深度范围内进行求解”,如果搜索深度太大,则在状态数较多的情况下会使时间耗费或空间耗费达到无法忍受的程度。 第4页 共8页 六、测试数据及测试结果 图一:程序初始运行界面 图二:人机对弈初始界面 第5页 共8页 图三:人机对弈一方胜利界面 图四:双人对弈界面 第6页 共8页 图五:双人对弈一方胜利界面 七、课程设计小结 心得体会: 通过本次《数据结构》课程设计,从看到设计要求,到选择课题再到自己构思,设计数据结构,构造算法,编写源代码,再到一个星期的上机调试,我充分认识到书本上的知识只是数据结构的基础知识,认识到将知识有机融合并运用到实际生活中的重要性。 本次课程设计的主要数据结构涉及到树的存储结构,我选择了用数组来存储相关内容,设计了一个parent域和child域。通过本次的课程设计、上机实验,原本对于树的存储结构相对比较生疏的我,现在能较为熟练的掌握树的各种存储结构,并能比较纯熟的选择适合的存储结构。在此次程序调试运行过程中我认识到一个可操作的好的程序必须有个良好的界面,因为只有这样才能实现与用户的互动,便于用户使用,才能充分发挥出一个好程序应有的功效。而一个好的编程工作者,应当在编程之前充分了解用户的需求,使用户能方便使用此程序的各项功能。 当然由于时间比较仓促、所学比较有限,对于此课程设计的模块尚不完全,因此功能还需完善,有较多地方有待改进,希望通过将来的进一步学习,我能完善此程序,将其功能设计的更加完全,能让用户更方便的使用。 存在问题: (1)在游戏进行过程中不能退出游戏界面; (2)双人对弈时不能清楚鉴别两人身份,落子时可能出现错误,且在游戏进行中不可提前判断平局情况; 第7页 共8页(3)不可进行悔棋,人机对弈难度的选择。 改进措施: 双人对弈时可设一姓名判别函数,确定双人身份; 设定判定树提前预测平局情况; 可对树的深度进行设置,借以改变对弈难度; 设一数组保存前一阶段棋局,在悔棋时可调出。 八、用户手册 按键说明: 1:进入人机对弈界面; 2:进入双人对弈界面; 3:退出。 具体说明: (1)进入具体对弈界面后会出现提示信息,按提示信息输入相关内容即可;(2)所输入的棋子的行列号为整数,其分别为11,12,13,21,22,23,31,32,33;其中前一位数为行号,后一位数为列号; (3)盘界面上0代表所在位置为空,若为0则代表此位置可落子;在人机对弈则1代表计算机所落之子,-1代表人所落之子;在双人对弈则1代表第二个人所落之子,-1代表第一人所落之子; (4)双人对弈时需先自行对下棋双方进行编号(1和2),而后根据提示输入谁为先手的信息,进而进入游戏。 注意: (1)进入游戏后不可中途退出游戏,需在决出胜负后按3方可退出;(2)在游戏进行期间若发现所输落子位置出错,可自行更改或按系统出错提示重新输入。 第8页 共8页 assume cs:code data segment;0-83H db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991' ,'1992' db '1993','1994','1995' ;84H-0a7h dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dd 11542,14430,15257,17800 data ends b segment db 32 dup(0)b ends stack segment dw 32 dup(0)stack ends code segment start: mov ax,data ;init ds,ss mov ds,ax mov ax,stack mov ss,ax mov sp,32 ;bx--第几组 si--年份,人数,雇员 di--显示位置 mov bx,0 mov si,0 mov di,0 mov cx,21 lp: push cx ;------------------------- ;年份 mov cx,4;内循环次数 mov si,bx call show_str ;------------------------- ;------------------------- ;收入 mov si,bx add si,84 ;si指向下一个段 call dtoc push ax ; push ds push si push di mov ax,b mov ds,ax mov si,0 add di,40 call show_str pop di pop si pop ds pop ax ;------------------------- ;------------------------- ;收入 mov si,bx add si,84 add si,84 ;pointer to employee 当employee定义为dd时,才能如此寻址,dw时,寻址不正确 call dtoc2 push ax ;pointer to data src push dx push si push di mov ax,b mov ds,ax mov si,0 add di,80 call show_str pop di pop si pop ds pop ax jmp mcon ;------------------------- help: jmp lp ;------------------------- ;平均 mcon: mov ax,data mov ds,ax mov si,bx ;初始化 num1 add si,84 mov ax,ds:[si] add si,2 mov dx,ds:[si] mov si,bx ;初始化 num2 add si,84 add si,84 ;当employee定义为dd时,才能如此寻址,dw时,寻址不正确 mov cx,ds:[si] call divdw push ds ;存放结果 push si push di push cx push ax mov ax,b mov ds,ax mov si,0 pop ax mov ds:[si],ax add si,2 ;inc si ? mov ds:[si],dx mov si,0 call dtoc add di,120 ;显示结果 call show_str pop cx pop di pop si pop ds ;------------------------- add di,160 ;inc bx add bx,4 pop cx loop help mov ax,4c00H int 21H ;主函数结束 ;---------------;-dtoc2 -;-params ds,si--src num(num1 16 bit) -;-return B Segment save num cx--num Length -;---------------dtoc2: push ds push si push ax push bx dc2: mov bx,0 ;save length mov ax,ds:[si] ;初始化 num1 mov dx,0 dccon2: mov cx,10 ;初始化 num2 call divdw add cx,30H push cx ;save extra inc bx push ax or ax,dx mov cx,ax pop ax jcxz dcok2 jmp dccon2 dcok2: mov cx,bx mov ax,b mov ds,ax mov si,0 dcsav2: pop ds:[si] inc si loop dcsav2 mov cx,bx ;result cx--length pop bx pop ax pop si pop ds ret ;---------------;-dtoc -;-params ds,si--src num(num1 32 bit) ;-params cx--length of str ds,si--src di--destination pos -;---------------show_str: push es push ax push si push di push bx push cx mov ax,0b800H;显存地址 mov es,ax mov bl,7 ;颜色 sstr: mov al,ds:[si] mov es:[di],al inc di mov es:[di],bl inc di inc si loop sstr pop cx pop bx pop di pop si pop ax pop es ret ;---------------;-除法函数 ;-余数--cx -;---------------divdw: push bx ddw: push ax mov ax,dx mov dx,0 div cx;商在ax中、余数在dx中 mov bx,ax pop ax div cx mov cx,dx mov dx,bx pop bx ret code ends end start第五篇:王爽语言课程设计一代码