| @@ -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_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(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_cv_have_getopt_long="no" | ||||
| AC_CHECK_FUNCS(getopt_long, | AC_CHECK_FUNCS(getopt_long, | ||||
| @@ -1,6 +1,7 @@ | |||||
| blit | blit | ||||
| canvas | canvas | ||||
| colors | colors | ||||
| conio | |||||
| demo | demo | ||||
| demo0 | demo0 | ||||
| dithering | dithering | ||||
| @@ -2,7 +2,7 @@ | |||||
| AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/caca -I$(top_builddir)/caca | 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_SOURCES = blit.c | ||||
| blit_LDADD = ../caca/libcaca.la | blit_LDADD = ../caca/libcaca.la | ||||
| @@ -13,6 +13,9 @@ canvas_LDADD = ../caca/libcaca.la | |||||
| colors_SOURCES = colors.c | colors_SOURCES = colors.c | ||||
| colors_LDADD = ../caca/libcaca.la | colors_LDADD = ../caca/libcaca.la | ||||
| conio_SOURCES = conio.c | |||||
| conio_LDADD = ../caca/libcaca.la | |||||
| demo_SOURCES = demo.c | demo_SOURCES = demo.c | ||||
| demo_LDADD = ../caca/libcaca.la | demo_LDADD = ../caca/libcaca.la | ||||
| demo_LDFLAGS = @MATH_LIBS@ | 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); | |||||
| } | |||||