C语言编写俄罗斯方块实验报告
俄罗斯方块 变形 c语言

俄罗斯方块变形c语言在C语言中实现俄罗斯方块游戏是一项复杂的任务,涉及到图形界面、游戏逻辑和事件处理等多个方面。
以下是一个简化版的俄罗斯方块游戏示例,使用字符在控制台中显示游戏界面。
c复制代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>#define WIDTH 20#define HEIGHT 10typedef enum {BLOCK_EMPTY,BLOCK_I,BLOCK_J,BLOCK_L,BLOCK_O,BLOCK_S,BLOCK_Z} BlockType;typedef struct {BlockType type;int x;int y;} Block;Block board[WIDTH][HEIGHT];BlockType currentBlock = BLOCK_I;int rotation = 0;int x = WIDTH / 2;int y = HEIGHT - 1;void drawBoard() {for (int i = 0; i < WIDTH; i++) { for (int j = 0; j < HEIGHT; j++) { char ch = ' ';switch (board[i][j].type) {case BLOCK_EMPTY:ch = '.';break;case BLOCK_I:ch = 'I';break;case BLOCK_J:ch = 'J';break;case BLOCK_L:ch = 'L';break;case BLOCK_O:ch = 'O';break;case BLOCK_S:ch = 'S';break;case BLOCK_Z:ch = 'Z';break;}printf("%c", ch);}printf("\n");}}void updateBoard() {for (int i = 0; i < WIDTH; i++) {for (int j = 0; j < HEIGHT; j++) {if (board[i][j].type != BLOCK_EMPTY) {board[i][j].y--; // Move block down one row.} else { // Place new block.switch (currentBlock) { // Place based on current block type.case BLOCK_I: // Place full I-block.board[i][j].type = BLOCK_I; // Column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column.j+1 y row.i+1 X -- column.j y row.i X -- column.j+1 y row.i X -- column.j y row.i+1 X -- column j Y n Row Y j Columns n - j 1 -- i 1 i - i j Row i Row i - 1 i Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column Column n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i - - - - - - - - - - - - - - -。
俄罗斯方块实验报告

俄罗斯方块实验报告编写“俄罗斯方块”游戏1、问题分析。
编写俄罗斯方块游戏,首先是界面问题,要有一个相对美观的游戏界面,可以有很多种解决的方法,可以用DOS的界面,也可以用MFC做。
界面做好后,最重要的就是七个方块如何存放,翻转,显示等等一系列问题,首先,我们要把这七个方块用一种数据结构存储起来;其次,在游戏中将这七个方块随机挑选出来并显示在屏幕上,根据键盘事件进行旋转;最后,判断到达底部的方块是简单叠加还是引发消除事件。
普通俄罗斯方块游戏中,只有七个基本方块:|,Z,N,L,7,|-,O,方块都可以画在一个4*4的方格中。
于是就有两个方法:一个是只存储七个方块,在游戏运行的时候计算旋转后的方块形状;另一个是将所有的方块全部存储起来,在游戏运行的时候计算取其中的哪个方块。
另外,考虑到4*4是16,而一个int正好是16位(TC2是16位,其他的是32位),所以可以把一个方块存储在一个int数据中,取出的时候,判断它的每个bit位,为1处有小方块,为0处是空白。
所以可以分别用二维数组和bit的方法来表示这些方块。
对于二维数组而言,其控制旋转的操作会很简单,就是控制数组的行列以决定到底该取出哪一种方块,所以程序中我会采用这种方法。
如何控制方块的下落速度,如何让实现左移,右移,下落,如何销行,如何计分,又如何加速等等都是需要考虑的问题。
对于控制方块的下落速度,首先应该现弄明白方块是怎样下落的,目前最常用的就是每隔一定得时间进行重新绘图,就像动画片一样,当很多副相关的画面不断在人眼前播放,由于人眼的掩蔽效应就会形成动着的画面,看起来就是物体在那里移动,于此原理相同,当改变方块在画面上的位置,再以一定得时间间隔进行重新刷图,其效果看起来就是方块在移动;也就是说控制方块下落速度的其实就是控制重新绘图的时间间隔,控制时间的函数有以下几种:a)调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200毫秒的时间间隔。
俄罗斯方块C语言实现

安阳师范学院本科学生毕业论文俄罗斯方块的C语言实现姓名马成强系(院)计算机与信息工程学院专业网络年级 08级学号 080902072指导教师王希杰日期 2012年5月目录1.摘要 (2)2.前言 (3)3.需求分析 (3)4.游戏总体设计 (4)5.功能设计分析 (4)5.1游戏方块预览 (4)5.2游戏方块控制 (4)5.3游戏显示更新 (4)5.4游戏速度分数更新 (4)6.流程图 (5)7.具体设计 (6)7.1定义变量 (6)7.2定义声明函数 (6)7.3过程判断 (6)8.系统测试 (7)8.1游戏界面显示测试 (7)8.2按键功能测试 (7)8.3方块的消行和行满游戏结束功能的测试 (7)8.4测试结果及界面显示 (7)9.参考文献 (8)10.总结致谢 (8)11源代码 (9)1.摘要:俄罗斯方块是一款风靡全球的掌上游戏机和PC机游戏,它造成的轰动与创造的经济价值可以说是游戏史上的一件大事。
它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
它看似简单却变化无穷,俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。
作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。
相信大多数人都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。
由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。
关键词:俄罗斯方块开发游戏编程程序开发AbstractsT etris is a fashionable global handheld game and PC games,it caused stir and create the economic value of gaming history is a great event.It is invented by the Russian Alexey Pazhitnov.The basic rule of tetris is moving,rotation and put the Game output squares,It arranged in a complete row or a complete multi row,Chac andscore.It seems simple but Full of change.As household the mass games all ages,Its popularity is any games that cannot be compared.Tetris often used for game programming practice subject.Key words:Tetris development ,Game programming ,program development2.前言:俄罗斯方块(Tetris)原本是前苏联科学家阿列克谢·帕吉特洛夫在1984年6月利用空闲时间所编写的游戏程序,据说游戏的作者最喜欢网球(Tennis)运动,于是,它把来源于希腊语的tetra(意为“四”)与其结合,造了“tetris”一词,之后开始提供授权给各个游戏公司,造成各平台上俄罗斯游戏软件大量发行的现象。
c++俄罗斯方块报告

