]> git.cameronkatri.com Git - bsdgames-darwin.git/commitdiff
cgram(6): use standard cursor keys, use standard shuffle algorithm
authorrillig <rillig@NetBSD.org>
Thu, 2 Jul 2020 19:11:01 +0000 (19:11 +0000)
committerrillig <rillig@NetBSD.org>
Thu, 2 Jul 2020 19:11:01 +0000 (19:11 +0000)
The previous shuffle algorithm asked for 100 random numbers, on average.
The new algorithm asks exactly for 26 random numbers.

Curses predefines numeric constants for keys, and there is no apparent
reason not to use these standard keys for cursor movement.

cgram/cgram.c

index 76ea55fb3d06127b9cf044ee428e8016f7ca5c10..5e5dd556b037ae2c7e8db7c729a7499b20edde7e 100644 (file)
@@ -120,16 +120,13 @@ static void readquote(void) {
 }
 
 static void encode(void) {
-   int used[26];
-   for (int i=0; i<26; i++) used[i] = 0;
-
    int key[26];
-   int keypos=0;
-   while (keypos < 26) {
-      int c = random()%26;
-      if (used[c]) continue;
-      key[keypos++] = c;
-      used[c] = 1;
+   for (int i=0; i<26; i++) key[i] = i;
+   for (int i=26; i>1; i--) {
+      int c = random() % i;
+      int t = key[i-1];
+      key[i-1] = key[c];
+      key[c] = t;
    }
 
    for (int y=0; y<lines.num; y++) {
@@ -244,9 +241,11 @@ static void loop(void) {
       int ch = getch();
       switch (ch) {
        case 1: /* ^A */
+       case KEY_BEG:
        curx=0;
        break;
        case 2: /* ^B */
+       case KEY_LEFT:
        if (curx > 0) {
           curx--;
        }
@@ -256,9 +255,11 @@ static void loop(void) {
        }
        break;
        case 5: /* ^E */
+       case KEY_END:
        curx = strlen(lines.v[cury]);
        break;
        case 6: /* ^F */
+       case KEY_RIGHT:
        if (curx < strlen(lines.v[cury])) {
           curx++;
        }
@@ -271,6 +272,7 @@ static void loop(void) {
        clear();
        break;
        case 14: /* ^N */
+       case KEY_DOWN:
        if (cury < lines.num-1) {
           cury++;
        }
@@ -282,6 +284,7 @@ static void loop(void) {
        }
        break;
        case 16: /* ^P */
+       case KEY_UP:
        if (cury > 0) {
           cury--;
        }
@@ -335,6 +338,7 @@ int main(void) {
    encode();
    opencurses();
 
+   keypad(stdscr, TRUE);
    loop();
 
    closecurses();