C语言版五子棋

这是一个使用C语言编写的五子棋游戏程序,包括绘制棋盘、移动光标、落子等功能。玩家可以使用键盘方向键和空格键进行操作,程序会判断胜负并提供游戏提示。
摘要由CSDN通过智能技术生成
#include "windows.h"
#include <stdio.h>  
#include <stdlib.h>    
#include <conio.h>
#ifndef __cplusplus
#include <stdbool.h>   /*包含bool、false */
#endif //__cplusplus
/*****************************************/
#define BOARD 16
COORD g_chessPos={38,18};   /*存储光标位置*/
short g_chessInfo[BOARD][BOARD]; /*g_chessInfo存储棋局信息,白子置为1,黑子为2,空则为0*/ 
/*****************************************/ 
void map(void);          //绘制棋盘 
void gotoxy(short,short);
void down(short,short);  //落子 
void play(int);               
void run(void);
void showCursor(void);   //显示光标
void clsCursor(void);    //清除光标
void mark(int) ;        //标记黑子或白子 
void printInfo(void);   //输出信息
bool isEmpty(void);     //有棋子则为false 
bool isWin(int);    /*判断是否获胜,true为获胜,int参数为1白子 ,2为黑子*/ 
/*****************************************/
int main(int argc, char *argv[]) {  
	system("mode con lines=36 cols=100");   //设置控制台大小 
	system("color f0");         
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };								//隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
	printInfo();
	map();
	showCursor();
	run();
	down(g_chessPos.X,g_chessPos.Y);
	system("pause");
	return 0;
}  
void gotoxy(short x,short y)
{
	HANDLE s_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD coord={x,y};
	SetConsoleCursorPosition(s_hConsole,coord);
}
void map(void)
{
	short x,y;
	for( x=10;x<=70;x+=4)
	{
		for( y=2;y<=32;y+=2)
		{
			gotoxy(x,y);    printf("╋━");
			gotoxy(x,y+1);  printf("┃");
		}
	}
	/*清除棋盘多余部分*/
	for(y=2;y<=32;y+=2)
	{
		gotoxy(70+2,y);printf(" ");
	}
	for(x=10;x<=70;x+=4)
	{
		gotoxy(x,32+1);printf(" ");
	}
}
void printInfo(void)
{
	gotoxy(76, 9);printf("控制:"); 
	gotoxy(76,10);printf("↓ ↑ ← →控制移动"); 
	gotoxy(76,11);printf("空格键落子");
	gotoxy(76,12);printf("按Esc退出"); 
}
void down(short x,short y)
{ 
    static int who=0;
	gotoxy(x,y);
	int t=who%2;
	mark(t);  //who是奇数为白子
	if(t)
	{
		printf("○");
		if(isWin(1))  //判断白棋是否获胜 
		{
		    gotoxy(38,18);printf("白子获胜");
			system("pause");
		}    
		gotoxy(76,16);printf("执黑子");
	}
	else
	{
		printf("●");
		if(isWin(2))  //判断黑棋是否获胜 
		 {
		     gotoxy(38,18);printf("黑子获胜");
			 system("pause");
		}
		gotoxy(76,16);printf("执白子"); 
	} 
	who++;
}
void run(void)
{
	gotoxy(76,16);printf("执黑子");
	while(1)
		if(_kbhit())
			play(_getch());
}
bool isEmpty(void) 
{
	if(g_chessInfo[(g_chessPos.X-10)/4] [(g_chessPos.Y-2)/2])
	    return false;
	return true;
}
void mark(int i) 
{
	/*i为1,白子置为1,i为0置黑子为2*/ 
	g_chessInfo[(g_chessPos.X-10)/4] [(g_chessPos.Y-2)/2]=(i?1:2);
}
void play(int c)
{
	clsCursor();
	switch(c)
	{
	case 72:    //上
		if(g_chessPos.Y-2>=2)  /*确保在棋盘内*/
			g_chessPos.Y-=2;
		break;     
	case 80:    //下	
		if(g_chessPos.Y+2<=32)
			g_chessPos.Y+=2;   
		break;     
	case 75:    //左
		if(g_chessPos.X-4>=10)
			g_chessPos.X-=4;   
		break;     	 
	case 77:    //右
		if(g_chessPos.X+4<=70)
			g_chessPos.X+=4;   
		break;     
	case 32:   //空格落子
	    if(isEmpty())
		    down(g_chessPos.X,g_chessPos.Y);
		break;
	case 27:   //Esc键
		exit(1);
		break;
	}
	showCursor();
}
void showCursor(void)
{
	gotoxy(g_chessPos.X-2,g_chessPos.Y-1);printf("┏━┓");
	gotoxy(g_chessPos.X-2,g_chessPos.Y+1);printf("┗━┛");
}
void clsCursor(void)
{
	gotoxy(g_chessPos.X-2,g_chessPos.Y-1);printf("     ");
	gotoxy(g_chessPos.X-2,g_chessPos.Y+1);printf("     ");
	if(g_chessPos.Y!=2)
	{
		gotoxy(g_chessPos.X,g_chessPos.Y-1);
		printf("┃");
	}
	if(g_chessPos.Y!=32)
	{
		gotoxy(g_chessPos.X,g_chessPos.Y+1);
		printf("┃");
	}
}
bool isWin(int t)
{
	int i,j,num;
	/*取出当前光标对应在棋盘数组中的位置*/
	int x=(g_chessPos.X-10)/4;	
	int y=(g_chessPos.Y-2)/2;
    /
	i=x;j=y;num=0;				//横向向右
	while(i<BOARD&&t==g_chessInfo[i][j]){++num;++i;}
	i=x-1;					    //横向向左
	while(i>=0&&t==g_chessInfo[i][j]){++num;--i;} 
	if(num>=5) return true;
	/
	i=x;j=y;num=0;				//纵向向下				
	while(j<BOARD&&t==g_chessInfo[i][j]){++num;++j;}
	i=x;j=y-1;					//纵向向上
	while(j>=0&&t==g_chessInfo[i][j]){++num;--j;} 
	if(num>=5) return true;
	/
	i=x;j=y;num=0;				//左斜向下		
	while(i<BOARD&&j<BOARD&&t==g_chessInfo[i][j]){++num;++i;++j;}
	i=x-1;j=y-1;				//左斜向上
	while(i>=0&&j>=0&&t==g_chessInfo[i][j]){++num;--i;--j;} 
	if(num>=5) return true;
	i=x;j=y;num=0;				//右斜向下			
	while(i>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;--i;++j;}
	i=x+1;j=y-1;				//右斜向向上
	while(j>=0&&i<BOARD&&t==g_chessInfo[i][j]){++num;++i;--j;} 
	if(num>=5) return true;
	return false;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值