本游戏用到了图形界面库graphics.h,图形界面库下载安装:
下载链接:https://easyx.cn/download
游戏截图:
加载游戏资源图片
右键打开项目属性,添加 -> 现有项,添加资源图片进项目·。
资源图片链接:https://pan.baidu.com/s/1l2pkD8flUMqC8fSLrKnEgg?pwd=jsfw
提取码:jsfw
IMAGE road, grass, car;
void initgamePicture() {
loadimage(&grass, "草.jpg", IMAGE_SIZE, IMAGE_SIZE);
loadimage(&road, "路.png", IMAGE_SIZE, IMAGE_SIZE);
for (int i = 0; i < MAX_CARS; i++) {
loadimage(&car[i], "车.png");
}
}
接下来就是定义画布,然后加载图片,我设定的地图是左右两边是一列草地,其余的都是公路。
const int IMAGE_SIZE = 128;
void SetMap(int x, int y) {
for (int i = 0; i < y; i++) {
for (int j = 0; j < x; j++) {
if (j == 0 || j == x - 1) { //草地
putimage(j * IMAGE_SIZE, i * IMAGE_SIZE, &grass);
}
else { //公路
putimage(j * IMAGE_SIZE, i * IMAGE_SIZE, &road);
}
}
}
//设置线条格式
setlinestyle(PS_SOLID, 3);
//设置线条颜色
setlinecolor(BLACK);
//从左上角到右下角画线条(车道两边的边缘)
line(IMAGE_SIZE, 0, IMAGE_SIZE, y * IMAGE_SIZE);
line((x - 1) * IMAGE_SIZE, 0, (x - 1) * IMAGE_SIZE, y * IMAGE_SIZE);
//车道中间实线
setlinecolor(YELLOW);
line(x / 2 * IMAGE_SIZE, 0, x / 2 * IMAGE_SIZE, y * IMAGE_SIZE);
}
紧接着是画虚实线,我们定义虚实线的结构体,并用数组来存放这些虚实线
const int LINE_NUM = 3 * 10 * 8; //虚实线的最大数量,这个看实际需求
const int LINE_LEN = 50; //虚实线的长度,这个看实际需求
const int LINE_SPACE = 25; //虚实线的间隔,这个看实际需求
int lines_cnt; //虚实线数量
struct Line {
int x, y; //坐标
int len; //长度
}lines[LINE_NUM];
void initLines(int x, int y) {
int lines_col = x - 2; //有多少列
int lines_row = y * IMAGE_SIZE / (LINE_LEN + LINE_SPACE) + 1; //有多少行
lines_cnt = lines_row * lines_col;
int idx = 0;
for (int i = 1; i <= lines_col; i++) {
//初始化坐标
x = i * IMAGE_SIZE + IMAGE_SIZE / 2;
y = 0;
for (int j = 0; j < lines_row; j++) {
lines[idx].len = LINE_LEN;
lines[idx].y = y;
lines[idx].x = x;
idx++;
y += LINE_LEN + LINE_SPACE;
}
}
}
画虚实线并移动它们
void ShowLine(float speed) {
setlinecolor(WHITE);
for (int i = 0; i < lines_cnt; i++) {
//画
line(lines[i].x, lines[i].y, lines[i].x, lines[i].y + lines[i].len);
//移动
int dst = lines[i].y + lines[i].len * speed;
//虚实线超出显示窗口范围把它们移到显示窗口上方
lines[i].y = dst > getheight() ? -lines[i].len : dst;
}
}
这时候发现画面闪烁
当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。
双缓冲实现过程如下:
1、在内存中创建与画布一致的缓冲区
2、在缓冲区画图
3、将缓冲区位图拷贝到当前画布上
4、释放内存缓冲区
我们可以使用easyx提供的函数去实现双缓冲技术
BeginBatchDraw(); //开启双缓冲绘图
while (true){
FlushBatchDraw(); //更新双缓冲绘图
}
EndBatchDraw(); //结束双缓冲绘图
车的定义,使用结构体
const int CARS_NUM = 40; //车的最大总数量,这个看实际情况
struct Car{
int x, y, w, h; //坐标和长宽
int dir; //方向
int speed; //速度
int srcx, srcy; //在资源的坐标
};
Car player, emenyCar[CARS_NUM];
初始化玩家和敌人属性
const enum DIRS {
DIR_UP,
DIR_DOWN
};
const int MAX_CARS = 15; //车的种类数量
int lines_col; //车道数量
int d; //距离车道左边间隔
int cars_num; //车的总数量
void initCar(int x, int y, int lv) {
srand((unsigned)time(NULL)); //设置随机数种子,使用rand()的时候有用
lines_col = (x - 2) * 2; //有多少车道
d = 10; //距离车道左边间隔
cars_num = lines_col + y - 4; //其他车辆数量
//玩家
player.y = getheight() - IMAGE_SIZE;
player.x = IMAGE_SIZE / 2 * (rand() % lines_col + 2) + d;
player.dir = DIR_UP;
player.speed = 1 + lv;
player.w = 43;
player.h = 74;
player.srcx = rand() % 3 * player.w;
player.srcy = rand() % 5 * player.h;
//其他车辆
for (int i = 0; i < cars_num; i++) {
emenyCar[i].w = 43;
emenyCar[i].h = 74;
//检测重叠
do {
emenyCar[i].y = rand() % (getheight() - IMAGE_SIZE) - IMAGE_SIZE * y;
emenyCar[i].x = IMAGE_SIZE / 2 * (rand() % lines_col + 2) + d;
} while (overlapation(emenyCar[i], i) && colhasempty());
emenyCar[i].dir = DIR_UP;
emenyCar[i].speed = lv;
emenyCar[i].srcx = rand() % 3 * emenyCar[i].w;
emenyCar[i].srcy = rand() % 5 * emenyCar[i].h;
col_cnt_car[(emenyCar[i].x - d) * 2 / IMAGE_SIZE]++;
}
}
检测重叠代码
bool overlapation(const struct Car& a, int idx) {
if (collision(player, a)) {
return true;
}
for (int i = 0; i < CARS_NUM; i++) {
if (idx == i) {
continue;
}
if (collision(emenyCar[i], a)) {
return true;
}
}
return false;
}
检测是否有空的车道
bool colhasempty() {
int ret = 1;
for (int i = 0; i < lines_col; i++) {
ret &= col_cnt_car[i];
}
return !ret;
}
检测碰撞代码
struct Point {
int x, y; //坐标
};
bool collision(const struct Car& a, const struct Car& b) {
//a的四个点
struct Point ap[4] = {
{a.x, a.y},
{a.x, a.y + a.h},
{a.x + a.w, a.y},
{a.x + a.w, a.y + a.h}
};
for (int i = 0; i < 4; i++) {
if (ap[i].x >= b.x && ap[i].x <= b.x + b.w &&
ap[i].y >= b.y && ap[i].y <= b.y + b.h) {
return true;
}
}
return false;
}
显示车辆在地图上
如果我们用easyx提供的putimage函数打印我们的车辆可以发现车辆四周有黑色的边框,这是因为putimage函数不能处理图片的透明度,我们要写一个函数来实现打印带透明度的图片。
图片的颜色储存是按ARGB的方式:
Red(红色) Green(绿色) Blue(蓝色)和 Alpha(透明度)的色彩空间
typedef unsigned long COLORREF;
typedef unsigned char byte;
typedef struct ARGB{
byte a;
byte r;
byte g;
byte b;
}ARGB;
///
/// 分解RGB合成的颜色
///
/// 待分解的颜色
ARGB DecompositionColor(COLORREF c){
byte r = (byte)c;
byte g = (byte)(c >> 8);
byte b = (byte)(c >> 16);
byte a = (byte)(c >> 24);
ARGB res = { a,r,g,b };
return res;
}
设计一个绘制PNG透明图片函数
void showimage(int x, int y, int w, int h, IMAGE* img, int srcx, int srcy){
DWORD* pdraw = GetImageBuffer();
DWORD* pImg = GetImageBuffer(img);
int win_w = getwidth();
int win_h = getheight();
int img_w = img->getwidth();
int img_h = img->getheight();
int imgx = 0;
for (int i = 0; i < w; i++){
for (int k = 0; k < h; k++){
int index = (k + srcy) * img_w + i + srcx;//当前IMG操作位置
ARGB img_argb = DecompositionColor(pImg[index]);
imgx = (y + k) * win_w + (i + x);
if (img_argb.a != 0 && imgx >= 0 && imgx < win_w * win_h){
pdraw[imgx] = pImg[index];
}
}
}
}
调用showimage函数显示车辆
void ShowCar() {
//显示玩家
showimage(player.x, player.y, player.w, player.h, &car, player.srcx, player.srcy);
//显示其他车辆
for (int i = 0; i < cars_num; i++) {
showimage(emenyCar[i].x, emenyCar[i].y, emenyCar[i].w, emenyCar[i].h, &car, emenyCar[i].srcx, emenyCar[i].srcy);
//其他车辆移动
emenyCar[i].y += emenyCar[i].speed;
//其他车辆移动超出显示窗口范围把它们移到显示窗口上方
if (emenyCar[i].y > getheight()) {
col_cnt_car[(emenyCar[i].x - d) * 2 / IMAGE_SIZE]--;
//检测重叠
do {
emenyCar[i].y = -emenyCar[i].h;
emenyCar[i].x = IMAGE_SIZE / 2 * (rand() % lines_col + 2) + d;
} while (overlapation(emenyCar[i], i) && colhasempty());
emenyCar[i].srcx = rand() % 3 * emenyCar[i].w;
emenyCar[i].srcy = rand() % 5 * emenyCar[i].h;
col_cnt_car[(emenyCar[i].x - d) * 2 / IMAGE_SIZE]++;
}
}
}
玩家的移动(异步读取玩家的方向操作)
void move() {
static int oldcom = 0;
if (GetAsyncKeyState(VK_UP) && player.y > 0) {
player.y -= player.speed;
if (oldcom != VK_UP && !GetAsyncKeyState(oldcom)) {
playmusic("加速.mp3", "");
oldcom = VK_UP;
}
}
if (GetAsyncKeyState(VK_DOWN) && player.y + player.h < getheight()){
player.y += player.speed;
if (oldcom != VK_DOWN && !GetAsyncKeyState(oldcom)) {
playmusic("急刹.mp3", "");
oldcom = VK_DOWN;
}
}
if (GetAsyncKeyState(VK_LEFT) && player.x > IMAGE_SIZE) {
player.x -= player.speed;
if (oldcom != VK_LEFT && !GetAsyncKeyState(oldcom)) {
playmusic("漂移.mp3", "");
oldcom = VK_LEFT;
}
}
if (GetAsyncKeyState(VK_RIGHT) && player.x + player.w < getwidth() - IMAGE_SIZE) {
player.x += player.speed;
if (oldcom != VK_RIGHT && !GetAsyncKeyState(oldcom)) {
playmusic("漂移.mp3", "");
oldcom = VK_RIGHT;
}
}
}
播放音效函数
void playmusic(string name, string type) {
static string oldname = "";
static string oldtype = "";
if (oldname.size() > 0 && oldtype != "repeat") {
string closecom = "close ./" + oldname;
mciSendString(closecom.c_str(), NULL, 0, NULL);
}
string opencom = "open ./" + name;
string playcom = "play ./" + name;
if (type.size() > 0) {
playcom += " " + type;
}
mciSendString(opencom.c_str(), NULL, 0, NULL);
mciSendString(playcom.c_str(), NULL, 0, NULL);
oldname = name;
oldtype = type;
}
判断玩家是否碰撞到其他车辆
bool conflict() {
for (int i = 0; i < cars_num; i++) {
if (collision(player, emenyCar[i])) {
return true;
}
}
return false;
}
初始化游戏参数
void initgame(int& w, int& h, int& lv) {
printf("请输入地图长度(最小为4,最大为10,默认为4):");
scanf("%d", &w);
w = w >= 4 && w <= 10 ? w : 4;
printf("设置地图长度为[%d]n", w);
printf("请输入地图高度(最小为3,最大为10,默认为6):");
scanf("%d", &h);
h = h >= 3 && h <= 10 ? h : 6;
printf("设置地图高度为[%d]n", h);
printf("请输入游戏难度(最小为1,最大为10,默认为1):");
scanf("%d", &lv);
lv = lv >= 1 && lv <= 10 ? lv : 1;
printf("设置游戏难度为[%d]n", lv);
printf("按任意键开始游戏");
_getch();
}
避免游戏运行的太快导致游戏的可玩性下降,我们可以画完一次图后停止运行10毫秒
Sleep(10);
游戏流程
int main() {
int w, h, lv; //地图的长宽和难度
playmusic("背景音乐.mp3", "repeat");
initgame(w, h, lv);
initgraph(w * IMAGE_SIZE, h * IMAGE_SIZE);
initgamePicture();
initLines(w, h);
initCar(w, h, lv);
BeginBatchDraw(); //开启双缓冲绘图
while (true) {
SetMap(w, h);
ShowLine(0.02 + 0.02 * lv);
ShowCar();
move();
FlushBatchDraw(); //更新双缓冲绘图
Sleep(10);
if (conflict()) {
playmusic("失败.mp3", "");
break;
}
}
EndBatchDraw(); //结束双缓冲绘图
mciSendString("close ./背景音乐.mp3", NULL, 0, NULL);
MessageBox(0, "游戏结束了", "失败", MB_OK);
closegraph();
return 0;
}
完整的代码
tools.h
#pragma once #ifndef _TOOLS_H_ #define _TOOLS_H_ #includetypedef unsigned long COLORREF; typedef unsigned char byte; typedef struct ARGB{ byte a; byte r; byte g; byte b; }ARGB; /// /// 分解RGB合成的颜色 /// /// 待分解的颜色 ARGB DecompositionColor(COLORREF c){ byte r = (byte)c; byte g = (byte)(c >> 8); byte b = (byte)(c >> 16); byte a = (byte)(c >> 24); ARGB res = { a,r,g,b }; return res; } ////// 绘制PNG透明图片 /// /// 图片左上角横坐标 /// 图片左上角纵坐标 /// 要绘制的图片指针 void showimage(int x, int y, int w, int h, IMAGE* img, int srcx, int srcy){ DWORD* pdraw = GetImageBuffer(); DWORD* pImg = GetImageBuffer(img); int win_w = getwidth(); int win_h = getheight(); int img_w = img->getwidth(); int img_h = img->getheight(); int imgx = 0; for (int i = 0; i < w; i++){ for (int k = 0; k < h; k++){ int index = (k + srcy) * img_w + i + srcx;//当前IMG操作位置 ARGB img_argb = DecompositionColor(pImg[index]); imgx = (y + k) * win_w + (i + x); if (img_argb.a != 0 && imgx >= 0 && imgx < win_w * win_h){ pdraw[imgx] = pImg[index]; } } } } #endif // !_TOOLS_H_
急速赛车.cpp
#define _CRT_SECURE_NO_WARNINGS //去掉scanf_s问题 #include#include #include #include #include #include "tools.h" #pragma comment(lib, "winmm.lib") using namespace std; const int IMAGE_SIZE = 128; const int MAX_CARS = 15; //车的最大总数量,这个看实际情况 const int LINE_NUM = 3 * 10 * 8; //虚实线的最大数量,这个看实际需求 const int LINE_LEN = 50; //虚实线的长度,这个看实际需求 const int LINE_SPACE = 25; //虚实线的间隔,这个看实际需求 const int CARS_NUM = 40; //车的最大总数量,这个看实际情况 const enum DIRS { DIR_UP, DIR_DOWN }; struct Line { int x, y; //坐标 int len; //长度 }lines[LINE_NUM]; struct Car{ int x, y, w, h; //坐标和长宽 int dir; //方向 int speed; //速度 int srcx, srcy; //在资源的坐标 }; struct Point { int x, y; //坐标 }; Car player, emenyCar[CARS_NUM]; int lines_col; //车道数量 int d; //距离车道左边间隔 int lines_cnt; //虚实线数量 int cars_num; //车的总数量 int col_cnt_car[20]; //每一列车的数量 void initgamePicture(); //读取游戏素材图片 void initgame(int &w, int &h, int &lv); //初始化游戏参数 void initCar(int x, int y, int lv); //初始化车辆 void initLines(int x, int y); //初始化虚实线 void SetMap(int x, int y); //绘制地图 void ShowLine(float speed); //显示虚实线 void ShowCar(); //显示车辆 void move(); //玩家移动 bool collision(const struct Car& a, const struct Car& b); //判断两个车辆碰撞 bool overlapation(const struct Car& a, int idx); //判断车辆覆盖 bool conflict(); //判断玩家和其他车辆碰撞 void playmusic(string name, string type); //播放音乐 bool colhasempty(); //判断是否有空的车道 IMAGE road, grass, car; int main() { int w, h, lv; //地图的长宽和难度 playmusic("背景音乐.mp3", "repeat"); initgame(w, h, lv); initgraph(w * IMAGE_SIZE, h * IMAGE_SIZE); initgamePicture(); initLines(w, h); initCar(w, h, lv); BeginBatchDraw(); //开启双缓冲绘图 while (true) { SetMap(w, h); ShowLine(0.02 + 0.02 * lv); ShowCar(); move(); FlushBatchDraw(); //更新双缓冲绘图 Sleep(10); if (conflict()) { playmusic("失败.mp3", ""); break; } } EndBatchDraw(); //结束双缓冲绘图 mciSendString("close ./背景音乐.mp3", NULL, 0, NULL); MessageBox(0, "游戏结束了", "失败", MB_OK); closegraph(); return 0; } void initgamePicture() { loadimage(&grass, "草.jpg", IMAGE_SIZE, IMAGE_SIZE); loadimage(&road, "路.png", IMAGE_SIZE, IMAGE_SIZE); for (int i = 0; i < MAX_CARS; i++) { loadimage(&car, "车.png"); } } void initgame(int& w, int& h, int& lv) { printf("请输入地图长度(最小为4,最大为10,默认为4):"); scanf("%d", &w); w = w >= 4 && w <= 10 ? w : 4; printf("设置地图长度为[%d]n", w); printf("请输入地图高度(最小为3,最大为10,默认为6):"); scanf("%d", &h); h = h >= 3 && h <= 10 ? h : 6; printf("设置地图高度为[%d]n", h); printf("请输入游戏难度(最小为1,最大为10,默认为1):"); scanf("%d", &lv); lv = lv >= 1 && lv <= 10 ? lv : 1; printf("设置游戏难度为[%d]n", lv); printf("按任意键开始游戏"); _getch(); } void initCar(int x, int y, int lv) { srand((unsigned)time(NULL)); //设置随机数种子,使用rand()的时候有用 lines_col = (x - 2) * 2; //有多少车道 d = 10; //距离车道左边间隔 cars_num = lines_col + y - 4; //其他车辆数量 //玩家 player.y = getheight() - IMAGE_SIZE; player.x = IMAGE_SIZE / 2 * (rand() % lines_col + 2) + d; player.dir = DIR_UP; player.speed = 1 + lv; player.w = 43; player.h = 74; player.srcx = rand() % 3 * player.w; player.srcy = rand() % 5 * player.h; //其他车辆 for (int i = 0; i < cars_num; i++) { emenyCar[i].w = 43; emenyCar[i].h = 74; //检测重叠 do { emenyCar[i].y = rand() % (getheight() - IMAGE_SIZE) - IMAGE_SIZE * y; emenyCar[i].x = IMAGE_SIZE / 2 * (rand() % lines_col + 2) + d; } while (overlapation(emenyCar[i], i) && colhasempty()); emenyCar[i].dir = DIR_UP; emenyCar[i].speed = lv; emenyCar[i].srcx = rand() % 3 * emenyCar[i].w; emenyCar[i].srcy = rand() % 5 * emenyCar[i].h; col_cnt_car[(emenyCar[i].x - d) * 2 / IMAGE_SIZE]++; } } void initLines(int x, int y) { int lines_col = x - 2; //有多少列 int lines_row = y * IMAGE_SIZE / (LINE_LEN + LINE_SPACE) + 1; //有多少行 lines_cnt = lines_row * lines_col; int idx = 0; for (int i = 1; i <= lines_col; i++) { //初始化坐标 x = i * IMAGE_SIZE + IMAGE_SIZE / 2; y = 0; for (int j = 0; j < lines_row; j++) { lines[idx].len = LINE_LEN; lines[idx].y = y; lines[idx].x = x; idx++; y += LINE_LEN + LINE_SPACE; } } } void SetMap(int x, int y) { for (int i = 0; i < y; i++) { for (int j = 0; j < x; j++) { if (j == 0 || j == x - 1) { //草地 putimage(j * IMAGE_SIZE, i * IMAGE_SIZE, &grass); } else { //公路 putimage(j * IMAGE_SIZE, i * IMAGE_SIZE, &road); } } } //设置线条格式 setlinestyle(PS_SOLID, 3); //设置线条颜色 setlinecolor(BLACK); //从左上角到右下角画线条(车道两边的边缘) line(IMAGE_SIZE, 0, IMAGE_SIZE, y * IMAGE_SIZE); line((x - 1) * IMAGE_SIZE, 0, (x - 1) * IMAGE_SIZE, y * IMAGE_SIZE); //车道中间实线 setlinecolor(YELLOW); line(x / 2 * IMAGE_SIZE, 0, x / 2 * IMAGE_SIZE, y * IMAGE_SIZE); } void ShowLine(float speed) { setlinecolor(WHITE); for (int i = 0; i < lines_cnt; i++) { //画 line(lines[i].x, lines[i].y, lines[i].x, lines[i].y + lines[i].len); //移动 int dst = lines[i].y + lines[i].len * speed; //虚实线超出显示窗口范围把它们移到显示窗口上方 lines[i].y = dst > getheight() ? -lines[i].len : dst; } } void ShowCar() { //显示玩家 showimage(player.x, player.y, player.w, player.h, &car, player.srcx, player.srcy); //显示其他车辆 for (int i = 0; i < cars_num; i++) { showimage(emenyCar[i].x, emenyCar[i].y, emenyCar[i].w, emenyCar[i].h, &car, emenyCar[i].srcx, emenyCar[i].srcy); //其他车辆移动 emenyCar[i].y += emenyCar[i].speed; //其他车辆移动超出显示窗口范围把它们移到显示窗口上方 if (emenyCar[i].y > getheight()) { col_cnt_car[(emenyCar[i].x - d) * 2 / IMAGE_SIZE]--; //检测重叠 do { emenyCar[i].y = -emenyCar[i].h; emenyCar[i].x = IMAGE_SIZE / 2 * (rand() % lines_col + 2) + d; } while (overlapation(emenyCar[i], i) && colhasempty()); emenyCar[i].srcx = rand() % 3 * emenyCar[i].w; emenyCar[i].srcy = rand() % 5 * emenyCar[i].h; col_cnt_car[(emenyCar[i].x - d) * 2 / IMAGE_SIZE]++; } } } void move() { static int oldcom = 0; if (GetAsyncKeyState(VK_UP) && player.y > 0) { player.y -= player.speed; if (oldcom != VK_UP && !GetAsyncKeyState(oldcom)) { playmusic("加速.mp3", ""); oldcom = VK_UP; } } if (GetAsyncKeyState(VK_DOWN) && player.y + player.h < getheight()){ player.y += player.speed; if (oldcom != VK_DOWN && !GetAsyncKeyState(oldcom)) { playmusic("急刹.mp3", ""); oldcom = VK_DOWN; } } if (GetAsyncKeyState(VK_LEFT) && player.x > IMAGE_SIZE) { player.x -= player.speed; if (oldcom != VK_LEFT && !GetAsyncKeyState(oldcom)) { playmusic("漂移.mp3", ""); oldcom = VK_LEFT; } } if (GetAsyncKeyState(VK_RIGHT) && player.x + player.w < getwidth() - IMAGE_SIZE) { player.x += player.speed; if (oldcom != VK_RIGHT && !GetAsyncKeyState(oldcom)) { playmusic("漂移.mp3", ""); oldcom = VK_RIGHT; } } } bool collision(const struct Car& a, const struct Car& b) { //a的四个点 struct Point ap[4] = { {a.x, a.y}, {a.x, a.y + a.h}, {a.x + a.w, a.y}, {a.x + a.w, a.y + a.h} }; for (int i = 0; i < 4; i++) { if (ap[i].x >= b.x && ap[i].x <= b.x + b.w && ap[i].y >= b.y && ap[i].y <= b.y + b.h) { return true; } } return false; } bool overlapation(const struct Car& a, int idx) { if (collision(player, a)) { return true; } for (int i = 0; i < CARS_NUM; i++) { if (idx == i) { continue; } if (collision(emenyCar[i], a)) { return true; } } return false; } bool conflict() { for (int i = 0; i < cars_num; i++) { if (collision(player, emenyCar[i])) { return true; } } return false; } void playmusic(string name, string type) { static string oldname = ""; static string oldtype = ""; if (oldname.size() > 0 && oldtype != "repeat") { string closecom = "close ./" + oldname; mciSendString(closecom.c_str(), NULL, 0, NULL); } string opencom = "open ./" + name; string playcom = "play ./" + name; if (type.size() > 0) { playcom += " " + type; } mciSendString(opencom.c_str(), NULL, 0, NULL); mciSendString(playcom.c_str(), NULL, 0, NULL); oldname = name; oldtype = type; } bool colhasempty() { int ret = 1; for (int i = 0; i < lines_col; i++) { ret &= col_cnt_car[i]; } return !ret; }



