(网盘链接 提取码:3639)(不常登录csdn,有问题可邮件 z_limbo@foxmail.com 联系)
如题所示,基于EasyX图形库,在VC++6.0中的小程序。
在当前目录中须有如下文件:
其中,music中须有:
picture中须有:
运行结果:
代码(IDE为VC++6.0,须装载EasyX库):
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#pragma comment(lib, "winmm.lib")
#define WIDTH 640
#define HIGH 480
#define GAME_WIDTH 15 //游戏区横列格子数
#define GAME_HIGH 28 //游戏区竖排格子数
#define BOX_WIDTH 15 //一个格子的宽度
#define BOX_HIGH 15 //一个格子的长度
//函数声明
void startup(); //初始化
void show(); //图像显示
void gameover(); //游戏结束设置
void fourKinds(int four[4][4], int kind); // 新的形状图形
void updateWithInput(); //无输入更新
void updateWithoutInput(); //有输入更新
void transformation(); //变形
void startMenu(); //开始菜单
void pauseStart(); //暂停菜单
void playMusicOnce(CHAR *musicName); //播放音效一次
void readRecord(); //读档
void writeRecord(); //存档
//全局变量
int GAME_CONDITION = 1; // 游戏状态,1为开始菜单, 0为退出, 2 为正式游戏
int board[GAME_WIDTH + 2][GAME_HIGH + 2]; //游戏区
int nowFour[4][4]; //现在图形
int nextFour[4][4]; // 下一个图形
int nowKind; //现在图形种类
int nextKind; //下一个图形种类
int four_x, four_y; //图形位置
int vY;
COLORREF color; //图形颜色
int pre_x, pre_y; //预告位置
int score; //分数(整形形式)
int levelUp; //等级
int beginWidth, beginHigh; //游戏区开始
bool isFail; //游戏失败
bool isPause; //游戏暂停
bool isMedi; //游戏中断
bool isArchive; //存档成功
bool isMusic; //音乐
IMAGE img_bk; //背景图片
MOUSEMSG m; //鼠标控制
int mouse_x, mouse_y;
int choice; //鼠标选择
int i, j, k;
//函数定义
// 播放音效一次
void playMusicOnce(CHAR * musicName) {
CHAR playMusic[50] = "open ";
strcat(playMusic, musicName);
strcat(playMusic, " alias tempMusic");
mciSendString("close tempMusic", NULL, 0, NULL);
mciSendString(playMusic, NULL, 0, NULL);
mciSendString("play tempMusic", NULL, 0, NULL);
}
//读档
void readRecord() {
startup();
//背景音乐
mciSendString("close bkMusic1", NULL, 0, NULL);
mciSendString("open .\\music\\bk2.mp3 alias bkMusic2", NULL, 0, NULL);
mciSendString("play bkMusic2 repeat", NULL, 0, NULL);
FILE *fp;
fp = fopen( "record.txt", "r");
int n;
fscanf(fp, "%d", &n);
if (n == -1) {
fscanf(fp, "%d %d %d %d %d %d %d %d", &score, &levelUp, &isFail, &isMusic, &four_x, &four_y, &nowKind, &nextKind);
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
fscanf(fp, "%d ", &nowFour[i][j]);
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
fscanf(fp, "%d ", &nextFour[i][j]);
for (i = 1; i <= GAME_WIDTH; i++)
for (j = 1; j <= GAME_HIGH; j++)
fscanf(fp, "%d ", &board[i][j]);
GAME_CONDITION = 2;
}
fclose(fp);
if(!isMusic) mciSendString("pause bkMusic2", NULL, 0, NULL);
}
//存档
void writeRecord() {
FILE * fp;
fp = fopen("record.txt", "w");
fprintf(fp, "%d\n\n", -1);
fprintf(fp, "%d %d %d %d %d %d %d %d\n\n", score, levelUp, isFail, isMusic, four_x, four_y, nowKind, nextKind);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
fprintf(fp, "%d ", nowFour[i][j]);
fprintf(fp, "\n");
}
fprintf(fp, "\n");
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
fprintf(fp, "%d ", nextFour[i][j]);
fprintf(fp, "\n");
}
fprintf(fp, "\n");
for (i = 1; i <= GAME_WIDTH; i++) {
for (j = 1; j <= GAME_HIGH; j++)
fprintf(fp, "%d ", board[i][j]);
fprintf(fp, "\n");
}
fclose(fp);
isArchive = true;
}
//开始菜单
void startMenu() {
putimage(0, 0, &img_bk);
setbkmode(TRANSPARENT);
settextcolor(GREEN);
settextstyle(64, 0, _T("华文琥珀"));
outtextxy(WIDTH * 0.25, HIGH * 0.08, _T("俄罗斯方块"));
setcolor(WHITE);
settextstyle(16, 0, _T("楷体"));
outtextxy(WIDTH * 0.42, HIGH * 0.25, _T("作者:Dora ^-^"));
/*setcolor(BLUE);
setfillcolor(RGB(200,200,200));
fillrectangle(WIDTH * 0.39, HIGH * 0.33, WIDTH * 0.61, HIGH * 0.43);
fillrectangle(WIDTH * 0.39, HIGH * 0.48, WIDTH * 0.61, HIGH * 0.58);
fillrectangle(WIDTH * 0.39, HIGH * 0.63, WIDTH * 0.61, HIGH * 0.73);
fillrectangle(WIDTH * 0.39, HIGH * 0.78, WIDTH * 0.61, HIGH * 0.88);*/
if (MouseHit()) {
m = GetMouseMsg(); // 获取鼠标信息
mouse_x = m.x;
mouse_y = m.y;
if (m.uMsg == WM_LBUTTONUP) {
if (choice == 1) {
GAME_CONDITION = 2;
playMusicOnce(".\\music\\mouse.wav");
Sleep(500);
mciSendString("close bkMusic1", NULL, 0, NULL);
mciSendString("open .\\music\\bk2.mp3 alias bkMusic2", NULL, 0, NULL);
if (isMusic) {
if (isMedi) mciSendString("resume bkMusic2", NULL, 0, NULL);
else mciSendString("play bkMusic2 repeat", NULL, 0, NULL);
}
}
else if (choice == 2) {
readRecord(); playMusicOnce(".\\music\\mouse.wav"); isPause = true; }
else if (choice == 3) {
writeRecord(); playMusicOnce(".\\music\\mouse.wav"); }
else if (choice == 4) {
playMusicOnce(".\\music\\mouse.wav"); Sleep(100); gameover(); }
}
}
choice = 0;
settextcolor(WHITE);
if (mouse_x >= WIDTH * 0.39 && mouse_x <= WIDTH * 0.61 && mouse_y >= HIGH * 0.33 && mouse_y <= HIGH * 0.43) {
settextstyle(32, 0, _T("华文彩云"));
choice = 1;
}
else settextstyle(32, 0, _T("楷体"));
if (isMedi) outtextxy(WIDTH * 0.4, HIGH * 0.35, _T("继续游戏"));
else outtextxy(WIDTH * 0.4, HIGH * 0.35, _T("开始游戏"));
if (mouse_x >= WIDTH * 0.39 && mouse_x <= WIDTH * 0.61 && mouse_y >= HIGH * 0.48 && mouse_y <= HIGH * 0.58) {
settextstyle(32, 0, _T("华文彩云"));
choice = 2;