用opencv和vc++6.0开发的五子棋软件

需要的工具如下

1)opencv1.0

2)vc++ 6.0

// wuziqi.cpp : Defines the entry point for the console application.

//
#include "stdafx.h"
#include <windows.h>
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include "windows.h"
#include "stdio.h"

#define up 'w'
#define left 'a'
#define down 's'
#define right 'd'
#define lz 'p'
#define cls 'q'

#include <string.h>
#include <conio.h>

int SCORE[15][15]={0};

struct stu  //定义位置记录结构体
{
int x;
int y;
} weizhi;

int player=2;
int Q[15][15]={0}; //定义数组以记录落子情况

void idtoxy(int id,int &x,int &y)
{
x=id%15;
y=id/15;
}
void xytoid(int &id,int &x,int &y)
{
id=x+15*y;
}

int isc(int w,int b)
{ int sc1[4]={35,800,15000,800000};
int sc2[4]={15,400,1800,100000}; 
if(w==0&&b==0) return  7;
if(w+b==5) return  0;
if(w>=1&&b>=1) return  0;
if(w==0) return sc1[b-1];
if(b==0) return sc2[w-1];
}

int s1(int i,int j,int n)
{
if(j-n>=0&&j-n<=10)
return 1;
else return 0;
}
int score_s1(int i,int j,int n)
{
int w=0; int k;
int b=0;
int score=0;
for(k=0;k<5;k++)
{if(Q[i][j+k-n]==2)  //人
w++;
else if(Q[i][j+k-n]==1)
b++;
}
score+=isc(w,b);
return score;
}
int s2(int i,int j,int n)
{
if(i-n>=0&&i-n<=10)
return 1;
else return 0;
}
int score_s2(int i,int j,int n)
{
int w=0; int k;int b=0;
int score=0;
for(k=0;k<5;k++)
{if(Q[i+k-n][j]==2)  //人
w++;
else if(Q[i+k-n][j]==1)
b++;
}
score+=isc(w,b);
return score;
}
int s3(int i,int j,int n)
{
// if(n==0 && i>=0 i<=10  && j>=0 j<=10 )
if( i>=n&& i<=10+n  && j>=n && j<=10+n )
return 1;
return 0;
}
int score_s3(int i,int j,int n)
{
int w=0; int k;int b=0;
int score=0;

for(k=0;k<5;k++)
{if(Q[i+k-n][j+k-n]==2)  //人
w++;
else if(Q[i+k-n][j+k-n]==1)
b++;
}
score+=isc(w,b);
return score;
}
int s4(int i,int j,int n)
{
// if(n==0 && i>=0 i<=10  && j>=0 j<=10 )
if( i>=n&& i<=10+n  && j>=4-n && j<=14-n )
return 1;
return 0;
}

int score_s4(int i,int j,int n)
{
int w=0; int k;int b=0;
int score=0;
for(k=0;k<5;k++)
{if(Q[i+k-n][j-k+n]==2)  //人
w++;
else if(Q[i+k-n][j-k+n]==1)
b++;
}
score+=isc(w,b);
//if(score!=7) printf("x:%d y:%d score:%d",i,j,score);
return score;
}

void gotoxy(int x, int y) //建立坐标函数 
{   
COORD c;   
c.X=2*x;   
c.Y=y; 
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); //修改当前光标的位置
}
void ai(int &mx,int &my)
{
//struct yuanzu na[1000];
int i,j,n; 
int max=0; //int mx;int my;
//水平
int index=0;
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
if(Q[i][j]!=0)
continue;
int sum=0; int hh=0;
for(n=0;n<5;n++)
{
hh=s1(i,j,n)*score_s1(i,j,n); //printf(<<mx<<"\t"<<my<<endl;
sum+=hh;
}
for(n=0;n<5;n++)
{
hh=s2(i,j,n)*score_s2(i,j,n); //printf(<<mx<<"\t"<<my<<endl;
sum+=hh;
}
for(n=0;n<5;n++)  //左斜
{
hh=s3(i,j,n)*score_s3(i,j,n);
sum+=hh;
}
for(n=0;n<5;n++)
{
hh=s4(i,j,n)*score_s4(i,j,n);
sum+=hh;
}
//SCORE[i][j]=sum;
if(sum>max)
{max=sum;// printf("max:%d",max);
mx=i;
my=j;}
}
}
// gotoxy(19,19);
// printf("x:%d y:%d max:%d\n",mx,my,max);
}
/*
void drawqipan() //绘制棋盘及数据初始化
{
int i,j;
system("cls"); //清除屏幕
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
Q[i][j]=0;
printf("十");
}
printf("\n");
}
weizhi.x=0;weizhi.y=0; //程序数据初始化
gotoxy(0,0);
}

void jilu() //记录落子情况
{
Q[weizhi.x][weizhi.y]=2;
if(player)
{
player=0;  //玩家变换
return;
}
player=1;
}

int cluozi(int x,int y) //由电脑落子时调用
{
weizhi.x=x;weizhi.y=y;
gotoxy(weizhi.x,weizhi.y);
if(Q[weizhi.x][weizhi.y]==0) //判断当前位置是否已经落子
{
jilu();
printf("○");
gotoxy(weizhi.x,weizhi.y);
}
return 0;
}*/
/*
void luozi() //玩家落子
{
if(Q[weizhi.x][weizhi.y]==0) //判断当前位置是否已经落子
{
if(player)
{
jilu();
printf("●"); 
gotoxy(weizhi.x,weizhi.y);
}
//else
{ int x,y;
ai(x,y);
gotoxy(x,y);
//jilu();
printf("○");
Q[x][y]=1;
player=1;
} }
}
*/

