| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 795 人关注过本帖
标题:求助!
只看楼主 加入收藏
SuperFreshMan
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2004-5-29
收藏
 问题点数:0 回复次数:4 
求助!

!这是本人做的黑白棋,已经可以正常运行了,但是在“落子”是还有错误,比如:白棋在黑棋右边不能落子,黑棋斜向不能落子等等,希望各位大虾帮帮小弟,看看到底哪里错了阿,谢谢了先~~~

以下是源程序:

#include"graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值*/ #define RIGHT 0x4d00 /*光标右键值*/ #define DOWN 0x5000 /*光标下键值*/ #define UP 0x4800 /*光标上键值*/ #define Esc 0x011b /*Esc键值*/ #define ENTER 0x01c0d /*回车键值*/ int a[8][8]={0},key,score1,score2; /*具体分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3]; /*两个人的得分转换成字符串输出*/ void playtoplay(void); /*双人对战函数*/ void DrawBattle(void); /*画棋盘函数*/ void SetPlayColor(int x); /*设置棋子第一次的颜色*/ void MoveColor(int x,int y); /*恢复原来的棋盘状态*/ int BattleChange(int x,int y,int z); /*判断棋盘的变化*/ void DoScore(void); /*处理分数*/ void PrintScore(int n); /*输出成绩*/ void PrintWin(void); /*输出胜者信息*/

void main(void) /*主函数*/ { int gd=DETECT,gr; initgraph(&gd,&gr,"c:\\tc"); DrawBattle(); playtoplay(); getch(); closegraph(); }

void DrawBattle() /*画棋盘*/ { int i,j; score1=score2=0; setbkcolor(BLUE); for(i=100;i<=420;i+=40) { line(100,i,420,i); /*水平线*/ line(i,100,i,420); /*垂直线*/ } setcolor(0); setfillstyle(SOLID_FILL,15); fillellipse(500,200,15,15); setfillstyle(SOLID_FILL,8); fillellipse(500,300,15,15); a[3][3]=a[4][4]=1; /*初始白棋*/ a[3][4]=a[4][3]=2; /*初识黑棋*/ setfillstyle(SOLID_FILL,WHITE); fillellipse(120+3*40,120+3*40,15,15); fillellipse(120+4*40,120+4*40,15,15); setfillstyle(SOLID_FILL,8); fillellipse(120+3*40,120+4*40,15,15); fillellipse(120+4*40,120+3*40,15,15); score1=score2=2; DoScore(); }

void playtoplay() /*双人对战*/ { int x,y,t=1,i,j,cc=0; while(1) /*交换玩家*/ { x=120,y=80; /*棋子初始坐标*/ while(1) /*玩家走棋过程*/ { PrintScore(1); PrintScore(2); SetPlayColor(t); fillellipse(x,y,15,15); key=bioskey(0); if(key==Esc) /*退出游戏*/ break; else if(key==ENTER) /*回车下子*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120/40)][(y-120)/40]!=2) /*位置无棋子*/ { if(t%2==1) /*玩家1*/ a[(x-120)/40][(y-120)/40]=1; else /*玩家2*/ a[(x-120)/40][(y-120)/40]=2; if(!BattleChange(x,y,t)) { a[(x-120)/40][(y-120)/40]=0; /*恢复空格状态*/ cc++; /*统计尝试次数*/ if(cc>=64-score1-score2) /*尝试超过空格则停步*/ { MoveColor(x,y); fillellipse(x,y,15,15); break; } else continue; } DoScore(); break; /*因为棋盘变化交换玩家*/ } else continue; } else /*方向键判断*/ if(key==LEFT&&x>120) /*左键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x-=40; fillellipse(x,y,15,15); } else if(key==RIGHT&&x<400&&y>80) /*右键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x+=40; fillellipse(x,y,15,15); } else if(key==UP&&y>120) /*上键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y-=40; fillellipse(x,y,15,15); } else if(key==DOWN&&y<400) /*下键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y+=40; fillellipse(x,y,15,15); } } if(key==Esc) break; if((score1+score2)==64||score1==0||score2==0) /*棋子已满或一方棋子为零*/ { PrintWin(); break; } t=t%2+1; /*一方下子后改变棋子颜色交换玩家*/ cc=0; /*计数清零*/ } /*endwhile*/ }

