#include<stdio.h>
#include<windows.h>
#include <stdlib.h>
#include<conio.h>
void computer(int a[][10])
{
int i,j,count=0,n,m,k,max,x,y,max2,x1,y1,f=0;
int b[10][10][4],c[10][10][4];//两个三维数组,分别用来记录电脑,玩家的棋型
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<4;k++){
b[i][j][k]=0;
c[i][j][k]=0;
}
}
}
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
if(a[i][j]==0)
{
a[i][j]=1;//假设电脑放此位置
n=i;m=j;count=0;
while(a[n][m]==1 && m>=1)//横
{
count++;
m--;
}n=i;m=j+1;
while(a[n][m]==1 && m<=9)
{
count++;
m++;
}
if(count==4 && a[n][m]!=0 && a[n][m-5]!=0)//若能连成4个但是两端若都没空位置,此时评分为0
{
count=0;
}
b[i][j][0]=count;
n=i;m=j;count=0;
while(a[n][m]==1 && n>=1)//竖
{
count++;
n--;
}n=i+1;m=j;
while(a[n][m]==1 && n<=9)
{
count++;
n++;
}
if(count==4 && a[n][m]!=0 && a[n-5][m]!=0)
{
count=0;
}
b[i][j][1]=count;
n=i;m=j;count=0;
while(a[n][m]==1 && n>=1 && m>=1)//右斜
{
count++;
n--;m--;
}n=i+1;m=j+1;
while(a[n][m]==1 && n<=9 && m<=9)
{
count++;
n++;m++;
}
if(count==4 && a[n][m]!=0 && a[n-5][m-5]!=0)
{
count=0;
}
b[i][j][2]=count;
n=i;m=j;count=0;
while(a[n][m]==1 && n>=1 && m<=9)//左斜
{
count++;
n--;m++;
}n=i+1;m=j-1;
while(a[n][m]==1 && n<=9 && m>=1)
{
count++;
n++;m--;
}
if(count==4 && a[n][m]!=0 && a[n-5][m+5]!=0)
{
count=0;
}
b[i][j][3]=count;
a[i][j]=2;//假设玩家放此位置
n=i;m=j;count=0;
while(a[n][m]==2 && m>=1)//横
{
count++;
m--;
}n=i;m=j+1;
while(a[n][m]==2 && m<=9)
{
count++;
m++;
}
if(count==4 && a[n][m]!=0 && a[n][m-5]!=0)
{
count=0;
}
c[i][j][0]=count;
n=i;m=j;count=0;
while(a[n][m]==2 && n>=1)//竖
{
count++;
n--;
}n=i+1;m=j;
while(a[n][m]==2 && n<=9)
{
count++;
n++;
}
if(count==4 && a[n][m]!=0 && a[n-5][m]!=0)
{
count=0;
}
c[i][j][1]=count;
n=i;m=j;count=0;
while(a[n][m]==2 && n>=1 && m>=1)//右斜
{
count++;
n--;m--;
}n=i+1;m=j+1;
while(a[n][m]==2 && n<=9 && m<=9)
{
count++;
n++;m++;
}
if(count==4 && a[n][m]!=0 && a[n-5][m-5]!=0)
{
count=0;
}
c[i][j][2]=count;
n=i;m=j;count=0;
while(a[n][m]==2 && n>=1 && m<=9)//左斜
{
count++;
n--;m++;
}n=i+1;m=j-1;
while(a[n][m]==2 && n<=9 && m>=1)
{
count++;
n++;m--;
}
if(count==4 && a[n][m]!=0 && a[n-5][m+5]!=0)
{
count=0;
}
c[i][j][3]=count;
a[i][j]=0;//假设完毕后还原棋盘
}
}
}
max=b[0][0][0];//找出两个棋型中,所能连成的棋的个数最大的一个位置,则为电脑下棋的位置。
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<4;k++){
if(b[i][j][k]>max)
{
max=b[i][j][k];
x=i;y=j;
}
}
}
}
max2=c[0][0][0];
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<4;k++){
if(c[i][j][k]>max2)
{
max2=c[i][j][k];
x1=i;y1=j;
}
}
}
}
if(max>max2)
{
a[x][y]=1;printf("电脑:<%d,%d>\n",x,y);
}
else{
a[x1][y1]=1;printf("电脑:<%d,%d>\n",x1,y1);}
}
int IsWin(int a[][10])
{
int i,j,n,m,count=0,f=0;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
if(a[i][j]==1)//判断赢的方法就是遍历每颗棋的各个方向上的棋数是否为大于等于5
{
n=i;m=j;count=0;//横
while(a[n][m]==1 && m>=1)
{
count++;
m--;
}n=i;m=j+1;
while(a[n][m]==1 && m<=9)
{
count++;
m++;
}
if(count>=5)
return 1;
n=i;m=j;count=0;//竖
while(a[n][m]==1 && n>=1)
{
count++;
n--;
}n=i+1;m=j;
while(a[n][m]==1 && n<=9)
{
count++;
n++;
}
if(count>=5)
return 1;
n=i;m=j;count=0;//左斜
while(a[n][m]==1 && n>=1 && m>=1)
{
count++;
n--;m--;
}n=i+1;m=j+1;
while(a[n][m]==1 && n<=9 && m<=9)
{
count++;
n++;m++;
}
if(count>=5)
return 1;
n=i;m=j;count=0;//右斜
while(a[n][m]==1 && n>=1 && m<=9)
{
count++;
n--;m++;
}n=i+1;m=j-1;
while(a[n][m]==1 && n<=9 && m>=1)
{
count++;
n++;m--;
}
if(count>=5)
return 1;
}
else if(a[i][j]==2)
{
n=i;m=j;count=0;
while(a[n][m]==2 && m>=1)
{
count++;
m--;
}n=i;m=j+1;
while(a[n][m]==2 && m<=9)
{
count++;
m++;
}
if(count>=5)
return 2;
n=i;m=j;count=0;
while(a[n][m]==2 && n>=1)
{
count++;
n--;
}n=i+1;m=j;
while(a[n][m]==2 && n<=9)
{
count++;
n++;
}
if(count>=5)
return 2;
n=i;m=j;count=0;
while(a[n][m]==2 && n>=1 && m>=1)
{
count++;
n--;m--;
}n=i+1;m=j+1;
while(a[n][m]==2 && n<=9 && m<=9)
{
count++;
n++;m++;
}
if(count>=5)
return 2;
n=i;m=j;count=0;
while(a[n][m]==2 && n>=1 && m<=9)
{
count++;
n--;m++;
}n=i+1;m=j-1;
while(a[n][m]==2 && n<=9 && m>=1)
{
count++;
n++;m--;
}
if(count>=5)
return 2;
}
}
}
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
if(a[i][j]==0){f=1;break;}
}
if(f==1)break;
}
if(f==0)return 3;
return 0;
}
main()
{
int a[10][10];
int i,j,b=49,v,x,y;
a[0][0]=5;
printf(" 五子棋\n 说明:%c代表电脑,%c代表玩家,输入坐标中间空格隔开,竖坐标是x,横坐标是y,玩家先手,不考虑禁手。注:初级水平!\n",1,2);
for(i=1;i<=9;i++)
{
a[0][i]=b;
a[i][0]=b;
b++;
}
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
a[i][j]=0;
}
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
printf("%c ",a[i][j]);
printf("\n");
}
while(1)
{
while(1)
{
scanf("%d%d",&x,&y);
if(a[x][y]==0)break;
else if(a[x][y]!=0 ){printf("wrong!\n");}
}
a[x][y]=2;
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
printf("%c ",a[i][j]);
printf("\n");
}
v=IsWin(a);
if(v==1){
printf("电脑胜利!\n");getch();break;}
else if(v==2){
printf("玩家胜利!\n");getch();break;}
else if(v==3){printf("平局!\n");getch();break;}system("cls");
computer(a);
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
printf("%c ",a[i][j]);
printf("\n");
}
v=IsWin(a);
if(v==1){
printf("电脑胜利!\n");getch();break;}
else if(v==2){
printf("玩家胜利!\n");getch();break;}
else if(v==3){printf("平局!\n");getch();break;}
}
}
控制台简易c语言五子棋小游戏
5星 · 超过95%的资源 需积分: 12 131 浏览量
2012-07-12
19:46:16
上传
评论 1
收藏 39KB RAR 举报
yoshin_me
- 粉丝: 28
- 资源: 8
最新资源
- 服务器概述服务器概述服务器概述服务器概述.txt
- 华中农业大学python实验题.txt
- 海康威视相机采图交叉编译示例程序,c++
- DETR-基于Tensorflow实现DETR目标检测算法-附流程教程+项目源码-优质项目实战.zip
- 3d激光slam地图发布程序,3d地图点云处理,c++程序
- 送给妈妈的一束鲜花.zip(母亲节祝福HTML源码)
- 稀疏化DETR-基于Pytorch实现稀疏化DETR-SparseDETR-附流程教程+项目源码-优质项目实战.zip
- 人工分类:SLTM的微博评论二分类数据集
- (自适应手机端)响应式房产合同知识产权网站pbootcms模板 企业管理类网站源码下载.zip
- (自适应手机端)响应式动力刀座pbootcms网站模板 五金机械设备类网站源码下载.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