俄罗斯方块游戏的设计与实现总结
游戏参与人员:
刘丹:负责整个游戏的数据结构设计与文档起草与修改及部分编码。
葛瑞:负责俄罗斯方块游戏的界面绘制,并参与部分文档的编写和代码编写。
王书林:负责游戏的设计,代码的整合,部分游戏的实现以及一些文档的编写。
李震:负责整个游戏的测试工作以及测试计划和文档的编写。
郑舒:负责信息收集,游戏中的界面设计,部分需求文档编写。
整个游戏基本的游戏更能已经实现,并且再后期游戏的开发中又添加了附加游戏—贪吃蛇游戏。具体功能如下:
俄罗斯方块:
1:方块的翻转
2:方块的变形
3:加速下落
4:主界面采用位图显示
5:通过不同的选择进入不同的游戏
6:自动计分功能及显示
7:背景音乐播放
8:中途退出游戏
9:显示预出现方块
贪吃蛇:
1:食物的自动出现
2:蛇移动方向的改变
3:自动计分功能
4:中途退出功能
5:背景音乐的播放
在整个游戏中由于种种原因使得一些原定的共能没有实现,具体未完成的功能如下:
1:游戏的积分榜显示
虽然在游戏中进行了有效的计分功能,但由于一直把它定位整个游戏的最后完成部分,但由于中途要对整个的游戏从单机版改成网络版而出现了一些开发计划改变,而当初我们选择的开发环境由于是比较早的TURBO C开发环境导致实现网络部分的两个重要头文件没有能更找到,所以时间上的浪费让我们少做了很多东西,但我们已经对该功能的实现接口进行了设计,只是具体没有进行编码。
2:游戏的对战实现
由于在前期的游戏开发中没有考虑进行对战,所以前期的开发环境选择了turbo c 而在后期的改变时无法进行利用socket 进行通信因为缺少两个头文件,而在网上没有找到这两个头文件,所以一直没有没能实现对战功能。并且影响了很多后期的开发。
3:进行等级设置
在进行游戏开发是为了方便进行调试,直接定义了一个全局变量进行时间延迟设置,而不知道什么原因时间设置后导致运行时不稳定,经过很多次时间修改后得到了一个相对稳定的时间延迟,前期设计是准备利用一个函数接口进行该值的设定,待后来由于没有能够调试处一个比较很好的时间延迟,所以就没有进行对该接口的实现。
1:初始界面的绘制
void unit()
{
int i,j;
int gd=DETECT,gm;
delayTime=2;
for(i=0;i<17;i++)
for(j=0;j<10;j++)
{
box[i][j]=0;
box_color[i][j]=0;
}
initgraph(&gd,&gm,"D:\\tc\\bgi");
setcolor(6);
rectangle(40,0,600,455);
rectangle(39,1,601,456);
setcolor(7);
for(i=0;i<17;i++)
for(j=0;j<10;j++)
rectangle(55+25*j,15+25*i,80+25*j,40+25*i);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
rectangle(405+25*j,50+25*i,430+25*j,75+25*i);
setcolor(7);
outtextxy(435,25,"NEXT");
outtextxy(370,180,"SCORE");
rectangle(440,170,505,195);
outtextxy(440,210,"HELP");
outtextxy(430,220,"LEFT:MOVE LEFT");
outtextxy(430,240,"RIGHT:MOVE RIGHT");
outtextxy(430,260,"DOWN:MOVE DOWN");
outtextxy(430,280,"UP:CHANGE");
getch();
}
2:产生下一个方块
void generate()
{
int ra;
randomize();
ra=random (7);
nowblock1=ra;
state=0;
switch(ra)
{
case 0: /*biao shi fang kuai*/
a1=4;
b1=5;
c1=14;
d1=15;
color=4;
break;
case 1: /*biao shi shu tiao*/
a1=4;
b1=14;
c1=24;
d1=34;
color=1;
break;
case 2: /*biao shi L*/
a1=5;
b1=15;
c1=25;
d1=26;
color=14;
break;
case 3: /*biao shi fan L*/
a1=5;
b1=15;
c1=25;
d1=24;
color=12;
break;
case 4: /*biao shi Z*/
a1=4;
b1=5;
c1=15;
d1=16;
color=15;
break;
case 5: /*biao shi fan Z*/
a1=5;
b1=6;
c1=15;
d1=14;
color=5;
break;
case 6: /*biao shi fan T*/
a1=4;
b1=13;
c1=14;
d1=15;
color=3;
break;
}
draw_next(ra);
}
3:方块的消去
{
direction=0;
if(CanMove(direction))
goto A;
else
{
box[a/10][a%10]=1;
box[b/10][b%10]=1;
box[c/10][c%10]=1;
box[d/10][d%10]=1;
box_color[a/10][a%10]=nowcolor;
box_color[b/10][b%10]=nowcolor;
box_color[c/10][c%10]=nowcolor;
box_color[d/10][d%10]=nowcolor;
/*generate();*/
goon=1;
a=a1;
b=b1;
c=c1;
d=d1;
nowBlock=nowblock1;
nowcolor=color;
if(box[a/10][a%10]==1||box[b/10][b%10]==1||box[c/10][c1%10]==1||box[d/10][d%10]==1)
{
flag=1;
Repaint();
break;
}
else
Repaint();
for(i=16;i>=0;i--)
{
for(j=9;j>=0;j--)
{
if(box[i][j]==0)
break;
}
if(j==-1)
{
score+=10;
for(m=i;m>0;m--)
for(n=0;n<10;n++)
{
box[m][n]=box[m-1][n];
box_color[m][n]=box_color[m-1][n];
}
for(m=0;m<10;m++)
{
box[0][m]=0;
box_color[0][m]=0;
}
i++;
Repaint();
sprintf(s,"%d",score);
outtextxy(450,180,s);
}
}
}
}
4:位图显示:
void ShowBMP(char c[])
{
int i,j;
unsigned int bfType;
unsigned int biBitCount;
unsigned long biCompression;
unsigned int index=0;
char rgb[4];
char *p;
FILE *fp;
if((fp=fopen(c,"rb")) == NULL)
{
printf("Can't open this file!");
getch();
exit(0);
}
fseek(fp,54,SEEK_SET);
for(i=0;i<256; i++)
{
rgb[B]=fgetc(fp);; /*read blue;*/
rgb[G]=fgetc(fp);; /*read green */
rgb[R]=fgetc(fp); /*read red */
fgetc(fp);
outp(0x3c6,0xff);
outp(0x3c8,i);
outp(0x3c9,rgb[R]>>2); /*写入调色板*/
outp(0x3c9,rgb[G]>>2);
outp(0x3c9,rgb[B]>>2);
}
p=(char *)malloc(1);
if(p==NULL)
{
printf("");
exit(0);
}
for(i=SCREEN_HEIGHT-1;i>=0;i--) /*直接写屏*/
{
fseek(fp,1078+(long)(i)*SCREEN_WIDTH,SEEK_SET);
/* fread(&video_buf[i*SCREEN_WIDTH],SCREEN_WIDTH,1,fp); */
for(j=0;j<SCREEN_WIDTH;j++)
{
fread(p,1,1,fp);
video_buf[index] = *p;
index++;
}
}
free(p);
fclose(fp);
}
4:艺术清屏:
void JalousieScreen(char c[]) /*百叶窗显示图片*/
{
int i,j,k;
unsigned int index=0;
unsigned char *p;
FILE *fp;
if((fp=fopen(c,"rb")) == NULL)
{
printf("Can't this file!");
getch();
exit(0);
}
p=(char *)malloc(1);
if(p==NULL)
{
printf("");
exit(0);
}
for(k=SCREEN_HEIGHT-1;k>SCREEN_HEIGHT-11; k--)
{
index =0;
index += SCREEN_WIDTH*(SCREEN_HEIGHT-k-1);
for(i=k;i>=0;i-=10)
{
fseek(fp,1078+(long)(i)*SCREEN_WIDTH,SEEK_SET);
for(j=0;j<SCREEN_WIDTH;j++)
{
fread(p,1,1,fp);
video_buf[index] = *p;
index++;
}
delay(1000);
index += SCREEN_WIDTH*9;
}
}
free(p);
fclose(fp);
}
虽然在开发中我们遇到了很多的难题,并且第一次利用turbo C 进行图形界面开发,所以在游戏的开发过程中前期设计出现了一些问题,但在我们团队的共同努力下还是将基本的内容完成,所以虽然很简单,但毕竟是我们几个人一起做的东西,还是有很多的收获,尽管和我们的预期值有很大的差别,我们希望在以后的时间能够将其完善。
通过这次游戏开发我们也了解了如何进行队员分工,充分利用每一个人的特长去共同完成我们的东西。在一个团队中,团结才是最重要,同时也让自己对C语言的开发有了更进一步的理解。
实训报告
设计题目: 俄罗斯方块游戏设计
院 系:
班 级:
学 号:
姓 名:
指导教师:
设计地点:
开课时间:
学院 制
学生姓名 成绩
评语:
指导教师(签名)
年 月 日
目录
1.设计目的和任务.... - 1 -
1.1目的:.... - 1 -
1.2任务:.... - 1 -
2.开发环境.... - 1 -
2.1硬件环境:.... - 1 -
2.2软件环境:.... - 1 -
3.设计题目.... - 2 -
3.1题目名称:.... - 2 -
3.2题目详细描述:.... - 2 -
3.3功能要求:.... - 2 -
4.相关技术以及知识点.... - 3 -
4.1编写Block类:.... - 3 -
4.2 PathGradientBrush 类:.... - 3 -
4.3 Random类:.... - 3 -
4.4 GDI图形处理:.... - 3 -
5. 设计与实现.... - 4 -
5.1 设计流程图.... - 4 -
5.2 游戏主体界面.... - 4 -
5.3 游戏图形界面.... - 11 -
5.4 图形的移动与消行.... - 13 -
5.5 得分的实现.... - 15 -
6.总结.... - 16 -
7.参考资料.... - 16 -
在现今电子信息高速发展的时代,电子游戏已深入人们的日常生活,成为老少皆宜的娱乐方式。俄罗斯方块,是一款风靡全球的游戏,最初是由苏联人制作的,规则简单,容易上手,且游戏过程变化无穷,可以让玩家充分感受游戏中的乐趣。
在游戏设计方面,俄罗斯方块是游戏编程的入门项目,因为它可以检验编辑人员对开发语言、环境和基本数据结构知识熟练程度。
使用C#语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,并具备下面几个功能:
(1) 实现各种方块的生产,包括形状和颜色等信息;
(2) 实现各个方块的上下左右移动和旋转的功能;
(3) 实现消行的功能;
(4) 实现开始,暂停,结束等功能。
服务器 CPU:PIII 500以上, 内存:256M
客户机 CPU:P200MMX以上,内存:32M以上
Visual Studio2005 .net 2.0 以上
俄罗斯方块游戏系统
使用C#语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,实现各种方块的生产,包括形状和颜色等信息,完成左右下旋转的功能,在消行的同时分数加1,在点击暂停或者按下空格的时候暂停或开始游戏,最后结束游戏。
功能(1) 实现各种方块的生产,包括形状和颜色等信息;
(2) 实现各个方块的上下左右移动和旋转的功能;
(3) 实现消行的功能;
(4) 实现时间和得分的统计功能;
(5) 实现开始,暂停,结束等功能;
要求(1) 编写程序要严格按照C#编程规范进行代码编写。
(2) 必须按照个体软件的过程,编写有关的文档。
(3) 按照老师的要求,每个人必须独立完成。
(4) 按照实训的时间安排进行实训,实训结束后提交有关的表格与文档
在游戏项目规范说明书所创建的类图中定义了Block类,现在可以把它编写为最终的类接口形式,包括属性的数据类型以及方法所使用参数的数据类型。
每个确定的方块都与正方形的某种特定排列方式相对应,因此可以考虑Block类的3个新成员:BlockType属性、方块类型的枚举集合、构造函数(用以在期望的位置、使用期望的色彩创建每个正方形)。为了给玩家一个清楚的视觉提示,每种类型的方块颜色应该是固定的,因此创建一个数组来保存每种类型方块的前景色和背景色是一种较好的想法。
封装 Brush 对象,它通过渐变填充 GraphicsPath 对象的内部。
彩色渐变是从路径的中点到路径的外边界边缘的平滑的彩色渐变。混合因子、位置和样式影响渐变起始和结束的位置,并且影响渐变变化的速度。
路径渐变画笔不遵循用于执行绘制操作的 Graphics 对象的 SmoothingMode 属性。无论是否用平滑模式,用 PathGradientBrush 对象填充的区域都以同样的方式呈现。
伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。Random 类的当前实现基于 Donald E.Knuth 的减法随机数生成器算法。
随机数的生成是从种子值开始。如果反复使用同一个种子,就会生成相同的数字系列。产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用 Int32 值。但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器。
通过创建单个而不是多个 Random 对象可以避免此问题。
若要提高性能,请创建一个随时间推移能生成多个随机数的 Random 对象,而不要反复新建会生成同一个随机数的 Random 对象。
GDI+提供了一个抽象层,隐藏了不同视频卡之间的区别,这样就可以调用Windows API函数完成指定的任务了,GDI还在内部指出在运行特定的代码时,如果让客户机的视频卡完成要绘制的图形。GDI还可以完成其他任务。大多数计算机都有多个显示设备---监视器、打印机。GDI成功的使应用程序所使用的打印机看起来与屏幕一样。如果要打印某些东西,而不是显示他们,只需告诉系统输出设备是打印机,再用相同的方式调用相同的Windows API函数可以。
图5.1.1
图5.2.1
主界面关键部分代码:
namespace 俄罗斯方块
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static public int[,] mainField;
static public int row = 20; //数组mainField[,]的行
static public int line = 15; //数组mainField[,]的列
private Block currentBlock; //主界面中活动的方块
private Block nextBlock; //副界面中的方块
private int level = 1;
private int score = 0;
//菜单栏中NewGame
private void menuItemNew_Click(object sender, EventArgs e)
{
NewGame();
}
//菜单栏中Start,在暂停之后使用,继续进行游戏
private void menuItemStart_Click(object sender, EventArgs e)
{
timerInterval.Start();
menuItemStart.Enabled = false;
menuItemPause.Enabled = true;
btnPause.Text = "Pause";
}
//菜单栏中Pause,用于暂停游戏
private void menuItemPause_Click(object sender, EventArgs e)
{
timerInterval.Stop();
menuItemStart.Enabled = true;
menuItemPause.Enabled = false;
btnPause.Text = "Start";
}
//菜单栏中Exit,用于推出游戏
private void menuItemExit_Click(object sender, EventArgs e)
{
this.Close();
Application.Exit();
}
//菜单栏中beginner model
private void menuItemBeginer_Click(object sender, EventArgs e)
{
NewGame();
level = 1;
timerInterval.Interval = 500 / level;
labeLevelVisual.Text = Convert.ToString(level);
}
//菜单栏中normal model
private void menuItemNormal_Click(object sender, EventArgs e)
{
NewGame();
level = 2;
timerInterval.Interval = 500 / level;
labeLevelVisual.Text = Convert.ToString(level);
}
//菜单栏中insane model
private void menuItemInsane_Click(object sender, EventArgs e)
{
NewGame();
level = 3;
timerInterval.Interval = 500 / level;
labeLevelVisual.Text = Convert.ToString(level);
}
private void menuItemOnMusic_Click(object sender, EventArgs e)
{
}
private void menuItemOffMusic_Click(object sender, EventArgs e)
{
}
//菜单栏中的config选项
private void menuItemConfig_Click(object sender, EventArgs e)
{
if (!GameIsOver())
{
timerInterval.Stop();
MessageBox.Show("Left: Arrow(←)\n\nRight: Arrow((→)\n\nDown: Arrow(↓)\n\nRotate: Arrow(↑)");
timerInterval.Start();
}
else
MessageBox.Show("Left: Arrow(←)\n\nRight: Arrow((→)\n\nDown: Arrow(↓)\n\nRotate: Arrow(↑)");
}
//菜单栏中的version选项
private void picBoxMainField_Click(object sender, EventArgs e)
{
//picBoxMainField.Focus();
}
//focus
private void picBoxMainField_Paint(object sender, PaintEventArgs e)
{
//若没有此句,键盘焦点不能移到picBoxMainField中
picBoxMainField.Focus();
}
private void labeLevelVisual_Click(object sender, EventArgs e)
{
}
private void labScoreVisual_Click(object sender, EventArgs e)
{
}
//主界面中的Pause按钮
private void btnPause_Click(object sender, EventArgs e)
{
//按钮btnPause点击Pause后显示Start
if (btnPause.Text == "Pause")
{
timerInterval.Stop();
btnPause.Text = "Start";
menuItemPause.Enabled = false;
menuItemStart.Enabled = true;
}
//按钮btnPause点击Start后显示Pause
else
if (btnPause.Text == "Start")
{
timerInterval.Start();
btnPause.Text = "Pause";
menuItemPause.Enabled = true;
menuItemStart.Enabled = false;
}
}
//主界面中的NewGame按钮
private void btnNewGame_Click(object sender, EventArgs e)
{
NewGame();
}
//主界面中的Exit按钮
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
Application.Exit();
}
//Null
private void Form1_Load(object sender, EventArgs e)
{
}
//Null
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
}
//显示newGame,这里是必须的
private void Form1_Shown(object sender, EventArgs e)
{
NewGame();
}
//新游戏
private void NewGame()
{
mainField = new int[row, line]; //申请一个新的数组,存储整个界面方块信息
for (int i = 0; i < row; i++)
{
for (int j = 0; j < line; j++)
{
mainField[i, j] = 0;
}
}
level = 1; //游戏下落速度等级
score = 0; //消去行数
timerInterval.Interval = 500 / level; //时间间隔随着等级增加而减少
labeLevelVisual.Text = level.ToString(); //将等级显示在label上
labScoreVisual.Text = score.ToString(); //将分数显示再label上
menuItemNew.Enabled = false; //菜单按钮new game不能点击
menuItemPause.Enabled = true; //菜单按钮Pause可以点击
btnPause.Text = "Pause";
btnPause.Enabled = true; //主界面按钮pause可以点击
timerInterval.Start(); //计时器开始计时
this.Refresh(); //刷新界面
currentBlock = new Block();
currentBlock.MoveToCenterScreen(); //为了美观,将方块出现的位置移动到中间
do
{
nextBlock = new Block();
} while (nextBlock.Type == currentBlock.Type); //防止主界面中与副界面中出现的block相同
//先后绘制副主界面中的block
nextBlock.DrawBlock(picBoxSubField.CreateGraphics());
currentBlock.DrawBlock(picBoxMainField.CreateGraphics());
}
图5.3.1
图形部分设计代码(此类代码太多,文档中只列举其中一个)
private class Block
{
private Brick[,] Shape;
private Point left;
private Point right;
private Point top;
private Point bottom;
private int type;
public int Type
{
get { return type; }
set { type = value; }
}
public Block()
{
Shape = new Brick[4, 4];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Shape[i, j] = new Brick();
}
}
Random RandType = new Random();
type = RandType.Next(1, 20);
switch (type)
{
case 1:
// ■□□□
// ■□□□
// ■□□□
// ■□□□
Shape[0, 0].X = 0;
Shape[0, 0].Y = 0;
for (int i = 0; i < 4; i++) //
for (int j = 0; j < 4; j++) //
{
Shape[i, j].X = Shape[0, 0].X + j;
Shape[i, j].Y = Shape[0, 0].Y + i;
}
Shape[0, 0].Filled = true;
Shape[1, 0].Filled = true;
Shape[2, 0].Filled = true;
Shape[3, 0].Filled = true;
left.X = Shape[0, 0].X;
left.Y = Shape[0, 0].Y;
right.X = Shape[0, 0].X;
right.Y = Shape[0, 0].Y;
bottom.X = Shape[3, 0].X;
bottom.Y = Shape[3, 0].Y;
break;
移动方面代码示例:
//判断是否能向下移动
public bool CanMoveDown()
{
bool canDown = true;
if (bottom.Y >= 19)
canDown = false;
if (bottom.Y < 19)
{
for (int i = 3; i >= 0; i--)
{
for (int j = 3; j >= 0; j--)
{
if (Shape[i, j].Filled == true)
{
if (mainField[Shape[i, j].Y + 1, Shape[i, j].X] == 1)
canDown = false;
}
}
}
}
return canDown;
}
消行方面代码示例:
private void ClearLine()
{
int lines = 0; //同时消失的行数
int bricks; //同一行中的砖块brick数
for (int i = row-1; i >= 0; i--)
{
bricks = 0;
for (int j = line-1; j >= 0; j--)
{
if (mainField[i, j] == 1)
bricks++;
}
if (bricks == line) //如果同一行中的砖块brick个数达到了行数line,即该行满行
{
lines++;
for(int j=line-1;j>=0;j--)
{
mainField[i,j]=0; //将该行全部赋值为0,即消除该行
}
for(int m=i;m>0;m--)
{
for(int j=line-1;j>=0;j--)
{
mainField[m,j]=mainField[m-1,j]; //将该行以上各行,均向下一行移动一行,这里用赋值完成
}
}
i++; //检查下一行
}
}
if (lines == 1) //如果同时消除1行,得1分
score += 1;
if (lines == 2) //如果同时消除2行,得3分
score += 3;
if (lines == 3) //如果同时消除3行,得5分
score += 5;
if (lines == 4) //如果同时消除4行,得10分
score += 10;
labScoreVisual.Text = score.ToString(); //主界面label显示分数score
if (score > 20 && level == 1) //score大于20分,进去第二个level
{
level++;
timerInterval.Interval = 500 / level;
labeLevelVisual.Text = level.ToString();
}
if (score > 35 && level == 2) //score大于35分,进入第三个level
{
level++;
timerInterval.Interval = 500 / level;
labeLevelVisual.Text = level.ToString();
}
}
这次C#实训是我人生中最大的收获,这次实训,让我受益匪浅。经过一周多的实训,我学到了很多知识,这为我接下来的学习做好铺垫。在这一周里我通过问老师问同学,逐步完成了俄罗斯方块的设计。现在我在一步一步的学习,制作出了俄罗斯方块,心中有一种自豪感。这是我这一周来得到的成果。
俄罗斯方块的制作的完成,让我学到了很多。在这个实训中我在编写代码的时候常常出错,经过同学的指教,才有了现在程序的正常运行。在编代码的过程中我遇到了很多小麻烦,有些小问题弄得我焦皮烂愕。实训中,有同学帮我把我的代码一遍遍的看了一下,帮我指出好多错误。在这之后我也仔细认真的查过一边,并把一些代码记住,增加了自己的知识。现在才感觉自己原来也是能做好的。在实训中我遇到很多问题:比如代码忘记了或者有些代码不认识。我都会去翻书,或者去问同学。在有些属性我不会用现在通过自己的摸索和同学的指教,我了解了很多、增加了我的知识。
在编程中经常会遇到崩溃的问题,这些我都重新弄了一下。增加了对代码的熟悉度这次实训让我受益匪浅,我学到了很多知识。这次实训让我学会了在以后的编程中要更加仔细更加认真
《Visual C#2005程序设计教程》 机械工业出版社
《Visual C# 时尚编程百例》 机械工业出版社
百度百科,baike.baidu.com
豆丁文档,docin.com
目录1.系统概述12.设计说明书43.系统操作界面64.源程序编码75.测试计划366.改进意见397.课程设计心得体会408.参…
海南师范大学软件设计模式课程报告20xx20xx年度第一学期课程名称题目院系信息科学技术学院班级任课教师成员1成绩评定分数一任务分…
课程设计报告题目基于VC++的俄罗斯方块游戏课程名称学生创新实践院部名称XX学院专业计算机科学与技术班级M08(嵌入式)学生姓名X…
计算机工程学院课程设计说明书课程名称设计项目学生姓名学号专业班级指导教师年月一任务与具体要求二设计说明书包括的内容三应完成的图纸四…
程序设计实践报告20xx20xx学年第2学期题目专学生姓班级学指导教指导单日俄罗斯方块游戏设计业名号师位软件工程系期20xx032…
俄罗斯方块实训总结这次实训即有收获,也有失落:1、俄罗斯方块程序勿促完成,有很多的bug,架构也有很多不合理的地方。虽然把所有的逻…
俄罗斯方块游戏JAVA版项目开发设计文档Ver10编制骆华审核20xx年8月一项目介绍俄罗斯方块是一款风靡全球的掌上游戏机和PC机…
C俄罗斯方块项目文档一问题描述要求支持键盘操作和7种不同类型方块的旋转变换并且界面上显示操作介绍以及当前的玩家的得分每消去一行得1…