void SetPlayColor(int t) /*设置棋子颜色*/ { if(t%2==1) setfillstyle(SOLID_FILL,15); else setfillstyle(SOLID_FILL,8); }

void MoveColor(int x,int y) /*下子后恢复原来状态*/ { if(y<100) setfillstyle(SOLID_FILL,BLUE); else switch(a[(x-120)/40][(y-120)/40]) { case 1: /*恢复白子*/ setfillstyle(SOLID_FILL,15); break; case 2: /*恢复黑子*/ setfillstyle(SOLID_FILL,8); break; default: /*恢复棋盘*/ setfillstyle(SOLID_FILL,BLUE); } }

int BattleChange(int x,int y,int t) /*棋盘变化*/ { int i,j,k,kk,ii,jj,yes; yes=0; i=(x-120)/40; /*数组元素行下标*/ j=(y-120)/40; /*数组元素列下标*/ SetPlayColor(t); /*8个方向变化判断*/ if(j<6) /*右边*/ { for(k=j+1;k<8;k++) if(a[i][k]==a[i][j]||a[i][k]==0) /*遇自己棋子或空格结束*/ break; if(a[i][k]!=0&&k<8) { for(kk=j+1;kk<k&&k<8;kk++) /*判断*/ { a[i][kk]=a[i][j]; /*改变棋子颜色*/ fillellipse(120+i*40,120+kk*40,15,15); } if(kk!=j+1) yes=1; } } if(j>1) /*左边*/ { for(k=j-1;k>=0;k--) if(a[i][k]==a[i][j]||!a[i][k]) break; if(a[i][k]!=0&&k>=0) { for(kk=j-1;kk>k&&k>=0;kk--) { a[i][kk]=a[i][j]; fillellipse(120+i*40,120+kk*40,15,15); } if(kk!=j-1) yes=1; } } if(i<6) /*下边*/ { for(k=i+1;k<8;k++) if(a[k][j]==a[i][j]||!a[k][j]) break; if(a[k][j]!=0&&k<8) { for(kk=i+1;kk<k&&k<8;kk++) { a[kk][j]=a[i][j]; fillellipse(120+kk*40,120+j*40,15,15); } if(kk!=i+1) yes=1; } } if(i>1) /*上边*/ { for(k=i-1;k>=0;k++) if(a[k][j]==a[i][j]||!a[k][j]) break; if(a[k][j]!=0&&k>=0) { for(kk=i-1;kk>k&&k>=0;kk--) { a[kk][j]=a[i][j]; fillellipse(120+kk*40,120+j*40,15,15); } if(kk!=i-1) yes=1; } } if(i>1&&j<6) /*右上*/ { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]&&k>=0&&kk<8) { for(ii=i-1,jj=j+1;ii<k&&k>=0;ii--,jj++) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i-1) yes=1; } } if(i<6&&j>1) /*左下*/ { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]!=0&&k<8&&kk>=0) { for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,1020+jj*40,15,15); } if(ii!=i+1) yes=1; } } if(i>1&&j>1) /*左上*/ { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]!=0&&k>=0&&kk>=0) { for(ii=i-1,jj=j-1;ii>k&&kk>=0;ii--,jj--) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i-1) yes=1; } } if(i<6&&j<6) /*右下*/ { for(k=i+1,kk=j+1;k<8&&kk<8;k++,kk++) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]!=0&&kk<8&&k<8) { for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i+1) yes=1; } } return yes; /*返回是否改变过棋子颜色的标记*/ }

void DoScore() /*处理分数*/ { int i,j; score1=score2=0; /*重新计分*/ for(i=0;i<8;i++) for(j=0;j<8;j++) if(a[i][j]==1) /*分别统计两个人的分数*/ score1++; else if(a[i][j]==2) score2++; }

void PrintScore(int playnum) /*输出成绩*/ { if(playnum==1) /*清除以前成绩*/ { setfillstyle(SOLID_FILL,BLUE); bar(550,100,640,400); } setcolor(RED); settextstyle(0,0,4); /*文本输出样式*/ if(playnum==1) /*判断棋手、输出位置*/ { sprintf(playone,"%d",score1); outtextxy(550,200,playone); } else { sprintf(playtwo,"%d",score2); outtextxy(550,300,playtwo); } setcolor(0); }