{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
2.设置难度级别,不同级别速度不同
3.方向键实现下落图形的左移、右移、加速下落、变形等基本操作
编写时间处理程序
4.正确判断游戏结束
5.对游戏成绩进行记分
6.设置成绩排行榜
概要设计
(1)CMyDlgDlg //主界面
1void CMyDlgDlg::OnAbout() //关于
2void CMyDlgDlg::OnBnClickedExit() //离开按钮命令响应
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_GV);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
重写函数PreTranslateMessage(MSG* pMsg);
为各个菜单项添加响应的事件响应处理函数
为对话框添加四个控件按钮,并分别添加事件处理函数
声明一个bool型的变量,用于判断是否暂停游戏
接着添加几个对话框,分别是游戏设置对话框,游戏结束对话框和英雄榜对话框
第一个对话框,游戏设计对话框,Caption为“游戏设置”,ID为“IDD_NAME”,为对话框添加相应的控件
C语言源码实现俄罗斯方块

C语⾔源码实现俄罗斯⽅块介绍俄罗斯⽅块(Tetris,俄⽂:Тетрис)是⼀款电视游戏机和掌上游戏机游戏,它由俄罗斯⼈阿列克谢·帕基特诺夫发明,故得此名。
俄罗斯⽅块的基本规则是移动、旋转和摆放游戏⾃动输出的各种⽅块,使之排列成完整的⼀⾏或多⾏并且消除得分。
由于上⼿简单、⽼少皆宜,从⽽家喻户晓,风靡世界。
源码#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>#include <conio.h>#include <windows.h>#ifdef _MSC_VER // M$的编译器要给予特殊照顾#if _MSC_VER <= 1200 // VC6及以下版本#error 你是不是还在⽤VC6?!#else // VC6以上版本#if _MSC_VER >= 1600 // 据说VC10及以上版本有stdint.h了#include <stdint.h>#else // VC10以下版本,⾃⼰定义int8_t和uint16_ttypedef signed char int8_t;typedef unsigned short uint16_t;#endif#ifndef __cplusplus // 据说VC都没有stdbool.h,不⽤C++编译,⾃⼰定义booltypedef int bool;#define true 1#define false 0#endif#endif#else // 其他的编译器都好说#include <stdint.h>#ifndef __cplusplus // 不⽤C++编译,需要stdbool.h⾥的bool#include <stdbool.h>#endif#endif// =============================================================================// 7种⽅块的4旋转状态(4位为⼀⾏)static const uint16_t gs_uTetrisTable[7][4] ={{ 0x00F0U, 0x2222U, 0x00F0U, 0x2222U }, // I型{ 0x0072U, 0x0262U, 0x0270U, 0x0232U }, // T型{ 0x0223U, 0x0074U, 0x0622U, 0x0170U }, // L型{ 0x0226U, 0x0470U, 0x0322U, 0x0071U }, // J型{ 0x0063U, 0x0264U, 0x0063U, 0x0264U }, // Z型{ 0x006CU, 0x0462U, 0x006CU, 0x0462U }, // S型{ 0x0660U, 0x0660U, 0x0660U, 0x0660U } // O型};// =============================================================================// 初始状态的游戏池// 每个元素表⽰游戏池的⼀⾏,下标⼤的是游戏池底部// 两端各置2个1,底部2全置为1,便于进⾏碰撞检测// 这样⼀来游戏池的宽度为12列// 如果想要传统的10列,只需多填两个1即可(0xE007),当然显⽰相关部分也要随之改动// 当某个元素为0xFFFFU时,说明该⾏已被填满// 顶部4⾏⽤于给⽅块,不显⽰出来// 再除去底部2⾏,显⽰出来的游戏池⾼度为22⾏static const uint16_t gs_uInitialTetrisPool[28] ={0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U,0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U,0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U,0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xC003U, 0xFFFFU, 0xFFFFU};#define COL_BEGIN 2#define COL_END 14// ============================================================================= typedef struct TetrisManager // 这个结构体存储游戏相关数据{uint16_t pool[28]; // 游戏池int8_t x; // 当前⽅块x坐标,此处坐标为⽅块左上⾓坐标int8_t y; // 当前⽅块y坐标int8_t type[3]; // 当前、下⼀个和下下⼀个⽅块类型int8_t orientation[3]; // 当前、下⼀个和下下⼀个⽅块旋转状态unsigned score; // 得分unsigned erasedCount[4]; // 消⾏数unsigned erasedTotal; // 消⾏总数unsigned tetrisCount[7]; // 各⽅块数unsigned tetrisTotal; // ⽅块总数bool dead; // 挂} TetrisManager;// ============================================================================= typedef struct TetrisControl // 这个结构体存储控制相关数据{bool pause; // 暂停bool clockwise; // 旋转⽅向:顺时针为trueint8_t direction; // 移动⽅向:0向左移动 1向右移动// 游戏池内每格的颜⾊// 由于此版本是彩⾊的,仅⽤游戏池数据⽆法存储颜⾊信息// 当然,如果只实现单⾊版的,就没必要⽤这个数组了int8_t color[28][16];} TetrisControl;HANDLE g_hConsoleOutput; // 控制台输出句柄// ============================================================================= // 函数声明// 如果使⽤全局变量⽅式实现,就没必要传参了void initGame(TetrisManager *manager, TetrisControl *control); // 初始化游戏void restartGame(TetrisManager *manager, TetrisControl *control); // 重新开始游戏void giveTetris(TetrisManager *manager); // 给⼀个⽅块bool checkCollision(const TetrisManager *manager); // 碰撞检测void insertTetris(TetrisManager *manager); // 插⼊⽅块void removeTetris(TetrisManager *manager); // 移除⽅块void horzMoveTetris(TetrisManager *manager, TetrisControl *control); // ⽔平移动⽅块void moveDownTetris(TetrisManager *manager, TetrisControl *control); // 向下移动⽅块void rotateTetris(TetrisManager *manager, TetrisControl *control); // 旋转⽅块void dropDownTetris(TetrisManager *manager, TetrisControl *control); // ⽅块直接落地bool checkErasing(TetrisManager *manager, TetrisControl *control); // 消⾏检测void keydownControl(TetrisManager *manager, TetrisControl *control, int key); // 键按下void setPoolColor(const TetrisManager *manager, TetrisControl *control); // 设置颜⾊void gotoxyWithFullwidth(short x, short y); // 以全⾓定位void printPoolBorder(); // 显⽰游戏池边界void printTetrisPool(const TetrisManager *manager, const TetrisControl *control); // 显⽰游戏池void printCurrentTetris(const TetrisManager *manager, const TetrisControl *control); // 显⽰当前⽅块void printNextTetris(const TetrisManager *manager); // 显⽰下⼀个和下下⼀个⽅块void printScore(const TetrisManager *manager); // 显⽰得分信息void runGame(TetrisManager *manager, TetrisControl *control); // 运⾏游戏void printPrompting(); // 显⽰提⽰信息bool ifPlayAgain(); // 再来⼀次// ============================================================================= // 主函数int main(){TetrisManager tetrisManager;TetrisControl tetrisControl;initGame(&tetrisManager, &tetrisControl); // 初始化游戏do{printPrompting(); // 显⽰提⽰信息printPoolBorder(); // 显⽰游戏池边界runGame(&tetrisManager, &tetrisControl); // 运⾏游戏if (ifPlayAgain()) // 再来⼀次{SetConsoleTextAttribute(g_hConsoleOutput, 0x7);system("cls"); // 清屏restartGame(&tetrisManager, &tetrisControl); // 重新开始游戏else{break;}} while (1);gotoxyWithFullwidth(0, 0);CloseHandle(g_hConsoleOutput);return 0;}// ============================================================================= // 初始化游戏void initGame(TetrisManager *manager, TetrisControl *control){CONSOLE_CURSOR_INFO cursorInfo = { 1, FALSE }; // 光标信息g_hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); // 获取控制台输出句柄SetConsoleCursorInfo(g_hConsoleOutput, &cursorInfo); // 设置光标隐藏SetConsoleTitleA("俄罗斯⽅块控制台版——By: NEWPLAN");restartGame(manager, control);}// ============================================================================= // 重新开始游戏void restartGame(TetrisManager *manager, TetrisControl *control){memset(manager, 0, sizeof(TetrisManager)); // 全部置0// 初始化游戏池memcpy(manager->pool, gs_uInitialTetrisPool, sizeof(uint16_t [28]));srand((unsigned)time(NULL)); // 设置随机种⼦manager->type[1] = rand() % 7; // 下⼀个manager->orientation[1] = rand() & 3;manager->type[2] = rand() % 7; // 下下⼀个manager->orientation[2] = rand() & 3;memset(control, 0, sizeof(TetrisControl)); // 全部置0giveTetris(manager); // 给下⼀个⽅块setPoolColor(manager, control); // 设置颜⾊}// ============================================================================= // 给⼀个⽅块void giveTetris(TetrisManager *manager){uint16_t tetris;manager->type[0] = manager->type[1]; // 下⼀个⽅块置为当前manager->orientation[0] = manager->orientation[1];manager->type[1] = manager->type[2];// 下下⼀个置⽅块为下⼀个manager->orientation[1] = manager->orientation[2];manager->type[2] = rand() % 7;// 随机⽣成下下⼀个⽅块manager->orientation[2] = rand() & 3;tetris = gs_uTetrisTable[manager->type[0]][manager->orientation[0]]; // 当前⽅块// 设置当前⽅块y坐标,保证刚给出时只显⽰⽅块最下⾯⼀⾏// 这种实现使得玩家可以以很快的速度将⽅块落在不显⽰出来的顶部4⾏内if (tetris & 0xF000){manager->y = 0;}else{manager->y = (tetris & 0xFF00) ? 1 : 2;}manager->x = 6; // 设置当前⽅块x坐标if (checkCollision(manager)) // 检测到碰撞manager->dead = true; // 标记游戏结束}else // 未检测到碰撞{insertTetris(manager); // 将当前⽅块加⼊游戏池}++manager->tetrisTotal; // ⽅块总数++manager->tetrisCount[manager->type[0]]; // 相应⽅块数printNextTetris(manager); // 显⽰下⼀个⽅块printScore(manager); // 显⽰得分信息}// ============================================================================= // 碰撞检测bool checkCollision(const TetrisManager *manager){// 当前⽅块uint16_t tetris = gs_uTetrisTable[manager->type[0]][manager->orientation[0]];uint16_t dest = 0;// 获取当前⽅块在游戏池中的区域:// 游戏池坐标x y处⼩⽅格信息,按低到⾼存放在16位⽆符号数中dest |= (((manager->pool[manager->y + 0] >> manager->x) << 0x0) & 0x000F);dest |= (((manager->pool[manager->y + 1] >> manager->x) << 0x4) & 0x00F0);dest |= (((manager->pool[manager->y + 2] >> manager->x) << 0x8) & 0x0F00);dest |= (((manager->pool[manager->y + 3] >> manager->x) << 0xC) & 0xF000);// 若当前⽅块与⽬标区域存在重叠(碰撞),则位与的结果不为0return ((dest & tetris) != 0);}// ============================================================================= // 插⼊⽅块void insertTetris(TetrisManager *manager){// 当前⽅块uint16_t tetris = gs_uTetrisTable[manager->type[0]][manager->orientation[0]];// 当前⽅块每4位取出,位或到游戏池相应位置,即完成插⼊⽅块manager->pool[manager->y + 0] |= (((tetris >> 0x0) & 0x000F) << manager->x);manager->pool[manager->y + 1] |= (((tetris >> 0x4) & 0x000F) << manager->x);manager->pool[manager->y + 2] |= (((tetris >> 0x8) & 0x000F) << manager->x);manager->pool[manager->y + 3] |= (((tetris >> 0xC) & 0x000F) << manager->x);}// ============================================================================= // 移除⽅块void removeTetris(TetrisManager *manager){// 当前⽅块uint16_t tetris = gs_uTetrisTable[manager->type[0]][manager->orientation[0]];// 当前⽅块每4位取出,按位取反后位与到游戏池相应位置,即完成移除⽅块manager->pool[manager->y + 0] &= ~(((tetris >> 0x0) & 0x000F) << manager->x);manager->pool[manager->y + 1] &= ~(((tetris >> 0x4) & 0x000F) << manager->x);manager->pool[manager->y + 2] &= ~(((tetris >> 0x8) & 0x000F) << manager->x);manager->pool[manager->y + 3] &= ~(((tetris >> 0xC) & 0x000F) << manager->x);}// ============================================================================= // 设置颜⾊void setPoolColor(const TetrisManager *manager, TetrisControl *control){// 由于显⽰游戏池时,先要在游戏池⾥判断某⼀⽅格有⽅块才显⽰相应⽅格的颜⾊// 这⾥只作设置即可,没必要清除// 当移动⽅块或给⼀个⽅块时调⽤int8_t i, x, y;// 当前⽅块uint16_t tetris = gs_uTetrisTable[manager->type[0]][manager->orientation[0]];for (i = 0; i < 16; ++i)y = (i >> 2) + manager->y; // 待设置的列if (y > ROW_END) // 超过底部限制{break;}x = (i & 3) + manager->x; // 待设置的⾏if ((tetris >> i) & 1) // 检测的到⼩⽅格属于当前⽅块区域{control->color[y][x] = (manager->type[0] | 8); // 设置颜⾊}}}// ============================================================================= // 旋转⽅块void rotateTetris(TetrisManager *manager, TetrisControl *control){int8_t ori = manager->orientation[0]; // 记录原旋转状态removeTetris(manager); // 移⾛当前⽅块// 顺/逆时针旋转manager->orientation[0] = (control->clockwise) ? ((ori + 1) & 3) : ((ori + 3) & 3);if (checkCollision(manager)) // 检测到碰撞{manager->orientation[0] = ori; // 恢复为原旋转状态insertTetris(manager); // 放⼊当前⽅块。
最新整理c++编程俄罗斯方块计算机实习报告模板.docx

