#include <fcntl.h>
#include <unistd.h>
#include "curses.h"
#include "zifu.h"
#define CURRENT_ATTRIBUTE C_ATTR(g_style, g_fore_color,g_back_color)
#define WHITE 1 //棋子颜色
#define BLACK 0
#define LEFTBORDER 44 //棋盘左边界
#define RIGHTBORDER 108 //棋盘右边界
#define MIDDLE (int)(RIGHTBORDER+LEFTBORDER)/2 //棋盘列数的中点
int div[][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}}; //方向向量
WINDOW* g_win = NULL;
int g_style = A_BOLD;
/******************************************************************/
/************************功能函数实现******************************/
/******************************************************************/
/*init_graphics***************************************/
/*
函数原型:bool init_graphics(void)
函数功能:初始化屏幕(配置当前地域、进入curses模式、设置输入、启用彩色机制并初始化颜色、隐藏鼠标、初始化背景色并绘制背景)
函数参数:无
函数返回值:false:初始化屏幕失败
true:初始化屏幕成功
用到自定义函数:clear_screen
*/
bool init_graphics(void) //初始化屏幕函数
{
setlocale(LC_ALL, "");
g_win=initscr();
if(g_win==NULL)
{
printf("call initscr() failed!\n");
return false;
}
cbreak(); //cbreak()模式开启后,除delete或ctrl等仍被视为特殊字元外,一切字元立刻被读取。nocbreak是关闭
noecho(); //用来控制输入的字元是否显示在终端上,系统预设是开启。echo是开启
//keypad(g_win,TRUE); //启用curses库中对键盘特殊键的定义
if(has_colors()) //has_colors函数检测你的屏幕的颜色显示能力
{
int i,j,k;
start_color(); //要启动彩色机制,必须先调用start_color()函数
for(i=0, k=0; i<GCCount; i++)
{
for(j=0; j<GCCount; j++)
{
init_pair(++k, i, j); //初始化所有颜色
}
}
}
curs_set(0); //隐藏鼠标
clear_screen(0, 0, COLS, LINES); //绘制背景
wrefresh(g_win); //刷新缓冲区
return true;
}
/*init_graphics***************************************/
/*exit_graphics***************************************/
/*
函数原型:void exit_graphics(void)
函数功能:退出curses图形界面
函数参数:无
函数返回值:无
用到自定义函数:无
*/
void exit_graphics(void)
{
endwin();
}
/*exit_graphics***************************************/
/*set_attribute***************************************/
/*
函数原型:void set_attribute(void)
函数功能:设置字体
函数参数:无
函数返回值:无
用到自定义函数:无
*/
void set_attribute(void)
{
wattrset(g_win, CURRENT_ATTRIBUTE);
}
/*set_attribute***************************************/
/*clear_screen****************************************/
/*
函数原型:void clear_screen(void)
函数功能:清屏函数
函数参数:起始位置坐标(x,y),清屏区域长度w,清屏区域高度h
函数返回值:无
用到自定义函数:无
*/
void clear_screen(int x, int y, int w, int h)
{
int i,j;
for(i=x;i<x+w;i++)
for(j=y;j<y+h;j++)
{
wmove(g_win,j,i);
waddch(g_win,' ');
}
wrefresh(g_win);
}
/*clear_screen***************************************/
/*read_key*******************************************/
/*
函数原型:int read_key(void)
函数功能:读取字符,将键盘按键转换为对应ASICII码
函数参数:无
函数返回值:按键所对应的ASICII码
用到自定义函数:无
*/
int read_key(void)
{
int flags;
int ch;
ch=getc(stdin);
if(ch==27)
{
flags=fcntl(STDIN_FILENO, F_GETFL, 0);// fcntl():stdin_fileno代表要设置的文件。F_GETFL取得文件描述词状态旗标,来自open()中的flag。
fcntl(STDIN_FILENO, F_SETFL, flags|O_NONBLOCK);
ch=getc(stdin);
if(ch==91)
{
ch=getc(stdin);
switch(ch)
{
case 'D':
case 'd':
ch=KEYLEFT;
break;
case 'C':
case 'c':
ch=KEYRIGHT;
break;
case 'B':
case 'b':
ch=KEYDOWN;
break;
case 'A':
ch=KEYUP;
break;
default:
ch=0;
}
}
else
{
ch=27;
}
fcntl(STDIN_FILENO, F_SETFL, flags);
}
return ch;
}
/*new_chessborad()***************************************/
/*
函数原型:bool new_chessborad()
函数功能:画一个新的棋盘
函数参数:无
函数返回值:返回1表示新棋盘画成功,返回0表示失败
用到自定义函数:无
*/
bool new_chessborad() /* 新建一个17*17的棋盘 */
{
int i,j;
char *str = "屏幕过小,请将终端屏幕放大!";
char *str2 = "按任意键退出";
if(COLS < 100||LINES < 30)
{
g_fore_color = GCRed;
set_attribute();
mvaddstr(LINES/2,COLS/2-10,str);
mvaddstr(LINES/2+1,COLS/2-10,str2);
wrefresh(g_win);
getchar();
return(0);
}
g_back_color = GCBlack;
set_attribute();
clear_screen(LEFTBORDER-4, 4, 76, 35); //先画黑色的阴影
g_back_color = GCYellow;
set_attribute();
clear_screen(LEFTBORDER-5, 3, 76, 35); //黄色的棋盘底盘
g_fore_color = GCBlue; //设置棋盘线为蓝色
set_attribute();
mvaddstr(4,LEFTBORDER, TLC_FRAME );
for(i=LEFTBORDER+2;i<RIGHTBORDER;i += 2) //第一行的棋盘线
{
if(i%4==(LEFTBORDER+2)%4)mvaddstr(4,i,HLINE);
else
mvaddstr(4,i,TMC_FRAME);
}
mvaddstr(4,RIGHTBORDER,TRC_FRAME);
for(i = 5;i<36;i += 1) //每一个行的棋盘线
{
if(i%2==1) //偶数行的棋盘线
{
for(j=LEFTBORDER;j<=RIGHTBORDER;j += 4)
mvaddstr(i,j,VLINE);
}
else //奇数行的棋盘线
{
mvaddstr(i,LEFTBORDER, LMC_FRAME );
for(j=LEFTBORDER+2;j<RIGHTBORDER;j += 4)
{
mvaddstr(i,j,HLINE);
mvaddstr(i,j+2,MMC_FRAME);
}
mvaddstr(i,RIGHTBORDER,RMC_FRAME);
}
}
mvaddstr(36,LEFTBORDER, BLC_FRAME ); //最后一行的棋盘线
for(i=LEFTBORDER+2;i<RIGHTBORDER;i += 2)
{
if(i%4==(LEFTBORDER+2)%4)mvaddstr(36,i,HLINE);
else
mvaddstr(36,i,BMC_FRAME);
}
mvaddstr(36,RIGHTBORDER,BRC_FRAME);
wrefresh(g_win);
return 1;
}
/*new_chessborad***************************************/
/*draw_chess*******************************************/
/*
函数原型:int draw_chess(int color,int x,int y)
函数功能:画棋子
函数参数:棋子颜色color,棋子坐标(x,y)
函数返回值:无
用到自定义函数:无
*/
void draw_chess(int color,int x,int y)
{
if(color == 0)
g_fore_color = GCBlack;
else
g_fore_color = GCWhite;
g_back_color = GCYellow;
set_attribute();
mvaddstr(y,x, CHESS);
wrefresh(g_win);
}
/*draw_chess*********************************************/
/*draw_chess_mouse***************************************/
/*
函数原型:void draw_chess_mouse(int x,int y)
函数功能:画棋子的光标
函数参数:棋子的坐标横坐标x,纵坐标y
函数返回值:无
用到自定义函数:set_attribute();
*/
void draw_chess_mouse(int x,int y)
{
g_fore_color = GCRed;
g_back_color = GCYellow;
set_attribute();
mvaddstr(y-1,x-2, TLC_FRAME);
mvaddstr(y+1,x-2, BLC_FRAME);
mvaddstr(y-1,x+2, TRC_FRAME);
mvaddstr(y+1,x+2, BRC_FRAME);
wrefresh(g_win);
}
/*draw_chess_mouse*****************************************/
/*clean_chess_mouse***************************************/
/*
函数原型:void clean_chess_mouse(int x,int y)
函数功能:清除棋子光标
函数参数:光标对应的棋子的横纵坐标(x,y)
函数返回值:无
用到自定义函数:set_attribute();
*/
void clean_chess_mouse(int x,int y)
{
g_back_color = GCYellow;
set_attribute();
mvaddstr(y-1,x-2, " ");
mvaddstr(y+1,x-2, " ");
mvaddstr(y-1,x+2, " ");
mvaddstr(y+1,x+2, " ");
wrefresh(g_win);
}
/*clean_chess_mouse***************************************/
/*record**************************************************/
/*
函数原型:void record(int (*a)[17],int chesscolor,int x,int y)
函�
- 1
- 2
前往页