int checkWin() //检查游戏是否有输赢
{
int p;
int r,c,rr,cc,count=0;
p=player==2?2:1;
for(c=0;c<15;c++)
{
for(r=0;r<15;r++)
{
if(Q[r][c]!=p)
continue;
//检查列
rr=r;cc=c;
while(--cc>=0 &&Q[rr][cc]==p)count++;  cc=c;
while(++cc<20 &&Q[rr][cc]==p)count++;  cc=c;
if(count+1>=5)
return p;
//检查行
count=0;
while(--rr>=0 &&Q[rr][cc]==p)count++;  rr=r;
while(++rr<20 &&Q[rr][cc]==p)count++;  rr=r;
if(count+1>=5)
return p;
//检查反斜边
count=0;
cc--;rr--;
while((cc>=0||rr>=0) &&Q[rr][cc]==p){count++;cc--;rr--;}  rr=r;cc=c;
cc++;rr++;
while((cc<20||rr<20) &&Q[rr][cc]==p){count++;cc++;rr++;}  rr=r;cc=c;
if(count+1>=5)
return p;
count=0;
//检查正斜边
count=0;
cc++;rr--;
while((cc<20||rr>=0) &&Q[rr][cc]==p){count++;cc++;rr--;}  rr=r;cc=c;
cc--;rr++;
while((cc>=0||rr<20) &&Q[rr][cc]==p){count++;cc--;rr++;}  rr=r;cc=c;
if(count+1>=5)
return p;
count=0;
}
}
return 0;
}
/*
void Keypress(char n) //光标位置移动
{
switch(n)
{
case up:if(weizhi.y<=0)weizhi.y=19;else weizhi.y--;gotoxy(weizhi.x,weizhi.y);break;
//向上移动光标
case left:if(weizhi.x<=0)weizhi.x=19;else weizhi.x--;gotoxy(weizhi.x,weizhi.y);break;
//向左移动光标
case right:if(weizhi.x>=19)weizhi.x=0;else weizhi.x++;gotoxy(weizhi.x,weizhi.y);break;
//向右移动光标
case down:if(weizhi.y>=19)weizhi.y=0;else weizhi.y++;gotoxy(weizhi.x,weizhi.y);break;
//向下移动光标
case lz:luozi();break;
//开始落子操作
case cls:drawqipan();break;
//重新开始
}
}*/
int fx=20;
int fy=20;
IplImage* painty;
int num=0;
char nums[10];

//IplImage* src=0;  
void drawai()
{
//else
cvWaitKey(1000); 
player=1;
int x1,y1;
ai(x1,y1);
//gotoxy(x,y);
//jilu();
//printf("○");
CvFont font;    
cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5, 0, 0, 1);    
sprintf(nums,"%d",num++);
cvCircle(painty, cvPoint(fy+y1*30,fx+x1*30), 15,CV_RGB(255, 0,0) ,CV_FILLED, CV_AA, 0 );  
cvPutText(painty, nums, cvPoint(fy+y1*30-10,fx+x1*30+5), &font, CV_RGB(0,0,0));
cvShowImage( "src", painty ); 
Q[x1][y1]=1;
int winer=checkWin();
if(winer!=0)
{
if(winer==2)
printf("the side of player ● wins\n");
else if(winer==1)
printf("the side of ai ○ wins\n");
}
player=2;
}

