俄罗斯方块实验报告
- 格式:doc
- 大小:518.67 KB
- 文档页数:41
西安财经学院《俄罗斯方块》小游戏开发实训报告班级:信管0701姓名:(0709340102)、(0709340104)、(0709340148)实训地点:西安财经学院1楼实验室完成时间:2009年11月27日第一部分:开发目的实习是大学教育最后一个极为重要的实践性教学环节。
我们通过开发一个俄罗斯方块游戏,深入理解、掌握、运用老师所传授知识,更能使我们融合与本专业相关的知识,增强感性认识,培养和锻炼我们综合运用所学的基础理论、基本技能和专业知识,去独立分析和解决实际问题的能力,把理论和实践结合起来,提高实践动手能力,为我们毕业后走上工作岗位打下一定的基础;同时可以检验教学效果,为进一步提高教育教学质量,培养合格人才积累经验,并为自己能顺利与社会环境接轨做准备。
第二部分:俄罗斯方块游戏开发原理俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。
然后程序根据这七种方块堆叠成各种不同的模型。
根据瀑布生命周期模型,可以将开发过程分为7个阶段,分别为:系统分析、需求分析、概要设计、详细设计、编码、测试、维护阶段。
其中系统分析阶段分析此游戏开发的价值和风险;需求分析阶段就是明确整个游戏开发过程需要做什么;在概要设计阶段,因为本系统是采用面向对象的开发方法,所以要明确整个游戏的对象。
第三部分:游戏开发要求1.硬件计算机一台、2.软件Microsoft Visual Studio 2005、EditPlus、office3.人员孔繁俊主要负责在概要设计和详细设计中画程序流程图王圆圆主要负责编写代码和编写实训报告袁展鹏主要负责调试和维护4.游戏开发要求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置三关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。
程序设计实践设计报告课题名称:双人版俄罗斯方块学生:王子轩班级: 2014211118 班序号: 02 学号: 2014210504 日期: 6/301.课题概述1.1课题目标和主要容本课题在控制台下设计并实现一个俄罗斯方块的游戏。
这是一款桌面游戏,最终要写成一个双人模式和选择难度的俄罗斯方块游戏,涉及到了控制台图形界面和多线程编程。
对于每个俄罗斯方块模块来说,中间是工作区,右边是记录当前游戏的级别和分数。
游戏开始后,自动播放背景音乐,通过键盘的W、S、A、D和上、下、左、右来控制方块的旋转、下移、左移、右移,ESC键退出。
本课题的开发环境为Visual Studio 2012集成开发环境,工程类型为Win32 Console Application。
1.2系统的主要功能基本功能:双人版俄罗斯方块扩展功能:背景音乐、游戏分级、存储显示最高分2. 系统设计2.1 系统总体框架开始界面☛☛打开背景音乐☛☛显示两个游戏界面☛☛初始化各项数值(分数和等级)☛☛两位玩家操作游戏☛☛一个玩家失败时游戏结束2.2 系统详细设计[1] 模块划分图及描述1.void Init(int, int map[MAPH][MAPW]);初始化给定的工作区并调用show函数。
2.void Turn(int map[MAPH][MAPW], int a[][4], int w, int h, int *x, int y);实现方块的旋转。
3.bool IsAvailable(int map[MAPH][MAPW], int a[], int x, int y, int w, int h);判断方块在工作区的下一个位置上是否存在其他方块,若不存在则返回TRUE,否则返回FALSE。
4.void DrawBlocks(int a[], int w, int h, int x, int y, WORD wColors[], int nColors,int dx, int dy);显示方块和边界。
小游戏——俄罗斯方块实验报告一.功能说明1.1总体功能说明设计完成俄罗斯方块游戏。
按任意键可开始游戏,游戏开始后随机产生一个方块并自动下落,下落过程中可以对方块进行左右移动、旋转、加速下落、暂停的操作。
叠满一行后方块自动消失,并记录1分,每30分升一级,速度加快,共九级。
当叠到小窗口顶部时游戏结束,可选择退出或开始新的游戏。
1.2用户界面开始界面:按任意键可开始游戏游戏界面:控制方块左右移动、旋转、加速下落暂停、退出游戏结束界面:显示最终得分、等级,选择开始新游戏还是退出1.3使用方法游戏控制:移动:←→旋转:↑下降:↓暂停:Space退出:Esc难度划分:每得30分为1个等级,共9个等级二.程序设计说明2.1 总体设计框架2.2 关键算法描述算法1:判断方块移动方向是否可以移动。
BOOL isavailable(int a[],int x,int y,int w,int h){for(int i=y; i<y+h; i++)for(int j=x; j<x+w; j++)if(map[i][j]&&a[w*(i-y)+j-x])return 0;return 1;}判断:当移动方向上地图的值和方块的值都不为0时,返回值为0,不能移动。
反之返回值为1,可以移动。
算法2:方块的旋转void turn(int a[][4],int w,int h,int *x,int y){int b[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};int sign=0,line=0;for(int i=h-1;i>=0;i--){for(int j=0;j<w;j++)if(a[i][j]){b[j][line]=a[i][j];sign=1;}if(sign){line++;sign=0;}}for(i=0;i<4;i++)if(isavailable(&b[0][0],*x-i,y,w,h)){*x-=i;for(int k=0;k<h;k++)for(int j=0;j<w;j++)a[k][j]=b[k][j];break;}}定义b[i][j],将a旋转赋值给b,判断b与所在位置是否可以放下,若可以,再将b值赋值给a。
——————数字电路与逻辑设计实验报告—————基于VHDL的简易俄罗斯方块实验名称简易俄罗斯方块姓名班级电信工程学院04107班学号辅导老师高英日期2006年11月6日◆摘要俄罗斯方块游戏是我们熟知的经典小游戏之一,本实验通过硬件编成实现了简易的俄罗斯方块游戏机。
VHDL是一种标准的,规范的硬件描述语言,在电子设计领域有着广泛的应用。
它具有很强的电路描述和建模能力,能从多个层次多电路进行描述和建模,从而大大简化了硬件设计任务,提高了设计效率和可靠性。
本实验基于VHDL语言,利用电路中心开发的实验板,用一个4×4点阵做为基本显示屏,一个发光点表示一个图形,完成俄罗斯方块游戏的基本功能:下落、左右移动、消行和显示得分情况,当某一列到顶时游戏结束。
关键字俄罗斯方块游戏VHDL 点阵◆设计任务利用电路中心开发的实验板,用点阵做为显示屏,一个发光点表示一个方块,完成下落、左右移动、消行和显示得分情况,当某一列到顶时游戏结束,数码管显示的分数保持不变。
◆设计思路由于实验中只用到了16个点来完成显示功能,所以选用一个16位的向量STATUS(0 TO 15)来存储各点状态,再用两个整型数分别控制当前点的坐标,但是这样控制会涉及到乘法运算,因此改为4个4位向量STAN(0 TO 3),每个向量代表一行点阵,这样做不仅使控制简单,而且在扫描显示的时候很方便,代码也很简洁。
设计包括2个大的元件,一个是RUSSIA,其功能是存储状态,分频,完成左右下移动以及计分等功能;另一个是RUSSIA_SCAN,主要完成点阵扫描和数码管译码。
具体设计是这样的:4个向量STA0,STA1,STA2,STA3记录游戏状态,点的坐标由COL 和ROW来控制。
设置两个指针FLAG和ROW4,如果四列中有一列都为1,表示游戏结束了,置FLAG为1,程序进入NULL;当最后一行及STA3=”1111”时,置ROW4=1,当ROW4=1时,表示要消行,加分,并且将上一行的值赋到下一行。
JAVA–俄罗斯方块实验报告实验目的本次实验旨在通过使用JAVA程序设计语言编写俄罗斯方块游戏,巩固和深入理解JAVA语言的基础知识,提高编程实践能力。
实验环境本次实验主要使用了Java SE SDK 8环境,使用Eclipse Java EE IDE for Web Developers编程工具,以及Java AWT和Java Swing开发组件。
实验过程首先,我们需要确定游戏的基本功能和规则:•游戏开始时,屏幕上出现一个空白的方块区域,以及一个正在下落的方块组合(包括四个小方块);•玩家通过移动和旋转方块来使其落到正确的位置;•当一个完整的水平行被填满时,该行会消失并向下移动其上面的方块;•当屏幕上出现一个顶部行被填满时,游戏结束。
接下来,我们需要考虑如何实现这些功能:1.创建游戏屏幕并绘制方块•使用Java AWT和Java Swing组件创建一个屏幕窗口,并在该窗口中创建一个Panel,用于绘制游戏方块区域;•实现绘制方块的方法,例如,使用drawRect()方法绘制一个小方块,实现方块组合的方法。
2.状态管理和动作控制•状态管理:定义枚举类型来表示方块的状态(例如,下落、停止、旋转等);•动作控制:实现按键监听器来接收玩家输入的键盘事件,并根据事件执行相应的动作。
3.移动和旋转操作的实现•根据当前方块的状态,在方块组合中确定一个基准点,以此为基础进行方块的移动和旋转;•对于方块的移动,计算新的位置并检查其是否合法;•对于方块的旋转,计算新的方块组合位置并检查其是否合法,若不合法则撤销当前的旋转操作。
4.水平行填满的处理•在Panel中定义一个二维数组,存储每个小方块的位置以及其所在的行和列;•定义方法来检查每一行是否填满,并返回一个布尔值;•在检查到满行时,将该行变为灰色表示该行已填满,并将所有位于该行上方的方块向下移动一行。
5.游戏结束的处理•定义方法来判断游戏是否结束,判断条件为:新的方块组合不能在放置时超出游戏区域的顶部。
目录一.需求分析....................................................... 错误!未定义书签。
二.系统运行环境 (2)三.系统功能需求描述: (2)四.总体设计 (2)五.系统结构图 (3)六.程序模块设计 (3)七、实验总结体会 (15)一.需求分析在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐的需求。
此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。
二.系统运行环境操作系统选择Windows XP 版本,运行环境选择MyEclipse三.系统功能需求描述俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。
本软件要实现的功能如下:1.游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。
2.游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。
3.级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏速度越快,难度越大。
四.总体设计游戏中玩家可以做的操作有:1.以90度为单位旋转方每一格块。
2.以格子为单位左右移动方块,让方块加速落下。
3.方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的随机图形会出现在区域上方开始落下。
4.当区域中某一列横向格子全部由方块填满,则该列会自动消除并成为玩家的得分。
同时删除的列数越多,得分指数上升。
5.当固定的方块堆到区域最上方,则游戏结束。
五.系统结构图六.程序模块设计6.1用户界面设计6.2 程序代码设计package russia;import java.awt.*;import java.awt.event.*;//俄罗斯方块类class ERS_Block extends Frame{/****/private static final long serialVersionUID = 1L;public static boolean isPlay=false;public static int level=1,score=0;public static TextField scoreField,levelField;public static MyTimer timer;GameCanvas gameScr;public static void main(String[] argus){ERS_Block ers = new ERS_Block("俄罗斯方块游戏V1.0 Author:Vincent"); WindowListener win_listener = new WinListener();ers.addWindowListener(win_listener);}//俄罗斯方块类的构造方法SuppressWarnings("deprecation")ERS_Block(String title){super(title);setSize(600,480);setLayout(new GridLayout(1,2));gameScr = new GameCanvas();gameScr.addKeyListener(gameScr);timer = new MyTimer(gameScr);timer.setDaemon(true);timer.start();timer.suspend();add(gameScr);Panel rightScr = new Panel();rightScr.setLayout(new GridLayout(2,1,0,30));rightScr.setSize(120,500);add(rightScr);//右边信息窗体的布局MyPanel infoScr = new MyPanel();infoScr.setLayout(new GridLayout(4,1,0,5));infoScr.setSize(120,300);rightScr.add(infoScr);//定义标签和初始值Label scorep = new Label("分数:",Label.LEFT);Label levelp = new Label("级数:",Label.LEFT);scoreField = new TextField(8);levelField = new TextField(8);scoreField.setEditable(false);levelField.setEditable(false);infoScr.add(scorep);infoScr.add(scoreField);infoScr.add(levelp);infoScr.add(levelField);scorep.setSize(new Dimension(20,60));scoreField.setSize(new Dimension(20,60));levelp.setSize(new Dimension(20,60));levelField.setSize(new Dimension(20,60));scoreField.setText("0");levelField.setText("1");//右边控制按钮窗体的布局MyPanel controlScr = new MyPanel();controlScr.setLayout(new GridLayout(5,1,0,5));rightScr.add(controlScr);//定义按钮playButton play_b = new Button("开始游戏");play_b.setSize(new Dimension(50,200));play_b.addActionListener(new Command(Command.button_play,gameScr));//定义按钮Level UPButton level_up_b = new Button("提高级数");level_up_b.setSize(new Dimension(50,200));level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));//定义按钮Level DownButton level_down_b =new Button("降低级数");level_down_b.setSize(new Dimension(50,200));level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr)); //定义按钮Level PauseButton pause_b =new Button("游戏暂停");pause_b.setSize(new Dimension(50,200));pause_b.addActionListener(new Command(Command.button_pause,gameScr));//定义按钮QuitButton quit_b = new Button("退出游戏");quit_b.setSize(new Dimension(50,200));quit_b.addActionListener(new Command(Command.button_quit,gameScr)); controlScr.add(play_b);controlScr.add(level_up_b);controlScr.add(level_down_b);controlScr.add(pause_b);controlScr.add(quit_b);setVisible(true);gameScr.requestFocus();}}//重写MyPanel类,使Panel的四周留空间class MyPanel extends Panel{/****/private static final long serialVersionUID = 1L;public Insets getInsets(){return new Insets(30,50,30,50);}}//游戏画布类class GameCanvas extends Canvas implements KeyListener{ /****/private static final long serialVersionUID = 1L;final int unitSize = 30; //小方块边长int rowNum; //正方格的行数int columnNum; //正方格的列数int maxAllowRowNum; //允许有多少行未削int blockInitRow; //新出现块的起始行坐标int blockInitCol; //新出现块的起始列坐标int [][] scrArr; //屏幕数组Block b; //对方快的引用//画布类的构造方法GameCanvas(){rowNum = 15;columnNum = 10;maxAllowRowNum = rowNum - 2;b = new Block(this);blockInitRow = rowNum - 1;blockInitCol = columnNum/2 - 2;scrArr = new int [32][32];}//初始化屏幕,并将屏幕数组清零的方法void initScr(){for(int i=0;i<rowNum;i++)for (int j=0; j<columnNum;j++){ scrArr[i][j]=0; }b.reset();repaint();}//重新刷新画布方法public void paint(Graphics g){for(int i = 0; i < rowNum; i++)for(int j = 0; j < columnNum; j++)drawUnit(i,j,scrArr[i][j]);}//画方块的方法public void drawUnit(int row,int col,int type){scrArr[row][col] = type;Graphics g = getGraphics();switch(type){ //表示画方快的方法case 0: g.setColor(Color.black);break; //以背景为颜色画case 1: g.setColor(Color.blue);break; //画正在下落的方块case 2: g.setColor(Color.magenta);break; //画已经落下的方法}g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true);g.dispose();}public Block getBlock(){return b; //返回block实例的引用}//返回屏幕数组中(row,col)位置的属性值public int getScrArrXY(int row,int col){if (row < 0 || row >= rowNum || col < 0 || col >= columnNum)return(-1);elsereturn(scrArr[row][col]);}//返回新块的初始行坐标方法public int getInitRow(){return(blockInitRow); //返回新块的初始行坐标}//返回新块的初始列坐标方法public int getInitCol(){return(blockInitCol); //返回新块的初始列坐标}//满行删除方法void deleteFullLine(){int full_line_num = 0;int k = 0;for (int i=0;i<rowNum;i++){boolean isfull = true;L1:for(int j=0;j<columnNum;j++)if(scrArr[i][j] == 0){k++;isfull = false;break L1;}if(isfull) full_line_num++;if(k!=0 && k-1!=i && !isfull)for(int j = 0; j < columnNum; j++){if (scrArr[i][j] == 0)drawUnit(k-1,j,0);elsedrawUnit(k-1,j,2);scrArr[k-1][j] = scrArr[i][j];}}for(int i = k-1 ;i < rowNum; i++){for(int j = 0; j < columnNum; j++){drawUnit(i,j,0);scrArr[i][j]=0;}}ERS_Block.score += full_line_num;ERS_Block.scoreField.setText(""+ERS_Block.score); }//判断游戏是否结束方法boolean isGameEnd(){for (int col = 0 ; col <columnNum; col ++){if(scrArr[maxAllowRowNum][col] !=0)return true;}return false;}public void keyTyped(KeyEvent e){}public void keyReleased(KeyEvent e){}//处理键盘输入的方法public void keyPressed(KeyEvent e){if(!ERS_Block.isPlay)return;switch(e.getKeyCode()){case KeyEvent.VK_DOWN:b.fallDown();break; case KeyEvent.VK_LEFT:b.leftMove();break;case KeyEvent.VK_RIGHT:b.rightMove();break; case KeyEvent.VK_SPACE:b.leftTurn();break;}}}//处理控制类class Command implements ActionListener{ static final int button_play = 1; //给按钮分配编号static final int button_levelup = 2;static final int button_leveldown = 3;static final int button_quit = 4;static final int button_pause = 5;static boolean pause_resume = true;int curButton; //当前按钮GameCanvas scr;//控制按钮类的构造方法Command(int button,GameCanvas scr){ curButton = button;this.scr=scr;}//按钮执行方法SuppressWarnings("deprecation")public void actionPerformed (ActionEvent e){ switch(curButton){case button_play:if(!ERS_Block.isPlay){scr.initScr();ERS_Block.isPlay = true;ERS_Block.score = 0;ERS_Block.scoreField.setText("0");ERS_Block.timer.resume();}scr.requestFocus();break;case button_levelup:if(ERS_Block.level < 10){ ERS_Block.level++;ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score = 0;ERS_Block.scoreField.setText(""+ERS_Block.score); }scr.requestFocus();break;case button_leveldown:if(ERS_Block.level > 1){ ERS_Block.level--;ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score = 0;ERS_Block.scoreField.setText(""+ERS_Block.score);}scr.requestFocus();break;case button_pause:if(pause_resume){ERS_Block.timer.suspend();pause_resume = false;}else{ERS_Block.timer.resume();pause_resume = true;}scr.requestFocus();break;case button_quit:System.exit(0);}}}//方块类class Block {static int[][] pattern = {{0x0f00,0x4444,0x0f00,0x4444},//用十六进至表示,本行表示长条四种状态{0x04e0,0x0464,0x00e4,0x04c4},{0x4620,0x6c00,0x4620,0x6c00},{0x2640,0xc600,0x2640,0xc600},{0x6220,0x1700,0x2230,0x0740},{0x6440,0x0e20,0x44c0,0x8e00},{0x0660,0x0660,0x0660,0x0660}};int blockType; //块的模式号(0-6)int turnState; //块的翻转状态(0-3)int blockState; //快的下落状态int row,col; //块在画布上的坐标GameCanvas scr;//块类的构造方法Block(GameCanvas scr){this.scr = scr;blockType = (int)(Math.random() * 1000)%7;turnState = (int)(Math.random() * 1000)%4;blockState = 1;row = scr.getInitRow();col = scr.getInitCol();}//重新初始化块,并显示新块public void reset(){blockType = (int)(Math.random() * 1000)%7;turnState = (int)(Math.random() * 1000)%4; blockState = 1;row = scr.getInitRow();col = scr.getInitCol();dispBlock(1);}//实现“块”翻转的方法public void leftTurn(){if(assertValid(blockType,(turnState + 1)%4,row,col)){ dispBlock(0);turnState = (turnState + 1)%4;dispBlock(1);}}//实现“块”的左移的方法public void leftMove(){if(assertValid(blockType,turnState,row,col-1)){ dispBlock(0);col--;dispBlock(1);}}//实现块的右移public void rightMove(){if(assertValid(blockType,turnState,row,col+1)){ dispBlock(0);col++;dispBlock(1);}}//实现块落下的操作的方法public boolean fallDown(){if(blockState == 2)return(false);if(assertValid(blockType,turnState,row-1,col)){ dispBlock(0);row--;dispBlock(1);return(true);}else{blockState = 2;dispBlock(2);return(false);}}//判断是否正确的方法boolean assertValid(int t,int s,int row,int col){ int k = 0x8000;for(int i = 0; i < 4; i++){for(int j = 0; j < 4; j++){if((int)(pattern[t][s]&k) != 0){int temp = scr.getScrArrXY(row-i,col+j);if (temp<0||temp==2)return false;}k = k >> 1;}}return true;}//同步显示的方法public synchronized void dispBlock(int s){int k = 0x8000;for (int i = 0; i < 4; i++){for(int j = 0; j < 4; j++){if(((int)pattern[blockType][turnState]&k) != 0){ scr.drawUnit(row-i,col+j,s);}k=k>>1;}}}}//定时线程class MyTimer extends Thread{ GameCanvas scr;public MyTimer(GameCanvas scr){this.scr = scr;}SuppressWarnings("deprecation")public void run(){while(true){try{sleep((10-ERS_Block.level + 1)*100);}catch(InterruptedException e){}if(!scr.getBlock().fallDown()){scr.deleteFullLine();if(scr.isGameEnd()){ERS_Block.isPlay = false;suspend();}elsescr.getBlock().reset();}}}}class WinListener extends WindowAdapter{ public void windowClosing (WindowEvent l){ System.exit(0);}}6.3 运行结果游戏进行中界面七.实验总结体会实验顺利完成,我觉得很有收获。
一、引言随着计算机技术的发展,编程已经成为计算机专业学生必须掌握的基本技能之一。
为了提高我们的编程能力和实践能力,学校组织了一次俄罗斯方块实训活动。
本次实训旨在通过设计和实现一个简单的俄罗斯方块游戏,让我们深入了解游戏编程的基本原理和技巧,培养我们的团队合作精神。
以下是对本次俄罗斯方块实训的总结报告。
二、实训目的1. 掌握游戏编程的基本原理和技巧。
2. 熟悉并运用各种编程语言进行游戏开发。
3. 培养团队合作精神和沟通能力。
4. 提高问题解决能力和创新能力。
三、实训内容1. 游戏设计:确定游戏规则、界面布局、角色设定等。
2. 编程实现:选择合适的编程语言,编写游戏代码。
3. 测试与优化:对游戏进行测试,找出并修复存在的问题,提高游戏性能。
四、实训过程1. 游戏设计阶段在游戏设计阶段,我们小组首先讨论并确定了游戏的基本规则:玩家通过操作控制俄罗斯方块,将不同形状的方块放置在游戏区域,当一行或几行方块被填满时,这些方块会消失,玩家获得分数。
游戏分为多个等级,随着等级的提高,游戏难度逐渐增加。
2. 编程实现阶段在编程实现阶段,我们小组分工合作,分别负责不同模块的开发。
以下是各模块的开发情况:(1)主界面:使用HTML和CSS设计游戏主界面,包括游戏区域、分数显示、游戏难度选择等。
(2)俄罗斯方块生成与移动:使用JavaScript编写代码,实现俄罗斯方块的生成、移动和旋转等功能。
(3)游戏逻辑:编写游戏逻辑代码,包括方块下落、消除、计分等。
(4)游戏音效:使用HTML5的audio标签,为游戏添加背景音乐和音效。
3. 测试与优化阶段在测试与优化阶段,我们对游戏进行了多次测试,发现并修复了一些问题。
主要优化内容包括:(1)提高游戏运行速度,减少卡顿现象。
(2)优化游戏音效,使音效更加真实。
(3)调整游戏难度,使游戏更具挑战性。
五、实训成果通过本次俄罗斯方块实训,我们小组成功实现了一个具有基本功能的俄罗斯方块游戏。
VC++项目开发实验报告课题名称:基于MFC的俄罗斯方块游戏设计姓名:学号:系别:计算机学院班级:专业:指导教师:1 俄罗斯方块的游戏概述1.1 游戏简介俄罗斯方块游戏由莫斯科科学学院程序员Alexei Pajitnov设计,发行于1985年。
他在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60为平台的俄罗斯方块的游戏。
后来经瓦丁·格拉西莫夫移植到PC上,并且在莫斯科的电脑界传播。
帕基特诺夫因此开始小有名气。
随后几年,俄罗斯方块开始登陆各大游戏主机。
也曾因为版权问题引起过许多纠纷。
但是拜亚洲盗版商人所赐,俄罗斯方块被引进到国内,如今已成为家喻户晓的著名游戏了。
如今电子游戏业如此繁荣,作为电子游戏鼻祖的俄罗斯方块起到了决定性的作用。
如今俄罗斯方块已有多种版本,有的加了几种特殊形状,有的可以使用道具,还有连机的俄罗斯方块等等。
但万变不离其宗,不管怎么变,游戏的基本规则是没有变化的。
游戏玩法十分简单,如今已经成为一种公认的规则:屏幕顶部以随机顺序落下形状各异的方块,你要试图用它们拼成没有空隙的行列。
坚持得时间越长,游戏速度也就变得越来越快,而游戏的吸引力就在于使你顶住碎块的进攻,支撑的时间比上一次更长。
由于玩法简单,容易上手,如今仍是风靡全球,老少皆宜的一款游戏1.2 游戏功能描述最原始的俄罗斯方块由七个不同形状的碎块组成,而每个碎块又是由四个大小相同的方块构成。
游戏开始后方块会根据难度的不同而以不同的速度开始下降。
在落地之前,玩家需要通过旋转方块使方块以最合适的形态下落,用它们拼成没有空隙的行列。
如此便完成消行,使得游戏有更大的空间可以继续下去。
如果方块累积达到游戏空间的顶层,游戏便失败而无法继续。
2需求分析与概要设计2.1 游戏开发基本策略游戏区域由许多等面积的小方块构成,这些区域状态只有满或空两种。
将空间以静态二维数组实现,并预先定义其状态值。
满为1,空为0,以此来完成游戏地图区域的空间分配。
双人版俄罗斯方块实验报告北京邮电大学信息与通信工程学院程序设计实践设计报告课题名称: 双人版俄罗斯方块学生姓名: 王子轩班级: 2014211118 班内序号: 02 学号: 2014210504 日期: 6/30第1页北京邮电大学信息与通信工程学院1( 课题概述1.1课题目标和主要内容本课题在控制台下设计并实现一个俄罗斯方块的游戏。
这是一款桌面游戏,最终要写成一个双人模式和选择难度的俄罗斯方块游戏,涉及到了控制台图形界面和多线程编程。
对于每个俄罗斯方块模块来说,中间是工作区,右边是记录当前游戏的级别和分数。
游戏开始后,自动播放背景音乐,通过键盘的W、S、A、D和上、下、左、右来控制方块的旋转、下移、左移、右移,ESC键退出。
本课题的开发环境为Visual Studio 2012集成开发环境,工程类型为Win32 Console Application。
1.2系统的主要功能基本功能:双人版俄罗斯方块扩展功能:背景音乐、游戏分级、存储显示最高分2. 系统设计2.1 系统总体框架开始界面??打开背景音乐??显示两个游戏界面??初始化各项数值(分数和等级)??两位玩家操作游戏??一个玩家失败时游戏结束2.2 系统详细设计[1] 模块划分图及描述1. void Init(int, int map[MAPH][MAPW]);初始化给定的工作区并调用show 函数。
2. void Turn(int map[MAPH][MAPW], int a[][4], int w, int h, int *x, int y);实现方块的旋转。
3. bool IsAvailable(int map[MAPH][MAPW], int a[], int x, int y, int w, int h);判断方块在工作区的下一个位置上是否存在其他方块,若不存在则返回TRUE,否则返回FALSE。
4. void DrawBlocks(int a[], int w, int h, int x, int y, WORD wColors[], int nColors,int dx, int dy);显示方块和边界。
钳工俄罗斯方块实训报告总结咱就说这钳工俄罗斯方块实训吧,那可真是一段特别的经历。
我刚走进实训车间的时候,那股子机油混合着铁屑的味儿就直往鼻子里钻,就好像那些机器啊、工具啊都在跟我打招呼,说“小子,你可得小心伺候着咱啊”。
我瞅着那些钳工工具,就跟瞅着一群陌生又有点厉害的家伙。
那锉刀啊,长长的,闪着冷冷的光,拿在手里沉甸甸的,就像攥着一把古代大侠的剑似的,可这剑不是用来行侠仗义的,是用来摆弄那些小铁块的。
我旁边的同学,有个叫小李的,那脸长得像个土豆,坑坑洼洼的。
他拿起工具的时候,那手还直哆嗦,我就笑他,“哟,小李啊,你这手咋跟筛糠似的,是要给铁块按摩呢还是咋的?”小李白了我一眼,说:“你懂啥,这叫兴奋,没见过这么多铁家伙,手痒。
”咱开始做这钳工俄罗斯方块的时候啊,那真不是个容易事儿。
那些铁块就像是故意跟我作对,我想把这个角锉平,它就非得翘起来一点,我就嘟囔着,“你这小铁块,咋就这么不听话呢,我还治不了你了?”然后我就更使劲地锉,结果呢,一不小心就锉多了,当时我那个心啊,就像被猫抓了一样,难受得很。
这时候,师傅走过来了,师傅那脸啊,黑红黑红的,像个熟透的枣,眼睛总是眯着,可一瞅见我这锉坏的铁块,眼睛一下子就瞪大了,就跟铜铃似的。
他说:“你这小子,咋这么毛毛躁躁的,这钳工活儿啊,得有耐心,跟你绣花似的,一针一线都得仔细着。
”我低着头,听着师傅的话,就像个犯了错的小学生。
不过呢,我也不服输啊。
我就看着那些铁块,心里想着,我还就不信了,我弄不好你们。
我就慢慢地、一点点地锉,眼睛都不敢眨一下,就怕再锉坏了。
我感觉自己就像个艺术家,在雕琢一件绝世的艺术品,虽然这艺术品看起来还歪歪扭扭的。
这实训的过程中啊,我还发现了个好玩的事儿。
咱这钳工俄罗斯方块,跟那游戏俄罗斯方块还真有点像。
你得把那些铁块啊,按照一定的形状和规则拼接起来,要是有一块不合适,就跟游戏里堆错了方块一样,整个都得乱套。
我就跟旁边的同学说:“哎,你看咱这钳工活儿,不就是个现实版的俄罗斯方块嘛。
C语言之游戏俄罗斯方块课程设计报告专业:[]学生姓名:[]指导教师:[]完成时间:目录一、需求分析..................................................................................... 错误!未定义书签。
二、概要设计..................................................................................... 错误!未定义书签。
三、详细设计..................................................................................... 错误!未定义书签。
四、调试分析 (26)五、用户手册 (27)六、测试数据..................................................................................... 错误!未定义书签。
七、附录.............................................................................................. 错误!未定义书签。
一、需求分析1.该程序是完成一个简易的俄罗斯方块的任务,其要完成几个重要的功能:界面,方块下落,旋转,判断是否还能下落,左右移动,分数,速度设置,清楚满的每行,下个方块的预览等;2.可用#include <graphics.h>的头文件来实用几个函数来控制并完成游戏的界面;3.可用7个二维5*5数组去实现下落方块的全部类型,再用随机函数使其随机下落;4.用#include <conio.h>的头文件去使用按键的控制,以保证用户能够合理操作;并用#include <stdlib.h>的头文件来使用rand函数来随机出示七种方块;完成正常的显示和下个方块的预览;5.用#include <bios.h>来运用时针去控制时间;6.程序执行过程:然后加上几个基本的头文件来执行函数,首先设置按键操作,用:w,a,d,s控制,然后进行界面的初始化设置,启动,时针参数设置,开始新游戏,开始随机下落方块,显示下一个方块,再行旋转,移动,清除,加分,速度参数,最后判断是否已满,停止游戏,打出分数,结束的画面设置,游戏终止...二、概要设计该程序中的函数设置总体主要功能大致如下1.找到合适的方块盒子(7种)使其一一下落box[MAX_C][5][5] = { /*MAX_C(7)种预定义的盒子*/ 这样用类似的7个5*5二维数组来实现每个盒子方块的形状,自此就引荐两个作为介绍,{{0,0,0,0,0},{0,0,0,0,0},{0,0,1,0,0},{0,1,1,1,0},{0,0,0,0,0},{0,0,0,0,0}},{{0,0,0,0,0},{1,1,1,1,0},{0,0,0,0,0},{0,0,0,0,0}},如此中用1代表显示的格子,0代表空。
《软件工程与开发实践1》软件设计报告题目俄罗斯方块学院计算机学院专业计算机科学与技术班级学号10109345学生姓名其他成员组长指导教师孙志海完成日期2012年6月一、软件设计概述(目的、任务、开发环境、参考资料)俄罗斯方块游戏属于经典小游戏,游戏规则简单,但又不乏趣味。
而计算的一大领域也是游戏,所以,成为游戏开发者,几乎是每个编程者的梦想。
经过大一和大二的学习,我们已经掌握了编程基础。
为了提高我们的编程能力,我们就要不断积累编程经验。
1、目的:复习和巩固C/C++编程的基本思想;掌握数据结构的核心思想;掌握C/C++中多文件的编写;初步对了解界面的设计。
2、任务:完成一个可以运行的游戏。
3、开发环境:C/C++控制台。
4、参考资料:[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社.2004.6[2] 孙鑫\余安萍.VC++深入详解[M].北京:电子工业出版社.2006.6二、可行性研究、需求分析及分工这是一个游戏软件,程序与用户的交流只在游戏界面上,方块的产生是随机的。
三、软件设计的基本原理和采用的主要方法与技术1、方块类型以下7大类████████████████████████████每一种方块都能够变形,所以在游戏中如何正确打印出方块的类型是重点,也是难点。
我采用的是“相对坐标法”,具体实现参照“实现的过程与步骤”部分。
2、此游戏是简单的二维游戏,而且区域恒定不变,所以在存储游戏的信息时,二维数组是首选。
用数组元素值模拟当前位置有无方块。
3、流程图如下4、采用的方法在控制台下,光标是左到右,自上而下的,所以要要调用系统函数来控制光标。
同理,为了界面的美观,也要调用系统函数进行颜色控制。
5界面设置游戏的最大特点就是界面的美观,由此才能吸引玩家的兴趣,因此如何让界面尽最大限度美观,是每个游戏程序员努力的目标。
这个程序是在VC环境下基于 C/C++控制台的,由于VC下没有像TC下那样丰富的图形库,画图就要调用windows API函数。
目录一.引言 (2)1.1运行环境 (2)二.需求分析 (2)2.1开发背景 (2)2.2设计目的 (2)2.3功能需求 (2)三.概要设计 (3)3.1设计思想 (3)3.2系统架构 (3)四.详细设计 (3)4.1事件处理 (3)4.2界面设计 (4)4.3游戏画布类 (4)4.4方块类 (6)4.5消行并统计分数 (11)五.使用说明 (12)5.1游戏开始运行 (12)5.2填满一行即消行得分 (13)5.3列被填满,则游戏自动结束 (14)六.课程设计总结与体会 (14)七.参考文献 (15)一.引言1.1运行环境操作系统:Microsoft Windows XP程序语言:Java开发工具:JCreator LE 4.50二.需求分析2.1开发背景Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能。
Java的产生与流行是Internet 发展的客观要求。
如今越来越多的应用程序是Java开发的,用Java开发的应用程序可在任何计算平台安全运行。
Java作为一个分布式的,面向对象的程序设计方法,可以让位于任何地方的任何计算机使用网络上的应用程序。
可以说Java是一个万能的开发平台,用Java编程成为一种趋势。
2.2设计目的通过本次课程设计了解和掌握JDK开发环境以及JCreator等集成开发环境,巩固所学的Java知识及编程机制。
了解Java程序开发流程,学会构思比较复杂的课程设计思想;能合理的利用本学期所掌握的多线程、类、GUI等知识编写一个较为复杂的Java应用软件。
掌握面向对象成学设计的有关概念和开发方法,锻炼团队合作开发精神。
2.3功能需求本课程设计的目标是设计一个名为《俄罗斯方块》的游戏软件,实现其界面的初始化,程序运行,退出,和相应数据处理。
能实现游戏的基本功能,类似下移、左移、右移、翻转、得分累加等,并在规定时间内达到课题所需要实现的功能及要求。
JAVA俄罗斯方块实训报告一、项目简介俄罗斯方块是一款经典的益智类游戏,由前苏联工程师Alexey Pajitnov于1984年设计并推出。
游戏的主要目标是通过操作不同形状的方块,使它们在下降过程中在一排一排地堆叠起来,当一排被填满时,整行将会被消除。
玩家需要尽可能地消除多行,以获得更高的分数。
本实训项目使用Java语言编写俄罗斯方块游戏的核心逻辑,并实现了基本的游戏操作。
二、实训目标1.理解游戏的基本规则和玩法。
2.学习面向对象编程的基本思想和方法。
3. 掌握Java语言的基本语法和常用类的使用。
4.能够使用GUI库设计简单的界面。
5.能够处理用户输入和游戏逻辑的交互。
6. 能够实现游戏的核心功能并进行测试和修复bug。
三、实训内容与方法1. 学习基础知识:学习掌握Java语言的基本语法和常用类的使用,了解面向对象编程的基本思想和方法。
2.设计游戏逻辑:根据游戏的规则和玩法,设计游戏的核心逻辑,包括方块的形状和下落规则、消除行的判定和计分等。
3. 实现游戏核心功能:根据设计的游戏逻辑,使用Java语言编写代码实现游戏的核心功能,包括方块的生成和下落、用户操作的响应、消除行的处理等。
4.设计界面和交互:使用GUI库设计游戏的界面,包括游戏区域、分数显示、游戏控制等,处理用户输入和游戏逻辑的交互。
5. 测试和修复bug:进行测试和调试,发现游戏中存在的bug,并对其进行修复和优化,确保游戏的稳定性和流畅性。
四、实训结果与总结1.实现了基本的游戏逻辑和核心功能,包括方块的生成和下落、用户操作的响应、消除行的处理等。
2.设计了简单的界面和游戏控制,可以与用户进行交互。
3. 进行了测试和调试,修复了发现的bug并进行了优化,提高了游戏的稳定性和流畅性。
4. 掌握了Java语言的基本语法和常用类的使用,加深了对面向对象编程的理解和应用。
5.通过本次实训,更深入地了解了游戏开发的流程和方法,提高了自己的逻辑思维和编程能力。
Verilog HDL高级数字设计实验报告题目:“俄罗斯方块”FPGA实现实验目的通过此次项目,完成以下目的:1)熟悉Xilinx FPGA的架构及开发流程2)设计一个功能完整的系统,掌握FSM + Datapath的设计方法。
实验内容1.项目介绍本项目主要在FPGA上实现了一个经典小游戏“俄罗斯方块”。
本项目基本解决方案是,使用Xilinx Zynq系列开发板ZedBoard作为平台,实现主控模块,通过VGA接口来控制屏幕进行显示。
2.系统框架整个系统由四部分组成,按键输入处理模块、控制模块、数据路径模块以及VGA显示接口模块。
整个系统的结构如下图所示:图1:系统框图下面分别对四个模块进行介绍:1)按键输入处理模块按键处理模块的主要功能是对输入系统的up,down,left,right四个控制信号进行消抖处理,并对其进行上升沿检测。
消抖模块采用上课所提出的结构,采用了一个4位的移位寄存器,先将输入信号延迟4个时钟周期,再对其以一个较低的时钟频率进行采用。
消抖模块的结构如下图所示:图2:消抖模块结构示意图为了简化控制系统,在本系统的设计过程中,不考虑长时间按键产生连按效果。
因而,需要对按键进行上升沿检测。
上升沿检测的基本实现方案是加入一组寄存器,对前一个的按键信号进行暂存,将暂存的值与当前值进行比较,当上一个值为0而当前值为1时,即认为其检测到了一个上升沿。
2)控制模块控制模块采用FSM的方式进行控制。
在控制模块中,定义了10个状态:S_idle:上电复位后进入的空状态,当start信号为1时进入S_new状态S_new:用于产生新的俄罗斯方块。
S_hold:保持状态。
在这个状态中进行计时,当时间到达一定间隔时,转到S_down 状态;或者等待输入信号(up,down,left,right)时,转到S_down(按键为down)或者S_move(up,left,right)状态。
S_down:判断当前俄罗斯块能否下移一格。
数据库课程实训报告( 2016-- 2017年度第2学期)题目: 车票销售管理子系统专业 软件工程 学生姓名 季新明 班级 软件152 学号1510701210 指导教师 陶明 徐静 完成日期2017.7.1车票销售管理子系统目录目录 (2)车站售票子系统 (1)1课题内容和要求 (1)1.1课题描述 (1)1.2 课题要求 (1)2需求分析 (1)2.1 功能需求分析 (1)2.2 数据需求分析 (2)3系统设计 (4)3.1 功能模块设计 (4)3.2 数据库概念设计 (4)3.3 数据库逻辑设计 (5)3.4 数据库物理设计 (6)3.5 数据库表间联系 (6)4系统实现 (8)4.1 增加乘客模块实现 (8)4.2 删除模块实现 (8)4.3 更新模块实现 (8)5代码调试与功能测试 (8)5.1 测试方案 (8)5.2 测试结果 (9)6收获与体会 (10)附录 (13)附录1源程序部分清单 (13)附录1.1数据库代码 (13)附录1.2 数据库代码 (30)附录1.3 WebConnect代码 (31)数据库课程实训(2017)车站售票子系统1 课题内容和要求1.1课题描述随着市场经济的不断飞速发展,交通道路环境的不断改善,人们的出行次数不断增多,人口流动频繁,数量不断加大,车站信息量迅猛增长,车站售票管理系统在人们的日常生活中发挥着越来越重要的作用。
本系统实现了线路信息,汽车信息,票务信息的查询和管理,满足人们的需求1.2 课题要求(1)具有方便快速的售票功能,包括车票的预定和退票功能,能够支持团体的预定票和退票(2)能准确地来哦接售票情况,提供多次查询和统计功能,如车次的查询时刻表的查询(3)能按情况所需实现对车次的更改、票价的变动及调度功能(4)完善的报表系统2 需求分析2.1 功能需求分析1.登录功能:分为汽车站售票人员和系统管理员两种权限登陆。
用户通过输入不同用户名和密码进行身份验证,系统通过用户名和密码判断不同用户的权限,从而确定该用户可以执行的操作。
2.车票信息查询功能:由车站的普通售票人员通过不同的检索入口,查询车票信息,并进行排序。
3.修改功能:汽车站售票人员、汽车站售票工作的管理人员能够修改自身的用户名和密码,系统管理员则能实现系统用户与普通用户的添加,修改普通用车票销售管理子系统户与系统管理员的密码,以此确保该系统能够安全操作,避免不必要的损失。
4.汇总功能:对当天车票的信息进行汇总。
2.2 数据需求分析 数据流图顶层图 0层图售票记录1层图车票记录订票记录车票记录数据库课程实训(2017)数据字典1.数据项乘客姓名顾客身份证号顾客性别顾客身高2.数据结构3.数据流数据流名称:乘客简述:乘客有关信息数据流来源:售票员操作结果数据流去向:购票乘客数据流组成:乘客身份证号+乘客姓名+乘客性别+乘客身高4.数据存储乘客记录:乘客身份证号乘客姓名乘客性别乘客身高增加记录:乘客身份证号乘客姓名乘客性别乘客身高删除记录:乘客身份证号乘客姓名乘客性别乘客身高更改记录:乘客身份证号乘客姓名乘客性别乘客身高车票销售管理子系统3 系统设计3.1 功能模块设计3.2 数据库概念设计数据库课程实训(2017)3.3 数据库逻辑设计车票{票价,车票编号,座位类型,座位号,发车时,火车到车站时,火车发站时间,火车到站时间,车票名}售票员{姓名,密码,工作号}购买{车票编号,工作号}顾客{姓名,身份证号}订票{车票编号,团体票,个人票,日期,交易金额,起始站,终点站,身份证号}退票{退票时间,车票编号,退票金额}服务{时刻查询,车次查询}车站{车站名,车站所在省,车站所在城市,车站号}工作{车站号,工作号}车票销售管理子系统管理员{姓名,工作号,密码}管理{票价更改,车次更改}3.4 数据库物理设计3.5 数据库表间联系乘客表:CREATE TABLE `ts_passenger` (`Pnum` bigint(12) NOT NULL AUTO_INCREMENT, `Pname` varchar(20) DEFAULT NULL,`Psex` varchar(20) DEFAULT NULL,`Pheight` varchar(20) DEFAULT NULL,PRIMARY KEY (`Pnum`)数据库课程实训(2017)) ENGINE=InnoDB DEFAULT CHARSET=utf8售票员表:CREATE TABLE `ts_conductor` (`Cname` varchar(10) NOT NULL,`Cno` bigint(30) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`Cno`)) ENGINE=InnoDB AUTO_INCREMENT=695 DEFAULT CHARSET=utf8车站表:CREATE TABLE `ts_station` (`Sname` varchar(10) DEFAULT NULL,`Sprovince` varchar(10) DEFAULT NULL,`Scity` varchar(20) DEFAULT NULL,`Sno` bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`Sno`)) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8车票表:CREATE TABLE `ts_ticket` (`Tpiaojia` varchar(300) NOT NULL,`Tno` bigint(30) NOT NULL AUTO_INCREMENT,`Tzuoweihao` varchar(300) NOT NULL,`Tchexiang` varchar(30) NOT NULL,`Tfacheshijian` time NOT NULL,PRIMARY KEY (`Tno`)) ENGINE=InnoDB DEFAULT CHARSET=utf8车票销售管理子系统4系统实现4.1 增加乘客模块实现该模块主要实现乘客信息的增加。
乘客管理中的数据源为ticket_sales数据库中passenger表,在此管理部分中,能够使用界面操作实现乘客信息的增加,并将数据库中的数据按照编辑的要求来及时更新数据表中的相关数据。
4.2 删除模块实现该模块主要实现乘客信息的删除。
乘客管理中的数据源为ticket_sales数据库中passenger表,在此管理部分中,能够使用界面操作实现乘客信息的删除,并将数据库中的数据按照编辑的要求来及时更新数据表中的相关数据。
4.3 更新模块实现该模块主要实现乘客信息的更新。
乘客管理中的数据源为ticket_sales数据库中passenger表,在此管理部分中,能够使用界面操作实现乘客信息的更新,并将数据库中的数据按照编辑的要求来及时更新数据表中的相关数据。
5 代码调试与功能测试5.1 测试方案在eclipese中执行,以本机为服务器并确定好服务器的位置。
以实现对乘客表的增,数据库课程实训(2017)删,改,查。
5.2 测试结果查增加删除修改车票销售管理子系统6 收获与体会本系统的整个设计开发是对乘客管理的一次的尝试,最后完成的这个系统也只是车票销售系统的一个模型,它的使用对象是客户端,如果要推广到车站使用,还面临很多问题,比如全国整个铁路系统包括很多分局,各自权限不一样,他们又下属很多结点。
但是经过这次的课程设计在本次实践中,我认识到了团队的重要性,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。
某个人的离群都可能导致导致整项工作的失败。
只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。
团结协作是我们实习成功的一项非常重要的保证。
而这次实习也正好锻炼我们这一点,这也是非常宝贵的。
我很清楚的知道团结协作的力量是伟大的,如果是我一个人孤军奋战的话,肯定不能在规数据库课程实训(2017)定时间内完成这次课程设计的要求内容,因此我很怀念这两个星期的合作,想起我们一起查阅资料,一起讨论设计程序的思路,成功的时候一起分享喜悦,失败的时候互相鼓励,我坚信,在这两个星期的时间里面,我们的友情和团结精神在历练中经受住了考验,变的更加顽强,我们是一个集体的思想已经深入人心!车票销售管理子系统参考文献[1]钱雪忠,王燕玲,林挺.数据库原理及技术[M].北京:清华大学出版社,2011.[2] 钱雪忠,罗海驰,陈国俊.数据库原理及技术课程设计[M].北京:清华大学出版社,2014.数据库课程实训(2017)附录附录1源程序部分清单附录1.1数据库代码cn.bdqn.util包package cn.bdqn.utils;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class DbInformationUtil {//创建一个Properties对象,对象中没有任何信息public static Properties properties = new Properties();static{InputStream in =DbInformationUtil.class.getClassLoader().getResourceAsStream("dp.properties");//加载文件信息try{properties.load(in);}catch(IOException e){e.printStackTrace();}}public static String getProperty(String key){return properties.getProperty(key);}车票销售管理子系统public static void main(String[] args){System.out.println(DbInformationUtil.getProperty("password"));}}dao包package dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.List;import cn.bdqn.utils.DbInformationUtil;import entity.Station;/*** @author BaseBao类**/public abstract class BaseDao {protected Connection getConnection =null;protected PreparedStatement ps=null;/*** @author 链接数据库数据库课程实训(2017)**/public Connection getConnection() throws SQLException{try{Class.forName(DbInformationUtil.getProperty("driver"));}catch(ClassNotFoundException e){e.printStackTrace();}String ur1 = DbInformationUtil.getProperty("url");String username=DbInformationUtil.getProperty("username");String password=DbInformationUtil.getProperty("password");//密码//连接数据库Connection connection = DriverManager.getConnection(ur1, username, password);return connection;}/*** @author 关闭数据库**/public void closeResource() throws SQLException{if(ps!=null){ps.close();}if(getConnection!=null){getConnection.close();}//关闭数据库}车票销售管理子系统/*** @author**/public List<Station> findall() {// TODO Auto-generated method stubreturn null;}}package dao;import java.sql.SQLException;import java.util.List;import entity.Station;/*** @author StationDao类**/public interface StationDao {/*** @author 数据操作增加方法**/public int save(Station station) throws SQLException;/*** @author 数据操作更新方法**/数据库课程实训(2017)public int update(Station station);/*** @author 数据操作查询方法**/public List<Station> findAll();/*** @author 数据操作删除方法**/public int removeBySno(int sno);Station findBySno(int sno);}dao.impl包package dao.Impt;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import dao.BaseDao;import dao.StationDao;import entity.Station;/**车票销售管理子系统* @author StationrDaoImpt类**/public class StationDaoImpt extends BaseDao implements StationDao { /*** @author 实现插入功能主程序**/public int save(Station station) throws SQLException {// 对售票员进行操作Connection connection = getConnection();String sqlAdd = "INSERT INTO ts_station V ALUE(?,?,?,null)";PreparedStatement ps = connection.prepareStatement(sqlAdd);ps.setString(1, station.getSname());ps.setString(2, station.getSprovince());ps.setString(3,station.getScity());int line = ps.executeUpdate();closeResource();return line;}/*** @author 实现查询功能主程序**/@Overridepublic List<Station> findAll() {// TODO Auto-generated method stubList<Station> list = new ArrayList<Station>();try {getConnection =getConnection();String sqlQuery ="SELECT * FROM ts_station";PreparedStatement ps = getConnection.prepareStatement(sqlQuery);ResultSet set = ps.executeQuery();while(set.next()){String sname = set.getString(1);String sprovince=set.getString(2);String scity=set.getString(3);int sno=set.getInt(4);Station station = new Station();station.setSname(sname);station.setSno(sno);;station.setSprovince(sprovince);station.setScity(scity);list.add(station);//System.out.println(sname+"----"+sprovince+"----"+scity+"----"+sno);}//int line = preparedStatement.executeUpdate();closeResource();}catch(SQLException e){e.printStackTrace();}return list;}/*** @author 实现删除功能主程序**//*** @author 实现更新功能主程序**/@Overridepublic int update(Station station) {//链接Connection connection=null;try {connection = getConnection();}catch (SQLException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}//更新String sqlUpdate="UPDA TE ts_station SET sname=?WHERE sno=?";//获取执行器statementint line2=-1;PreparedStatement ps=null;try {ps = connection.prepareStatement(sqlUpdate);ps.setString(1,station.getSname());ps.setInt(2, station.getSno());;line2=ps.executeUpdate();closeResource();}catch (SQLException e) {e.printStackTrace();}return line2;}@Overridepublic Station findBySno(int sno) {// TODO Auto-generated method stubStation station=null;try {getConnection =getConnection();String sqlQuery ="SELECT * FROM ts_station WHERE sno=?";PreparedStatement ps = getConnection.prepareStatement(sqlQuery);ps.setInt(1, sno);ResultSet set = ps.executeQuery();station=new Station();while(set.next()){String sname = set.getString(1);String sprovince=set.getString(2);String scity=set.getString(3);int no=set.getInt(4);station.setSname(sname);station.setSprovince(sprovince);station.setScity(scity);station.setSno(no);;//System.out.println(sname+"----"+sprovince+"----"+scity+"----"+sno);}//int line = preparedStatement.executeUpdate();closeResource();}catch(SQLException e){e.printStackTrace();}return station;}@Overridepublic int removeBySno(int sno) {// TODO Auto-generated method stubConnection connection=null;try {connection = getConnection();}catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}//sqlString sqlDelete="DELETE FROM ts_station WHERE sno=? ";//获取执行器statementint line=-1;PreparedStatement ps=null;try {ps = connection.prepareStatement(sqlDelete);ps.setInt(1, sno);line=ps.executeUpdate();closeResource();}catch (SQLException e) {e.printStackTrace();}return line;}}entity包package entity;/*** @author Station类**/public class Station {private int sno;private String sname;private String sprovince;private String scity;/*** @author sno调用方法**/public int getSno() {return sno;}public void setSno(int sno) {this.sno = sno;}/*** @author sname调用方法**/public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}/*** @author sprovince调用方法**/public String getSprovince() {return sprovince;}public void setSprovince(String sprovince) { this.sprovince = sprovince;}/*** @author scity调用方法**/public String getScity() {return scity;public void setScity(String scity) {this.scity = scity;}}Service包package service;import java.sql.SQLException;import java.util.List;import entity.Station;/*** @author ConductorService类**/public interface StationService {/*** @author售票员的增加**/public void add(Station station) throws SQLException;/*** @author售票员的查询*/public List<Station> findAll();/*** @author售票员的删除**/public Station findBySno(int sno);public int deleteBySno(int sno);public int update(Station station); }serviceimpl包package serviceimpt;import java.sql.SQLException;import java.util.List;import dao.StationDao;import dao.Impt.StationDaoImpt;import entity.Station;import service.StationService;/*** @author StationServiceImpt类**/public class StationServiceImpt implements StationService { private StationDao dao;public StationServiceImpt(StationDao dao){this.dao=dao;}public void add(Station station) throws SQLException { dao.save(station);}/*** @author 主函数调用**/public static void main(String[]args) throws SQLException{Station station = new Station();station.setSname("盐城火车站");station.setScity("盐城");station.setSprovince("江苏");new StationDaoImpt().save(station);//增// StationDao dao = (StationDao) new StationDaoImpt();// Station station = new Station();// station.setSno(12);// new StationSeiviceImpt(dao).delete(station);//删// StationDao dao = (StationDao) new StationDaoImpt();// Station station = new Station();// station.setSname("盐城汽车站");//station.setSno(1);// new StationServiceImpt(dao).update(station);//改// StationDao dao = (StationDao) new StationDaoImpt();// StationService service = new StationServiceImpt(dao);// List<Station> list =service.findAll();// for(Station station:list){//System.out.println(station.getSname()+"--"+station.getSprovince()+"--"+station.getScity()+"--"+statio n.getSno());// }//查}/*** @author 实现更改功能**/public int update(Station station) {return dao.update(station);}/*** @author 实现查询功能**/@Overridepublic List<Station> findAll() {// TODO Auto-generated method stub return dao.findAll();}/*** @author 实现删除功能**/@Overridepublic int deleteBySno(int sno) {return dao.removeBySno(sno);}@Overridepublic Station findBySno(int sno) {// TODO Auto-generated method stubreturn dao.findBySno(sno);}}附录1.2 数据库代码乘客表:CREATE TABLE `ts_passenger` (`Pnum` bigint(12) NOT NULL AUTO_INCREMENT,`Pname` varchar(20) DEFAULT NULL,`Psex` varchar(20) DEFAULT NULL,`Pheight` varchar(20) DEFAULT NULL,PRIMARY KEY (`Pnum`)) ENGINE=InnoDB DEFAULT CHARSET=utf8售票员表:CREATE TABLE `ts_conductor` (`Cname` varchar(10) NOT NULL,`Cno` bigint(30) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`Cno`)) ENGINE=InnoDB AUTO_INCREMENT=695 DEFAULT CHARSET=utf8车站表:CREATE TABLE `ts_station` (`Sname` varchar(10) DEFAULT NULL,`Sprovince` varchar(10) DEFAULT NULL,`Scity` varchar(20) DEFAULT NULL,`Sno` bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`Sno`)) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8车票表:CREATE TABLE `ts_ticket` (`Tpiaojia` varchar(300) NOT NULL,`Tno` bigint(30) NOT NULL AUTO_INCREMENT,`Tzuoweihao` varchar(300) NOT NULL,`Tchexiang` varchar(30) NOT NULL,`Tfacheshijian` time NOT NULL,PRIMARY KEY (`Tno`)) ENGINE=InnoDB DEFAULT CHARSET=utf8附录1.3 WebConnect代码Delete.jsp<?xml version="1.0"encoding="UTF-8"?><%@page import="entity.Station"%><%@page import="serviceimpt.StationServiceImpt"%><%@page import="service.StationService"%><%@page import="dao.Impt.StationDaoImpt"%><%@page import="dao.StationDao"%><%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%StationDao dao = new StationDaoImpt();StationService service =new StationServiceImpt(dao);Station station=new Station();String no = request.getParameter("sno");service.deleteBySno(Integer.parseInt(no));response.sendRedirect("/doma3/table.jsp");%>NewFile.html<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><form action="/doma3/process.jsp"method="post">请输入您想增加的车站信息:<br><br>车站名:<input type = "text"name= "sname"value="请输入车站名"><br><br>车站所在省:<input type = "text"name= "sprovince"value="请输入车站所在省"><br><br>车站所在城市:<input type = "text"name= "scity"value="请输入车站所在城市"><br><br><input type = "submit"value="提交"></form></body></html>NewFile.jsp<?xml version="1.0"encoding="UTF-8"?><%@page import="entity.Station"%><%@page import="service.StationService"%><%@page import="serviceimpt.StationServiceImpt"%><%@page import="dao.Impt.StationDaoImpt"%><%@page import="dao.StationDao"%><%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8" /><title>Insert title here</title></head><body><%request.setCharacterEncoding("UTF-8");int no = Integer.parseInt(request.getParameter("sno")); StationDao dao = new StationDaoImpt();StationService service = new StationServiceImpt(dao);Station station=service.findBySno(no);request.setAttribute("station", station);request.getRequestDispatcher("/update.jsp").forward(request, response); %></body></html>Process.jsp<%@page import="entity.Station"%><%@page import="serviceimpt.StationServiceImpt"%><%@page import="service.StationService"%><%@page import="dao.Impt.StationDaoImpt"%><%@page import="dao.StationDao"%><%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"> <title>增加</title></head><body><%request.setCharacterEncoding("UTF-8");String name= request.getParameter("sname");String province= request.getParameter("sprovince"); String city= request.getParameter("scity");String no=request.getParameter("sno");//out.print(name);//out.print(province);//out.print(city);//向网页打印StationDao dao = new StationDaoImpt();StationService service =new StationServiceImpt(dao); Station station = new Station();station.setSname(name);station.setSprovince(province);station.setScity(city);if(no == null){service.add(station);}station.setSno(Integer.parseInt(no));service.update(station);}// request.setAttribute("name","盐城火车站");//装发response.sendRedirect("/doma3/table.jsp");//重定位//request.getRequestDispatcher("success.jsp").forward(request, response);%></body></html>Table.jsp<%@page import="entity.Station"%><%@page import="service.StationService"%><%@page import="serviceimpt.StationServiceImpt"%><%@page import="java.util.List"%><%@page import="dao.Impt.StationDaoImpt"%><%@page import="dao.StationDao"%><%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%StationDao dao = new StationDaoImpt();StationService service =new StationServiceImpt(dao);List<Station> list = service.findAll();<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8" /><title>查询车站</title><script type="text/javascript">function dosomthing(){if(confirm('确认离开吗?')){alert('再见');}}</script></head><body><table border="1"width="1000px"><tr><td colspan ="5"align="center">车站信息</td></tr><tr><td>车站名</td><td>车站所在省</td><td>车站所在城市</td><td>车站号</td><td>操作</td></tr>Update.jsp<%for(Station station:list){ %><tr><td><%=station.getSname() %></td><td><%=station.getSprovince() %></td><td><%=station.getScity() %></td><td><%=station.getSno() %></td><td><a href="/doma3/NewFile.jsp?sno=<%=station.getSno() %>">修改</a> <ahref="/doma3/delete.jsp?sno=<%=station.getSno()%>">删除</a></td> <%}%></tr></table><br><br><a href="NewFile.html"><input type="button"value="增加"onclick="window.location.href('NewFile.html')"></a><br><br><br><input type="button"value="离开"onclick="dosomthing()"></br> </body></html>数据库课程实训(2017)<?xml version="1.0"encoding="UTF-8"?><%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8" /><title>Insert title here</title></head><body><form action="/doma3/process.jsp" method="post">车站名:<inputtype="text"name="sname"value="${station.sname}"><br><input type="hidden"value="${station.sno}"name="sno"><input type="submit"value="确认"></form></body></html>39。