Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/games/gomoku Better user interface. From OpenBSD, written by...



details:   https://anonhg.NetBSD.org/src/rev/a3b0425bd553
branches:  trunk
changeset: 753448:a3b0425bd553
user:      dholland <dholland%NetBSD.org@localhost>
date:      Mon Mar 29 03:51:55 2010 +0000

description:
Better user interface. From OpenBSD, written by Paul Janzen quite a
long time ago. A few minor adjustments by yours truly.

diffstat:

 games/gomoku/bdisp.c  |  203 +++++++++++++++++++++++++++++++++++++++++++++----
 games/gomoku/gomoku.6 |   43 ++++++---
 games/gomoku/gomoku.h |   12 ++-
 games/gomoku/main.c   |   61 +++++++++-----
 4 files changed, 258 insertions(+), 61 deletions(-)

diffs (truncated from 531 to 300 lines):

diff -r 31ce5384ebd9 -r a3b0425bd553 games/gomoku/bdisp.c
--- a/games/gomoku/bdisp.c      Mon Mar 29 03:44:37 2010 +0000
+++ b/games/gomoku/bdisp.c      Mon Mar 29 03:51:55 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: bdisp.c,v 1.13 2010/03/29 02:21:04 dholland Exp $      */
+/*     $NetBSD: bdisp.c,v 1.14 2010/03/29 03:51:55 dholland Exp $      */
 
 /*
  * Copyright (c) 1994
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)bdisp.c    8.2 (Berkeley) 5/3/95";
 #else
-__RCSID("$NetBSD: bdisp.c,v 1.13 2010/03/29 02:21:04 dholland Exp $");
+__RCSID("$NetBSD: bdisp.c,v 1.14 2010/03/29 03:51:55 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -66,9 +66,19 @@
        if (!initscr()) {
                errx(EXIT_FAILURE, "Couldn't initialize screen");
        }
+       if ((LINES < SCRNH) || (COLS < SCRNW)) {
+               errx(EXIT_FAILURE, "Screen too small (need %d%xd)",
+                   SCRNW, SCRNH);
+       }
+       keypad(stdscr, TRUE);
+       nonl();
        noecho();
        cbreak();
-       leaveok(stdscr, TRUE);
+       leaveok(stdscr, FALSE);
+
+#if 0 /* no mouse support in netbsd curses yet */
+       mousemask(BUTTON1_CLICKED, NULL);
+#endif
 }
 
 /*
@@ -78,10 +88,10 @@
 cursfini(void)
 {
 
-       leaveok(stdscr, FALSE);
-       move(23, 0);
+       move(BSZ4, 0);
        clrtoeol();
        refresh();
+       echo();
        endwin();
 }
 
@@ -123,18 +133,28 @@
 void
 bdwho(int update)
 {
-       int i;
+       int i, j;
 
        move(21, 0);
-       clrtoeol();
-       i = 6 - strlen(plyr[BLACK]) / 2;
-       move(21, i > 0 ? i : 0);
-       printw("BLACK/%s", plyr[BLACK]);
-       i = 30 - strlen(plyr[WHITE]) / 2;
-       move(21, i);
-       printw("WHITE/%s", plyr[WHITE]);
-       move(21, 19);
-       addstr(" vs. ");
+        printw("                                              ");
+       i = strlen(plyr[BLACK]);
+       j = strlen(plyr[WHITE]);
+       if (i + j <= 20) {
+               move(21, 10 - (i+j)/2);
+               printw("BLACK/%s (*) vs. WHITE/%s (O)",
+                   plyr[BLACK], plyr[WHITE]);
+       } else {
+               move(21, 0);
+               if (i <= 10) {
+                       j = 20 - i;
+               } else if (j <= 10) {
+                       i = 20 - j;
+               } else {
+                       i = j = 10;
+               }
+               printw("BLACK/%.*s (*) vs. WHITE/%.*s (O)",
+                   i, plyr[BLACK], j, plyr[WHITE]);
+       }
        if (update)
                refresh();
 }
@@ -217,10 +237,10 @@
                /* move 'em up */
                lastline = 1;
        }
-       move(lastline, 46);
-       addnstr(str, SCRNW - 46 - 1);
+       move(lastline, TRANSCRIPT_COL);
+       addnstr(str, SCRNW - TRANSCRIPT_COL - 1);
        clrtoeol();
-       move(lastline + 1, 46);
+       move(lastline + 1, TRANSCRIPT_COL);
        clrtoeol();
 }
 
@@ -233,10 +253,10 @@
 {
        int len = strlen(str);
 
-       move(23, 0);
+       move(BSZ4, 0);
        addstr(str);
        clrtoeol();
-       move(23, len);
+       move(BSZ4, len);
        refresh();
 }
 
@@ -284,3 +304,146 @@
        *cp = '\0';
        return(c != EOF);
 }
+
+/*
+ * Decent (n)curses interface for the game, based on Eric S. Raymond's
+ * modifications to the battleship (bs) user interface.
+ */
+int
+get_coord(void)
+{
+       static int curx = BSZ / 2;
+       static int cury = BSZ / 2;
+       int ny, nx, ch;
+
+       BGOTO(cury, curx);
+       refresh();
+       nx = curx;
+       ny = cury;
+       for (;;) {
+               mvprintw(BSZ3, (BSZ -6)/2, "(%c %d)", 
+                               'A'+ ((curx > 7) ? (curx+1) : curx), cury + 1);
+               BGOTO(cury, curx);
+
+               ch = getch();
+               switch (ch) {
+               case 'k':
+               case '8':
+               case KEY_UP:
+                       nx = curx;
+                       ny = cury + 1;
+                       break;
+               case 'j':
+               case '2':
+               case KEY_DOWN:
+                       nx = curx;
+                       ny = BSZ + cury - 1;
+                       break;
+               case 'h':
+               case '4':
+               case KEY_LEFT:
+                       nx = BSZ + curx - 1;
+                       ny = cury;
+                       break;
+               case 'l':
+               case '6':
+               case KEY_RIGHT:
+                       nx = curx + 1;
+                       ny = cury;
+                       break;
+               case 'y':
+               case '7':
+               case KEY_A1:
+                       nx = BSZ + curx - 1;
+                       ny = cury + 1;
+                       break;
+               case 'b':
+               case '1':
+               case KEY_C1:
+                       nx = BSZ + curx - 1;
+                       ny = BSZ + cury - 1;
+                       break;
+               case 'u':
+               case '9':
+               case KEY_A3:
+                       nx = curx + 1;
+                       ny = cury + 1;
+                       break;
+               case 'n':
+               case '3':
+               case KEY_C3:
+                       nx = curx + 1;
+                       ny = BSZ + cury - 1;
+                       break;
+               case 'K':
+                       nx = curx;
+                       ny = cury + 5;
+                       break;
+               case 'J':
+                       nx = curx;
+                       ny = BSZ + cury - 5;
+                       break;
+               case 'H':
+                       nx = BSZ + curx - 5;
+                       ny = cury;
+                       break;
+               case 'L':
+                       nx = curx + 5;
+                       ny = cury;
+                       break;
+               case 'Y':
+                       nx = BSZ + curx - 5;
+                       ny = cury + 5;
+                       break;
+               case 'B':
+                       nx = BSZ + curx - 5;
+                       ny = BSZ + cury - 5;
+                       break;
+               case 'U':
+                       nx = curx + 5;
+                       ny = cury + 5;
+                       break;
+               case 'N':
+                       nx = curx + 5;
+                       ny = BSZ + cury - 5;
+                       break;
+               case '\f':
+                       nx = curx;
+                       ny = cury;
+                       (void)clearok(stdscr, TRUE);
+                       (void)refresh();
+                       break;
+#if 0 /* notyet */
+               case KEY_MOUSE:
+               {
+                       MEVENT  myevent;
+
+                       getmouse(&myevent);
+                       if (myevent.y >= 1 && myevent.y <= BSZ1 &&
+                           myevent.x >= 3 && myevent.x <= (2 * BSZ + 1)) {
+                               curx = (myevent.x - 3) / 2;
+                               cury = BSZ - myevent.y;
+                               return PT(curx,cury);
+                       } else {
+                               beep();
+                       }
+               }
+               break;
+#endif /* 0 */
+               case 'Q':
+                       return RESIGN;
+                       break;
+               case 'S':
+                       return SAVE;
+                       break;
+               case ' ':
+               case '\r':
+                       (void) mvaddstr(BSZ3, (BSZ -6)/2, "      ");
+                       return PT(curx+1,cury+1);
+                       break;
+       }
+
+       curx = nx % BSZ;
+       cury = ny % BSZ;
+    }
+}
diff -r 31ce5384ebd9 -r a3b0425bd553 games/gomoku/gomoku.6
--- a/games/gomoku/gomoku.6     Mon Mar 29 03:44:37 2010 +0000
+++ b/games/gomoku/gomoku.6     Mon Mar 29 03:51:55 2010 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: gomoku.6,v 1.13 2010/03/29 02:34:50 dholland Exp $
+.\"    $NetBSD: gomoku.6,v 1.14 2010/03/29 03:51:55 dholland Exp $
 .\"
 .\" Copyright (c) 1994
 .\"    The Regents of the University of California.  All rights reserved.
@@ -32,7 +32,7 @@
 .\"
 .\"     @(#)gomoku.6   8.2 (Berkeley) 8/4/94
 .\"
-.Dd August 4, 1994
+.Dd March 28, 2010
 .Dt GOMOKU 6
 .Os
 .Sh NAME
@@ -42,7 +42,7 @@
 .Nm
 .Op Fl bcdu
 .Op Fl D Ar debugfile
-.Op Ar inputfile
+.Op Ar savefile
 .Sh DESCRIPTION
 .Nm
 is a two player game where the object is to get 5 in a row horizontally,
@@ -51,19 +51,26 @@
 With no arguments,
 .Nm
 will display a playing board and prompt for moves from the user.
-Valid moves are a letter for the column and a number for the row of an empty
-board location.
-Entering
-.Dq quit



Home | Main Index | Thread Index | Old Index