void PrintWin() /*输出胜者信息*/ { settextstyle(0,0,4); setcolor(12); if(score2>score1) /*判断最后结果*/ outtextxy(100,50,"black win!"); else if(score2<score1) outtextxy(100,50,"white win!"); else outtextxy(60,50,"you all win!"); }

搜索更多相关主题的帖子: 黑白棋 define 光标 落子 黑棋 
2004-05-29 16:47
deepblue
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2004-12-15
收藏
得分:0 

我也写了一个。很差劲。

不过落子方面解决的还可以。

2004-12-17 18:02
deepblue
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2004-12-15
收藏
得分:0 

/**********************************************/ /* 黑白棋源代码 */ /* TC2.0下运行通过 */ /* 走子策略采用边角权值算法 */ /*********************************************/

/**************************************************************/ /***最小方块是:单个的一个方块 */ /***当前方块是:目前正在移动的由四个小方块组成的方块 */ /*下一个方块是:下一个将要成为当前方块的由四个小方块组成的方块*/ /**************************************************************/

# include <stdio.h> # include <dos.h> # include <conio.h> # include <graphics.h> # include <stdlib.h> # include <time.h>

# define BGCOLOR 1 /* 背景颜色*/ # define COLOR_WHITECHESS 0 /*白棋棋子的颜色*/ # define COLOR_BLACKCHESS 15 /*黑棋棋子的颜色*/ # define COLOR_LINE 15 /*棋盘线的颜色*/

# define MINBOXSIZE 30 /*棋盘每一格边长*/ # define MAXSIZE 300 /*棋盘的大小 (1+8+1)*25 */ # define SCCOL 50 /*棋盘左上角的坐标*/ # define SCROW 60

/* 按键码*/ # define VK_LEFT 0x4b00 # define VK_RIGHT 0x4d00 # define VK_DOWN 0x5000 # define VK_UP 0x4800 # define VK_SPACE 0x3920 # define VK_ESC 0x011b

/*初始棋盘布局*/ int gril[10][10]= {{0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,1,2,0,0,0,0}, {0,0,0,0,2,1,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0} };

int gril_value[10][10]= {{0,0,0,0,0,0,0,0,0,0}, {0,26,1,16,3,3,16,1,26,0}, {0,1,1,3,3,3,3,1,1,0}, {0,16,3,6,3,3,6,3,16,0}, {0,3,3,3,3,3,3,3,3,0}, {0,3,3,3,3,3,3,3,3,0}, {0,16,3,6,3,3,6,3,16,0}, {0,1,1,3,3,3,3,1,1,0}, {0,26,0,16,3,3,16,1,26,0}, {0,0,0,0,0,0,0,0,0,0}, };

int num_user=2; /*得分统计*/ int num_computer=2;

int gbwzc=5,gbwzr=5; /*光标的初始位置*/ int present_p_v[10][10];/*当前格的位置及其权值*/

char again='0';/*用来判断游戏是否需要重新开始*/ /*********************************************************************/ /*功能:初始化图形模式 */ /*调用TC中initgraph(&gdrive,&gmode,"E:\\Turboc\\")函数 */ /*********************************************************************/ void init(int gdrive,int gmode) { int errorcode; initgraph(&gdrive,&gmode,"E:\\Turboc\\");

errorcode=graphresult(); if(errorcode!=grOk)/*出错处理!*/ { printf("error of: %s",grapherrormsg(errorcode)); exit(1); } }

/**************************/ /*功能:在图形模式下的清屏*/ /*将屏幕用黑色填充 */ /**************************/ void cls() { setfillstyle(SOLID_FILL,0); /*用黑色进行实填充*/ setcolor(0); /*设置前景颜色 */ bar(0,0,640,480); /*0,0为屏幕左上角,屏幕宽为640,长为480*/ }

/*************************************/ /*功能:在图形模式下的高级清屏 */ /*它能填充指定颜色color的指定大小的矩*/ /*形框从(a,b)到(c,d) */ /*************************************/ void clscr(int a,int b,int c,int d,int color) { setfillstyle(SOLID_FILL,color); setcolor(color); bar(a,b,c,d); }

