急求一个五子棋C++程序

2024-11-11 01:29:27
推荐回答(2个)
回答1:

#include
#include

#define ROW 20
#define COL 20
#define SIZE 20
#define HIDE 0
#define SHOW 1
#define SET 2
#define TRUE 1
#define FALSE 0
#define LU 5
#define RD 6
#define LD 7
#define RU 8
#define LEFT 0x4b00 /*光标左键值*/
#define RIGHT 0x4d00 /*光标右键值*/
#define DOWN 0x5000 /*光标下键值*/
#define UP 0x4800 /*光标上键值*/
#define ESC 0x011b /*按键Esc的值 */
#define ENTER 0x1c0d /*按键Enter的值 */
#define F2 0x3c00 /*按键F2的值*/

int MinX, MinY, MaxX, MaxY; /*定义棋盘横纵坐标变量*/
int CurRow, CurCol, CurX, CurY; /*定义行列坐标变量*/
int CurFocus, Radius; /*定义棋手标志变量、棋子半径变量*/
int Map[ROW][COL]; /*定义棋盘数组*/

void InitGraph(); /*初始化图形*/
void InitData(); /*初始化数据*/
void DrawChessboard(); /*画棋盘函数*/
void ShowChess(); /*显示棋子*/
void GamePlay(); /*开始游戏*/
void SetChess(int focus); /*设定棋子*/
void MoveChess(int dir); /*移动棋子*/
void Refresh(); /*更新画面*/
void CheckWin(int row, int col); /*判断输赢*/

main()
{
InitGraph(); /*初始化图形*/
InitData(); /*初始化数据*/
DrawChessboard(); /*画棋盘*/
GamePlay(); /*开始游戏*/
closegraph(); /*关闭图形界面*/
}

void InitGraph() /*初始化图形*/
{
int gdriver = DETECT;
int gmode, errorcode;

initgraph(&gdriver, &gmode, ""); /*初始化图形系统*/
errorcode = graphresult();
if (errorcode != grOk) /*错误处理*/
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /*出错退出*/
}
}

void InitData() /*初始化数据*/
{
int x, y;

x = getmaxx();
y = getmaxy();
MinX = (x-COL*SIZE)/2; /*棋盘边框横坐标最小值*/
MaxX = MinX+COL*SIZE; /*棋盘边框横坐标最大值*/
MinY = (y-ROW*SIZE)/2; /*棋盘边框纵坐标最小值*/
MaxY = MinY+ROW*SIZE; /*棋盘边框纵坐标最大值*/
CurRow = ROW/2, CurCol = COL/2;
CurX = MinX+CurCol*SIZE+SIZE/2;
CurY = MinY+CurRow*SIZE+SIZE/2;
Radius = SIZE/2-3; /*棋子半径*/
CurFocus = 1; /* 黑1 白2*/
}

void DrawChessboard() /*画棋盘函数*/
{
int i, j, x, y;
setbkcolor(3); /*设置背景颜色*/
setfillstyle(SOLID_FILL, 3); /*背景颜色填充模式*/
bar(0, 0, getmaxx(), MinY);
setfillstyle(SOLID_FILL, 7);
setcolor(11);
bar(MinX, MinY, MaxX, MaxY);
x = MinX, y = MinY;
for (i=0; i<=ROW; i++, y+=SIZE)
line(MinX, y, MaxX, y); /*画水平线*/
for (j=0; j<=COL; j++, x+=SIZE)
line(x, MinY, x, MaxY); /*画垂直线*/
setcolor(11); /*文本颜色*/
settextstyle(0, 0, 0); /*文本类型*/
settextjustify(1, 1);
outtextxy(MinX-MinX/2, MinY+10, "Player 1"); /*显示文本*/
outtextxy(MaxX+MinX/2, MinY+10, "Player 2"); /*显示文本*/
outtextxy(getmaxx()/2, MaxY+MinY/2,"Esc:Exit Enter:Set F2:Start");
}

void ShowChess(int flag) /*显示棋子*/
{
int color, r = Radius;

if (flag==SET || flag==SHOW) /*画棋子*/
{
if (CurFocus == 1)
color = 1; /*棋手1的棋子颜色*/
else
color = 15; /*棋手2的棋子颜色*/
}
else
color = 7; /*背景颜色*/
if (flag == SET)
{
Map[CurRow][CurCol] = color; /*置位数组值为当前颜色*/
CheckWin(CurRow, CurCol); /*判断输赢*/
}
else
r -= 2; /*显示棋子时棋子半径值*/
setcolor(color); /*当前棋子颜色*/
circle(CurX, CurY, r); /*画棋子*/
setfillstyle(SOLID_FILL, color); /*填充棋子*/
floodfill(CurX, CurY, color); /*棋子的边缘颜色*/
}