void onMouse(int event,int x,int y,int flags,void* param )
{
    // printf("( %d, %d) ",x,y);
 if( event == CV_EVENT_LBUTTONDOWN )  
    {  
        //CvPoint pt = cvPoint(x,y);  
        //char temp[16];  
        //sprintf(temp,"(%d,%d)",pt.x,pt.y);  
        //cvPutText(painty,temp, pt, &font, cvScalar(255, 255, 255, 0));  
//printf("The Event is : %d ",event);
//printf("The flags is : %d ",flags);
//printf("The param is : %d\n",param);
int x1,y1;
//luozi();
//ai(x1,y1);
//weizhi.y=y1;
//weizhi.x=x1;
weizhi.y=(x+15-fy)/30;
weizhi.x=(y+15-fx)/30;
//printf("%d %d\n",weizhi.x,weizhi.y);
if(Q[weizhi.x][weizhi.y]==0) //判断当前位置是否已经落子
{
if(player==2)
{
//jilu();
Q[weizhi.x][weizhi.y]=2;
CvFont font;    
sprintf(nums,"%d",num++);
cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5, 0, 0, 1);   
cvCircle( painty, cvPoint(fy+weizhi.y*30, fx+weizhi.x*30), 15,CV_RGB(0, 0,0) ,CV_FILLED, CV_AA, 0 ); 
cvPutText(painty, nums, cvPoint(fy+weizhi.y*30-10, fx+weizhi.x*30+5), &font, CV_RGB(0,0,255));

cvShowImage( "src", painty ); 
printf("==="); 
int winer=checkWin();
if(winer!=0)
{
if(winer==2)
printf("the side of player ● wins\n");
else if(winer==1)
printf("the side of ai ○ wins\n");
}//gotoxy(weizhi.x,weizhi.y);
}
drawai();
}
    }   
}

/*void on_mouse( int event, int x, int y, int flags, void* ustc)  
{  
    CvFont font;  
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);  
          
    if( event == CV_EVENT_LBUTTONDOWN )  
    {  
        CvPoint pt = cvPoint(x,y);  
        char temp[16];  
        sprintf(temp,"(%d,%d)",pt.x,pt.y);  
        cvPutText(painty,temp, pt, &font, cvScalar(255, 255, 255, 0));  
        cvCircle( painty, pt, 5,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
       
    }   
}  
  */
int main2()  
{  
painty=cvCreateImage( cvSize(fx+450,fy+450),IPL_DEPTH_8U, 3 );;               //vital
//cvZero(painty);
//if(type==1)
cvNot(painty,painty);
cvNamedWindow("src",1); 
cvSetMouseCallback( "src", onMouse, 0 ); 
for(int i=0;i<15;i++)
{cvLine(painty, cvPoint(fx+i*30,fy+0), cvPoint(fx+i*30,fy+420), cvScalar(0,0,0), 1,8, 0 );
cvLine(painty, cvPoint(fx+0,fy+i*30), cvPoint(fx+420,fy+i*30),cvScalar(0,0,0), 1,8, 0 );
}
cvShowImage( "src", painty );  
//cvShowImage("src",painty); 
cvWaitKey(0); 
    //src=cvLoadImage("lena.jpg",1);  
    cvDestroyAllWindows();  
    cvReleaseImage(&painty);  
  
    return 0;  
}  
main()
{
main2();
/* char press;
int winer=0;
system("color 2f");
l: drawqipan();
press=getch();
while(1)
{
Keypress(press);
if(press=='p')
winer=checkWin();
if(winer!=0)
gotoxy(0,15);
if(winer==2)
printf("the side of player ● wins\n");
else if(winer==1)
printf("the side of ai ○ wins\n");
else
{
// if(player==0)
// {
// //cluozi(1,2); //此处落子由电脑控制
// }
press=getch();
continue;
}
printf("do you want to play again?(y/n):");
p: press=getch();
if(press=='n')
break;
else if(press=='y')
{
winer=0;
goto l;
}
else
goto p;
}
*/

}

完整代码运行效果如下