/***********************************************************/ /*功能:最小棋子的绘制 */ /*所在方格的所在格的坐标为(fc,fr) (1,1)为可落子的最左上格 */ /*棋子的半径为radius */ /*棋子的颜色为color */ /*棋子中心坐标为(a,b) */ /***********************************************************/ void minbox(int fc,int fr,int color) { int a=0,b=0; int radius; int color1=color; a=(fc*MINBOXSIZE+SCCOL)+MINBOXSIZE/2; b=(fr*MINBOXSIZE+SCROW)+MINBOXSIZE/2; radius=MINBOXSIZE/2-5;

setcolor(color1); while(radius>0) { circle(a,b,radius--); /*画一个半径radius,圆心为(a,b)空心圆*/ } }

/**********************************/ /*功能:绘制棋盘的可见的最外框 */ /*非可见外框的最左上坐标为(ac,ar) */ /* 每一格棋的宽度为aw */ /**********************************/ void outerdraw(int ac,int br,int aw,int color) { int a,b; a=ac+aw; b=br+aw;

setcolor(color); rectangle(a,b,a+8*MINBOXSIZE, b+8*MINBOXSIZE); rectangle(a-3,b-3,a+8*MINBOXSIZE+3, b+8*MINBOXSIZE+3); rectangle(a-4,b-4,a+8*MINBOXSIZE+4, b+8*MINBOXSIZE+4); rectangle(a-5,b-5,a+8*MINBOXSIZE+5, b+8*MINBOXSIZE+5); }

/*************************************/ /*功能:绘制棋盘中间的纵横线 */ /*非可见外框的最左上坐标为(cc,cr) */ /*每一格棋的宽度为cw */ /*线的颜色为color */ /*先画七根纵线,后画七根横线 */ /*************************************/ void linedraw(int cc,int cr,int cw,int color) { int m=0; int x1,y1,x2,y2; for(m=1;m<8;m++) { x1=(cc+cw)+m*cw; y1=(cr+cw); x2=x1; y2=y1+8*cw;

setcolor(color); line(x1,y1,x2,y2); } for(m=1;m<8;m++) {

x1=(cc+cw); y1=(cr+cw)+m*cw; x2=x1+8*cw; y2=y1;

setcolor(color); line(x1,y1,x2,y2); } }

/*********************************************/ /*在(a,b)处用color色显示大小为font的字符串txt*/ /*********************************************/ void txt(int a,int b,char *txt,int font,int color) { setcolor(color); settextstyle(0,0,font);/*设置图形模式下字符显示底字体、方向和大小*/ outtextxy(a,b,txt); /*图形模式下在x,y坐标位置显示一行字符串*/ }

/********************/ /*整个屏幕外框的绘制*/ /********************/ void win(int a,int b,int c,int d,int bgcolor,char *text,int font,int textcolor) { clscr(a,b,c,d,7); clscr(a+3,b+24,c-3,d-3,bgcolor); clscr(a+3,b+3,c-3,b+20,9);

setcolor(15); line(a,b,c,b); line(a,b,a,d); line(a+2,b+21,c-2,b+21); line(c-2,b+2,c-2,b+21); line(a+2,d-2,c-2,d-2); line(c-2,b+23,c-2,d-2); txt(a+5,b+8,text,font,textcolor);/*调用文字显示函数*/

setcolor(0); line(a,d,c,d); line(c,b,c,d); line(a+3,b+2,c-3,b+2); line(a+2,b+2,a+2,b+20); line(a+2,b+24,a+2,d-2); line(a+2,b+23,c-3,b+23); } /*************************************************************/ /*功能:绘出所在格的提示光标 */ /*(gc,gr)表示当前光标的所在格,(1,1)为的最左上格 */ /*************************************************************/ void gbdw(int gc,int gr,int color) { int x1,y1; x1=(SCCOL+MINBOXSIZE)+(gc-1)*MINBOXSIZE; y1=(SCROW+MINBOXSIZE)+(gr-1)*MINBOXSIZE;

setcolor(color); line(x1+7,y1+7,x1+MINBOXSIZE-7,y1+MINBOXSIZE-7); line(x1+7,y1+MINBOXSIZE-7,x1+MINBOXSIZE-7,y1+7);

}

