//*** //*** File : billiards_display.bip -- BIP description of billiards //*** game with two balls. //*** //*** Details: http://www-verimag.imag.fr/~async/BIP/examples.html //*** //*** Author : Ananda Basu (basu@imag.fr), Verimag, 09/2005 //*** {# // Here goes some user include files #include #include #include #} {# // Here are some global variable declarations typedef char** charStarStar; enum COORD_STATE { CPOS, CNEG, CSHOCK }; // Board dimensions int MAXX = 30, MAXY = 20; #} // define the enumeration values in Bip world extern data COORD_STATE CPOS extern data COORD_STATE CNEG extern data COORD_STATE CSHOCK // define the board dimension in Bip world extern data int MAXX extern data int MAXY component Coordinate (int v_val, int dv_val, COORD_STATE st, int vMax) // Atom port incomplete tick, shock port complete flip, pos, neg data int v, dv, MAX behavior initial do v = v_val; if (st == CPOS) { dv = dv_val;} else {dv = -dv_val;} MAX = vMax; to POS if st==CPOS; NEG if st==CNEG; SHOCK state POS on flip provided (v==MAX) do dv=-dv; to NEG on tick provided (v0) do v=v+dv; to NEG on shock to SHOCK state SHOCK on pos provided ((dv > 0)&&(v 0)&&(v==MAX)) || ((dv < 0)&&(v>0)) do dv=-abs(dv);v=v+dv; to NEG end end component Ball (int x, int dx, COORD_STATE st_x, int maxx, int y, int dy, COORD_STATE st_y, int maxy) // Compound contains Coordinate X (x, dx, st_x, maxx) contains Coordinate Y (y, dy, st_y, maxy) connector XflipConn = X.flip complete = X.flip behavior end connector XposConn = X.pos complete = X.pos behavior end connector XnegConn = X.neg complete = X.neg behavior end connector YflipConn = Y.flip complete = Y.flip behavior end connector YposConn = Y.pos complete = Y.pos behavior end connector YnegConn = Y.neg complete = Y.neg behavior end end component Display (int length, int breadth) //Atom port incomplete tick data unsigned x_green, x_red, y_green, y_red data unsigned x_green_old, x_red_old, y_green_old, y_red_old data int X_LENGTH, Y_LENGTH init {# X_LENGTH = length; Y_LENGTH = breadth; initscr(); cbreak(); noecho(); nonl(); intrflush(stdscr, FALSE); keypad(stdscr, TRUE); nodelay(stdscr, TRUE); curs_set(0); // Hide the cursor y_green_old = x_green_old = 0; y_red_old = x_red_old = 0; #} behavior initial to DRAW state DRAW on tick do {# // Refresh board for(int i = 0; i<= X_LENGTH; i++) { mvprintw(Y_LENGTH, i, "_"); } for(int i = 0; i<= Y_LENGTH; i++) { mvprintw(i, X_LENGTH, "|"); } refresh(); // Refresh balls mvprintw(y_green_old, x_green_old, " "); mvprintw(y_red_old, x_red_old, " "); mvaddch(y_green, x_green, ' ' | A_REVERSE); mvaddch(y_red, x_red, ACS_LANTERN); y_green_old = y_green; x_green_old = x_green; y_red_old = y_red; x_red_old = x_red; refresh(); usleep(100000); #} to DRAW end end component Billiards // Top level Compound Component data unsigned temp contains Ball green (0, 1, CPOS, MAXX, 0, 1, CPOS, MAXY ) contains Ball red (8, 1, CNEG, MAXX, 0, 1, CPOS, MAXY ) contains Display disp(MAXX, MAXY) connector Tick = green.X.tick, green.Y.tick, red.X.tick, red.Y.tick, disp.tick behavior do disp.x_green = green.X.v; disp.y_green = green.Y.v; disp.x_red = red.X.v; disp.y_red = red.Y.v; end connector Shock = green.X.shock, green.Y.shock, red.X.shock, red.Y.shock behavior provided (green.X.v == red.X.v) && (green.Y.v == red.Y.v) do temp = green.X.v; green.X.v = red.X.v; red.X.v = temp; temp = green.X.dv; green.X.dv = red.X.dv; red.X.dv = temp; temp = green.Y.v; green.Y.v = red.Y.v; red.Y.v = temp; temp = green.Y.dv; green.Y.dv = red.Y.dv; red.Y.dv = temp; end priority // {Flip}_i < {Shock} shock_Flip1 green.XflipConn : green.X.flip < Shock : green.X.shock, green.Y.shock, red.X.shock, red.Y.shock shock_Flip2 green.YflipConn : green.Y.flip < Shock : green.X.shock, green.Y.shock, red.X.shock, red.Y.shock shock_Flip3 red.XflipConn : red.X.flip < Shock : green.X.shock, green.Y.shock, red.X.shock, red.Y.shock shock_Flip4 red.YflipConn : red.Y.flip < Shock : green.X.shock, green.Y.shock, red.X.shock, red.Y.shock priority // {Tick} < {Shock} shock_tick Tick : green.X.tick, green.Y.tick, red.X.tick, red.Y.tick, disp.tick < Shock : green.X.shock, green.Y.shock, red.X.shock, red.Y.shock end