📄 wuziqi.cpp
字号:
// C++程序大作业:五子棋模拟
#include<iostream.h>
#include<graphics.h>
#include<dos.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
int pane1[225][2]; //定义全局数组用来记录有棋子的位置,由于每个交点的坐标唯一确定,所以此点的值不为0,表示这里已经有了棋子。
char ch1,ch2,ch3; //定义玩家的按键的字符变量
int a,q; //标记pane1[][2]和biaoji[]
int biaoji[224]; //用于标记判断输赢的数组,在交点的可由坐标x,y确定,某点的值为0,表示此点误棋子,为1,此点为玩家1的棋子,为2,为玩家2的棋子。
clock_t start ,end; //定义时间变量,最后输出玩家所用时间。
class Display //显示玩家如何玩的界面操作说明类。
{
int x;
public:
Display( int m)
{
x=m;
}
void draw()
{
outtextxy(x,60,"Player1: left a");
outtextxy(x,70," right d");
outtextxy(x,80," up s");
outtextxy(x,90," down x");
outtextxy(x,100," Ok space");
outtextxy(x,150,"Player2: left 4");
outtextxy(x,160," right 6");
outtextxy(x,170," up 8");
outtextxy(x,180," down 2");
outtextxy(x,190," Ok enter");
outtextxy(x,230," quit q ");
outtextxy(x,250,"Player1 First,then in turn");
outtextxy(x,270,"Make sure Number available");
}
};
class Draw_pane //画棋盘的类
{
int x,y;
public:
Draw_pane(int m,int n)
{
x=m;
y=n;
}
void draw();
};
void Draw_pane::draw()
{
for(int i=0;i<=280;i+=20)
{
moveto(x,y+i);
linerel(280,0);
moveto(x+i,y);
linerel(0,280);
}
}
class draw_circle //定义了一各抽象类,以派生具体的棋子
{
int x,y,r;
public:
void Circle(int m,int n,int j)
{
x=m;y=n;r=j;
}
void draw_jiben(int t)
{
circle(x,y,t);
}
virtual void draw()=0; //纯虚函数
};
class draw_move:public draw_circle //定义的移动的棋子类,由抽象类派生
{
public:
void draw()
{
setcolor(4);
draw_jiben(9);
setcolor(15);
}
};
class draw_cover:public draw_circle //定义的棋子移动后,覆盖移动的棋子的类,由抽象类派生
{
public:
void draw()
{
setcolor(1);
draw_jiben(9);
setcolor(15);
}
};
class draw_player1:public draw_circle //定义的玩家1的棋子类,由抽象类派生
{
public:
void draw();
};
void draw_player1::draw()
{
for(int i=1;i<=7;i++)
draw_jiben(i);
}
class draw_player2:public draw_circle //定义的玩家2的棋子类,由抽象类派生
{
public:
void draw();
};
void draw_player2::draw()
{
setcolor(2);
for(int i=1;i<=7;i++)
draw_jiben(i);
setcolor(15);
}
class Sound //定义的声音类。
{
public:
void sound1()
{
sound(500);
delay(300);
nosound();
}
};
int exist(int m[][2],int x,int y) //判定玩家的棋子移动的位置是否已经有了棋子。若有返回0,否则返回1。
{
for(int i=0;i<225;i++)
{
if((m[i][0]==x)&&(m[i][1]==y))
return 0;
}
return 1;
}
void win1() //判断玩家1是否赢的函数,通过遍历每个点的的八个方向来判断输赢。
{
for(int i=100;i<=380;i+=20)
for(int j=50; j<=330;j+=20)
{
q=(i-100)/20+15*(j-50)/20;
if((i-100)>=100)
if((biaoji[q-1]==1)&&(biaoji[q-2]==1)&&(biaoji[q-3]==1)&&(biaoji[q-4]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if((i+100)<=380)
if((biaoji[q+1]==1)&&(biaoji[q+2]==1)&&(biaoji[q+3]==1)&&(biaoji[q+4]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if((j-100)>=50)
if((biaoji[q-15]==1)&&(biaoji[q-30]==1)&&(biaoji[q-45]==1)&&(biaoji[q-60]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if((j+100)<=330)
if((biaoji[q+15]==1)&&(biaoji[q+30]==1)&&(biaoji[q+45]==1)&&(biaoji[q+60]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)>=100)&&((j-100)>=50))
if((biaoji[q-16]==1)&&(biaoji[q-32]==1)&&(biaoji[q-48]==1)&&(biaoji[q-64]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)>=100)&&((j-100)<=330))
if((biaoji[q+14]==1)&&(biaoji[q+28]==1)&&(biaoji[q+42]==1)&&(biaoji[q+56]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)<=380)&&((j-100)>=50))
if((biaoji[q-14]==1)&&(biaoji[q-28]==1)&&(biaoji[q-42]==1)&&(biaoji[q-56]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)<=380)&&((j-100)<=330))
if((biaoji[q+16]==1)&&(biaoji[q+32]==1)&&(biaoji[q+48]==1)&&(biaoji[q+64]==1)&&(biaoji[q]==1))
{
outtextxy(100,350,"Congratulation! Player1 win!");
outtextxy(100,360,"Sorry! Player2 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
}
}
void win2()
{
for(int i=100;i<=380;i+=20)
for(int j=50; j<=330;j+=20)
{
q=(i-100)/20+15*(j-50)/20;
if((i-100)>=100)
if((biaoji[q-1]==2)&&(biaoji[q-2]==2)&&(biaoji[q-3]==2)&&(biaoji[q-4]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if((i+100)<=380)
if((biaoji[q+1]==2)&&(biaoji[q+2]==2)&&(biaoji[q+3]==2)&&(biaoji[q+4]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if((j-100)>=50)
if((biaoji[q-15]==2)&&(biaoji[q-30]==2)&&(biaoji[q-45]==2)&&(biaoji[q-60]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if((j+100)<=330)
if((biaoji[q+15]==2)&&(biaoji[q+30]==2)&&(biaoji[q+45]==2)&&(biaoji[q+60]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)>=100)&&((j-100)>=50))
if((biaoji[q-16]==2)&&(biaoji[q-32]==2)&&(biaoji[q-48]==2)&&(biaoji[q-64]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)>=100)&&((j-100)<=330))
if((biaoji[q+14]==2)&&(biaoji[q+28]==2)&&(biaoji[q+42]==2)&&(biaoji[q+56]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)<=380)&&((j-100)>=50))
if((biaoji[q-14]==2)&&(biaoji[q-28]==2)&&(biaoji[q-42]==2)&&(biaoji[q-56]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
if(((i-100)<=380)&&((j-100)<=330))
if((biaoji[q+16]==2)&&(biaoji[q+32]==2)&&(biaoji[q+48]==2)&&(biaoji[q+64]==2)&&(biaoji[q]==2))
{
outtextxy(100,350,"Congratulation! Player2 win!");
outtextxy(100,360,"Sorry! Player1 fail!");
end=clock();
gotoxy(10,25);
cout<<"It takes you "<<int((end-start)/CLK_TCK)<<" seconds. If you want to retry,please quit and run this program again.";
}
}
}
class Play //玩的具体过程类
{
int x,y;
public:
draw_player1 player1; //定义了这个类里的对象成员
draw_player2 player2;
draw_move move;
draw_cover cover;
Sound sound;
Play(int m,int n) //构造函数
{
x=m;
y=n;
}
void play(); //玩的过程中的主要的函数
};
void Play:: play()
{
for(int j=0;j<225;j++) //玩家最多可下225步棋,所以此循环严格控制玩家1和2轮流走。
{
if(j%2==0) //玩家1先走。
{
loop1:
ch1=getch(); //接收玩家1的按键输入字符。
/*if((j==0)&&(ch1==32)) { player1.Circle(x,y,7);player1.draw();
line(x,50,x,330);line(100,y,380,y); pane1[a][0]=x;
pane1[a][1]=y;
a++; }*/
loop: //这里只是具体給处了‘a’的解释,其余相似,可类推。
switch(ch1)
{
case 'a': x=x-20;
if(x<100)
{
x=x+20;
sound.sound1();
goto loop1;
} //如果超出棋盘范围发出声音,重新走棋
cover.Circle(x+20,y,9);
cover.draw();
line(x+20,50,x+20,330);
line(100,y,380,y); //这里把移动到此前的圆覆盖掉,同时又把所涉及的两条棋盘线再画一遍,否则会留有痕迹。
switch(ch2)
{
case 'a': cover.Circle(x+20,y,9);
cover.draw();
line(x+20,50,x+20,330);
line(100,y,380,y);
break;
case 'd': cover.Circle(x-20,y,9);
cover.draw();
line(x-20,50,x-20,330);
line(100,y,380,y);
break;
case 's': cover.Circle(x,y+20,9);
cover.draw();
line(x,50,x,330);
line(100,y+20,380,y+20);
break;
case 'x': cover.Circle(x,y-20,9);
cover.draw();
line(x,50,x,330);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -