とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

STLとオブジェクト指向プログラミングの結合 screen.hpp

STL―標準テンプレートライブラリによるC++プログラミング 第2版
ex17-01.cpp, shape.hpp, screen.hpp の三つのファイルを用いたプログラム。
ファイル構成やソースの内容は本を参考にしつつ,変えてある。
ex17-01.cpp が shape.hpp を #include し shape.hpp が screen.hpp を #include している。

// screen.hpp

const int X_MAX = 40;
const int Y_MAX = 24;

static char screen[X_MAX][Y_MAX];

enum color
{
 black = '*', white = ' '
};

struct point
{
 int x, y;
 point()
  : x(), y()
 {}
 point(int a, int b)
  : x(a), y(b)
 {}
};

inline int on_screen(int a, int b)
{
 return 0 <= a && a < X_MAX && 0 <= b && b < Y_MAX;
}

inline void put_point(int a, int b)
{
 if(on_screen(a, b))
  screen[a][b] = black;
}

inline void put_point(point p)
{
 put_point(p.x, p.y);
}

inline void put_line(int x0, int y0, int x1, int y1)
{
 int dx = 1;
 int a = x1 - x0;
 if(a < 0){
  dx = -1;
  a = -a;
 }

 int dy = 1;
 int b = y1 - y0;
 if(b < 0){
  dy = -1;
  b = -b;
 }

 int two_a = 2 * a;
 int two_b = 2 * b;
 int xcrit = -b + two_a;
 int eps = 0;

 for(;;){
  put_point(x0, y0);
  if(x0 == x1 && y0 == y1)
   break;
  if(eps <= xcrit){
   x0 += dx;
   eps += two_b;
  }
  if(eps >= a){
   y0 += dy;
   eps -= two_a;
  }
 }
}

inline void put_line(point a, point b)
{
 put_line(a.x, a.y, b.x, b.y);
}

inline void screen_init()
{
 for(int y = 0; y < Y_MAX; ++y)
  for(int x = 0; x < X_MAX; ++x)
   screen[x][y] = white;
}

inline void screen_destroy()
{}

inline void screen_clear()
{
 screen_init();
}

#include<iostream>
inline void screen_refresh()
{
 using std::cout;
 for(int y = Y_MAX -1; 0 <= y; --y)
 {
  for(int x = 0; x < X_MAX; ++x)
   cout << screen[x][y];
  cout << '\n';
 }
}