头文件
--------------------------------------------------------------
#pragma once
#include <time.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <graphics.h>
#include <easyx.h>
#include <fstream.h>
#include <windows.h>
#pragma comment( lib, "msimg32.lib")
#pragma comment( lib, "winmm.lib")
MOUSEMSG m;
//定义鼠标
char asa[10];
int arr[15][15];
int xx[]= {
0,1,-1,0,1,-1,-1,1
}
;
int yy[]= {
1,0,0,-1,1,-1,1,-1
}
;
//°Ë¸ö·½Ïò
int flag1,flag2,sum1,sum2,nummr,turn;
int X,Y;
struct node {
int arrx,arry;
int arrsum;
}
Stack[66];
int end();
void showNow();
void guize();
void found();
void getaXY();
void getaXY2();
void Gengxin();
void outjieguo();
void coutheibai();
void ptp();
void ptc();
int show();
-------------------------------
主程序
-------------------------------
#include "StdAfx.h"
/*************************************************
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.
File name: 五子棋
Date: 2016.7.12
Name: 王鹏鹏
版本: v1.1
*************************************************/
/*
**函数名:showNow()
**函数功能:下棋状态
**入口参数:无
**出口参数:无
*/
void showNow() {
for (int i=0;i<sum1*9;i++) {
setcolor(LIGHTGREEN);
circle(650,500-i,10);
//画进度条
for (int qw=1;qw<=sum1;qw++) {
circle(650,500,qw);
//画圈
}
setcolor(LIGHTRED);
circle(650,500,sum1);
}
for (int j=0;j<sum2*9;j++) {
setcolor(BLACK);
circle(750,500-j,10);
//画进度条
for (int qe=1;qe<=sum2;qe++) {
circle(750,500,qe);
//画圈
}
setcolor(LIGHTRED);
circle(750,500,sum2);
}
// setcolor(RED);
// setbkmode(TRANSPARENT);
// memset(asa,'\0',sizeof(asa));
// sprintf(asa,"%d",sum1);//棋子个数
// outtextxy(650,530,asa);
// setbkmode(TRANSPARENT);
// memset(asa,'\0',sizeof(asa));
// sprintf(asa,"%d",sum2);
// outtextxy(730,530,asa);
}
/*
**函数名:guize()
**函数功能:规则界面
**入口参数:无
**出口参数:无
*/
void guize() {
initgraph(900,600);
loadimage(NULL, "res\\bangzhu.jpg");
while(true) {
// 获取一条鼠标消息
m = GetMouseMsg();
int asdd=0;
switch(m.uMsg) {
case WM_MOUSEMOVE:
setcolor(GREEN);
circle(m.x, m.y, 2);
//鼠标移动的时候做标记
circle(m.x, m.y, 1);
break;
case WM_LBUTTONDOWN:
if(m.x>750&&m.y>=500) {
setcolor(RED);
rectangle(m.x-5, m.y-5, m.x+100, m.y+100);
closegraph();
show();
asdd=1;
}
if (asdd==1) {
closegraph();
break;
}
}
if (asdd==1) {
closegraph();
break;
}
}
closegraph();
}
/*
**函数名:found
**函数功能:查找可行点
**入口参数:无
**出口参数:无
*/
void found() {
nummr=0;
int aa,bb;
if(turn==1) {
aa=2;
bb=1;
} else if(turn==2) {
aa=1;
bb=2;
}
for (int i=1;i<=8;i++)
for (int j=1;j<=8;j++) {
if(arr[i][j]==0) {
int ss=0;
for (int h=0;h<8;h++) {
int ii=i,jj=j;
while(1) {
ii+=xx[h];
jj+=yy[h];
if(ii>=1&&jj>=1&&ii<=8&&jj<=8) {
if(arr[ii][jj]!=aa) break;
//找到第一个不是对方棋子的位置便停下
} else break;
}
if(ii>=1&&jj>=1&&ii<=8&&jj<=8) {
if(arr[ii][jj]==bb&&(abs(i-ii)>1||abs(j-jj)>1))//是否吃子 {
ss+=abs(i-ii)>abs(j-jj)?abs(i-ii):abs(j-jj);
//可以吃掉的数量
}
}
}
if(ss>0) {
// setbkmode(TRANSPARENT);
// outtextxy(i*50+95,j*50+95,"*");//显示可行点
Stack[nummr].arrx=i;
Stack[nummr].arry=j;
Stack[nummr++].arrsum=ss;
}
}
}
}
/*
**函数名:getaXY
**函数功能:人人界面得到坐标
**入口参数:无
**出口参数:无
*/
void getaXY() {
int flag=0;
while(1) {
m = GetMouseMsg();
switch(m.uMsg) {
case WM_LBUTTONDOWN:
X=((m.x-120)/50)+1;
Y=((m.y-120)/50)+1;
for (int i=0;i<nummr;i++) {
if(Stack[i].arrx==X&&Stack[i].arry==Y) {
flag=1;
break;
} else if(m.x>=600&&m.y<=200) {
show();
//退出到主菜单
}
}
if(flag==1) break;
}
if(flag==1) break;
}
}
/*
**函数名:getaXY2
**函数功能:人机界面得到坐标
**入口参数:无
**出口参数:无
*/
void getaXY2() {
int flag=0;
while(1) {
int mx,my;
mx=rand()%400+120;
//随机数
my=rand()%400+120;
X=((mx-120)/50)+1;
Y=((my-120)/50)+1;
for (int i=0;i<nummr;i++) {
if(Stack[i].arrx==X&&Stack[i].arry==Y) {
flag=1;
break;
}
}
if(flag==1) break;
}
}
/*
**函数名:Gengxin
**函数功能:更新后台数据与界面
**入口参数:无
**出口参数:无
*/
void Gengxin() {
arr[X][Y]=turn;
int aa,bb;
if(turn==1) {
aa=2;
bb=1;
} else if(turn==2) {
aa=1;
bb=2;
}
if(turn==1) {
sum1++;
} else {
sum2++;
}
nummr=0;
for (int h=0;h<8;h++) {
int ii=X,jj=Y;
while(1) {
ii+=xx[h];
jj+=yy[h];
if(ii>=1&&jj>=1&&ii<=8&&jj<=8) {
if(arr[ii][jj]!=aa) {
break;
}
} else {
break;
}
}
if(ii>=1&&jj>=1&&ii<=8&&jj<=8) {
if(arr[ii][jj]==bb&&(abs(X-ii)>1||abs(Y-jj)>1))//若当相同颜色且距离大于一可以吃子则进行吃子操作 {
ii=X;
jj=Y;
while(1) {
ii+=xx[h];
jj+=yy[h];
if(ii>=1&&jj>=1&&ii<=8&&jj<=8) {
if(arr[ii][jj]!=aa) {
break;
} else {
arr[ii][jj]=bb;
Stack[nummr].arrx=ii;
Stack[nummr++].arry=jj;
if(turn==1) {
sum1++;
sum2--;
} else {
sum2++;
sum1--;
}
}
} else break;
}
}
}
}
for (int i=0;i<nummr;i++) {
if(turn==1) setcolor(WHITE); else setcolor(BLACK);
for (int j=2;j<=20;j++) circle(120+(Stack[i].arrx-1)*50+25,120+(Stack[i].arry-1)*50+25,j);
}
if(turn==1) {
setcolor(WHITE);
} else {
setcolor(BLACK);
}
for (int j=2;j<=20;j++) {
circle(120+(X-1)*50+25,120+(Y-1)*50+25,j);
}
//更新棋盘上的棋子
}
/*
**函数名:outjieguo
**函数功能:输出结果
**入口参数:无
**出口参数:无
*/
void outjieguo() {
if(sum1>sum2) {
outtextxy(290,60,"白旗胜!");
} else if(sum2>sum1) {
outtextxy(290,60,"黑旗胜");
} else {
outtextxy(320,80,"平");
}
Sleep(5000);
closegraph();
}
/*
**函数名:coutheibai
**函数功能:绘制所有黑白棋
**入口参数:无
**出口参数:无
*/
void coutheibai() {
for (int i=1;i<=8;i++)
for (int j=1;j<=8;j++) {
if(arr[i][j]==1) {
setcolor(WHITE);
for (int h=2;h<=20;h++) circle(120+(i-1)*50+25,120+(j-1)*50+25,h);
} else if(arr[i][j]==2) {
setcolor(BLACK);
for (int h=2;h<=20;h++) circle(120+(i-1)*50+25,120+(j-1)*50+25,h);
}
}
}
/*
**函数名:ptp
**函数功能:人人对战
**入口参数:无
**出口参数:无
*/
void ptp() {
initgraph(900,600);
// initgraph(800,600);
loadimage(NULL,"res//111.jpg");
for (int nb=0;nb<2;nb++) {
for (int d=360;d>=0;d--) {
int r=rand()%255,g=rand()%255,b=rand()%255;
setcolor( RGB(r,g,b));
for (int rr=0;rr<2;rr++) {
circle(cos(d*3.14/180)*80+703,sin(d*3.14/180)*80+110,rr);
}
Sleep(1);
}
}
int r=rand()%255,g=rand()%255,b=rand()%255;
setcolor( RGB(r,g,b));
for (int oi=79;oi<=85;oi++) { {
circle(703,110,oi);
}
}
int c,d;
setcolor(LIGHTGREEN);
for (c=0;c<9;c++) line(120,120+c*50,520,120+c*50);
for (d=0;d<9;d++) line(120+d*50,120,120+d*50,520);
memset(arr,0,sizeof(arr));
arr[4][4]=arr[5][5]=1;
arr[4][5]=arr[5][4]=2;
sum1=sum2=2;
coutheibai();
turn=1;
while(1) {
if(turn==1) {
found();
if(nummr>0)//存在可行点 {
getaXY();
Gengxin();
setbkmode(TRANSPARENT);
showNow();
if(sum1+sum2==64)//满棋 {
outjieguo();
show();
} else {
flag1=flag2=0;
//死棋变量不死
turn=2;
}
} else {
if(flag2==1)//若上一步对方也死棋则游戏结束,判断输赢,否则将己方死棋变量赋值为1,继续循环 {
outjieguo();
show();
} else {
flag1=1;
turn=2;
}
}
} else if(turn==2) {
found();
if(nummr>0) {
getaXY();
Gengxin();
setbkmode(TRANSPARENT);
showNow();
if(sum1+sum2==64) {
outjieguo();
show();
} else {
flag1=flag2=0;
turn=1;
}
} else {
if(flag1==1) {
outjieguo();
show();
} else {
closegraph();
flag2=1;
turn=1;
}
}
}
}
closegraph();
}
/*
**函数名:ptc
**函数功能:人机对战
**入口参数:无
**出口参数:无
*/
void ptc() {
initgraph(900,600);
// initgraph(800,600);
loadimage(NULL,"res//111.jpg");
for (int nb=0;nb<2;nb++) {
for (int d=0;d<=360;d++) {
int r=rand()%255,g=rand()%255,b=rand()%255;
setcolor( RGB(r,g,b));
for (int rr=0;rr<2;rr++) {
circle(cos(d*3.14/180)*80+703,sin(d*3.14/180)*80+110,rr);
}
Sleep(1);
}
}
int r=rand()%255,g=rand()%255,ba=rand()%255;
setcolor( RGB(r,g,ba));
for (int oi=79;oi<=85;oi++) { {
circle(703,110,oi);
}
}
int a,b;
setcolor(LIGHTGREEN);
for (a=0;a<9;a++) {
line(120,120+a*50,520,120+a*50);
}
for (b=0;b<9;b++) {
line(120+b*50,120,120+b*50,520);
}
memset(arr,0,sizeof(arr));
arr[4][4]=arr[5][5]=1;
arr[4][5]=arr[5][4]=2;
sum1=sum2=2;
coutheibai();
turn=1;
while(1) {
if(turn==1) {
found();
if(nummr>0) {
getaXY2();
Gengxin();
setbkmode(TRANSPARENT);
showNow();
if(sum1+sum2==64) {
outjieguo();
show();
} else {
flag1=flag2=0;
turn=2;
}
} else {
if(flag2==1) {
outjieguo();
show();
} else {
flag1=1;
turn=2;
}
}
} else if(turn==2) {
found();
if(nummr>0) {
getaXY();
Gengxin();
setbkmode(TRANSPARENT);
showNow();
if(sum1+sum2==64) {
outjieguo();
show();
} else {
flag1=flag2=0;
turn=1;
}
} else {
if(flag1==1) {
outjieguo();
show();
} else {
flag2=1;
turn=1;
}
}
}
}
closegraph();
}
/*
**函数名:ptc
**函数功能:人机对战
**入口参数:无
**出口参数:无
*/
void ptc1() {
//initgraph(800,600);
initgraph(900,600);
loadimage(NULL,"res//111.jpg");
for (int nb=0;nb<2;nb++) {
for (int d=360;d>=0;d--) {
int r=rand()%255,g=rand()%255,b=rand()%255;
setcolor( RGB(r,g,b));
for (int rr=0;rr<2;rr++) {
circle(cos(d*3.14/180)*80+703,sin(d*3.14/180)*80+110,rr);
}
Sleep(1);
}
}
int r=rand()%255,g=rand()%255,ba=rand()%255;
setcolor( RGB(r,g,ba));
for (int oi=79;oi<=85;oi++) { {
circle(703,110,oi);
}
}
int a,b;
setcolor(LIGHTGREEN);
for (a=0;a<9;a++) {
line(120,120+a*50,520,120+a*50);
}
for (b=0;b<9;b++) {
line(120+b*50,120,120+b*50,520);
}
memset(arr,0,sizeof(arr));
arr[4][4]=arr[5][5]=1;
arr[4][5]=arr[5][4]=2;
sum1=sum2=2;
coutheibai();
turn=1;
while(1) {
if(turn==1) {
found();
if(nummr>0) {
getaXY2();
// Sleep(1000);
Gengxin();
setbkmode(TRANSPARENT);
showNow();
if(sum1+sum2==64) {
outjieguo();
show();
} else {
flag1=flag2=0;
turn=2;
}
} else {
if(flag2==1) {
outjieguo();
show();
} else {
flag1=1;
turn=2;
}
}
} else if(turn==2) {
found();
if(nummr>0) {
getaXY();
Gengxin();
setbkmode(TRANSPARENT);
showNow();
if(sum1+sum2==64) {
outjieguo();
show();
} else {
flag1=flag2=0;
turn=1;
}
} else {
if(flag1==1) {
outjieguo();
show();
} else {
flag2=1;
turn=1;
}
}
}
}
closegraph();
}
/*
**函数名:show
**函数功能:主界面
**入口参数:无
**出口参数:无
*/
int show() {
initgraph(900,600);
loadimage(NULL,"res\\st.jpg");
for (int nb=0;nb<10;nb++) {
for (int d=1;d<=360;d++) {
int r=rand()%255,g=rand()%255,b=rand()%255;
setcolor( RGB(r,g,b));
for (int rr=0;rr<2;rr++) {
circle(cos(d*3.14/180)*86+195,sin(d*3.14/179)*76+444,rr);
}
// Sleep(1);
}
int r=rand()%255,g=rand()%255,b=rand()%148;
setcolor( RGB(r,g,b));
for (int oi=56;oi<=60;oi++) { {
circle(77,544,oi);
}
}
r=rand()%255;
g=rand()%255;
b=rand()%148;
setcolor( RGB(r,g,b));
for ( oi=56;oi<=60;oi++) { {
circle(477,544,oi);
}
}
for (int nb=0;nb<2;nb++) {
for (int d=360;d>=0;d--) {
int r=rand()%255,g=rand()%255,b=rand()%255;
setcolor( RGB(r,g,b));
for (int rr=0;rr<2;rr++) {
circle(cos(d*3.14/180)*86+390,sin(d*3.14/180)*74+445,rr);
}
// Sleep(1);
}
}
}
// int r=rand()%255,g=rand()%255,b=rand()%148;
// setcolor( RGB(r,g,b));
// for(int oi=74;oi<=85;oi++)
// {
// {
// circle(195,445,oi);
// }
// }
// setbkmode(TRANSPARENT);
// settextstyle(115, 33, "宋体");
// char s[20];
// sprintf(s,"%d", sum1);
// outtextxy(100, 100, s);
int flag=0;
while(1) {
m = GetMouseMsg();
switch(m.uMsg) {
case WM_LBUTTONDOWN:
X=m.x;
Y=m.y;
for (int i=0;i<3;i++) {
if(X>=130&&X<=285&&Y>=382) {
flag=1;
break;
} else if(X>=295&&X<=483&&Y>=400&&Y<=500) {
flag=2;
break;
} else if(X>=460&&X<550&&Y>500) {
flag=3;
break;
} else if(X<=130&&Y>=500) {
flag=4;
break;
}
}
if(flag!=0) break;
}
if(flag!=0) break;
}
if(flag==1) {
closegraph();
ptp();
} else if(flag==2) {
closegraph();
ptc();
} else if(flag==3) {
closegraph();
guize();
} else if(flag==4) {
closegraph();
end();
return 0;
}
}
/*
**函数名:end
**函数功能:结束界面
**入口参数:无
**出口参数:无
*/
int end() {
initgraph(900,600);
loadimage(NULL,"res\\1.jpg");
Sleep(1500);
for (int i=810,j=540;i>=0,j>=0;i-=180,j-=120) {
closegraph();
initgraph(i,j);
loadimage(NULL,"res\\1.jpg");
}
return 0;
}
/*
**函数名:main
**函数功能:主函数
**入口参数:无
**出口参数:无
*/
int main() {
mciSendString("open res\\backmusic.mp3 alias BackMusic", NULL, 0, NULL);
// 打开音乐
mciSendString("setaudio BackMusic volume to 300",NULL,0,NULL);
//设置音量大小
mciSendString("play BackMusic repeat", NULL, 0, NULL);
//循环播放
show();
return 0;
}
TC+C语言五子棋游戏
最新推荐文章于 2023-03-05 16:24:34 发布