用opencv和vc++6.0开发的五子棋游戏软件相关推荐

  1. java游戏演示ppt_java项目开发实战──五子棋游戏.ppt

    java项目开发实战──五子棋游戏.ppt 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 第 24 ...

  2. c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt

    C语言复习和VC6.0开发环境推荐 * * * * * * * * * F10-单步调试 F11-进入函数内部调试 Shift+F11-从函数内部回到调用函数(如main) Ctrl+F10-运行到光 ...

  3. 基于VC++6.0开发俄罗斯方块(五)

    开始游戏 一.开始游戏模块概述 二.显示俄罗斯方块 注意:开始游戏之后,俄罗斯方块会显示在游戏窗口和右侧的方块预览界面上,这两部分是有联系的,在方块的预览界面上出现的方块类型,就是在游戏窗口下一个会出 ...

  4. VC++6.0开发环境之快捷键

    F1: 帮助 Ctrl+O :Open Ctrl+P :Print Ctrl+N :New Ctrl+Shift+F2 :清除所有书签 F2 :上一个书签 Shift+F2 :上一个书签 Alt+F2 ...

  5. 从VC 6.0移植代码到VS C++ 2005得出的一些经验

    作者:朱金灿 来源:blog.csdn.net/clever101 最近将一个系统的源码从VC 6.0移植到VS C++ 2005上,从而得出了一些经验.不同编译平台的代码移植(这里指从低版本的编译器 ...

  6. 入门学习C语言需要使用vc++6.0吗?

    提到VC++便会顺带提一下网上吐槽最多到谭浩强的C语言教材,回顾我以前入门学习C语言到的时候,看的第一本书也是这一本. 这么多年过去了,尽管网上吐槽得很多,但很多大学还是使用这一本教材,还在使用VC+ ...

  7. 【181122】VC++开发的CAD绘图软件EastDraw源代码

    源码下载简介 一款工程CAD绘图软件EastDraw的源代码,VC++6.0开发编写,功能还是比较强大的,演示可看截图.在VC6.0下编译通过.源码有很高的学习价值,它可以用来绘制平画图形,直线.矩形 ...

  8. VC++6.0的简单使用!(保姆级)

    VC++6.0的简单使用!(保姆级) 新建文件夹 这个文件夹来存放新建的C文件,便于之后的整理. 此文件夹放在一个自己容易找到的地方,比如桌面! 打开VC++6.0新建C文件 打开软件后,点击左上角文 ...

  9. c语言五子棋开题报告,基于VC的五子棋游戏的设计与实现(附答辩记录)

    基于VC的五子棋游戏的设计与实现(附答辩记录)(包含选题审批表,任务书,开题报告,中期检查报告,毕业论文12300字,程序) 摘 要:以计算机技术和网络技术为核心的现代网络技术已在现实生活和生产中得以 ...

最新文章

  1. 我与我的专业计算机作文500字,我的好朋友——电脑
  2. truncate报ORA-02266错“唯一/主键被启用的外部关键字引用”解决方法
  3. Retrofit学习笔记
  4. 我结婚了,我要用什么做个邀请函呢?【iVX无代码YYDS 06】
  5. 【李宏毅2020 ML/DL】P62-65 More about Auto-encoder
  6. mysql optimize 用法_mysql中OPTIMIZE TABLE的作用
  7. mac osx 下gcc升级导致sac101.6a编译失败解决办法
  8. Fritzing软件绘制Arduino面包板接线图传感器模块库文件170
  9. workbench焊接实例_基于ANSYS Workbench平台和ANSYS经典界面的焊接仿真-工业电子-与非网...
  10. 【架构】分布式架构介绍及实现(简略)
  11. JavaWeb学习笔记4
  12. Latex 数学符号速查字典(第2版)
  13. 怎么更换linux桌面管理,切换窗口管理器/桌面环境?
  14. 从表征到行动---意向性的自然主义进路(续三)
  15. CentOS7 和 Ubuntu16 安装、配置并挂载 NFS
  16. 海量数据荣获华为“中国政企数据存储优秀合作伙伴”金奖
  17. 精通cobol--9.3.1 OCCURS语句的使用方法
  18. 深圳大学大学计算机考试科目,深圳大学计算机考研科目有哪些
  19. 使用PyQT进行可视化编程
  20. 计算机扩大C盘分区容量,电脑c盘空间太小,用分区软件把c盘扩大10g随后开机就这样了,怎么搞...

热门文章

  1. Jmeter对Web Socket进行压力测试 —— 200人直播课实战经验
  2. JAVA打字小游戏,面向对象完成
  3. 模拟电路学习常用原件之电阻的作用和仿真
  4. java 简单的聊天室_Java简单聊天室
  5. 银行案例启示:莫把客户投诉当小事
  6. 最优化--等式约束最优性条件
  7. Dmoz对Google的PageRank影响(转)
  8. 【前端 H5】网页H5 调用微信支付和支付宝支付 流程
  9. 鸿蒙系统 智能手表,wear os智能手表和鸿蒙系统智能手表对比
  10. Ubuntu 18.04安装openJDK7编译安卓6.0.0_r1