实训项目:五子棋
#include<graphics.h>
#include<conio.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
void Beginning(); //开始图片
void Background(); //显示背景
void ShowPlate(); //显示棋盘
void PlayGame(); //玩游戏
void Judgewin(int,int); //判断输赢
void Blackwin(); //黑棋赢
void Whitewin(); //白棋赢
bool flag=true; //走棋顺序
int piece[16][16]; //棋子变量
int ti,tj;
int f=1;
void main()
{
for(int i=0;i<16;i++)
for(int j=0;j<16;j++)
piece[i][j]=0; //初始化棋子变量
initgraph(965,642); //设置窗口大小
mciSendString("play 2.mp3",0,0,0);//播放背景音乐
Background(); //显示背景
PlayGame(); //玩游戏
getch(); //保持窗口开着
}
void Background()
{
IMAGE img;
getimage(&img, "2.jpg");
putimage(0,0, &img); //设置背景图片
}
void ShowPlate()
{
setfillstyle(RGB(213,176,146));
bar(270,30,730,490); //棋盘大小
for(int x=290,y=50;x<=710,y<=470;x+=30,y+=30) //画棋盘线
{
setcolor(BLACK);
line(x,50,x,470);
line(290,y,710,y);
}
setfillstyle(BLACK);
bar(284,44,286,476);
bar(284,44,716,46);
bar(714,44,716,476);
bar(284,474,716,476);//棋盘线周围的一圈粗线
fillellipse(380,140,4,4);
fillellipse(620,140,4,4);
fillellipse(380,380,4,4);
fillellipse(620,380,4,4);
fillellipse(500,260,4,4);//棋盘的五个小黑点
setcolor(BLACK);
setfillstyle(RGB(213,176,146));
bar3d(800,100,900,140,0,0);
bar3d(800,200,900,240,0,0);
bar3d(800,300,900,340,0,0);
setfont(24,0,"华文行楷");
outtextxy(805,110,"重新开始");//重新开始 按钮
outtextxy(827,210,"悔棋");//悔棋按钮
outtextxy(827,310,"投降");//投降按钮
setcolor(RGB(213,176,146));
setfillstyle(WHITE);
fillellipse(820,28,20,20);
setcolor(RGB(213,176,146));
setfillstyle(BLACK);
fillellipse(880,28,20,20);
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
if(piece[i][j]==-1)
{
setcolor(WHITE);
setfillstyle(WHITE);
fillellipse(290+j*30,50+i*30,12,12);
}
else if(piece[i][j]==1)
{
setcolor(BLACK);
setfillstyle(BLACK);
fillellipse(290+j*30,50+i*30,12,12);
}
}
}
}
void PlayGame()
{
int h=0;
int y=0;
int Y;
int ti=0,tj=0;
while(f)
{
MOUSEMSG msg=GetMouseMsg(); //得到鼠标输入
while(msg.uMsg==WM_LBUTTONUP)
{
h++;
if(h==1)
{
ShowPlate();
}
else
break;
}
if(h>2)
{
int a,b,c,d;
a=(msg.x-290)%30;
b=(msg.y-50)%30;
c=(msg.x-290)/30+a/15;//落子点的横坐标
d=(msg.y-50)/30+b/15;//落子点的纵坐标
if(msg.x>800&&msg.x<840&&msg.y>8&&msg.y<48&&y==0)
flag=false;
else if(msg.x>860&&msg.x<900&&msg.y>8&&msg.y<48&&y==0)
flag=true;
if(a==15||b==15) //判断是否在两格中间
continue;
if(msg.uMsg==WM_LBUTTONUP&&piece[d][c]==0&&(c>=0&&c<15&&d>=0&&d<15)) //判断是否在棋盘内且无棋子
{
mciSendString("play 3.mp3",0,0,0);
if(flag==true)
{
piece[d][c]=1;
setcolor(BLACK);
setfillstyle(BLACK);
fillellipse(290+c*30,50+d*30,12,12);
flag=false;
ti=d;
tj=c;
y++;
}
else
{
piece[d][c]=-1;
setcolor(WHITE);
setfillstyle(WHITE);
fillellipse(290+c*30,50+d*30,12,12);
flag=true;
ti=d;
tj=c;
y++;
}
}
Judgewin(c,d);
if(msg.uMsg==WM_LBUTTONUP)
if((msg.x>=800&&msg.x<=900)&&(msg.y>=300&&msg.y<=340)) //投降
{
if(flag==true)
Whitewin();
else
Blackwin();
}
if(msg.uMsg==WM_LBUTTONUP)
if((msg.x>=800&&msg.x<=900)&&(msg.y>=100&&msg.y<=140)) //中途重新开始
{
y=0;
for (c=0;c<16;c++)
{
for (d=0;d<16;d++)
{
piece[c][d]=0;
}
}
ShowPlate();
}
if(msg.uMsg==WM_LBUTTONUP)
{
if ((msg.x>=800&&msg.x<=900)&&(msg.y>=200&&msg.y<=240)&&(Y!=y)) //悔棋
{
Y=y;
if(flag==true)
flag=false;
else
flag=true;
piece[ti][tj]=0;
ShowPlate();
}
}
}
while(!f) //结束后重新开始
{
MOUSEMSG msg=GetMouseMsg();
if(msg.uMsg==WM_LBUTTONUP)
if((msg.x>=800&&msg.x<=900)&&(msg.y>=100&&msg.y<=140))
{
for (int c1=0;c1<16;c1++)
{
for (int d1=0;d1<16;d1++)
{
piece[c1][d1]=0;
}
}
ShowPlate();
f=1;
PlayGame();
}
}
}
}
void Judgewin(int c,int d)
{
for(int i=0;i<15;i++)//判断是否五子连珠——横向
{
int s=0;
for(int j=i;j<i+5;j++)
{
s=s+piece[d][j];
if(s==5)
Blackwin();
if(s==-5)
Whitewin();
}
}
for(int m=0;m<15;m++)//判断是否五子连珠——纵向
{
int s=0;
for(int n=m;n<m+5;n++)
{
s=s+piece[n][c];
if(s==5)
Blackwin();
if(s==-5)
Whitewin();
}
}
for(int p=d-5,q=c-5;p<15;p++,q++)//判断是否五子连珠——左上到右下
{
int s=0;
for(int t=0;t<5;t++)
{
s=s+piece[p+t][q+t];
if(s==5)
Blackwin();
if(s==-5)
Whitewin();
}
}
for(int P=d+5,Q=c-5;Q<15;P--,Q++)//判断是否五子连珠——左下到右上
{
int s=0;
for(int t=0;t<5;t++)
{
s=s+piece[P-t][Q+t];
if(s==5)
Blackwin();
if(s==-5)
Whitewin();
}
}
}
void Blackwin()
{
setcolor(WHITE);
setfillstyle(BLACK);
fillellipse(500,260,70,30);
outtextxy(470,250,"黑子赢");
f=0;
mciSendString("play 4.mp3",0,0,0);
}
void Whitewin()
{
setcolor(BLACK);
setfillstyle(WHITE);
fillellipse(500,260,70,30);
outtextxy(470,250,"白子赢");
f=0;
mciSendString("play 4.mp3",0,0,0);
}