/*在棋手名字下面显示当前下棋的棋手的棋子颜色*/
void SetChess(int focus)
{
int color1, color2;
static x1, y1, x2, y2;
if (!x1)
{
x1 = MinX-MinX/2;
x2 = MaxX+MinX/2;
y1 = y2 = MinY+40;
}
/*根据棋手标志设定棋子颜色*/
if (focus == 1) /*棋手标志值为1时 显示棋手1的颜色*/
{
color1 = 1;
color2 = 3;
}
else /*否则显示棋手2的颜色*/
{
color1 = 3;
color2 = 15;
}
setfillstyle(SOLID_FILL, color1); /*填充棋盘左侧棋子颜色*/
setcolor(color1);
circle(x1, y1, Radius+2); /*显示的棋子半径比正常的棋子半径大*/
floodfill(x1, y1, color1); /*棋盘右侧欲显示棋子的边缘颜色*/
setfillstyle(SOLID_FILL, color2); /*填充棋盘右侧棋子颜色*/
setcolor(color2);
circle(x2, y2, Radius+2); /*显示的棋子半径比棋盘上棋子半径大*/
floodfill(x2, y2, color2); /*棋盘左侧欲显示棋子的边缘颜色*/
CurFocus = focus;
}

void GamePlay() /*开始游戏*/
{
int key, Exit = FALSE;
int i, j;

ShowChess(SHOW); /*初始化棋手要下的棋子的位置*/
SetChess(CurFocus); /*显示正在下棋的棋手的棋子颜色*/
while (!Exit) /*循环扫描键盘输入*/
{
key = bioskey(0);
switch (key) /*判断键盘输入*/
{
case ESC: /*按Esc键退出游戏*/
Exit = TRUE;
break;
case ENTER: /*按Enter键确认棋子*/
/*若此位置没有棋子则在此位置落子*/
/*并判断胜负,胜则显示胜者信息,负则提示该对手下棋*/
if (!Map[CurRow][CurCol])
{
ShowChess(SET); /*在此处落子*/
SetChess(CurFocus%2 + 1); /*提示对手下棋*/
ShowChess(SHOW); /*显示对手棋子的颜色*/
}
break;
case F2: /*按F2,重新开始一局游戏*/
InitData(); /*重新初始化数据*/
for (i=0; i for (j=0; j Map[i][j] = 0;
DrawChessboard(); /*重新画棋盘*/
ShowChess(SHOW); /*在初始位置显示棋子*/
SetChess(CurFocus); /*显示下棋一方的颜色提示信息*/
case DOWN: /*按方向键移动棋子*/
case UP:
case LEFT:
case RIGHT:
MoveChess(key); /*按照键盘输入移动棋子*/
break;
}
}
}

void MoveChess(int dir) /*移动棋子*/
{
ShowChess(HIDE); /*隐藏棋子*/
if (Map[CurRow][CurCol])
Refresh(); /*此位置有棋子时更新*/
switch (dir)
{
case LEFT: /*向左移动*/
CurCol--; /*数组横向减一*/
CurX -= SIZE; /*横坐标减一格*/
if (CurCol < 0) /*若移出棋盘从相反方向进入*/
{
CurCol += COL;
CurX += COL * SIZE;
}
break;
case RIGHT: /*向右移动*/
CurCol++;
CurX += SIZE;
if (CurCol == COL)
{
CurCol -= COL;
CurX -= COL * SIZE;
}
break;
case DOWN: /*向下移动*/
CurRow++;
CurY += SIZE;
if (CurRow == ROW)
{
CurRow -= ROW;
CurY -= ROW * SIZE;
}
break;
case UP: /*向上移动*/
CurRow--;
CurY -= SIZE;
if (CurRow < 0)
{
CurRow += ROW;
CurY += ROW * SIZE;
}
break;
}
ShowChess(SHOW); /*当前位置显示棋子*/
}

void Refresh() /*更新画面*/
{
int color = Map[CurRow][CurCol];
setcolor(color);
circle(CurX, CurY, Radius);
setfillstyle(SOLID_FILL, color);
floodfill(CurX, CurY, color);
}

void CheckWin(int row, int col) /*判断是否有五子相连,即判断输赢*/
{
int count, color = Map[row][col];
int winner = 0, x, y;
char MsgWin[50];

/*统计水平方向相连棋子数目*/
count = GetNum(row,col,LEFT,color)+GetNum(row,col,RIGHT,color)+1;
if (count >= 5)
winner = CurFocus; /*五子相连则胜*/
if (!winner)
{
/*统计竖直方向相连棋子数目*/
count = GetNum(row,col,UP,color)+GetNum(row,col,DOWN,color)+1;
if (count >= 5)
winner = CurFocus; /*五子相连则胜*/
}

if (!winner)
{
/*统计左对角线方向相连棋子数目*/
count = GetNum(row,col,LU,color)+GetNum(row,col,RD,color)+1;
if (count >= 5)
winner = CurFocus; /*五子相连则胜*/
}

if (!winner)
{
/*统计右对角线方向相连棋子数目*/
count = GetNum(row,col,LD,color)+GetNum(row,col,RU,color)+1;
if (count >= 5)
winner = CurFocus; /*五子相连则胜*/
}

if (winner) /*若当前棋手获胜,则输出相关信息*/
{
x = getmaxx()/2; /*在棋盘上面输出文本信息*/
y = MinY-MinY/2;
setcolor(12);
settextstyle(0, 0, 2);
if (CurFocus == 1) /*判断哪方获胜并输出其名称*/
strcpy(MsgWin, "Player 1");
else
strcpy(MsgWin, "Player 2");
strcat(MsgWin, " Win");
outtextxy(x, y, MsgWin); /*显示文本“Win”*/
settextstyle(0, 0, 0);
getch();
exit(0);
}
}

/*向8个方向判断相连棋子数目,返回数目值*/
int GetNum(int row, int col, int dir, int value)
{
int result = 0;
int i, j;

switch (dir)
{
case LEFT: /*向左判断*/
for (i=col-1; i>=0; i--) /*找出最后相连棋子的位置*/
if (Map[row][i] != value) break;
result = col - 1 - i; /*计算相连棋子的数目*/
break;
case RIGHT: /*向右判断*/
for (i=col+1; i if (Map[row][i] != value) break;
result = i - 1 - col; /*计算相连棋子的数目*/
break;
case DOWN: /*向下判断*/
for (i=row+1; i if (Map[i][col] != value) break;
result = i - 1 - row; /*计算相连棋子的数目*/
break;
case UP: /*向上判断*/
for (i=row-1; i>=0; i--) /*找出最后相连棋子的位置*/
if (Map[i][col] != value) break;
result = row - 1 - i; /*计算相连棋子的数目*/
break;
case LU: /*左上判断*/
/*找出最后相连棋子的位置*/
for (i=row-1, j=col-1; i>=0 && j>=0; i--, j--)
if (Map[i][j] != value) break;
result = row - 1 - i; /*计算相连棋子的数目*/
break;
case RD: /*右下判断*/
/*找出最后相连棋子的位置*/
for (i=row+1, j=col+1; i if (Map[i][j] != value) break;
result = i - 1 - row; /*计算相连棋子的数目*/
break;
case RU: /*右上判断*/
/*找出最后相连棋子的位置*/
for (i=row-1,j=col+1; i>=0 && j if (Map[i][j] != value) break;
result = row - 1 - i; /*计算相连棋子的数目*/
break;
case LD: /*左下判断*/
/*找出最后相连棋子的位置*/
for (i=row+1,j=col-1; i=0; i++, j--)
if (Map[i][j] != value) break;
result = i - 1 - row; /*计算相连棋子的数目*/
break;
}
return result; /*返回相连棋子的数值*/
}

回答2:

以下代码经测试能在vc++6.0运行
以下是代码的开始
-----------------------------------------------------------------
#include
#include
using namespace std;
const char outstr[11][4]={"┌","┬","┐","├","┼","┤","└","┴","┘","○","●"};
int com[15][15],luozi[15][15];
int c,d;
void jushi() //这是判断落子重要性的函数
{
int x,y,i,m,n,lianzi1=0,lianzi2=0,life=0;
memset(com,0,sizeof(com));
for(x=0;x<=14;x++)
for(y=0;y<=14;y++)
{
if(luozi[x][y]==0)
{
for(m=-1;m<=1;m++)
for(n=-1;n<=1;n++)
{
if(m!=0 || n!=0)
{
for(i=1;i<=4;i++)
{
if( x+i*m>=0 && x+i*m<=14 && y+i*n>=0 && y+i*n<=14 && luozi[x+i*m][y+i*n]==1 )
{lianzi1++;}
else
if(luozi[x+i*m][y+i*n]==0)
{life++; break;}
else
{break;}
}
for(i=-1;i>=-4;i--)
{
if( x+i*m>=0 && x+i*m<=14 && y+i*n>=0 && y+i*n<=14 && luozi[x+i*m][y+i*n]==1 )
{lianzi1++;}
else
if(luozi[x+i*m][y+i*n]==0)
{life++; break;}
else
{break;}
}
if(lianzi1==1) {com[x][y]+=1;}
else if(lianzi1==2)
{
if(life==1) {com[x][y]+=5;}
else if(life==2) {com[x][y]+=10;}
}
else if(lianzi1==3)
{
if(life==1) {com[x][y]+=20;}
else if(life==2) {com[x][y]+=100;}
}
else if(lianzi1==4) {com[x][y]+=500;}
life=0;
for(i=1;i<=4;i++)
{
if( x+i*m>=0 && x+i*m<=14 && y+i*n>=0 && y+i*n<=14 && luozi[x+i*m][y+i*n]==2 )
{lianzi2++;}
else
if(luozi[x+i*m][y+i*n]==0)
{life++; break;}
else
{break;}
}
for(i=-1;i>=-4;i--)
{
if( x+i*m>=0 && x+i*m<=14 && y+i*n>=0 && y+i*n<=14 && luozi[x+i*m][y+i*n]==2 )
{lianzi2++;}
else
if(luozi[x+i*m][y+i*n]==0)
{life++; break;}
else
{break;}
}
if(lianzi2==1) {com[x][y]+=2;}
else if(lianzi2==2)
{
if(life==1) {com[x][y]+=8;}
else if(life==2) {com[x][y]+=30;}
}
else if(lianzi2==3)
{
if(life==1) {com[x][y]+=50;}
else if(life==2) {com[x][y]+=200;}
}
else if(lianzi2==4) {com[x][y]+=1000;}
lianzi1=0;
lianzi2=0;
life=0;
}
}
}
}
}
void computer(int a[15][15]) //这是电脑落子的函数
{
int i,j,max=0;
jushi();
for(i=0;i<=14;i++)
for(j=0;j<=14;j++)
{
if(com[i][j]>max)
{
max=com[i][j];
c=i;
d=j;
}
}
a[c][d]=10;
luozi[c][d]=2;
}

int panduan(int x,int y,int sum) //判断胜负的函数
{
int m,n,i,lianzi=0;
for(m=-1;m<=1;m++)
for(n=-1;n<=1;n++)
{
if(m!=0 || n!=0)
{
for(i=1;i<=4;i++)
{
if( x+i*m>=0 && x+i*m<=14 && y+i*n>=0 && y+i*n<=14 && luozi[x+i*m][y+i*n]==sum )
{lianzi++;}
else
{break;}
}
for(i=-1;i>=-4;i--)
{
if( x+i*m>=0 && x+i*m<=14 && y+i*n>=0 && y+i*n<=14 && luozi[x+i*m][y+i*n]==sum )
{lianzi++;}
else
{break;}
}
if(lianzi>=4)

{
return 1;
}
else
{
lianzi=0;
}
}
}
return 0;
}

int main() //主函数 ,主要进行人落子工作
{
system ("color 2f");
system ("mode con cols=50 lines=25");
system ("title 欢迎使用!");
int a[15][15]={0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
6,7,7,7,7,7,7,7,7,7,7,7,7,7,8};
int x,y,i,j;
memset(luozi,0,sizeof(luozi));
cout<<" 0 1 2 3 4 5 6 7 8 9 10 1 2 3 4"< for(i=0;i<=14;i++)
{
if(i!=0)
cout< cout< for(j=0;j<=14;j++)
{
cout< }
}
cout< cout<<"请输入您要下的棋子 行\\列 用空格隔开:";
while(cin>>x>>y)
{
if(luozi[x][y]==0 && x>=0 && x<=14 && y>=0 && y<=14)
{
a[x][y]=9;
luozi[x][y]=1;
if(panduan(x,y,1)==0)
{
system ("cls");
computer(a);
if(panduan(c,d,2)==0)
{
cout<<" 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4"< for(i=0;i<=14;i++)
{
if(i!=0)
cout< cout< for(j=0;j<=14;j++)
{
cout< }
}
cout< cout<<"您的棋子落在"< cout<<"电脑的棋子落在"< cout<<"请输入您要下的棋子";
}
else
{
cout<<" 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4"< for(i=0;i<=14;i++)
{
if(i!=0)
cout< cout< for(j=0;j<=14;j++)
{
cout< }
}
cout< cout<<"电脑的棋子落在"< cout<<"电脑获胜!"< break;
}
}
else
{
system ("cls"); //清屏
cout<<" 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4"< for(i=0;i<=14;i++)
{
if(i!=0)
cout< cout< for(j=0;j<=14;j++)
{
cout< }
}
cout< cout<<"您获胜啦!"< break;
}
}
else
{
cout<<"输入错误,请重新输入:"< }
}
system ("title 谢谢使用!");
system ("color 03");
cout<<"谢谢使用"< system("pause>nul");
return 0;
}
-----------------------------------------------
希望对你有用!