最新整理c++编程俄罗斯方块计算机实习报告模板c++编程俄罗斯方块计算机实习报告模板姓名:班级:学号:小班序号:指导老师:题目:用c++编程俄罗斯方块xxxx:用c++编程俄罗斯方块实验报告一.功能说明1.1总体功能说明我所设计的俄罗斯方块在实现俄罗斯方块基本功能的基础上,实现了一些基本的创新。
我们开发的俄罗斯方块游戏,主要实现了以下几种功能:1.对初次玩的玩家进行新手指导。
2.可以灵活控制方块在图形框中运动。
3.游戏过程中方块可以自由旋转。
4.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。
并且当连续消行时分数会有一定奖励。
5.可以提示下一个出现的方块6.游戏前可以选游戏的等级,不同等级对应不同速度,不同等级消行后的加分不同,等级越高分数越高,方便不同水平的玩家游戏。
7.有记录最大分的功能,历史最高分记录在一个名为HighestPoint的txt文件中。
8.游戏结束后弹出对话框提醒结束游戏还是继续游戏。
9.初始化界面和游戏中有音乐,使游戏更吸引人我的游戏的主要特色如下:1、不同的方块的颜色不同,使游戏的视觉效果更佳。
2、分数上,不同的难度等级对应不同速度,速度越快,每消一行所加的分数越多。
3、假如一次消多行,那么加分会比逐次消行更多。
4、有提示下一个方块的功能,是游戏更加人性化。
5、可以记录历史最高分。
当创造最高分后会有庆祝的画面。
6、算法编程上,创建了一个数组structsha{intxy[8];WORD*tcolor;intnext;};用于记录方块的位置、颜色、以及旋转后方块的编号。
这种编程方法可以为后续方块运动的编程创造便利。
7、此外,采用多文件结构,每个cpp文件存储一个功能,便于程序的修改和功能的扩展。
1.2用户界面1、初始化界面。
主要完成的功能是进入游戏后的初始化和功能选择。
2、帮助界面。
功能是方便初玩者尽快熟悉游戏操作。
3、难度选择界面。
俄罗斯方块 C课程设计论文(报告)
辽 宁 工 业 大 学 C语言程序设计 课程设计(论文)
题目: 俄罗斯方块游戏
院(系): 软件学院 专业班级: 电子商务112班 学 号: 111401043 学生姓名: 张欢廷 指导教师: 武志刚 教师职称: 讲师 起止时间: 2011.12.05至2011.12.18 课程设计(报告)任务及评语 院(系):软件学院 教研室:软件教研窒 学 号 111401043 学生姓名 张欢廷 专业班级 电子商务112班 程序设计(报告)题目 机房收费管理系统
程序设计(报告)任务
程序设计的任务与要求: (1)掌握C语言编程的基础知识。 (2)较熟练地编写C语言应用程序。 (3)了解C语言的常用标准函数、编程技巧、异常处理。 (5)联系已学过的内容,巩固所学的理论,增强独立工作能力。 (6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。 (7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。 课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。
指导教师评语及成绩 成绩: 指导教师签字:
2011 年 12 月 22 日 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) 目 录
第1章 课程设计的目的与要求 ................................................ 1 1.1 课程设计目的 ........................................................ 1 1.2 课程设计的实验环境 .................................................. 1 1.3 课程设计的预备知识 .................................................. 1 1.4 课程设计要求 ........................................................ 1
VC++基于MFC的俄罗斯方块实验报告
VC++项目开发实验报告课题名称:基于MFC的俄罗斯方块游戏设计姓名:学号:系别:计算机学院班级:专业:指导教师:1 俄罗斯方块的游戏概述1.1 游戏简介俄罗斯方块游戏由莫斯科科学学院程序员Alexei Pajitnov设计,发行于1985年。
他在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60为平台的俄罗斯方块的游戏。
后来经瓦丁·格拉西莫夫移植到PC上,并且在莫斯科的电脑界传播。
帕基特诺夫因此开始小有名气。
随后几年,俄罗斯方块开始登陆各大游戏主机。
也曾因为版权问题引起过许多纠纷。
但是拜亚洲盗版商人所赐,俄罗斯方块被引进到国内,如今已成为家喻户晓的著名游戏了。
如今电子游戏业如此繁荣,作为电子游戏鼻祖的俄罗斯方块起到了决定性的作用。
如今俄罗斯方块已有多种版本,有的加了几种特殊形状,有的可以使用道具,还有连机的俄罗斯方块等等。
但万变不离其宗,不管怎么变,游戏的基本规则是没有变化的。
游戏玩法十分简单,如今已经成为一种公认的规则:屏幕顶部以随机顺序落下形状各异的方块,你要试图用它们拼成没有空隙的行列。
坚持得时间越长,游戏速度也就变得越来越快,而游戏的吸引力就在于使你顶住碎块的进攻,支撑的时间比上一次更长。
由于玩法简单,容易上手,如今仍是风靡全球,老少皆宜的一款游戏1.2 游戏功能描述最原始的俄罗斯方块由七个不同形状的碎块组成,而每个碎块又是由四个大小相同的方块构成。
游戏开始后方块会根据难度的不同而以不同的速度开始下降。
在落地之前,玩家需要通过旋转方块使方块以最合适的形态下落,用它们拼成没有空隙的行列。
如此便完成消行,使得游戏有更大的空间可以继续下去。
如果方块累积达到游戏空间的顶层,游戏便失败而无法继续。
2需求分析与概要设计2.1 游戏开发基本策略游戏区域由许多等面积的小方块构成,这些区域状态只有满或空两种。
将空间以静态二维数组实现,并预先定义其状态值。
满为1,空为0,以此来完成游戏地图区域的空间分配。
1C#报告 俄罗斯方块游戏
目录1.设计目的和任务.........................................................................................................................................11.1目的.................................................................................................................................................11.2任务.................................................................................................................................................12.开发环境.....................................................................................................................................................22.1硬件环境..........................................................................................................................................22.2软件环境..........................................................................................................................................23.设计题目.....................................................................................................................................................33.1题目名称..........................................................................................................................................33.2题目详细描述..................................................................................................................................33.3功能要求..........................................................................................................................................34.相关技术及知识点.....................................................................................................................................44.1Windows窗体控件..........................................................................................................................44.2命令对象..........................................................................................................................................44.3对象..................................................................................................................................................44.3对象..................................................................................................................................................45.系统分析与总体设计.................................................................................................................................55.1系统分析..........................................................................................................................................55.2总体结构设计..................................................................................................................................55.3概念结构设计..................................................................................................................................65.4逻辑结构设计..................................................................................................................................86.设计与实现.............................................................................................................................................116.1管理员结构图................................................................................................................................116.2管理员菜单窗口............................................................................................................................116.3管理员各窗口名称........................................................................................................................116.4管理员界面....................................................................................................................................126.5管理员其他界面的设计与实现...................................................................................................127.总结...........................................................................................................................................................308.参考资料...................................................................................................................错误!未定义书签。实训设计报告
C语言_win32实现俄罗斯方块
//==========================================中华 制作============================================================ //==========================================QQ讨论群: 104544511============================================================
//=================头文件====================== #include #include #include
//=================初始化 地图================= const int hang=20; //行为20行 const int lie=10; //列为10列 const int kuaiLenght=30; //每个矩形宽为30
int xukuai[hang][lie]={0}; //存储落下的方块的 坐标 int shikuai[hang][lie]={0}; //存储已经到底的方块的 坐标 int NextKuai[2][4]={0}; //下一个方块的 坐标
int HANG=0;; //存储 需要旋转的 行坐标 int LIE=0; //存储 需要旋转的 列坐标
int isADD=FALSE; //虚块是否到底了 到底了 就加到shikuai里面去 int isOver=FALSE; //游戏是否结束
int Count=0; //计分 int dengji=0; //等级
enum style{heng,zhe,fang,tu,xie}; //虚块的几种样式 enum direction{DOWN,LEFT,RIGHT}; //移动的几种方式
style sty=zhe; //默认的一种样式 direction dir=DOWN; //默认移动的一种方向 style nextSty; //下一个方块的样式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
`````````学院:数计学院班级:13级数媒班学号:姓名:摘要……………………………………………………………………………………………………..关键字:目录第一部分设计总概........................................................................................................................... 摘要…………………………………………………………………………………………………一、设计目的.............................................................................................................................二、设计要求.............................................................................................................................三、设计内容.............................................................................................................................四、系统分析与设计................................................................................................................. 第二部分数据结构设计................................................................................................................... 第三部分功能实现与程序调试………………………………………………………………….第四部分完成设计...........................................................................................................................一、实习日记.............................................................................................................................二、实习总结.............................................................................................................................三、教师评语.............................................................................................................................四、程序使用说明书………………………………………………………………………….第一部分设计总概一、设计目的二、设计要求三、设计内容四、系统分析与设计第二部分数据结构设计第三部分功能实现与程序调试第四部分完成设计一、实习日记:二、实习总结:………………………三、教师评语:设计成绩:指导老师签名:摘要使用C语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,实现各种方块的生产,包括形状和颜色等信息,完成左右下旋转的功能,在消行的同时分数加10,在点击暂停或者按下空格的时候暂停或开始游戏,最后结束游戏.关键字:音乐、背景、按键控制、暂停、继续、停止,难度级别第一部分设计总概一、设计目的:本课程设计是一个综合性的实践教学环节,目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、软件设计技术和设计思想的理解,并能运用所学知识进行开发。
希望通过本课程设计中简单系统的开发,使学生掌握软件设计的基本方法和基本流程,提高自己的综合应用能力。
二、设计要求利用C++编写俄罗斯方块游戏,使俄罗斯游戏能够在Microsoft Visual C++6.0上运行该游戏。
二、设计内容:俄罗斯方块(1)游戏等级:游戏分为难中易三个等级,等级越高,方块下落速度越快;(2)由方向键控制游戏:上键控制方块变形、下键控制方块下移并判断是否有消行、左键控制方块左移、右键控制方块右移;(3)游戏积分:一次性消的行数越多加的分数越多,当达到一定分数自动提高一个游戏等级。
三、系统分析与设计1.程序功能模块:2.程序流程图:第二部分数据结构设计1.游戏需求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。
2.游戏界面需求:良好的用户界面,以键盘操作,有关数显示和分数显示。
让方块在一定的区域内运动和变形,并且显示下一个即将出现的方块。
3.游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
第三部分功能实现与程序调试程序:// testBlock.cpp : Defines the entry point for theapplication.//#define CreateWindow CreateWindowA#include "stdafx.h"#include "resource.h"#include<mmsystem.h>//PlaySound函数的头文件#pragma comment(lib, "WINMM.LIB")#include "commctrl.h"#pragma comment(lib, "comctl32.lib")#include <windows.h>#include <commctrl.h>HMENU hMenu; //菜单句柄#define IDM_NEW 40001#define IDM_PAUSE 40002//#define IDM_STOP 40003#define IDM_HELP 40008#define IDM_MUSIC 40010#define IDM_LEFT 1001#define IDM_RIGHT 1002#define IDM_UP 1003#define IDM_DOWN 1004#define IDC_RADIO1 1005#define IDC_RADIO2 1006#define COLOR_BTNFACE 15#define MAX_LOADSTRING 100#define TIMER_DROP_ID 1int c = 0,contin=1;int cnext=0;int ch1=0;int ch2=0;int ch3=1;int music=0;BOOL bMusicOn; //音乐开关int iMusicBG; //背景音乐canRotate( int rank);BOOL CALLBACK MusicDlgProc(HWND,UINT,WPARAM,LPARAM); void TetrisMusic(BOOL);void MusicItem(int);static TBBUTTON tbButtons[] ={{0,IDC_JIXU,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1} ,{1,IDC_PAUSE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },{2,IDM_STOP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1},{3,IDM_MUSIC,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },{4,IDM_HELP1,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1},{5,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },}; //工具栏数据结构struct Block{ POINT a; POINT b; POINT c; POINT d; }; //方块模型数据结构static Block Tetris[7][4] ={//□□//□□(1){{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}}},//□□// □□(2){{{0,0},{1,0},{1,1},{2,1}},{{1,0},{1,1},{0,1},{0,2}},{{0,0},{1,0},{1,1},{2,1}},{{1,0},{1,1},{0,1},{0,2}}},// □□//□□ (2){{{1,0},{2,0},{0,1},{1,1}},{{0,0},{0,1},{1,1},{1,2}}, {{1,0},{2,0},{0,1},{1,1}}, {{0,0},{0,1},{1,1},{1,2}} },//□□□□(2){{{0,0},{1,0},{2,0},{3,0}}, {{1,0},{1,1},{1,2},{1,3}}, {{0,0},{1,0},{2,0},{3,0}}, {{1,0},{1,1},{1,2},{1,3}} },// □//□□□(4){{{1,0},{0,1},{1,1},{2,1}}, {{0,0},{0,1},{1,1},{0,2}}, {{0,0},{1,0},{2,0},{1,1}}, {{1,0},{0,1},{1,1},{1,2}} },//□//□□□(4){{{0,0},{0,1},{1,1},{2,1}}, {{0,0},{1,0},{0,1},{0,2}}, {{0,0},{1,0},{2,0},{2,1}}, {{1,0},{1,1},{0,2},{1,2}} },// □//□□□(4){{{2,0},{0,1},{1,1},{2,1}}, {{0,0},{0,1},{0,2},{1,2}}, {{0,0},{1,0},{2,0},{0,1}}, {{0,0},{1,0},{1,1},{1,2}}}}; //七种方块全部变形数据结构int x = 4 ;//以方块为单位int y = -1;int nBlockAreaX=10;//背景窗口int nBlockAreaY=30;int BlockMatrix[19][10];int nBlockKind = 0;int nBlockColor = 0;int nBlockState = 0;int nBlockAreaXnext=220;//显示窗口int nBlockAreaYnext=37;int BlockMatrixnext[8][6];int nBlockKindnext = 0;int nBlockColornext = 0;int nBlockStatenext = 0;int gamescore=0;BOOL BGame=FALSE;BOOL bGOver=FALSE;HWND hWnd;HDC hdc;HDC hMemDC = NULL;HDC hWndDC = NULL;// Global Variables:HINSTANCE hInst; // current instanceTCHAR szTitle[MAX_LOADSTRING];// The title bar textTCHAR szWindowClass[MAX_LOADSTRING];// The title bar textHBITMAP bmp[999] = {0};// Foward declarations of functions included in this code module:ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);void DrawTetris( HDC hdc, int offsetX/*0*/, int offsetY/*0*/, int rank/*no use*/ );void Tools(HWND hWnd);LoadImage();void GameStart();void DrawNext(HDC hdc);void GameOver();void DrawButton(LPARAM lParam);LPARAM lParam;int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){// TODO: Place code here.MSG msg;HACCEL hAccelTable;// Initialize global stringsLoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_TESTBLOCK, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);FILE *fp=NULL;////////////char ch[50];fp=fopen("test.txt","r");fgets(ch,523,fp);ch1=atoi(ch);fclose(fp);////////// Perform application initialization:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTBLOCK);char fileName[100] = {0};//res\\1.bmpfor (int i = 0; i < 9; i++ ){sprintf(fileName, "res\\%d.bmp", i+1);bmp[i] = (HBITMAP)LoadImage(NULL, fileName,0,0,0,LR_LOADFROMFILE);//LOADIMAGEFROMFILE}for( i=0;i<=18;i++){for(int j=0;j<=9;j++){BlockMatrix[i][j]=-1;}}for(int m=0;m<=5;m++){for(int n=0;n<=5;n++){BlockMatrixnext[m][n]=-1;}}//beijingint a=1000;SetTimer(hWnd,TIMER_DROP_ID,a,NULL);hWndDC = GetDC(hWnd);hMemDC = CreateCompatibleDC(NULL);// Main message loop:Tools(hWnd);while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;}ATOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+2);wcex.lpszMenuName =MAKEINTRESOURCE(IDC_TESTBLOCK);wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));return RegisterClassEx(&wcex);}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {hInst = hInstance; // Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 200, 350, 485, NULL, NULL, hInstance, NULL);//窗口大小设置if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;TCHAR szHello[MAX_LOADSTRING];LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);switch (message){case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// Parse the menu selections:switch (wmId){case IDM_UP:SendMessage(hWnd,WM_KEYDOWN,VK_UP,0);SetFocus(hWnd);break;case IDM_DOWN:SendMessage(hWnd,WM_KEYDOWN,VK_DOWN,0);SetFocus(hWnd);break;case IDM_RIGHT:SendMessage(hWnd,WM_KEYDOWN,VK_RIGHT,0);SetFocus(hWnd);break;case IDM_LEFT:SendMessage(hWnd,WM_KEYDOWN,VK_LEFT,0);SetFocus(hWnd);break;case IDM_START:{InvalidateRect(hWnd,0,1);GameStart();}break;break;//开始按键case IDC_PAUSE://暂停{BGame=FALSE;MessageBox(NULL, "你好,游戏暂停", "暂停", MB_OK);}break;case IDC_JIXU://继续{if(contin!=0)BGame=TRUE;}break;case IDM_STOP://停止BGame=FALSE;GameOver();break;case IDC_easy:InvalidateRect(hWnd,0,0);ch3=1;MessageBox(NULL, "你好,你选择的难易程度为简单", "简单", MB_OK);SetTimer(hWnd,TIMER_DROP_ID,1000,NULL);break;case IDC_normal:InvalidateRect(hWnd,0,0);ch3=2;MessageBox(NULL, "你好,你选择的难易程度为一般", "一般", MB_OK);SetTimer(hWnd,TIMER_DROP_ID,500,NULL);break;case IDC_difficult:MessageBox(NULL, "你好,你选择的难易程度为困难", "困难", MB_OK);ch3=3;InvalidateRect(hWnd,0,0);SetTimer(hWnd,TIMER_DROP_ID,100,NULL);break;case IDM_beijing:{SelectObject(hMemDC,bmp[8]);BitBlt(hWndDC,0,20,2000,2000,hMemDC,0,0,SRCCOPY);InvalidateRect(hWnd,0,0);//重绘//InvalidateRect(hwnd, NULL, false);重画时不擦除背景}break;case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_HELP1), hWnd, (DLGPROC)About);break;case IDM_HELP1:DialogBox(hInst, MAKEINTRESOURCE(IDD_help2), hWnd, (DLGPROC)About);break;case IDM_MUSIC:DialogBox(hInst,MAKEINTRESOURCE(IDD_MUSIC),hWnd,Mu sicDlgProc);break;case IDM_music1:MusicItem(IDM_music1);break;case IDM_music2:MusicItem(IDM_music2);break;case IDM_musicstop:MusicItem(IDM_musicstop);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message,wParam, lParam);}break;{case WM_PAINT:hdc = BeginPaint(hWnd, &ps);RECT rt;GetClientRect(hWnd, &rt);for(int i=0;i<=18;i++){for(int j=0;j<=9;j++){if(BlockMatrix[i][j]==-1){PatBlt(hdc,nBlockAreaX+j*20,nBlockAreaY+i*20,20,20 ,BLACKNESS);}else{SelectObject(hMemDC,bmp[BlockMatrix[i][j]]);BitBlt(hdc,nBlockAreaX+j*20,nBlockAreaY+i*20,20,20 ,hMemDC,0,0,SRCCOPY);}}}//InvalidateRect(hWnd,0,0);for(int m=0;m<=5;m++){for(int n=0;n<=5;n++){if(BlockMatrixnext[m][n]==-1){PatBlt(hdc,nBlockAreaXnext+n*20,nBlockAreaYnext+m* 20,20,20,BLACKNESS);}else{SelectObject(hMemDC,bmp[BlockMatrixnext[m][n]]);BitBlt(hdc,nBlockAreaXnext+n*20,nBlockAreaYnext+m* 20,20,20,hMemDC,0,0,SRCCOPY);}}}DrawTetris(hWndDC, 0, 0, 0);DrawNext( hdc);RECT rtTxt;TCHAR scoreTxt[100];sprintf(scoreTxt, " 得分: %d", gamescore);rtTxt.top = 200;rtTxt.left = 220;rtTxt.right = rtTxt.left+200;rtTxt.bottom = rtTxt.top+50;DrawText(hdc, scoreTxt, strlen(scoreTxt), &rtTxt, DT_LEFT);RECT rtTxt1;TCHARmaxscore[100];///////////////////////////////////// ////sprintf(maxscore, " 最高分: %d", ch1);rtTxt1.top=240;rtTxt1.left=220;rtTxt1.right=rtTxt1.left+300;rtTxt1.bottom=rtTxt1.top+100;DrawText(hdc, maxscore, strlen(maxscore), &rtTxt1, DT_LEFT);RECT rtTxt2;TCHAR eaayORdifficult[100];sprintf(eaayORdifficult, "难易级别: %d", ch3);rtTxt2.top = 280;rtTxt2.left = 220;rtTxt2.right = rtTxt2.left+200;rtTxt2.bottom = rtTxt2.top+50;DrawText(hdc, eaayORdifficult, strlen(eaayORdifficult), &rtTxt2, DT_LEFT);EndPaint(hWnd, &ps);}break;//计算分数case WM_DRAWITEM:DrawButton(lParam); //绘制方向按钮return TRUE;case WM_LBUTTONDOWN:{}break;case WM_TIMER:{DrawTetris(hWndDC, 0, 1, 0);}break;case WM_KEYDOWN:{int virtual_code=(int)wParam;int key_state=(int)lParam;switch(virtual_code){case VK_RIGHT:{DrawTetris(hWndDC, 1, 0, 0);}break;case VK_LEFT:{DrawTetris(hWndDC, -1, 0, 0);}break;case VK_UP:if(canRotate(1)){DrawTetris( hWndDC,0,0,1);}break;case VK_DOWN:{DrawTetris(hWndDC, 0, 1, 0);}break;default: break;}}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;}return FALSE;}BOOL CALLBACK MusicDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){switch ( message ){case WM_INITDIALOG:if( iMusicBG == IDR_WAVE1 ) CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RAD IO1);if( iMusicBG == IDR_WAVE2 ) CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RAD IO2);if( !bMusicOn ) CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RAD IO3);return TRUE;case WM_COMMAND :switch ( LOWORD(wParam) ){case IDC_RADIO1:CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RA DIO1);break;case IDC_RADIO2:CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RA DIO2);break;case IDC_RADIO3:CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RA DIO3);break;case IDOK:if ( IsDlgButtonChecked(hDlg,IDC_RADIO1) == BST_CHECKED ){bMusicOn = TRUE;iMusicBG = IDR_WAVE1;MusicItem(IDM_music1);if ( BGame ) TetrisMusic(TRUE);}if ( IsDlgButtonChecked(hDlg,IDC_RADIO2) == BST_CHECKED ){bMusicOn = TRUE;iMusicBG = IDR_WAVE2;MusicItem(IDM_music2);if ( BGame ) TetrisMusic(TRUE);}if ( IsDlgButtonChecked(hDlg,IDC_RADIO3) == BST_CHECKED ){bMusicOn = FALSE;MusicItem(IDM_musicstop);TetrisMusic(FALSE);}EndDialog(hDlg,0);break;case IDCANCEL:EndDialog(hDlg,0);break;}break;}return FALSE;}//音乐菜单处理void MusicItem(int iCheckID){CheckMenuRadioItem(hMenu,IDM_music1,IDM_musicstop, iCheckID,MF_BYCOMMAND);if ( iCheckID == IDM_music1 ){bMusicOn = TRUE;iMusicBG = IDR_WAVE1;if ( BGame ) TetrisMusic(TRUE);}else if ( iCheckID == IDM_music2 ){bMusicOn = TRUE;iMusicBG = IDR_WAVE2;if ( BGame ) TetrisMusic(TRUE);}else{bMusicOn = FALSE;TetrisMusic(FALSE);}return;}//背景音乐void TetrisMusic(BOOL start){if ( start && bMusicOn && !bGOver )PlaySound(MAKEINTRESOURCE(iMusicBG),NULL,SND_RESOU RCE|SND_LOOP|SND_ASYNC);elsePlaySound(NULL,NULL,NULL);return;}BOOL clear( ){int count=0;for(int i=18;i>=0;i--){for(int j=0;j<10;j++){if(BlockMatrix[i][j]==-1)break;}if(j==10){count++;for(int k=i-1;k>=0;k--){for(int m=0;m<10;m++){BlockMatrix[k+1][m]=BlockMatrix[k][m];}}i++;if(gamescore>=ch1)ch1=gamescore;if(gamescore>450){ch3=3;SetTimer(hWnd,TIMER_DROP_ID,100,NULL);}else if(gamescore<=450&&gamescore>300){ch2=2;if(ch2>=ch3){ch3=ch2;SetTimer(hWnd,TIMER_DROP_ID,500,NULL);}}}}if(count==1){gamescore+=10;}if(count==2){gamescore+=30;}if(count==3){gamescore+=50;}if(count==4){gamescore+=80;}InvalidateRect(hWnd,0,0);return true;}void GameStart(){BGame=TRUE;gamescore=0;FILE *fp=NULL;char ch[50];fp=fopen("test.txt","r");fgets(ch,523,fp);ch1=atoi(ch);fclose(fp);contin=1;for(int i=0;i<=18;i++){for(int j=0;j<=9;j++){BlockMatrix[i][j]=-1;}}srand(GetTickCount()); nBlockKind=nBlockKindnext;nBlockState=nBlockStatenext;c=rand()%7;nBlockKindnext=rand()%7;nBlockStatenext=rand()%4;cnext=rand()%7;x = 4;y = -1;}BOOL DownCheckCollideBlock(int offsetX, int offsetY, int rank){if(y==-1){return FALSE;}if((BlockMatrix[offsetY+y+Tetris[nBlockKind][nBloc kState].a.y][x+Tetris[nBlockKind][nBlockState].a.x] !=-1)||(BlockMatrix[offsetY+y+Tetris[nBlockKind][nBlock State].b.y][x+Tetris[nBlockKind][nBlockState].b.x]! =-1)||(BlockMatrix[offsetY+y+Tetris[nBlockKind][nBlock State].c.y][x+Tetris[nBlockKind][nBlockState].c.x]! =-1)||(BlockMatrix[offsetY+y+Tetris[nBlockKind][nBlock State].d.y][x+Tetris[nBlockKind][nBlockState].d.x]! =-1)){return TRUE;}return FALSE;}BOOL LeftOrRightCheckCollideBlock(int offsetX, int offsetY, int rank){if(y==-1){return FALSE;}if((BlockMatrix[y+Tetris[nBlockKind][nBlockState].a.y][offsetX+x+Tetris[nBlockKind][nBlockState].a.x] !=-1)||(BlockMatrix[y+Tetris[nBlockKind][nBlockState].b .y][offsetX+x+Tetris[nBlockKind][nBlockState].b.x]! =-1)||(BlockMatrix[y+Tetris[nBlockKind][nBlockState].c .y][offsetX+x+Tetris[nBlockKind][nBlockState].c.x]! =-1)||(BlockMatrix[y+Tetris[nBlockKind][nBlockState].d .y][offsetX+x+Tetris[nBlockKind][nBlockState].d.x]! =-1)){return TRUE;}return FALSE;}BOOL canRotate( int rank)//旋转{if(rank==0){return FALSE;}int tempState = (nBlockState+1)%4;if((BlockMatrix[y+Tetris[nBlockKind][tempState].a. y][x+Tetris[nBlockKind][tempState].a.x]!=-1) ||(BlockMatrix[y+Tetris[nBlockKind][tempState].b.y][x +Tetris[nBlockKind][tempState].b.x]!=-1)||(BlockMatrix[y+Tetris[nBlockKind][tempState].c.y][x +Tetris[nBlockKind][tempState].c.x]!=-1)||(BlockMatrix[y+Tetris[nBlockKind][tempState].d.y][x +Tetris[nBlockKind][tempState].d.x]!=-1)||(y+Tetris[nBlockKind][tempState].a.y>18 )|| (y+Tetris[nBlockKind][tempState].b.y>18 )||(y+Tetris[nBlockKind][tempState].c.y>18 )||(y+Tetris[nBlockKind][tempState].d.y>18 )||(x+Tetris[nBlockKind][tempState].a.x<0 || x+Tetris[nBlockKind][tempState].a.x>9)||(x+Tetris[nBlockKind][tempState].b.x<0 || x+Tetris[nBlockKind][tempState].b.x>9)||(x+Tetris[nBlockKind][tempState].c.x<0 || x+Tetris[nBlockKind][tempState].c.x>9)||(x+Tetris[nBlockKind][tempState].d.x<0 || x+Tetris[nBlockKind][tempState].d.x>9)){return FALSE;}return TRUE;}void DrawTetris( HDC hdc, int offsetX, int offsetY, int rank ){if(!BGame){return;}int iX=0;int iY=0;if((y+Tetris[nBlockKind][nBlockState].a.y+offsetY>18 )||(y+Tetris[nBlockKind][nBlockState].b.y+offsetY>18 )||(y+Tetris[nBlockKind][nBlockState].c.y+offsetY>1 8 )||(y+Tetris[nBlockKind][nBlockState].d.y+offsetY>1 8 )||DownCheckCollideBlock(offsetX,offsetY,rank)){BlockMatrix[y+Tetris[nBlockKind][nBlockState].a.y] [x+Tetris[nBlockKind][nBlockState].a.x] = c;//c是步骤1定义的变量,表示绘制背景时使用的图片下标。