1.?正方正方???Դ??
2.求俄罗斯方块源代码
????Դ??
正方教务软件真龘相大揭秘--高等学校的悲哀 软件行业的耻辱 作者:浙江某大学教务软件系统管理员一、软件设计拙劣,源码功能实现混乱
(1) 架构不科学,正方正方流程不清晰,源码功能不完整;系统界面设计粗糙,正方正方功能模块划分凌乱;未能提供正式印刷的源码怀旧服辅助源码配套操作手册,概念混乱、正方正方到处说法不一,源码错字、正方正方病句随处可见,源码深得垃圾堆放之精妙,正方正方俨然未成年大猩猩之杰作。源码
(2) 数据库设计不合理,正方正方严重违反关系数据库设计的源码基本原则,大量信息重复存储,正方正方缺乏最基本的数据关联,不能实时记录数据的历史状态,严重破坏了数据的完整性、准确性、时效性与一致性,必然导致管理数据混乱,上帝也无能为力。
(3) 逻辑关联不紧密,管理控制不精确,数据处理不到位,无法保证数据的正确性与数据状态的准确性,因而不可能满足教务工作对大量数据进行精确管理的需要;这也正是多年以来不少教务管理软件纷纷退出市场的根本原因所在。
(4) 没有基于互联网为管理人员提供信息服务,.net concat 源码大量需要远程维护、移动处理的工作无法开展。
(5) 无论是程序内部控制,还是用户操作界面,到处以固化方式实现,缺乏扩展性与灵活性,大量特殊问题无法解决,不能适应用户不断增长、不断变化的个性化要求。
(6) 无视教务管理的严肃性,公然破坏公开、公平、公正原则,提供了大量的特殊、特权管理功能,几乎所有数据(其中包括课程、教学计划、学生学籍、学生成绩、学生毕业信息等重要且敏龘感的信息)均可由操作人员无需任何理由、没有任何限制地直接增删改。 (7) 无视信息安全的基本原则,公然提供大量篡改数据的危险功能,比如系统初始化、直接使用数据库语句增删改,人为地造成大量管理漏洞;操作人员稍不注意,就会导致数据丢失和混乱、微型论坛源码酿成教学事故。
(8) 到处提供数据导入功能,到处裸露龘底层数据表结构(即字段信息),完全依赖人的聪明与记性,由操作人员负责建立字段之间的对应关系,无法保证数据的完整性、准确性、时效性与一致性,不可避免地引起数据混乱。
(9) 没有提供教务工作需要的各种规范报表,而是将大量数据导出,依赖美国微软公司的电子表格处理软件进行随意编辑、打印,不仅增加了教务管理人员的工作量,而且由于不得不经常调整报表格式、有意或无意的人为因素介入,破坏了数据的正确性,不可避免地给教学管理工作带来重大隐患,严重损害了教务管理部门的权威性。
() 借助几个蹩脚的菜单名称、简陋的录入窗体,提供的所谓增强功能根本不属于教务工作范畴,如学科建设、教研教改、师资管理、人事管理、校产管理、网站源码jingojin收费管理、学生工作、宿舍管理、实验室管理等,事实上不可能正常使用,纯粹愚弄学校。 二、销售手段使尽,蒙蔽用户众多
(1) 打着浙江大学的招牌。 不少高校误以为正方是浙大的,因而提到正方随口冠以浙大,甚至不提正方单讲浙大。 事实上,正方不是浙江大学的!因为浙江大学的官方网站上公布的下属企业名单中没有正方。 不少高校误以为浙江大学学分制改革搞的好,其实并不好!究竟好在哪里?到底有多少成功的经验可以借鉴?浙江大学允许学生在校期间随意更换专业,简直是误人子弟! 如果看重名气,清华大学名气最大,最好购置清华大学研制开发的教务软件。
(2) 造谣SQL Server不安全。 不少高校误以为数据库采用Oracle就安全、采用SQL Server就不安全。 事实上,SQL Server与Oracle同属大型关系数据库管理系统,co源码解析根本不存在安全与不安全一说。 教务软件的安全性涉及到两个方面:一方面是外部环境的安全性,只能依靠防火墙抵挡病毒侵袭与黑客攻击;另一方面是软件内部的安全性,这才是最为核心、最应关注的,管理控制是否安全可靠、数据处理是否智能批量,直接关系到数据的完整性、准确性与一致性。
(3) 鼓吹“完全学分制”。 故弄玄虚地将教务软件划分为多个版本(完全学年制版、学年/学分制版、过渡版、完全学分制版),没有能力提供适应学年/学分制的完整版本。 事实上,没有哪一所推行学分制的高校不是学年/学分制,根本就不存在完全学分制一说! 难道上一学期不完全、这一学期就突然完全了,级不完全、级就突然完全了? 明目张胆地愚弄高校“老系统管理老生、新系统管理新生”;实际上,老生与新生不可能截然分开,因为老生与新生在课表编排与考试安排等诸多方面都必需统一考虑、共享资源;其险恶用心昭然若揭:故意暂时拖住高校,以免过早露出马脚。
(4) 妄称终身免费服务。 实质上是陷阱、是弥天大谎,只不过是哄人高兴、骗取合同的拙劣伎俩而已;显然即将收摊,不期望再有以后了。原因很简单,谁都清楚软件需要维护、服务需要成本,没有一个供应商能够背离价值规律长期生存。
(5) 提供源代码。 声称高校可以在源代码基础上自主地进行二次开发且节省后期技术服务费用。 其实得不偿失、断不可行,因为二次开发与后期维护需要耗费大量的人力、物力与财力,而且要求相关人员技术水平高、业务能力强并保持长期稳定。 事实上,表明供应商已经在这个领域丧失信心,已经对高校不负责任了。
(6) 免费赠送根本不成型的软件。 通过免费赠送一些非教务软件,在高校选购教务软件时获得优势。 事实上,免费赠送的软件根本不成型或者根本就没有,但是没有人较真;反正合同已经签订。 当发现根本无法使用时,得到的回答却是:本来免费赠送的,能用就用、不能用不就算了。
(7) 恶意低价、有意高价。 对于认可其他供应商的高校,采用恶意低价手段,低到两万以下; 对于关系到位的高校,采用有意高价手段,高到三十万以上。
(8) 编造谎言、到处散布,恶意诬陷其他供应商。 令人遗憾的是,绝大多数高校对于正方的凭空造谣信以为真、不加证实。
回复
2楼
-- :
举报 |个人企业举报垃圾信息举报
ourfocus
博导
三、焦头烂额修补,饮鸩止渴残喘
(1) 作为整个教务系统的底层,系统维护包括大量繁杂的设置参数,混乱不堪、触目惊心,完全依赖系统管理员的人为设置进行管理(不得不记住所有的代码),必然导 致出错频繁、隐患不断,为整个教务系统的全面崩溃埋下祸根。而且,采用不同的代码直接控制各个功能模块的处理过程、片面应付不同用户的个性化需求,事实上 根本不可能满足。
(2) 作为整个教务系统的核心,绝大多数功能模块的处理过程纯粹依赖手工、完全随心所欲(通过SQL语句直接操纵底层数据),成千上万的各种数据到处存储、互不关联,无法记录历史、缺乏时效性。
(3) 作为整个教务系统的表象,查询和统计报表是所有用户最为关心的部分。对于不同用户需要的各种报表,随时随地添加字段、修改表结构,表面上能够基本满足报表的式样,事实上大量数据要由使用人员直接填录。这正是多数用户长期以来被蒙骗的根本原因。
(4) 到处裸露数据库表结构和字段名,对数据的正确性、关联性、时效性与状态不加任何控制,以便开发人员随意修改程序、使用人员随意修改数据。这正是不少用户勉强维持、暂时没有放弃劣质软件的主要原因(事实上不得不反复修补,数据越来越混乱、修改越来越困难)。
(5) 对于用户而言,签了合同就好比打了结婚证,付了第一笔款就好比生了第一个小孩;作为濒临绝望的长期受害者,尽管系统已经千疮百孔、不可能改好,但是不少用户依然抱有一丝幻想,很难痛下决心、抛弃劣质软件。
四、技术服务艰难,全面崩溃不远
不少用户根本没有使用,深感自身管理不及浙江大学,需要准备一段时间;
许多用户刚刚开始使用,忙于通过正方提供的极不规范的电子表格收集、整理历史数据;
多数用户使用功能有限,比如仅仅使用了学籍、成绩,根本没有使用排课、排考、教材等;
部分用户使用功能较多、时间较长,陷入应用困难、问题不断、解决无望、苦不堪言的境地。
另外,正方教务用户已经被换掉的有郑州工程学院、 西安培华学院、南通医学院、内蒙古医学院、重庆三峡职业学院等;而且,由于正方教务软件存在大量致命的设计缺陷与严重的功能缺陷(交付用户的全部数据处理 程序只有一个文件JWGL.EXE),加上服务手段落后(接收用户反馈放入文件夹、任何修改均采用最原始的手工覆盖文件方式),杭州正 方电子工程有限公司的技术支持已经到了全面崩溃的边缘、已经服务不了,必然导致问题不断、数据混乱、管理失控、停止运转,越来越多的正方教务用户将被一一 换掉。因为所有用户使用的正方教务软件均患了绝症——数据越来越混乱、管理越来越失控,就像肿瘤恶性化之后,癌细胞已经扩散,外科手术无能为力。
求俄罗斯方块源代码
手机游戏---俄罗斯方块
俄罗斯方块——java源代码提供
import java.awt.*;
import java.awt.event.*;
//俄罗斯方块类
public class ERS_Block extends Frame{
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);
}
//俄罗斯方块类的构造方法
ERS_Block(String title){
super(title);
setSize(,);
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,));
rightScr.setSize(,);
add(rightScr);
//右边信息窗体的布局
MyPanel infoScr = new MyPanel();
infoScr.setLayout(new GridLayout(4,1,0,5));
infoScr.setSize(,);
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(,));
scoreField.setSize(new Dimension(,));
levelp.setSize(new Dimension(,));
levelField.setSize(new Dimension(,));
scoreField.setText("0");
levelField.setText("1");
//右边控制按钮窗体的布局
MyPanel controlScr = new MyPanel();
controlScr.setLayout(new GridLayout(5,1,0,5));
rightScr.add(controlScr);
//定义按钮play
Button play_b = new Button("开始游戏");
play_b.setSize(new Dimension(,));
play_b.addActionListener(new Command(Command.button_play,gameScr));
//定义按钮Level UP
Button level_up_b = new Button("提高级数");
level_up_b.setSize(new Dimension(,));
level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));
//定义按钮Level Down
Button level_down_b =new Button("降低级数");
level_down_b.setSize(new Dimension(,));
level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr));
//定义按钮Level Pause
Button pause_b =new Button("游戏暂停");
pause_b.setSize(new Dimension(,));
pause_b.addActionListener(new Command(Command.button_pause,gameScr));
//定义按钮Quit
Button quit_b = new Button("退出游戏");
quit_b.setSize(new Dimension(,));
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{
public Insets getInsets(){
return new Insets(,,,);
}
}
//游戏画布类
class GameCanvas extends Canvas implements KeyListener{
final int unitSize = ; //小方块边长
int rowNum; //正方格的行数
int columnNum; //正方格的列数
int maxAllowRowNum; //允许有多少行未削
int blockInitRow; //新出现块的起始行坐标
int blockInitCol; //新出现块的起始列坐标
int [][] scrArr; //屏幕数组
Block b; //对方快的引用
//画布类的构造方法
GameCanvas(){
rowNum = ;
columnNum = ;
maxAllowRowNum = rowNum - 2;
b = new Block(this);
blockInitRow = rowNum - 1;
blockInitCol = columnNum/2 - 2;
scrArr = new int [][];
}
//初始化屏幕,并将屏幕数组清零的方法
void initScr(){
for(int i=0;i<rowNum;i++)
for (int j=0; j<columnNum;j++)
scrArr[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[j]);
}
//画方块的方法
public void drawUnit(int row,int col,int type){
scrArr[row][col] = type;
Graphics g = getGraphics();
tch(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);
else
return(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[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[j] == 0)
drawUnit(k-1,j,0);
else
drawUnit(k-1,j,2);
scrArr[k-1][j] = scrArr[j];
}
}
for(int i = k-1 ;i < rowNum; i++){
for(int j = 0; j < columnNum; j++){
drawUnit(i,j,0);
scrArr[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;
tch(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;
}
//按钮执行方法
public void actionPerformed (ActionEvent e){
tch(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 < ){
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 = {
,//用十六进至表示,本行表示长条四种状态
,
,
,
,
,
};
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() * )%7;
turnState = (int)(Math.random() * )%4;
blockState = 1;
row = scr.getInitRow();
col = scr.getInitCol();
}
//重新初始化块,并显示新块
public void reset(){
blockType = (int)(Math.random() * )%7;
turnState = (int)(Math.random() * )%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 = 0x;
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 = 0x;
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;
}
public void run(){
while(true){
try{
sleep((-ERS_Block.level + 1)*);
}
catch(InterruptedException e){ }
if(!scr.getBlock().fallDown()){
scr.deleteFullLine();
if(scr.isGameEnd()){
ERS_Block.isPlay = false;
suspend();
}else
scr.getBlock().reset();
}
}
}
class WinListener extends WindowAdapter{
public void windowClosing (WindowEvent l){
System.exit(0);
}
}