/**************************************************************/ /*功能:判断当前是否格可以落子 */ /*(xc,yr)表示当前欲落子的所在格的坐标,(1,1)为可落子的最左上格.*/ /*测试当前方块是否可以放置棋子,可放的话得到present_p_v的值 */ /*val表示欲落子的值,白为1,黑为2 */ /*返回值为int 0或1,0代表不可继续下落 */ /*判断依据:向八个方向依次推进,判断每一个方向的情况 */ /**************************************************************/ int putdown(xc,yr,val) { int a=1,b=1,c=1,d=1,e=1,f=1,g=1,h=1; int a_val=0,b_val=0,c_val=0,d_val=0,e_val=0,f_val=0,g_val=0,h_val=0; int temp=0; if(gril[xc][yr]==0) { if(gril[xc-1][yr-1]==2/val)/*沿左上角向左上上沿*/ { while(gril[xc-a][yr-a]==2/val) { a_val=a_val+gril_value[xc-a][yr-a]; a++; }

if(gril[xc-a][yr-a]==val) present_p_v[xc][yr]=gril_value[xc][yr]+a_val; else a_val=0; }

if(gril[xc][yr-1]==2/val)/*沿正上方向正上方上沿*/ { while(gril[xc][yr-b]==2/val) { b_val=b_val+gril_value[xc][yr-b]; b++; } if(gril[xc][yr-b]==val) present_p_v[xc][yr]=gril_value[xc][yr]+b_val; else b_val=0; }

if(gril[xc+1][yr-1]==2/val)/*沿右上角向右上上沿*/ { while(gril[xc+c][yr-c]==2/val) { c_val=c_val+gril_value[xc+c][yr-c]; c++; }

if(gril[xc+c][yr-c]==val) present_p_v[xc][yr]=gril_value[xc][yr]+c_val; else c_val=0; }

if(gril[xc-1][yr]==2/val)/*沿正左方向向正左方左沿*/ { while(gril[xc-d][yr]==2/val) { d_val=d_val+gril_value[xc-d][yr]; d++; } if(gril[xc-d][yr]==val) present_p_v[xc][yr]=gril_value[xc][yr]+d_val; else d_val=0; }

if(gril[xc+1][yr]==2/val)/*沿正右方向向正右方右沿*/ { while(gril[xc+e][yr]==2/val) { e_val=e_val+gril_value[xc+e][yr]; e++; } if(gril[xc+e][yr]==val) present_p_v[xc][yr]=gril_value[xc][yr]+e_val; else e_val=0; }

if(gril[xc-1][yr+1]==2/val)/*沿左下角向左下角下沿*/ { while(gril[xc-f][yr+f]==2/val) { f_val=f_val+gril_value[xc-f][yr+f]; f++; }

if(gril[xc-f][yr+f]==val) present_p_v[xc][yr]=gril_value[xc][yr]+f_val; else f_val=0;

}

if(gril[xc][yr+1]==2/val)/*沿正下方向正下方下沿*/ { while(gril[xc][yr+g]==2/val) { g_val=g_val+gril_value[xc][yr+g]; g++; } if(gril[xc][yr+g]==val) present_p_v[xc][yr]=gril_value[xc][yr]+g_val; else g_val=0; }

if(gril[xc+1][yr+1]==2/val)/*沿右下角向右下下沿*/ { while(gril[xc+h][yr+h]==2/val) { h_val=h_val+gril_value[xc+h][yr+h]; h++; }

if(gril[xc+h][yr+h]==val) present_p_v[xc][yr]=gril_value[xc][yr]+h_val; else h_val=0; }

} else return 0;

temp=a_val+b_val+c_val+d_val+e_val+f_val+g_val+h_val; if(temp==0) return 0; return 1; }

