@@ -1,117 +1,119 @@ | |||
# $Id$ | |||
EXTRA_DIST = caca_types.h.in caca.pc.in \ | |||
mono9.data monobold12.data \ | |||
libcaca.vcproj libcaca.def | |||
DISTCLEANFILES = caca_types.h caca.pc | |||
AM_CPPFLAGS = -I$(top_srcdir) -DPLUGINDIR=\"$(plugindir)\" | |||
pkgconfig_DATA = caca.pc | |||
pkgconfigdir = $(libdir)/pkgconfig | |||
include_HEADERS = caca.h caca_types.h caca0.h | |||
lib_LTLIBRARIES = libcaca.la | |||
libcaca_la_SOURCES = \ | |||
caca.c \ | |||
caca.h \ | |||
caca_types.h \ | |||
caca_internals.h \ | |||
caca_stubs.h \ | |||
caca0.c \ | |||
caca0.h \ | |||
canvas.c \ | |||
dirty.c \ | |||
string.c \ | |||
legacy.c \ | |||
transform.c \ | |||
charset.c \ | |||
attr.c \ | |||
line.c \ | |||
box.c \ | |||
conic.c \ | |||
triangle.c \ | |||
frame.c \ | |||
dither.c \ | |||
font.c \ | |||
file.c \ | |||
figfont.c \ | |||
graphics.c \ | |||
event.c \ | |||
time.c \ | |||
$(codec_source) \ | |||
$(driver_source) \ | |||
$(NULL) | |||
libcaca_la_DEPENDENCIES = \ | |||
mono9.data \ | |||
monobold12.data \ | |||
$(NULL) | |||
libcaca_la_CPPFLAGS = $(AM_CPPFLAGS) @CACA_CFLAGS@ -D__LIBCACA__ | |||
libcaca_la_LDFLAGS = -no-undefined -version-number @LT_VERSION@ | |||
libcaca_la_LIBADD = @CACA_LIBS@ $(ZLIB_LIBS) | |||
codec_source = \ | |||
codec/import.c \ | |||
codec/export.c \ | |||
codec/codec.h \ | |||
codec/text.c \ | |||
$(NULL) | |||
driver_source = \ | |||
driver/conio.c \ | |||
driver/ncurses.c \ | |||
driver/null.c \ | |||
driver/raw.c \ | |||
driver/slang.c \ | |||
driver/vga.c \ | |||
driver/win32.c \ | |||
$(NULL) | |||
install-exec-local: | |||
$(mkinstalldirs) $(DESTDIR)$(libdir) | |||
. libcaca.la; \ | |||
for x in $$library_names; do \ | |||
ln -sf $$x $(DESTDIR)$(libdir)/$$(echo $$x | sed 's/caca/cucul/g'); \ | |||
done | |||
ln -sf libcaca.la $(DESTDIR)$(libdir)/libcucul.la | |||
install-data-local: | |||
$(mkinstalldirs) $(DESTDIR)$(pkgconfigdir) | |||
ln -sf caca.pc $(DESTDIR)$(pkgconfigdir)/cucul.pc | |||
$(mkinstalldirs) $(DESTDIR)$(includedir) | |||
ln -sf caca.h $(DESTDIR)$(includedir)/cucul.h | |||
uninstall-local: | |||
. libcaca.la; \ | |||
for x in $$library_names; do \ | |||
rm -f $(DESTDIR)$(libdir)/$$(echo $$x | sed 's/caca/cucul/g'); \ | |||
done | |||
rm -f $(DESTDIR)$(libdir)/libcucul.la | |||
rmdir $(DESTDIR)$(libdir) 2>/dev/null || true | |||
rm -f $(DESTDIR)$(pkgconfigdir)/cucul.pc | |||
rmdir $(DESTDIR)$(pkgconfigdir) 2>/dev/null || true | |||
rm -f $(DESTDIR)$(includedir)/cucul.h | |||
if USE_PLUGINS | |||
plugin_LTLIBRARIES = libx11_plugin.la libgl_plugin.la | |||
plugindir = $(libdir)/caca | |||
libx11_plugin_la_SOURCES = driver/x11.c | |||
libx11_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(X11_CFLAGS) | |||
libx11_plugin_la_LDFLAGS = -no-undefined -module -no-version | |||
libx11_plugin_la_LIBADD = libcaca.la $(X11_LIBS) | |||
libgl_plugin_la_SOURCES = driver/gl.c | |||
libgl_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(GL_CFLAGS) #$(FTGL_CFLAGS) | |||
libgl_plugin_la_LDFLAGS = -no-undefined -module -no-version | |||
libgl_plugin_la_LIBADD = libcaca.la $(GL_LIBS) #$(FTGL_LIBS) | |||
else | |||
driver_source += driver/x11.c driver/gl.c | |||
endif | |||
if USE_COCOA | |||
driver_source += driver/cocoa.m | |||
endif | |||
# $Id$ | |||
EXTRA_DIST = caca_types.h.in caca.pc.in \ | |||
mono9.data monobold12.data \ | |||
libcaca.vcproj libcaca.def | |||
DISTCLEANFILES = caca_types.h caca.pc | |||
AM_CPPFLAGS = -I$(top_srcdir) -DPLUGINDIR=\"$(plugindir)\" | |||
pkgconfig_DATA = caca.pc | |||
pkgconfigdir = $(libdir)/pkgconfig | |||
include_HEADERS = caca.h caca_types.h caca_conio.h caca0.h | |||
lib_LTLIBRARIES = libcaca.la | |||
libcaca_la_SOURCES = \ | |||
caca.c \ | |||
caca.h \ | |||
caca_types.h \ | |||
caca_internals.h \ | |||
caca_stubs.h \ | |||
caca_conio.c \ | |||
caca_conio.h \ | |||
caca0.c \ | |||
caca0.h \ | |||
canvas.c \ | |||
dirty.c \ | |||
string.c \ | |||
legacy.c \ | |||
transform.c \ | |||
charset.c \ | |||
attr.c \ | |||
line.c \ | |||
box.c \ | |||
conic.c \ | |||
triangle.c \ | |||
frame.c \ | |||
dither.c \ | |||
font.c \ | |||
file.c \ | |||
figfont.c \ | |||
graphics.c \ | |||
event.c \ | |||
time.c \ | |||
$(codec_source) \ | |||
$(driver_source) \ | |||
$(NULL) | |||
libcaca_la_DEPENDENCIES = \ | |||
mono9.data \ | |||
monobold12.data \ | |||
$(NULL) | |||
libcaca_la_CPPFLAGS = $(AM_CPPFLAGS) @CACA_CFLAGS@ -D__LIBCACA__ | |||
libcaca_la_LDFLAGS = -no-undefined -version-number @LT_VERSION@ | |||
libcaca_la_LIBADD = @CACA_LIBS@ $(ZLIB_LIBS) | |||
codec_source = \ | |||
codec/import.c \ | |||
codec/export.c \ | |||
codec/codec.h \ | |||
codec/text.c \ | |||
$(NULL) | |||
driver_source = \ | |||
driver/conio.c \ | |||
driver/ncurses.c \ | |||
driver/null.c \ | |||
driver/raw.c \ | |||
driver/slang.c \ | |||
driver/vga.c \ | |||
driver/win32.c \ | |||
$(NULL) | |||
install-exec-local: | |||
$(mkinstalldirs) $(DESTDIR)$(libdir) | |||
. libcaca.la; \ | |||
for x in $$library_names; do \ | |||
ln -sf $$x $(DESTDIR)$(libdir)/$$(echo $$x | sed 's/caca/cucul/g'); \ | |||
done | |||
ln -sf libcaca.la $(DESTDIR)$(libdir)/libcucul.la | |||
install-data-local: | |||
$(mkinstalldirs) $(DESTDIR)$(pkgconfigdir) | |||
ln -sf caca.pc $(DESTDIR)$(pkgconfigdir)/cucul.pc | |||
$(mkinstalldirs) $(DESTDIR)$(includedir) | |||
ln -sf caca.h $(DESTDIR)$(includedir)/cucul.h | |||
uninstall-local: | |||
. libcaca.la; \ | |||
for x in $$library_names; do \ | |||
rm -f $(DESTDIR)$(libdir)/$$(echo $$x | sed 's/caca/cucul/g'); \ | |||
done | |||
rm -f $(DESTDIR)$(libdir)/libcucul.la | |||
rmdir $(DESTDIR)$(libdir) 2>/dev/null || true | |||
rm -f $(DESTDIR)$(pkgconfigdir)/cucul.pc | |||
rmdir $(DESTDIR)$(pkgconfigdir) 2>/dev/null || true | |||
rm -f $(DESTDIR)$(includedir)/cucul.h | |||
if USE_PLUGINS | |||
plugin_LTLIBRARIES = libx11_plugin.la libgl_plugin.la | |||
plugindir = $(libdir)/caca | |||
libx11_plugin_la_SOURCES = driver/x11.c | |||
libx11_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(X11_CFLAGS) | |||
libx11_plugin_la_LDFLAGS = -no-undefined -module -no-version | |||
libx11_plugin_la_LIBADD = libcaca.la $(X11_LIBS) | |||
libgl_plugin_la_SOURCES = driver/gl.c | |||
libgl_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(GL_CFLAGS) #$(FTGL_CFLAGS) | |||
libgl_plugin_la_LDFLAGS = -no-undefined -module -no-version | |||
libgl_plugin_la_LIBADD = libcaca.la $(GL_LIBS) #$(FTGL_LIBS) | |||
else | |||
driver_source += driver/x11.c driver/gl.c | |||
endif | |||
if USE_COCOA | |||
driver_source += driver/cocoa.m | |||
endif | |||
@@ -0,0 +1,392 @@ | |||
/* | |||
* libcaca Colour ASCII-Art library | |||
* Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net> | |||
* All Rights Reserved | |||
* | |||
* $Id$ | |||
* | |||
* This library is free software. It comes without any warranty, to | |||
* the extent permitted by applicable law. You can redistribute it | |||
* and/or modify it under the terms of the Do What The Fuck You Want | |||
* To Public License, Version 2, as published by Sam Hocevar. See | |||
* http://sam.zoy.org/wtfpl/COPYING for more details. | |||
*/ | |||
/* | |||
* This file contains a full conio.h reimplementation. More information | |||
* on conio.h can be found on http://poli.cs.vsb.cz/c/help/conio.htm | |||
*/ | |||
#include "config.h" | |||
#if !defined(__KERNEL__) | |||
# include <stdio.h> | |||
# include <stdlib.h> | |||
#endif | |||
#include "caca.h" | |||
#include "caca_internals.h" | |||
#include "caca_conio.h" | |||
static caca_canvas_t *cv; | |||
static caca_display_t *dp; | |||
static int unget_ch = -1; | |||
static char pass_buffer[BUFSIZ]; | |||
static char cgets_buffer[BUFSIZ]; | |||
static void conio_init(void); | |||
static void conio_refresh(void); | |||
static void conio_fini(void); | |||
/** \brief DOS conio.h cgets() equivalent */ | |||
char * caca_conio_cgets(char *str) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
cgets_buffer[0] = '\0'; | |||
return cgets_buffer; | |||
} | |||
/** \brief DOS conio.h clreol() equivalent */ | |||
void caca_conio_clreol(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h clrscr() equivalent */ | |||
void caca_conio_clrscr(void) | |||
{ | |||
conio_init(); | |||
caca_clear_canvas(cv); | |||
conio_refresh(); | |||
} | |||
/** \brief DOS conio.h cprintf() equivalent */ | |||
int caca_conio_cprintf(const char *format, ...) | |||
{ | |||
va_list args; | |||
conio_init(); | |||
va_start(args, format); | |||
caca_vprintf(cv, caca_wherex(cv), caca_wherey(cv), format, args); | |||
va_end(args); | |||
conio_refresh(); | |||
/* FIXME: we should fix caca_vprintf so that it returns the number of | |||
* characters that were printed. */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h cputs() equivalent */ | |||
int caca_conio_cputs(const char *str) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h cscanf() equivalent */ | |||
int caca_conio_cscanf(char *format, ...) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h delline() equivalent */ | |||
void caca_conio_delline(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h getch() equivalent */ | |||
int caca_conio_getch(void) | |||
{ | |||
caca_event_t ev; | |||
int ch; | |||
conio_init(); | |||
if(unget_ch >= 0) | |||
{ | |||
int tmp = unget_ch; | |||
unget_ch = -1; | |||
return tmp; | |||
} | |||
caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1); | |||
ch = caca_get_event_key_ch(&ev); | |||
switch(ch) | |||
{ | |||
case CACA_KEY_LEFT: ch = 75; break; | |||
case CACA_KEY_RIGHT: ch = 77; break; | |||
default: break; | |||
} | |||
return ch; | |||
} | |||
/** \brief DOS conio.h getche() equivalent */ | |||
int caca_conio_getche(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h getpass() equivalent */ | |||
char * caca_conio_getpass(const char *prompt) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
pass_buffer[0] = '\0'; | |||
return pass_buffer; | |||
} | |||
/** \brief DOS conio.h gettext() equivalent */ | |||
int caca_conio_gettext(int left, int top, int right, int bottom, void *destin) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h gettextinfo() equivalent */ | |||
void caca_conio_gettextinfo(struct caca_conio_text_info *r) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h gotoxy() equivalent */ | |||
void caca_conio_gotoxy(int x, int y) | |||
{ | |||
conio_init(); | |||
caca_gotoxy(cv, x - 1, y - 1); | |||
conio_refresh(); | |||
} | |||
/** \brief DOS conio.h highvideo() equivalent */ | |||
void caca_conio_highvideo(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h insline() equivalent */ | |||
void caca_conio_insline(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h kbhit() equivalent */ | |||
int caca_conio_kbhit(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h lowvideo() equivalent */ | |||
void caca_conio_lowvideo(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h movetext() equivalent */ | |||
int caca_conio_movetext(int left, int top, int right, int bottom, | |||
int destleft, int desttop) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h normvideo() equivalent */ | |||
void caca_conio_normvideo(void) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS stdio.h printf() equivalent */ | |||
int caca_conio_printf(const char *format, ...) | |||
{ | |||
va_list args; | |||
conio_init(); | |||
va_start(args, format); | |||
caca_vprintf(cv, caca_wherex(cv), caca_wherey(cv), format, args); | |||
va_end(args); | |||
conio_refresh(); | |||
/* FIXME: we should fix caca_vprintf so that it returns the number of | |||
* characters that were printed. */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h putch() equivalent */ | |||
int caca_conio_putch(int ch) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h puttext() equivalent */ | |||
int caca_conio_puttext(int left, int top, int right, int bottom, void *destin) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
return 0; | |||
} | |||
/** \brief DOS conio.h _setcursortype() equivalent */ | |||
void caca_conio__setcursortype(int cur_t) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h textattr() equivalent */ | |||
void caca_conio_textattr(int newattr) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h textbackground() equivalent */ | |||
void caca_conio_textbackground(int newcolor) | |||
{ | |||
conio_init(); | |||
caca_set_color_ansi(cv, caca_attr_to_ansi_fg(caca_get_attr(cv, -1, -1)), | |||
newcolor); | |||
} | |||
/** \brief DOS conio.h textcolor() equivalent */ | |||
void caca_conio_textcolor(int newcolor) | |||
{ | |||
conio_init(); | |||
caca_set_color_ansi(cv, newcolor, | |||
caca_attr_to_ansi_bg(caca_get_attr(cv, -1, -1))); | |||
} | |||
/** \brief DOS conio.h textmode() equivalent */ | |||
void caca_conio_textmode(int newmode) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/** \brief DOS conio.h ungetch() equivalent */ | |||
int caca_conio_ungetch(int ch) | |||
{ | |||
conio_init(); | |||
if(unget_ch >= 0) | |||
return EOF; | |||
unget_ch = ch; | |||
return ch; | |||
} | |||
/** \brief DOS conio.h wherex() equivalent */ | |||
int caca_conio_wherex(void) | |||
{ | |||
conio_init(); | |||
return caca_wherex(cv) + 1; | |||
} | |||
/** \brief DOS conio.h wherey() equivalent */ | |||
int caca_conio_wherey(void) | |||
{ | |||
conio_init(); | |||
return caca_wherey(cv) + 1; | |||
} | |||
/** \brief DOS conio.h window() equivalent */ | |||
void caca_conio_window(int left, int top, int right, int bottom) | |||
{ | |||
conio_init(); | |||
/* TODO: implement this function */ | |||
} | |||
/* XXX: the following functions are local. */ | |||
static void conio_init(void) | |||
{ | |||
if(!cv) | |||
cv = caca_create_canvas(80, 25); | |||
if(!dp) | |||
{ | |||
dp = caca_create_display(cv); | |||
caca_set_cursor(dp, 1); | |||
#if defined HAVE_ATEXIT | |||
atexit(conio_fini); | |||
#endif | |||
} | |||
} | |||
static void conio_refresh(void) | |||
{ | |||
caca_refresh_display(dp); | |||
} | |||
static void conio_fini(void) | |||
{ | |||
caca_free_display(dp); | |||
dp = NULL; | |||
caca_free_canvas(cv); | |||
cv = NULL; | |||
} | |||
@@ -0,0 +1,255 @@ | |||
/* | |||
* libcaca Colour ASCII-Art library | |||
* Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net> | |||
* All Rights Reserved | |||
* | |||
* $Id$ | |||
* | |||
* This library is free software. It comes without any warranty, to | |||
* the extent permitted by applicable law. You can redistribute it | |||
* and/or modify it under the terms of the Do What The Fuck You Want | |||
* To Public License, Version 2, as published by Sam Hocevar. See | |||
* http://sam.zoy.org/wtfpl/COPYING for more details. | |||
*/ | |||
/* | |||
* This header contains a conio.h reimplementation. | |||
*/ | |||
#ifndef __CACA_CONIO_H__ | |||
#define __CACA_CONIO_H__ | |||
#include <caca.h> | |||
#if !defined(__KERNEL__) | |||
# include <stdio.h> | |||
#endif | |||
#undef __extern | |||
#if defined(_DOXYGEN_SKIP_ME) | |||
#elif defined(_WIN32) && defined(__LIBCACA__) | |||
# define __extern extern __declspec(dllexport) | |||
#else | |||
# define __extern extern | |||
#endif | |||
#ifdef __cplusplus | |||
extern "C" | |||
{ | |||
#endif | |||
/* conio.h defines and global variables */ | |||
#define CACA_CONIO_BLINK 128 | |||
#define CACA_CONIO_BLACK 0 | |||
#define CACA_CONIO_BLUE 1 | |||
#define CACA_CONIO_GREEN 2 | |||
#define CACA_CONIO_CYAN 3 | |||
#define CACA_CONIO_RED 4 | |||
#define CACA_CONIO_MAGENTA 5 | |||
#define CACA_CONIO_BROWN 6 | |||
#define CACA_CONIO_LIGHTGRAY 7 | |||
#define CACA_CONIO_DARKGRAY 8 | |||
#define CACA_CONIO_LIGHTBLUE 9 | |||
#define CACA_CONIO_LIGHTGREEN 10 | |||
#define CACA_CONIO_LIGHTCYAN 11 | |||
#define CACA_CONIO_LIGHTRED 12 | |||
#define CACA_CONIO_LIGHTMAGENTA 13 | |||
#define CACA_CONIO_YELLOW 14 | |||
#define CACA_CONIO_WHITE 15 | |||
__extern int caca_conio_directvideo; | |||
#define CACA_CONIO__NOCURSOR 0 | |||
#define CACA_CONIO__SOLIDCURSOR 1 | |||
#define CACA_CONIO__NORMALCURSOR 2 | |||
struct caca_conio_text_info | |||
{ | |||
unsigned char winleft; /* left window coordinate */ | |||
unsigned char wintop; /* top window coordinate */ | |||
unsigned char winright; /* right window coordinate */ | |||
unsigned char winbottom; /* bottom window coordinate */ | |||
unsigned char attribute; /* text attribute */ | |||
unsigned char normattr; /* normal attribute */ | |||
unsigned char currmode; /* current video mode: | |||
BW40, BW80, C40, C80, or C4350 */ | |||
unsigned char screenheight; /* text screen's height */ | |||
unsigned char screenwidth; /* text screen's width */ | |||
unsigned char curx; /* x-coordinate in current window */ | |||
unsigned char cury; /* y-coordinate in current window */ | |||
}; | |||
#define CACA_CONIO_LASTMODE -1 | |||
#define CACA_CONIO_BW40 0 | |||
#define CACA_CONIO_C40 1 | |||
#define CACA_CONIO_BW80 2 | |||
#define CACA_CONIO_C80 3 | |||
#define CACA_CONIO_MONO 7 | |||
#define CACA_CONIO_C4350 64 | |||
__extern int caca_conio__wscroll; | |||
#if !defined _DOXYGEN_SKIP_ME && !defined __LIBCACA__ | |||
# undef BLINK | |||
# define BLINK CACA_CONIO_BLINK | |||
# undef BLACK | |||
# define BLACK CACA_CONIO_BLACK | |||
# undef BLUE | |||
# define BLUE CACA_CONIO_BLUE | |||
# undef GREEN | |||
# define GREEN CACA_CONIO_GREEN | |||
# undef CYAN | |||
# define CYAN CACA_CONIO_CYAN | |||
# undef RED | |||
# define RED CACA_CONIO_RED | |||
# undef MAGENTA | |||
# define MAGENTA CACA_CONIO_MAGENTA | |||
# undef BROWN | |||
# define BROWN CACA_CONIO_BROWN | |||
# undef LIGHTGRAY | |||
# define LIGHTGRAY CACA_CONIO_LIGHTGRAY | |||
# undef DARKGRAY | |||
# define DARKGRAY CACA_CONIO_DARKGRAY | |||
# undef LIGHTBLUE | |||
# define LIGHTBLUE CACA_CONIO_LIGHTBLUE | |||
# undef LIGHTGREEN | |||
# define LIGHTGREEN CACA_CONIO_LIGHTGREEN | |||
# undef LIGHTCYAN | |||
# define LIGHTCYAN CACA_CONIO_LIGHTCYAN | |||
# undef LIGHTRED | |||
# define LIGHTRED CACA_CONIO_LIGHTRED | |||
# undef LIGHTMAGENTA | |||
# define LIGHTMAGENTA CACA_CONIO_LIGHTMAGENTA | |||
# undef YELLOW | |||
# define YELLOW CACA_CONIO_YELLOW | |||
# undef WHITE | |||
# define WHITE CACA_CONIO_WHITE | |||
# undef directvideo | |||
# define directvideo caca_conio_directvideo | |||
# undef _NOCURSOR | |||
# define _NOCURSOR CACA_CONIO__NOCURSOR | |||
# undef _SOLIDCURSOR | |||
# define _SOLIDCURSOR CACA_CONIO__SOLIDCURSOR | |||
# undef _NORMALCURSOR | |||
# define _NORMALCURSOR CACA_CONIO__NORMALCURSOR | |||
# undef text_info | |||
# define text_info caca_conio_text_info | |||
# undef LASTMODE | |||
# define LASTMODE CACA_CONIO_LASTMODE | |||
# undef BW40 | |||
# define BW40 CACA_CONIO_BW40 | |||
# undef C40 | |||
# define C40 CACA_CONIO_C40 | |||
# undef BW80 | |||
# define BW80 CACA_CONIO_BW80 | |||
# undef C80 | |||
# define C80 CACA_CONIO_C80 | |||
# undef MONO | |||
# define MONO CACA_CONIO_MONO | |||
# undef C4350 | |||
# define C4350 CACA_CONIO_C4350 | |||
# undef _wscroll | |||
# define _wscroll caca_conio__wscroll | |||
#endif | |||
/* conio.h functions */ | |||
__extern char * caca_conio_cgets(char *str); | |||
__extern void caca_conio_clreol(void); | |||
__extern void caca_conio_clrscr(void); | |||
__extern int caca_conio_cprintf(const char *format, ...); | |||
__extern int caca_conio_cputs(const char *str); | |||
__extern int caca_conio_cscanf(char *format, ...); | |||
__extern void caca_conio_delline(void); | |||
__extern int caca_conio_getch(void); | |||
__extern int caca_conio_getche(void); | |||
__extern char * caca_conio_getpass(const char *prompt); | |||
__extern int caca_conio_gettext(int left, int top, int right, int bottom, | |||
void *destin); | |||
__extern void caca_conio_gettextinfo(struct caca_conio_text_info *r); | |||
__extern void caca_conio_gotoxy(int x, int y); | |||
__extern void caca_conio_highvideo(void); | |||
__extern void caca_conio_insline(void); | |||
__extern int caca_conio_kbhit(void); | |||
__extern void caca_conio_lowvideo(void); | |||
__extern int caca_conio_movetext(int left, int top, int right, int bottom, | |||
int destleft, int desttop); | |||
__extern void caca_conio_normvideo(void); | |||
__extern int caca_conio_printf(const char *format, ...); | |||
__extern int caca_conio_putch(int ch); | |||
__extern int caca_conio_puttext(int left, int top, int right, int bottom, | |||
void *destin); | |||
__extern void caca_conio__setcursortype(int cur_t); | |||
__extern void caca_conio_textattr(int newattr); | |||
__extern void caca_conio_textbackground(int newcolor); | |||
__extern void caca_conio_textcolor(int newcolor); | |||
__extern void caca_conio_textmode(int newmode); | |||
__extern int caca_conio_ungetch(int ch); | |||
__extern int caca_conio_wherex(void); | |||
__extern int caca_conio_wherey(void); | |||
__extern void caca_conio_window(int left, int top, int right, int bottom); | |||
#if !defined _DOXYGEN_SKIP_ME && !defined __LIBCACA__ | |||
# undef cgets | |||
# define cgets caca_conio_cgets | |||
# undef clreol | |||
# define clreol caca_conio_clreol | |||
# undef clrscr | |||
# define clrscr caca_conio_clrscr | |||
# undef cprintf | |||
# define cprintf caca_conio_cprintf | |||
# undef cputs | |||
# define cputs caca_conio_cputs | |||
# undef cscanf | |||
# define cscanf caca_conio_cscanf | |||
# undef delline | |||
# define delline caca_conio_delline | |||
# undef getch | |||
# define getch caca_conio_getch | |||
# undef getche | |||
# define getche caca_conio_getche | |||
# undef getpass | |||
# define getpass caca_conio_getpass | |||
# undef gettext | |||
# define gettext caca_conio_gettext | |||
# undef gettextinfo | |||
# define gettextinfo caca_conio_gettextinfo | |||
# undef gotoxy | |||
# define gotoxy caca_conio_gotoxy | |||
# undef highvideo | |||
# define highvideo caca_conio_highvideo | |||
# undef insline | |||
# define insline caca_conio_insline | |||
# undef kbhit | |||
# define kbhit caca_conio_kbhit | |||
# undef lowvideo | |||
# define lowvideo caca_conio_lowvideo | |||
# undef movetext | |||
# define movetext caca_conio_movetext | |||
# undef normvideo | |||
# define normvideo caca_conio_normvideo | |||
# undef printf | |||
# define printf caca_conio_printf | |||
# undef putch | |||
# define putch caca_conio_putch | |||
# undef puttext | |||
# define puttext caca_conio_puttext | |||
# undef _setcursortype | |||
# define _setcursortype caca_conio__setcursortype | |||
# undef textattr | |||
# define textattr caca_conio_textattr | |||
# undef textbackground | |||
# define textbackground caca_conio_textbackground | |||
# undef textcolor | |||
# define textcolor caca_conio_textcolor | |||
# undef textmode | |||
# define textmode caca_conio_textmode | |||
# undef ungetch | |||
# define ungetch caca_conio_ungetch | |||
# undef wherex | |||
# define wherex caca_conio_wherex | |||
# undef wherey | |||
# define wherey caca_conio_wherey | |||
# undef window | |||
# define window caca_conio_window | |||
#endif | |||
#ifdef __cplusplus | |||
} | |||
#endif | |||
#endif /* __CACA_CONIO_H__ */ |
@@ -103,7 +103,7 @@ AC_ARG_ENABLE(zzuf, | |||
AC_CHECK_HEADERS(stdio.h stdarg.h signal.h sys/ioctl.h sys/time.h endian.h unistd.h arpa/inet.h netinet/in.h winsock2.h errno.h locale.h getopt.h dlfcn.h termios.h) | |||
AC_CHECK_FUNCS(signal ioctl snprintf vsnprintf getenv putenv strcasecmp htons) | |||
AC_CHECK_FUNCS(usleep gettimeofday) | |||
AC_CHECK_FUNCS(usleep gettimeofday atexit) | |||
ac_cv_have_getopt_long="no" | |||
AC_CHECK_FUNCS(getopt_long, | |||
@@ -1,6 +1,7 @@ | |||
blit | |||
canvas | |||
colors | |||
conio | |||
demo | |||
demo0 | |||
dithering | |||
@@ -2,7 +2,7 @@ | |||
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/caca -I$(top_builddir)/caca | |||
noinst_PROGRAMS = blit canvas colors demo demo0 dithering driver event export figfont font font2tga frames fullwidth gamma hsv input spritedit swallow text transform truecolor unicode import | |||
noinst_PROGRAMS = blit canvas colors conio demo demo0 dithering driver event export figfont font font2tga frames fullwidth gamma hsv input spritedit swallow text transform truecolor unicode import | |||
blit_SOURCES = blit.c | |||
blit_LDADD = ../caca/libcaca.la | |||
@@ -13,6 +13,9 @@ canvas_LDADD = ../caca/libcaca.la | |||
colors_SOURCES = colors.c | |||
colors_LDADD = ../caca/libcaca.la | |||
conio_SOURCES = conio.c | |||
conio_LDADD = ../caca/libcaca.la | |||
demo_SOURCES = demo.c | |||
demo_LDADD = ../caca/libcaca.la | |||
demo_LDFLAGS = @MATH_LIBS@ | |||
@@ -0,0 +1,682 @@ | |||
/*4il.c (4 in line) - compiled under Borland C++ 5.0. | |||
*Version : Beta | |||
*Author : Cheok Yan Cheng | |||
*Date started coding : 11/10/2000 | |||
*Date finished coding : 13/10/2000 | |||
*/ | |||
/*If you had encounted any problem, bugs or comment on this source code | |||
*you are welcomed to contact me by my e-mail : yccheok@yahoo.com | |||
*/ | |||
/*Some terms in this source code that you encounted may looked strange to you. | |||
*However, I have no time to include the explaination in detail. | |||
*If you really want to know, please contact me through e-mail. | |||
*Sorry for the inconvenience | |||
*/ | |||
#include "config.h" | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <time.h> | |||
#include "caca_conio.h" | |||
#undef max | |||
#define X_BOARD 8 | |||
#define Y_BOARD 8 | |||
#define BOARD_SIZE X_BOARD*Y_BOARD | |||
#define BOOLEAN int | |||
#define TRUE 1 | |||
#define FALSE 0 | |||
#define WIN 1 | |||
#define LOSE -1 | |||
#define DRAW 0 | |||
#define OK 2 | |||
#define COMPUTER 0 | |||
#define HUMAN 1 | |||
#define EMPTY -1 | |||
#define BASE -2 | |||
#define WIN_MESSAGE "I Win! Press Any Key To Continue...\n" | |||
#define LOSE_MESSAGE "You Win! Press Any Key To Continue...\n" | |||
#define DRAW_MESSAGE "Draw! Press Any Key To Continue...\n" | |||
BOOLEAN computerMove(void); | |||
BOOLEAN doubleHaed(int, int [Y_BOARD][X_BOARD]); | |||
BOOLEAN humanMove(int); | |||
BOOLEAN isFull(void); | |||
BOOLEAN isWon(int, int [Y_BOARD][X_BOARD]); | |||
BOOLEAN twoSnake(int, int, int [Y_BOARD][X_BOARD]); | |||
int bestmove(void); | |||
int max(int [X_BOARD]); | |||
int status(void); | |||
int xDoubleHead(int, int [Y_BOARD][X_BOARD]); | |||
int xTwoSnake(int, int [Y_BOARD][X_BOARD]); | |||
int xWon(int, int [Y_BOARD][X_BOARD]); | |||
int y_Base(int, int [Y_BOARD][X_BOARD]); | |||
void duplicate(int [Y_BOARD][X_BOARD], int [Y_BOARD][X_BOARD]); | |||
void drawBoard(void); | |||
void drawPiece(void); | |||
void genNumWin(int [X_BOARD]); | |||
void getHumanMove(void); | |||
void init(void); | |||
void makeMove(int, int, int [Y_BOARD][X_BOARD]); | |||
void sorting(int n[X_BOARD]); | |||
int move[X_BOARD] = {3, 4, 2, 5, 1, 6, 0, 7}; | |||
int col[X_BOARD] = {-1,-1,-1,-1,-1,-1,-1,-1}; | |||
int square[Y_BOARD][X_BOARD] = | |||
{ {-1, -1, -1, -1, -1, -1, -1, -1}, | |||
{-1, -1, -1, -1, -1, -1, -1, -1}, | |||
{-1, -1, -1, -1, -1, -1, -1, -1}, | |||
{-1, -1, -1, -1, -1, -1, -1, -1}, | |||
{-1, -1, -1, -1, -1, -1, -1, -1}, | |||
{-1, -1, -1, -1, -1, -1, -1, -1}, | |||
{-1, -1, -1, -1, -1, -1, -1, -1}, | |||
{-2, -2, -2, -2, -2, -2, -2, -2}, | |||
}; | |||
BOOLEAN computerMove(void) | |||
{ | |||
int x_best; | |||
if (isFull()) | |||
return FALSE; | |||
x_best = bestmove(); | |||
gotoxy(52,2); | |||
printf("x:%d, y:%d\n" ,x_best+1 ,Y_BOARD-y_Base(x_best,square)); | |||
makeMove(COMPUTER, x_best, square); | |||
return TRUE; | |||
} | |||
BOOLEAN doubleHead(int who, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int x,y; | |||
for(y=0; y<Y_BOARD; y++) | |||
{ | |||
for(x=0; x<(X_BOARD-4); x++) | |||
{ | |||
if( xsquare[y][x] == BASE && | |||
xsquare[y][x+1] == who && | |||
xsquare[y][x+2] == who && | |||
xsquare[y][x+3] == who && | |||
xsquare[y][x+4] == BASE ) | |||
return TRUE; | |||
} | |||
} | |||
return FALSE; | |||
} | |||
BOOLEAN humanMove(int x) | |||
{ | |||
gotoxy(1,20); | |||
if ((x < 0) || x >= X_BOARD) | |||
return FALSE; | |||
if (y_Base(x, square) == -1) /*indicate no base at that x-coulomb*/ | |||
return FALSE; | |||
if (isFull()) /*the board is full*/ | |||
return FALSE; | |||
gotoxy(52,5); | |||
printf("x:%d, y:%d\n" ,x+1 ,Y_BOARD-y_Base(x,square)); | |||
makeMove(HUMAN,x,square); | |||
return TRUE; | |||
} | |||
BOOLEAN isFull() | |||
{ | |||
int x; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
if(square[0][x] == EMPTY || square[0][x] == BASE) | |||
return FALSE; | |||
} | |||
return TRUE; | |||
} | |||
BOOLEAN isWon(int who, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int x,y; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
for(y=0; y<Y_BOARD; y++) | |||
{ | |||
/*horizontal position*/ | |||
if( xsquare[y][x] == who && | |||
xsquare[y][x+1] == who && | |||
xsquare[y][x+2] == who && | |||
xsquare[y][x+3] == who && | |||
(x+3)<X_BOARD | |||
) | |||
return TRUE; | |||
/*vertical position*/ | |||
if( xsquare[y][x] == who && | |||
xsquare[y+1][x] == who && | |||
xsquare[y+2][x] == who && | |||
xsquare[y+3][x] == who && | |||
(y+3)<Y_BOARD | |||
) | |||
return TRUE; | |||
/*downstair diagonal position*/ | |||
if( xsquare[y][x] == who && | |||
xsquare[y+1][x+1] == who && | |||
xsquare[y+2][x+2] == who && | |||
xsquare[y+3][x+3] == who && | |||
(x+3)<X_BOARD && | |||
(y+3)<Y_BOARD | |||
) | |||
return TRUE; | |||
/*upstair diagonal position*/ | |||
if( xsquare[y][x] == who && | |||
xsquare[y-1][x+1] == who && | |||
xsquare[y-2][x+2] == who && | |||
xsquare[y-3][x+3] == who && | |||
(x+3)<X_BOARD && | |||
(y-3)>=0 | |||
) | |||
return TRUE; | |||
} | |||
} | |||
return FALSE; | |||
} | |||
BOOLEAN twoSnake(int who, int x, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int xxsquare[Y_BOARD][X_BOARD]; | |||
int n[Y_BOARD] = {0,0,0,0,0,0,0,0}; | |||
int i; | |||
for(i=0; i<Y_BOARD; i++) | |||
{ | |||
if(xsquare[i][x] == BASE || xsquare[i][x] == EMPTY) | |||
{ | |||
duplicate(xxsquare, xsquare); | |||
xxsquare[i][x] = who; | |||
if(isWon(who, xxsquare)) | |||
n[i] = TRUE; | |||
} | |||
} | |||
for(i=0; i<(Y_BOARD-1); i++) | |||
{ | |||
if( n[i] == TRUE && n[i+1] == TRUE ) | |||
return TRUE; | |||
} | |||
return FALSE; | |||
} | |||
int bestmove() | |||
{ | |||
int xsquare[Y_BOARD][X_BOARD], n[X_BOARD], i, snake; | |||
gotoxy(1,19); | |||
textcolor(4); | |||
if(xWon(COMPUTER, square) != -1) | |||
{ | |||
cprintf("Computer Previous Depth : +1\n"); | |||
return xWon(COMPUTER, square); | |||
} | |||
if(xWon(HUMAN, square) != -1) | |||
{ | |||
cprintf("Computer Previous Depth : -1\n"); | |||
return xWon(HUMAN, square); | |||
} | |||
for(i=0; i<X_BOARD; i++) | |||
{ | |||
if(y_Base(move[i], square) != -1 && col[move[i]] == COMPUTER) | |||
{ | |||
duplicate(xsquare, square); | |||
makeMove(COMPUTER, move[i], xsquare); | |||
if(xWon(HUMAN, xsquare) == -1) | |||
{ | |||
cprintf("Computer Previous Depth : +2\n"); | |||
return move[i]; | |||
} | |||
} | |||
} | |||
if(xDoubleHead(COMPUTER, square) != -1) | |||
{ | |||
duplicate(xsquare, square); | |||
makeMove(COMPUTER, xDoubleHead(COMPUTER, xsquare), xsquare); | |||
if(xWon(HUMAN, xsquare) == -1) | |||
{ | |||
cprintf("Computer Previous Depth : +3\n"); | |||
return xDoubleHead(COMPUTER, square); | |||
} | |||
} | |||
if(xDoubleHead(HUMAN, square) != -1) | |||
{ | |||
duplicate(xsquare, square); | |||
makeMove(COMPUTER, xDoubleHead(HUMAN, xsquare), xsquare); | |||
if(xWon(HUMAN, xsquare) == -1) | |||
{ | |||
cprintf("Computer Previous Depth : -3\n"); | |||
return xDoubleHead(HUMAN, square); | |||
} | |||
} | |||
snake =xTwoSnake(COMPUTER, square); | |||
if( snake != -1) | |||
{ | |||
duplicate(xsquare, square); | |||
makeMove(COMPUTER, snake, xsquare); | |||
if(xWon(HUMAN, xsquare) == -1) | |||
{ | |||
cprintf("Computer Previous Depth : +4\n"); | |||
return snake; | |||
} | |||
} | |||
if(xTwoSnake(HUMAN, square) != -1) | |||
{ | |||
duplicate(xsquare, square); | |||
makeMove(COMPUTER, xTwoSnake(HUMAN, xsquare), xsquare); | |||
if(xWon(HUMAN, xsquare) == -1) | |||
{ | |||
cprintf("Computer Previous Depth : -4\n"); | |||
return xTwoSnake(HUMAN, square); | |||
} | |||
} | |||
genNumWin(n); | |||
sorting(n); | |||
for(i=0; i<X_BOARD; i++) | |||
{ | |||
if( y_Base (n[i], square) != -1) | |||
{ | |||
duplicate(xsquare, square); | |||
makeMove(COMPUTER, n[i], xsquare); | |||
if(xWon(HUMAN, xsquare) == -1) | |||
{ | |||
cprintf("Computer Previous Depth : +5\n"); | |||
return n[i]; | |||
} | |||
} | |||
} | |||
for(i=0; i<X_BOARD; i++) | |||
{ | |||
if( y_Base (move[i], square) != -1) | |||
{ | |||
cprintf("Computer Previous Depth : +0\n"); | |||
return move[i]; | |||
} | |||
} | |||
return -1; | |||
} | |||
int max(int n[X_BOARD]) | |||
{ | |||
int i, big; | |||
big = 0; | |||
for(i=0; i<X_BOARD; i++) | |||
{ | |||
if(n[i]>big) | |||
big = n[i]; | |||
} | |||
return big; | |||
} | |||
int status() | |||
{ | |||
if (isWon(COMPUTER, square)) | |||
return WIN; | |||
else | |||
if (isWon(HUMAN, square)) | |||
return LOSE; | |||
else | |||
if (isFull()) | |||
return DRAW; | |||
else | |||
return OK; | |||
} | |||
int xDoubleHead(int who, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int x; | |||
int xxsquare[Y_BOARD][X_BOARD]; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
if(y_Base(x,xsquare) != -1) | |||
{ | |||
duplicate(xxsquare, xsquare); | |||
makeMove(who, x, xxsquare); | |||
if(doubleHead(who, xxsquare)) | |||
return x; | |||
} | |||
} | |||
return -1; | |||
} | |||
int xTwoSnake(int who, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int x, dx; | |||
int xxsquare[Y_BOARD][X_BOARD]; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
if(y_Base(move[x],xsquare) != -1) | |||
{ | |||
duplicate(xxsquare, xsquare); | |||
makeMove(who, move[x], xxsquare); | |||
for(dx=0; dx<X_BOARD; dx++) | |||
{ | |||
if( twoSnake(who, move[dx], xxsquare) && col[move[dx]] != who) | |||
{ | |||
if(who == COMPUTER) | |||
col[move[dx]] = who; | |||
return move[x]; | |||
} | |||
} | |||
} | |||
} | |||
return -1; | |||
} | |||
int xWon(int who, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int x; | |||
int xxsquare[Y_BOARD][X_BOARD]; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
if(y_Base(x,xsquare) != -1) | |||
{ | |||
duplicate(xxsquare, xsquare); | |||
makeMove(who, x, xxsquare); | |||
if(isWon(who, xxsquare)) | |||
return x; | |||
} | |||
} | |||
return -1; | |||
} | |||
int y_Base(int x, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int y; | |||
for(y=0; y<Y_BOARD; y++) | |||
{ | |||
if(xsquare[y][x] == BASE) | |||
return y; | |||
} | |||
return -1; /*indicate no base at that x*/ | |||
} | |||
void duplicate(int xSquare[Y_BOARD][X_BOARD], int oSquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int x,y; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
for(y=0; y<Y_BOARD; y++) | |||
{ | |||
xSquare[y][x] = oSquare[y][x]; | |||
} | |||
} | |||
} | |||
void drawBoard() | |||
{ | |||
textcolor(0); | |||
textbackground(7); | |||
clrscr(); | |||
gotoxy(1,1); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("| | | | | | | | |\n"); | |||
printf("+-----+-----+-----+-----+-----+-----+-----+-----+\n"); | |||
printf("ARROW:move\tSPACE:select\tESC:exit\n"); | |||
textcolor(1); | |||
gotoxy(44,20); | |||
cprintf("%-1s","4 In Line\n"); | |||
gotoxy(44,21); | |||
cprintf("%-1s","ver Beta by Cheok Yan Cheng\n"); | |||
gotoxy(44,22); | |||
cprintf("E-mail : yccheok@yahoo.com\n"); | |||
gotoxy(44,23); | |||
cprintf("Web Site: www.geocities.com/yccheok\n"); | |||
gotoxy(44,24); | |||
cprintf("Source code included!\n"); | |||
gotoxy(1,22); | |||
printf("Human's Piece is O\n"); | |||
gotoxy(1,23); | |||
printf("Computer's Piece is X\n"); | |||
gotoxy(52,1); | |||
printf("Computer Move :\n"); | |||
gotoxy(52,4); | |||
printf("Human Move :\n"); | |||
} | |||
void drawPiece() | |||
{ | |||
int x,y; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
for(y=0; y<Y_BOARD; y++) | |||
{ | |||
if(square[y][x] == HUMAN) | |||
{ | |||
gotoxy(x*6+4, y*2+2); | |||
textcolor(1); | |||
cprintf("O\n"); | |||
} | |||
else | |||
if(square[y][x] == COMPUTER) | |||
{ | |||
gotoxy(x*6+4, y*2+2); | |||
textcolor(4); | |||
cprintf("X\n"); | |||
} | |||
} | |||
} | |||
} | |||
void genNumWin(int n[X_BOARD]) | |||
{ | |||
int i, j, k, mov; | |||
int xsquare[Y_BOARD][X_BOARD]; | |||
int xxsquare[Y_BOARD][X_BOARD]; | |||
for(i=0; i<X_BOARD; i++) | |||
{ | |||
n[i]=0; | |||
if(y_Base(i, square) != -1) /*has base exsit?*/ | |||
{ | |||
duplicate(xsquare, square); | |||
makeMove(COMPUTER, i, xsquare); | |||
for(j=0; j<X_BOARD; j++) | |||
{ | |||
for(k=0; k<Y_BOARD; k++) | |||
{ | |||
if(xsquare[k][j] == EMPTY || xsquare[k][j] == BASE) | |||
{ | |||
duplicate(xxsquare, xsquare); | |||
xxsquare[k][j] = COMPUTER; | |||
if(isWon(COMPUTER, xxsquare)) | |||
n[i]++; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
void getHumanMove() | |||
{ | |||
int x=3 ; | |||
int ch; | |||
while(TRUE) | |||
{ | |||
gotoxy(x*6 +4, 2); | |||
ch = (int)getch(); | |||
switch(ch) | |||
{ | |||
case 75:/*LEFT*/ | |||
if(x>0) | |||
x--; | |||
break; | |||
case 77:/*RIGHT*/ | |||
if(x<(X_BOARD-1)) | |||
x++; | |||
break; | |||
case 27:/*ESC*/ | |||
textcolor(7); | |||
textbackground(0); | |||
clrscr(); | |||
printf("Thank You For Playing 4 in line by Cheok Yan Cheng!\n"); | |||
exit(0); | |||
break; | |||
case 32:/*SPACE*/ | |||
if(humanMove(x)) | |||
{ | |||
drawPiece(); | |||
return; | |||
} | |||
else | |||
{ | |||
gotoxy(1,20); | |||
textcolor(4); | |||
cprintf("OOPs! Wrong Move! \n"); | |||
} | |||
} | |||
} | |||
} | |||
void init() | |||
{ | |||
int x,y; | |||
for(x=0; x<X_BOARD; x++) | |||
{ | |||
for(y=0; y<(Y_BOARD-1); y++) | |||
{ | |||
square[y][x] = EMPTY; | |||
} | |||
square[7][x] = BASE; | |||
col[x] = -1; | |||
} | |||
} | |||
void makeMove(int who, int x, int xsquare[Y_BOARD][X_BOARD]) | |||
{ | |||
int y; | |||
y = y_Base(x, xsquare); | |||
xsquare[y][x] = who; | |||
if(y>0) | |||
xsquare[y-1][x] = BASE; | |||
} | |||
void sorting(int n[]) | |||
{ | |||
int i, index, alpha; | |||
int tmp[X_BOARD]; | |||
int store[X_BOARD]; | |||
for(index=0; index<X_BOARD; index++) | |||
{ | |||
alpha = max(n); | |||
for(i=0; i<X_BOARD; i++) | |||
{ | |||
if(n[move[i]] == alpha) | |||
{ | |||
store[index] = move[i]; | |||
n[move[i]] = -1; | |||
break; | |||
} | |||
} | |||
} | |||
for(i=0; i<X_BOARD; i++) | |||
n[i] = store[i]; | |||
} | |||
void main() | |||
{ | |||
BOOLEAN myturn; | |||
myturn = TRUE; | |||
drawBoard(); | |||
srand(time(NULL)); | |||
rand(); | |||
do | |||
{ | |||
switch (status()) | |||
{ | |||
case WIN: | |||
case LOSE: | |||
case DRAW: | |||
init(); | |||
drawBoard(); | |||
if (myturn) | |||
{ | |||
makeMove(COMPUTER,(2+rand()%4),square); | |||
} | |||
myturn = !myturn; | |||
drawPiece(); | |||
} | |||
textcolor(4); | |||
gotoxy(1,20); | |||
cprintf("Your Turn, Please.\n"); | |||
getHumanMove(); | |||
gotoxy(1,20); | |||
textcolor(4); | |||
switch (status()) | |||
{ | |||
case WIN: | |||
cprintf(WIN_MESSAGE); | |||
getch(); | |||
break; | |||
case LOSE: | |||
cprintf(LOSE_MESSAGE); | |||
getch(); | |||
break; | |||
case DRAW: | |||
cprintf(DRAW_MESSAGE); | |||
getch(); | |||
break; | |||
default:/*OK*/ | |||
if(computerMove()) | |||
{ | |||
gotoxy(1,20); | |||
drawPiece(); | |||
gotoxy(1,20); | |||
switch (status()) | |||
{ | |||
case WIN: | |||
cprintf(WIN_MESSAGE); | |||
getch(); | |||
break; | |||
case LOSE: | |||
cprintf(LOSE_MESSAGE); | |||
getch(); | |||
break; | |||
case DRAW: | |||
cprintf(DRAW_MESSAGE); | |||
getch(); | |||
break; | |||
} | |||
} | |||
} | |||
} | |||
while(TRUE); | |||
} | |||