🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: rec.puzzles
Article #2443

Rock, Paper, Scissors CA program

#2443
From: James Aspnes
Date: Wed, 05 Feb 1992 01:03
180 lines
4066 bytes
To compile it: cc -o rps rps.c -lcurses -ltermcap
To run it: rps height width num_states threshold

There are absolutely no guarantees whatsoever about the quality of
this code.  

====================================================================

#include <stdio.h>
#include <curses.h>
#include <ctype.h>

typedef char State;

#define MAX_STATES (32)

char printnames[] = " +#/@*AbCdEfGhIjKlMnOpQrStUvWxYz";

#define PrintName(x) (printnames[(x)])

State num_states;

int ysize;
int xsize;
int size;			/* ysize * xsize */

State *field;
State *changed;
int *check_list;
int check_list_top;

/* positive modulus */
#define Mod(x, m) ((x) < 0 ? ((x) % (m)) + (m) : (x) % (m))

void touch_cell(int i)
{
    if(!changed[i]) {
	changed[i]++;
        check_list[check_list_top++] = i;
    }
}

void init_states(int y, int x, int states)
{
    int i;

    ysize = y;
    xsize = x;
    size = ysize * xsize;
    num_states = states;

    field = (State *) malloc(sizeof(State) * size);

    changed = (State *) malloc(sizeof(State) * size);
    bzero(changed, sizeof(State) * size);

    check_list = (int *) malloc(sizeof(int) * size);
    check_list_top = 0;

    for(i = 0; i < x * y; i++) {
	field[i] = random() % num_states;
	touch_cell(i);
    }
}

void display_cell(int i, State new)
{
    mvaddch(i / xsize, i % xsize, PrintName(new));
}

void change_cell(int i, State new)
{
    touch_cell(i);

    touch_cell(Mod(i-xsize-1, size));
    touch_cell(Mod(i-xsize, size));
    touch_cell(Mod(i-xsize+1, size));
    touch_cell(Mod(i-1, size));
    touch_cell(Mod(i+1, size));
    touch_cell(Mod(i+xsize-1, size));
    touch_cell(Mod(i+xsize, size));
    touch_cell(Mod(i+xsize+1, size));

    display_cell(i, new);
}

void init_display(void)
{
    int i;

    initscr();

    for(i = 0; i < size; i++) {
	display_cell(i, field[i]);
    }

    refresh();
}

int sweep(int threshold)
{
    State *new;
    int i;
    int j;
    int ncount[MAX_STATES];
    int delta;
    int changes = 0;
    int *old_check;
    int old_check_top;

    new = (State *) malloc(sizeof(State) * size);
    bzero(changed, sizeof(State) * size);

    old_check = check_list;
    old_check_top = check_list_top;

    check_list = (int *) malloc(sizeof(int) * size);
    check_list_top = 0;
    
    while(--old_check_top >= 0) {
	i = old_check[old_check_top];

	for(j = 0; j < num_states; j++) ncount[j] = 0;

	/* add up neighbors */
	ncount[field[Mod(i-xsize-1, size)]]++;
	ncount[field[Mod(i-xsize, size)]]++;
	ncount[field[Mod(i-xsize+1, size)]]++;
	ncount[field[Mod(i-1, size)]]++;
	ncount[field[Mod(i+1, size)]]++;
	ncount[field[Mod(i+xsize-1, size)]]++;
	ncount[field[Mod(i+xsize, size)]]++;
	ncount[field[Mod(i+xsize+1, size)]]++;

	/* default is no change */
	new[i] = field[i];

	/* look for winning neighbor */
	j = (field[i] + 1) % num_states;
	if(ncount[j] >= threshold) {
	    changes++;
	    new[i] = j;
	    change_cell(i, j);
	}
    }

    free(old_check);

    free(field);
    field = new;

    refresh();

    return changes;
}

void mutate(void)
{
    int i;
    State s;

    i = random() % size;
    s = random() % num_states;

    field[i] = s;
    change_cell(i, s);
}

main(int argc, char **argv)
{
    srandom(getpid() + time(0));

    init_states(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
    init_display();
    
    for(;;) {
	if(sweep(atoi(argv[4])) == 0) mutate();
    }
}
	
Technical Details
Message-ID: <1992Feb05.010327.239631@cs.cmu.edu>
Path: arc1-ca.pugleaf.net!wupost!udel!rochester!cantaloupe.srv.cs.cmu.edu!crabapple.srv.cs.cmu.edu!asp
References: <schnitzi.696795610@eola.cs.ucf.edu>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!wupost!udel!rochester!cantaloupe.srv.cs.cmu.edu!crabapple.srv.cs.cmu.edu!asp
From: asp+@cs.cmu.edu (James Aspnes)
Newsgroups: rec.puzzles,comp.theory.cell-automata,alt.sources
Subject: Rock, Paper, Scissors CA program
Summary: quick and dirty
Message-ID: <1992Feb05.010327.239631@cs.cmu.edu>
Date: 5 Feb 92 01:03:27 GMT
References: <schnitzi.696795610@eola.cs.ucf.edu>
Organization: School of Computer Science, Carnegie Mellon
Lines: 180
Nntp-Posting-Host: furst.theory.cs.cmu.edu