/*********************************************************/ /*功能:吃掉所落棋子与同色棋子之间别的棋子 */ /*所落棋子为(xr,yr) */ /*val表示欲落子的值,白为1,黑为2 */ /*向八个方向进行查找,吃子。 */ /*********************************************************/ void change_val(int xc,int yr,int val) { int a=1,b=1,c=1,d=1,e=1,f=1,g=1,h=1; int temp=0,color;

if(val==1) color=15; if(val==2) color=0; if(gril[xc-1][yr-1]==2/val)/*沿左上角向左上上沿*/ {

while(gril[xc-a][yr-a]==2/val) { a++; } if(gril[xc-a][yr-a]==val) { for(temp=1;temp<a;temp++) gril[xc-temp][yr-temp]=val; }

}

if(gril[xc][yr-1]==2/val)/*沿正上方向正上方上沿*/ { while(gril[xc][yr-b]==2/val) { b++; } if(gril[xc][yr-b]==val) { for(temp=1;temp<b;temp++) gril[xc][yr-temp]=val; } }

if(gril[xc+1][yr-1]==2/val)/*沿右上角向右上上沿*/ { while(gril[xc+c][yr-c]==2/val) { c++; } if(gril[xc+c][yr-c]==val) { for(temp=1;temp<c;temp++) gril[xc+temp][yr-temp]=val; } }

if(gril[xc-1][yr]==2/val)/*沿正左方向向正左方左沿*/ { while(gril[xc-d][yr]==2/val) { d++; } if(gril[xc-d][yr]==val) { for(temp=1;temp<d;temp++) gril[xc-temp][yr]=val; }

}

if(gril[xc+1][yr]==2/val)/*沿正右方向向正右方右沿*/ { while(gril[xc+e][yr]==2/val) { e++; } if(gril[xc+e][yr]==val) { for(temp=1;temp<e;temp++) gril[xc+temp][yr]=val; }

}

if(gril[xc-1][yr+1]==2/val)/*沿左下角向左下角下沿*/ { while(gril[xc-f][yr+f]==2/val) { f++; }

if(gril[xc-f][yr+f]==val) { for(temp=1;temp<f;temp++) gril[xc-temp][yr+temp]=val; }

}

if(gril[xc][yr+1]==2/val)/*沿正下方向正下方下沿*/ { while(gril[xc][yr+g]==2/val) { g++; } if(gril[xc][yr+g]==val) { for(temp=1;temp<g;temp++) gril[xc][yr+temp]=val; } }

if(gril[xc+1][yr+1]==2/val)/*沿右下角向右下下沿*/ { while(gril[xc+h][yr+h]==2/val) { h++; } if(gril[xc+h][yr+h]==val) { for(temp=1;temp<h;temp++) gril[xc+temp][yr+temp]=val; } }

}

2004-12-17 18:04
deepblue
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2004-12-15
收藏
得分:0 

/********************************/ /*功能:游戏中各种提示信息的显示*/ /********************************/ void help_info(char *txt,int color) { clscr(SCCOL,410,500,430,15); setcolor(color); settextstyle(0,0,1);/*设置图形模式下字符显示底字体、方向和大小*/ outtextxy(SCCOL+15,417,txt); /*图形模式下在x,y坐标位置显示一行字符串*/ }

/***************************/ /*功能:延时函数 */ /*t为所延时的长度 */ /***************************/ void wait(int t) { clock_t t2,t1; t2=clock(); t1=clock(); while((t1-t2)<25*t) { t1=clock(); } }

/****************************************************/ /*功能:判断游戏是否结束,并进行得分的统计,判定胜负*/ /****************************************************/ void jud_win() { int x,y; int jud=0;/*表示游戏已经结束*/

num_user=0; num_computer=0; for(x=1;x<=8;x++) { for(y=1;y<=8;y++) { if(gril[x][y]==1) ++num_user; if(gril[x][y]==2) ++num_computer; if(gril[x][y]==0) jud=1; } } if(jud==0)/*游戏已经结束时*/ { if(num_user>num_computer) help_info("You Win! ^_^ Game will Exit! ",4); if(num_user<num_computer) help_info("You Lose! ^_^ Game will Exit! ",0); if(num_user==num_computer)help_info("Dogfall! ^_^ Game will Exit! ",14); wait(2); exit(1);

}

}

/********************************************/ /*****************repaint********************/ /********************************************/ void repaint() { int i=1,j=1; clscr(SCCOL,SCROW,SCCOL+MAXSIZE,SCROW+MAXSIZE,7); outerdraw(SCCOL,SCROW,MINBOXSIZE,8); linedraw(SCCOL,SCROW,MINBOXSIZE,8); for(i=1;i<=8;i++) { for(j=1;j<=8;j++) { if(gril[i][j]==1) minbox(i,j,15); if(gril[i][j]==2) minbox(i,j,0); } } gbdw(gbwzc,gbwzr,12); }

/**********************/ /*游戏打开后第一个屏幕*/ /**********************/ void front_screen() { int il,jl,kl;

clscr(0,0,640,480,15); win(1,1,639,479,BGCOLOR," Welcome to use the programme of deepblue!",1,15);/***windows 绘制***/ txt(192,155,"OTHELO",5,15); txt(190,153,"OTHELO",5,7); txt(205,350,"copyright: deepblue Dec.04",1,7); txt(205,360,"E-mail:fjzhang@yeah.net",1,7); txt(205,370,"Http://56m.net/deepblue",1,7); wait(2); getch();

}

/************************************************/ /*此函数完成程序的程序的主要功能 */ /*在每一个时间片里通过对键盘的监视完成相应的操作*/ /************************************************/ void main_game() { int key,cant=0; /*cant用来判断我是否此时无子可走,cant=0为无子可走*/ int m,n; int big_val[3]={0,0,0}; /*电脑走子时用,用来存目前的最佳位置*/ for(;;) { /*用户走子*/ while(1) /*if(bioskey(1))*/ {

/*******************/ for(m=1;m<=8;m++) { for(n=1;n<=8;n++) { if(putdown(m,n,1)==1) cant=1; } } if(cant==0) { help_info("You have to no chessman to play this time !",BGCOLOR);

wait(2); break; }/*无子可走,给电脑走子*/ cant=0; /*********************/ help_info("It is your turn now !",BGCOLOR); key=bioskey(0); if(key==VK_LEFT) { if(gbwzc>1) { --gbwzc; repaint(); } } if(key==VK_RIGHT) { if(gbwzc<8) { ++gbwzc; repaint(); } } if(key==VK_UP) { if(gbwzr>1) { --gbwzr; repaint(); } } if(key==VK_DOWN) { if(gbwzr<8) { ++gbwzr; repaint(); } }

if(key==VK_SPACE) { if(putdown(gbwzc,gbwzr,1)==1) { gril[gbwzc][gbwzr]=1;/*完成落子*/ repaint(); change_val(gbwzc,gbwzr,1);/*完成落子后的吃子*/ gbwzc=5;/*完成光标的复位*/ gbwzr=5; repaint();

jud_win();/*统计积分,判断胜负及游戏的结束*/

break;/*交换走棋权*/ } } if(key==VK_ESC) { help_info("Do you really want to Exit?(Y/N)",BGCOLOR); again=getch(); if((again=='Y')||(again=='y')) exit(1);

} }

/*电脑走子*/ while(1) {

for(m=1;m<=8;m++) { for(n=1;n<=8;n++) { if(putdown(m,n,2)==1) cant=1; } } if(cant==0) { help_info("The computer have no chessman to play this time !",BGCOLOR); wait(2); break;/*无子可走,给用户走子*/ } cant=0; /*********************/

/************************/ for(m=0;m<=9;m++) { for(n=0;n<=9;n++) { present_p_v[m][n]=0; } } /************************/

for(m=1;m<=8;m++) { for(n=1;n<=8;n++) { putdown(m,n,2); if(big_val[2]<present_p_v[m][n]) {

big_val[0]=m; big_val[1]=n; big_val[2]=present_p_v[m][n]; } } } help_info("It is the turn of computer now !",BGCOLOR); wait(1);

gril[big_val[0]][big_val[1]]=2;/*完成落子*/ repaint(); change_val(big_val[0],big_val[1],2);/*完成落子后的吃子*/ repaint();

jud_win();/*统计积分,判断胜负及游戏的结束*/

big_val[0]=0;big_val[1]=0;big_val[2]=0;/*(复原该值)电脑走子时用,用来存目前的最佳位置*/

break;/*交换走棋权*/

} } } void help_fangxiang() { txt(410,120,"<- : Move Left",1,15); txt(410,135," -> : Move Right",1,15);

txt(410,150,"ESC : Exit Game",1,15); txt(410,165,"Space: Play Game",1,15);

}

/*主程序开始*/ void main() { int i,j,color=7;

init(VGA,VGAHI); front_screen(); clscr(0,0,640,480,15); win(1,1,639,479,BGCOLOR," Welcome to use the programmme of deepblue!",1,15);/***windows 绘制***/

repaint();

help_info("Help: press the SPACE key to put down or ESC to exit! ",BGCOLOR); help_fangxiang(); wait(1); main_game(); getch(); closegraph(); }

2004-12-17 18:05
断线风筝
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-5-20
收藏
得分:0 
我晕,是真长
2004-12-28 18:10
快速回复:求助!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022922 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved