⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wuziqi.txt

📁 在本次“五子棋“程序的编写中
💻 TXT
字号:
/* ****************************************************************************************************** */
/* 程序:我伟大的五子棋 */
/* 程序员:向雪林XxX   */
/* 时间:2008/5/12    */
/* ****************************************************************************************************** */
#include <stdio.h>
#include <graphics.h>
#include <bios.h>

#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 ESE 0x011b
#define ENTER 0x1c0d
#define F2 0x3c00

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("Graghics 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;
}
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,"LYJ");
	outtextxy(MaxX+MinX/2,MinY+10,"XxX"); 
	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;
		else color=15;
	}
	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)
	{
		color1=1;
		color2=3;
	}
	else
	{
		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,color2);
	CurFocus=focus;
}
void GamePlay()
{
	int key,Exit=FALSE;
	int i,j;
	ShowChess(SHOW);
	SetChess(CurFocus);
	while(!Exit)
	{
		key=bioskey(0);
		switch(key)
		{
			case ESE:
				Exit=TRUE;
				break;
			case ENTER:
				if(!Map[CurRow][CurCol])
				{
					ShowChess(SET);
					SetChess(CurFocus%2+1);
					ShowChess(SHOW);
				}
				break;
			case F2:
				InitData();
				for(i=0;i<ROW;i++)
					for(j=0;j<COL;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,"LYJ");
		else
			strcpy(MsgWin,"XxX");   
		strcat(MsgWin," Win ");
		outtextxy(x,y,MsgWin);
		settextstyle(0,0,0);
		getch();
		exit(0); 
	   }
	
}
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<COL;i++)
			if(Map[row][i]!=value) break;
			result=i-1-col;
			break;
	case DOWN:
		for(i=row+1;i<ROW;i++)
			if(Map[i][COL]!=value) break;
			result=i-1-row;
			break;
	case UP:
		for(i=row-1;row>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=i-1-row;
			break;
	case RD:
		for(i=row+1,j=col+1;i<ROW&&j<COL;i++,j++)
			if(Map[i][j]!=value) break;
			result=i-1-row;
			break;
	case RU:
		for(i=row-1,j=col+1;i>=0&&j<COL;i--,j++)
			if(Map[i][j]!=value) break;
			result =row-1-i;
			break;
	case LD:
		for(i=row+1,j=col-1;i<ROW&&j>=0;i++,j--)
			if(Map[i][j]!=value) break;
			result=i-1-row;
			break;
	}
	return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -