TC+C语言五子棋游戏

​
头文件
--------------------------------------------------------------
#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;
}
​
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个很好的五子棋c语言源程序代码,最重要的是能运行正确!!! #include #include #include #include #include #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #define CROSSRD 0xd9 /*右下角点*/ #define CROSSL 0xc3 /*左边*/ #define CROSSR 0xb4 /*右边*/ #define CROSSU 0xc2 /*上边*/ #define CROSSD 0xc1 /*下边*/ #define CROSS 0xc5 /*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #define MAPXOFT 5 #define MAPYOFT 2 /*定义1号玩家的操作键键码*/ #define PLAY1UP 0x1157/*上移--'W'*/ #define PLAY1DOWN 0x1f53/*下移--'S'*/ #define PLAY1LEFT 0x1e41/*左移--'A'*/ #define PLAY1RIGHT 0x2044/*右移--'D'*/ #define PLAY1DO 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/ #define PLAY2UP 0x4800/*上移--方向键up*/ #define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/ #define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESCAPE 0x011b /*定义棋盘上交叉点的状态, 即该点有无棋子 */ /*若有棋子, 还应能指出是哪个玩家的棋子 */ #define CHESSNULL 0 /*没有棋子*/ #define CHESS1 'O'/*一号玩家的棋子*/ #define CHESS2 'X'/*二号玩家的棋子*/ /*定义按键类别*/ #define KEYEXIT 0/*退出键*/ #define KEYFALLCHESS 1/*落子键*/ #define KEYMOVECURSOR 2/*光标移动键*/ #define KEYINVALID 3/*无效键*/ 下载可看到完整的...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值