软件工程俄罗斯方块_第1页
软件工程俄罗斯方块_第2页
软件工程俄罗斯方块_第3页
软件工程俄罗斯方块_第4页
软件工程俄罗斯方块_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程实验报告课程名称:软件工程计算机科学与技术学院目录软件名称:俄罗斯方块软件定义.............................3问题定义...........................3可行性研究..........................3需求分析...........................4设计棋盘.........................5设计棋子.........................6按键功能设置(上下左右)....................7棋子落下的动画实现以及越界检测................9Morefunctions......................11俄罗斯方块的DFD图.......................12需求分析建模–数据字典......................13代码..............................14俄罗斯方块编译环境Codeblocks编译器用C语言在window8下软件定义问题定义额,俄罗斯方块不用定义了吧。。相信大家都知道。俄罗斯方块(Tetris,俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。2014年2月22日,英国心理学家发现,减肥者通过玩俄罗斯方块,可以降低对富含脂肪的食物和零食的心理需求;尝试戒烟者的烟瘾也能得到遏制。可行性研究俄罗斯方块是曾经风靡全球的一款游戏。如今看来,虽然与其他手游相比,编码简单,但对于现阶段的我们,还是有一定的难度,因而做出俄罗斯方块的代码,是一个很能锻炼自我的任务,因此我选择了写俄罗斯方块。通过大一对C语言和这学期数据结构的学习,已经基本掌握了俄罗斯方块编程的需要,因此是可行的。需求分析设计棋盘设计棋子按键功能设置(上下左右)棋子落下的动画实现以及越界检测软件设计设计棋盘设计出棋盘的高和宽:#defineCHESS_WIDTH12*2#defineCHESS_HIGHT1出来的效果应该是这样的:设计棋子用一个二维数组表示棋子:x,y(4,1)chara[4][4]a[0][0]=1,a[0][1]=1,a[1][0],a[1][1]=1;出来的效果:按键功能设置(上下左右,暂停)按键功能分别由下面几个函数实现:voidClearChess(chess_datachess)清屏voidMoveDown(chess_data*Chess)下移voidMoveLeft(chess_data*Chess)左移voidMoveRight(chess_data*Chess)右移然后这儿呢,会出现一个bug,即出现越界现象,所以需要写函数来判断是否越界。棋子落下的动画实现以及越界检测越界检测:intCheckLeftBorder(chess_dataChess)检查左右边界intCheckDownBorder(chess_dataChess)检查下边界Morefunctions游戏难度控制添加声音效果还未研发出来….俄罗斯方块的DFD图第0层:第1层:需求分析建模–数据字典数据流名:玩家可用键说明:玩家在玩游戏是可以用到的键数据流来源:玩家数据流去向:系统处理数据流组成:Y/N+上下左右数据元素词条 Y/N=“Y”“N” 上下左右=“↑”“↓”“←”“→”程序代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#include<stdarg.h>#include<time.h>#include"hello.h"#include<share.h>#include<Windows.h>#include"gameproc.h"//#definevar333;//移动光标位置voidgotoxy(intx,inty){ COORDxy; HANDLEhstdout; hstdout=GetStdHandle(STD_OUTPUT_HANDLE); xy.X=x; xy.Y=y; SetConsoleCursorPosition(hstdout,xy); //CloseHandle(hstdout);}voidfillchar(chara,intcharlen){ COORDxy={0}; HANDLEhstdout; longbyw; hstdout=GetStdHandle(STD_OUTPUT_HANDLE); FillConsoleOutputCharacter(hstdout,a,charlen,xy,&byw); CloseHandle(hstdout);}#defineX20#defineY6//绘制边框voiddrawM(void){ inti; //上边 gotoxy(X,Y); prt("┏"); for(i=1;i<=13;i++) { prt("━"); } prt("┓");//左边 for(i=1;i<=16;i++) {gotoxy(X,Y+i); prt("┃"); } //右边 for(i=1;i<=16;i++) { gotoxy(X+28,Y+i); prt("┃"); } //下边 gotoxy(X,Y+17); prt("┗"); for(i=1;i<=13;i++) { prt("━"); } prt("┛"); return;}//drawmenuvoiddrawmenu(void){ gotoxy(X+3,Y+3); prt("1->菜单选项一");gotoxy(X+3,Y+3+2); prt("菜单选项二"); gotoxy(X+3,Y+3+2+2); prt("退出"); gotoxy(0,0);}intselmenu_Num=0;intselmenu(void){//0,1,2//如果按下↓selmenu_Num++;如果>2selmenu_Num=0;//如果按下↑selmenu_Num--;如果<0selmenu_Num=2; intch=0; while(1) { ch=getch(); //gotoxy(0,0); //prt("%d",ch); if(ch==13) { returnselmenu_Num; } switch(ch) { case72://上光标 selmenu_Num--; if(selmenu_Num<0) { selmenu_Num=2; } break; case80://下光标 selmenu_Num++; if(selmenu_Num>2) { selmenu_Num=0; } break; }gotoxy(0,0); //prt("selmenu_num=%d",selmenu_Num); //动态菜单 switch(selmenu_Num) { case0: gotoxy(X+3,Y+3); prt("1->"); gotoxy(X+3,Y+3+2); prt(""); gotoxy(X+3,Y+3+2+2); prt(""); gotoxy(0,0); break; case1: gotoxy(X+3,Y+3); prt(""); gotoxy(X+3,Y+3+2); prt("2->"); gotoxy(X+3,Y+3+2+2); prt(""); gotoxy(0,0); break; case2: gotoxy(X+3,Y+3); prt(""); gotoxy(X+3,Y+3+2); prt(""); gotoxy(X+3,Y+3+2+2); prt("3->"); gotoxy(0,0); break; } }//endwhile returnselmenu_Num;}//doMenuvoiddoMenu(void){intsel;sel= selmenu();switch(sel){case0://菜单一 gotoxy(0,0); prt("\n菜单一功能\n"); break;case1: gotoxy(0,0); prt("\n菜单二功能\n"); break;case2://退出 exit(1); break;}}DWORDWINAPIThreadProc1( LPVOIDlpParameter//接收CreateThread的第4个参数 ){inti=0;while(1) //添加线程代码{i++;EnterCriticalSection(&cs);gotoxy(0,1);printf("OKOKi=%d",i);//下移一格棋子if(CheckDownBorder(oneChess)||CheckDownChess(oneChess)){ Add1Chess(oneChess); ShowChessBoard(); //重新赋值OneChess进行新的一轮棋子掉落 //随机初始化 rx=rand()%5; ry=0; oneChess=DownChessData[rx][ry]; oneChess.rx=rx; oneChess.ry=ry; ShowChess(oneChess);}else{ MoveDown(&oneChess);}LeaveCriticalSection(&cs);Sleep(speed);} return1;}DWORDWINAPIThreadProc2( LPVOIDlpParameter//接收CreateThread的第4个参数 ){while(1)//添加线程代码{//随机初始化rx=rand()%2;ry=rand()%4;Sleep(100);}return1;}intmain(void){ //Y行X列//fillchar('',3000); InitializeCriticalSection(&cs); InitializeCriticalSection(&cs_puts); system("color0a"); system("titleQQ150330575");/*drawM(); drawmenu(); doMenu();*/ SetWindowPos(HWND_BOTTOM,HWND_NOTOPMOST,133,100,800,600,SWP_SHOWWINDOW); DrawChessMap(); //开始游戏 th1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL); //创建线程 //CreateThread(NULL,0,ThreadProc2,NULL,0,NULL); //创建线程 playgame(); getch(); prt("22222222222"); getch(); return0;}//宏定义#defineCHESS_X28#defineCHESS_Y8#defineCHESS_WIDTH12*2#defineCHESS_HIGHT18charChessBoard[12][18]={0};//12*18的二维数组表示棋盘数据有黑格子的地方置1其它地方置0unsignedintrx,ry;externvoidgotoxy(int,int);intPointNum=0;intspeed=1000;HANDLEth1;//线程1句柄voidShowChessBoard();typedefstruct_chess_data{ charrx;//5种类型0..4 charry;////4种形态0..3 chardata[4][4];//数据 COORDxy;//位置POINT}chess_data;chess_dataoneChess;CRITICAL_SECTIONcs;CRITICAL_SECTIONcs_puts;voidprt(char*s){//进入临界区 EnterCriticalSection(&cs_puts); puts(s); LeaveCriticalSection(&cs_puts); //离开临界区}//画棋盘voidDrawChessMap(void){ inti; //U型 //左边 for(i=0;i<CHESS_HIGHT;i++){ gotoxy(CHESS_X,CHESS_Y+i); prt("┃");} //右边 for(i=0;i<CHESS_HIGHT;i++) { gotoxy(CHESS_X+CHESS_WIDTH,CHESS_Y+i); prt("┃"); } //底部转角gotoxy(CHESS_X,CHESS_Y+CHESS_HIGHT); prt("┗"); gotoxy(CHESS_X+CHESS_WIDTH,CHESS_Y+CHESS_HIGHT); prt("┛"); //底部横线 for(i=1;i<CHESS_WIDTH/2;i++) { gotoxy(CHESS_X+i*2,CHESS_Y+CHESS_HIGHT); prt("━"); } return;}//20种不成形态的棋子chess_dataDownChessData[5][4]={0};voidInitChessData(void){ //□□ //□□类型0状态0 DownChessData[0][0].xy.X=CHESS_X+4; DownChessData[0][0].xy.Y=CHESS_Y+0; DownChessData[0][0].data[0][0]=1; DownChessData[0][0].data[1][0]=1; DownChessData[0][0].data[0][1]=1; DownChessData[0][0].data[1][1]=1; //状态1-3=状态0 DownChessData[0][1]=DownChessData[0][2]=DownChessData[0][3]=DownChessData[0][0]; //□□□ //□类型1状态0 DownChessData[1][0].xy.X=CHESS_X+4; DownChessData[1][0].xy.Y=CHESS_Y+0; DownChessData[1][0].data[0][0]=1; DownChessData[1][0].data[1][0]=1; DownChessData[1][0].data[2][0]=1; DownChessData[1][0].data[1][1]=1; //□ //□□ //□类型1状态1 DownChessData[1][1].xy.X=CHESS_X+4; DownChessData[1][1].xy.Y=CHESS_Y+0; DownChessData[1][1].data[1][0]=1; DownChessData[1][1].data[1][1]=1; DownChessData[1][1].data[1][2]=1; DownChessData[1][1].data[0][1]=1; //□类型1状态2 //□□□ DownChessData[1][2].xy.X=CHESS_X+4; DownChessData[1][2].xy.Y=CHESS_Y+0; DownChessData[1][2].data[1][0]=1; DownChessData[1][2].data[0][1]=1; DownChessData[1][2].data[1][1]=1; DownChessData[1][2].data[2][1]=1; //□类型1状态3 //□□ //□ DownChessData[1][3].xy.X=CHESS_X+4; DownChessData[1][3].xy.Y=CHESS_Y+0; DownChessData[1][3].data[0][0]=1; DownChessData[1][3].data[0][1]=1; DownChessData[1][3].data[0][2]=1; DownChessData[1][3].data[1][1]=1; //□ //□ //□ //□ DownChessData[2][0].xy.X=CHESS_X+4; DownChessData[2][0].xy.Y=CHESS_Y+0; DownChessData[2][0].data[1][0]=1; DownChessData[2][0].data[1][1]=1; DownChessData[2][0].data[1][2]=1; DownChessData[2][0].data[1][3]=1; DownChessData[2][2]=DownChessData[2][0]; //□□□□ DownChessData[2][3].xy.X=CHESS_X+4; DownChessData[2][3].xy.Y=CHESS_Y+0; DownChessData[2][3].data[1][2]=1; DownChessData[2][3].data[2][2]=1; DownChessData[2][3].data[3][2]=1; DownChessData[2][3].data[0][2]=1; DownChessData[2][1]=DownChessData[2][3]; //□□ //□□ DownChessData[3][0].xy.X=CHESS_X+4; DownChessData[3][0].xy.Y=CHESS_Y+0; DownChessData[3][0].data[0][1]=1; DownChessData[3][0].data[0][2]=1; DownChessData[3][0].data[1][2]=1; DownChessData[3][0].data[1][3]=1; DownChessData[3][2]=DownChessData[3][0]; //□ //□□ //□ DownChessData[3][1].xy.X=CHESS_X+4; DownChessData[3][1].xy.Y=CHESS_Y+0; DownChessData[3][1].data[0][0]=1; DownChessData[3][1].data[1][0]=1; DownChessData[3][1].data[1][1]=1; DownChessData[3][1].data[2][1]=1; DownChessData[3][3]=DownChessData[3][1]; //□ //□ //□□ DownChessData[4][0].xy.X=CHESS_X+4; DownChessData[4][0].xy.Y=CHESS_Y+0; DownChessData[4][0].data[1][0]=1; DownChessData[4][0].data[1][1]=1; DownChessData[4][0].data[1][2]=1; DownChessData[4][0].data[2][2]=1; //□□□ //□ DownChessData[4][1].xy.X=CHESS_X+4; DownChessData[4][1].xy.Y=CHESS_Y+0; DownChessData[4][1].data[0][2]=1; DownChessData[4][1].data[1][2]=1; DownChessData[4][1].data[2][2]=1; DownChessData[4][1].data[0][3]=1; //□□ //□ //□ DownChessData[4][2].xy.X=CHESS_X+4; DownChessData[4][2].xy.Y=CHESS_Y+0; DownChessData[4][2].data[0][0]=1; DownChessData[4][2].data[1][0]=1; DownChessData[4][2].data[1][1]=1; DownChessData[4][2].data[1][2]=1; //□ //□□□ DownChessData[4][3].xy.X=CHESS_X+4; DownChessData[4][3].xy.Y=CHESS_Y+0; DownChessData[4][3].data[3][1]=1; DownChessData[4][3].data[1][2]=1; DownChessData[4][3].data[2][2]=1; DownChessData[4][3].data[3][2]=1;}//显示某个下落的棋子voidShowChess(chess_datachess){ intx,y; for(x=0;x<=3;x++) { for(y=0;y<=3;y++) if(chess.data[x][y]) { gotoxy(chess.xy.X+x*2,chess.xy.Y+y); prt("□"); } }}//隐藏棋子voidClearChess(chess_datachess){ intx,y; for(x=0;x<=3;x++) { for(y=0;y<=3;y++) if(chess.data[x][y])// { gotoxy(chess.xy.X+x*2,chess.xy.Y+y); prt(""); } }}voidMoveUp(chess_data*Chess){ chess_databakChess; //隐藏 ClearChess(*Chess); //ry+1 Chess->ry++;//1,2,3,4,5 Chess->ry%=4;//0..3 //data bakChess=DownChessData[Chess->rx][Chess->ry]; bakChess.xy=Chess->xy; bakChess.rx=Chess->rx; bakChess.ry=Chess->ry; //*Chess=bakChess; ShowChess(*Chess);}voidMoveDown(chess_data*Chess){ //隐藏 ClearChess(*Chess); Chess->xy.Y+=1; ShowChess(*Chess);}voidMoveLeft(chess_data*Chess){ //隐藏 ClearChess(*Chess); Chess->xy.X-=2; ShowChess(*Chess);}voidMoveRight(chess_data*Chess){ //隐藏 ClearChess(*Chess); Chess->xy.X+=2; ShowChess(*Chess);}//检测左边界是否到达,到达则返回1否则返回0intCheckLeftBorder(chess_dataChess){ intx,y; for(x=0;x<=3;x++) for(y=0;y<=3;y++) { if(Chess.data[x][y]) { if(Chess.xy.X+x*2<=CHESS_X+2) { return1; } } }return0;}//检测左边界是否到达,到达则返回1否则返回0intCheckRightBorder(chess_dataChess){ intx,y; for(x=3;x>=0;x--) for(y=3;y>=0;y--) { if(Chess.data[x][y]) { if(Chess.xy.X+x*2>=CHESS_X+CHESS_WIDTH-2)//左边界│占2字符宽度+右边界│占的2个字符宽度所以得减4 { return1; } } } return0;}//检测下边界intCheckDownBorder(chess_dataChess){ intx,y; for(y=0;y<=3;y++) for(x=0;x<=3;x++) { if(Chess.data[x][y]) { if(Chess.xy.Y+y+1>=CHESS_Y+CHESS_HIGHT) { return1; } } } return0;}//检测下方向是否有棋子存在intCheckDownChess(chess_dataChess){ intx,y; for(y=0;y<=3;y++) for(x=0;x<=3;x++) { if(Chess.data[x][y]) { if(ChessBoard[(Chess.xy.X-CHESS_X)/2+x][Chess.xy.Y-CHESS_Y+y+1])//12*18 { return1; } } } return0;}//假设向左移一格,是否会产生碰撞,如果有,则返回1否则返回0intCheckLeftChess(chess_dataChess){ intx,y; for(y=0;y<=3;y++) for(x=0;x<=3;x++) { if(Chess.data[x][y]) { if(ChessBoard[(Chess.xy.X-CHESS_X)/2+x-1][Chess.xy.Y-CHESS_Y+y])//12*18 { return1; } } } return0;}//假设向右移一格,是否会产生碰撞,如果有,则返回1否则返回0intCheckRightChess(chess_dataChess){ intx,y; for(y=0;y<=3;y++) for(x=0;x<=3;x++) { if(Chess.data[x][y]) { if(ChessBoard[(Chess.xy.X-CHESS_X)/2+x+1][Chess.xy.Y-CHESS_Y+y])//12*18 { return1; } } } return0;}//旋转冲突检测intCheckSpinBorder(chess_datachess){intx,y,ty; chess_dataNextChess; //取得旋转后的棋子数据 NextChess=chess;//xy,rx,ry //取得旋转后棋子数据data //NextChess.data=DownChessData[chess.rx][chess.ry].data; if(chess.ry==3) { ty=0; }else { ty=chess.ry+1; } memcpy(NextChess.data,DownChessData[chess.rx][ty].data,4*4*sizeof(char)); //检测边界冲突 for(x=0;x<=3;x++) for(y=0;y<=3;y++) { if(NextChess.data[x][y]) { if(NextChess.xy.X+x<=CHESS_X+2) { return1; } // if(NextChess.xy.X+x>=CHESS_X+CHESS_WIDTH-4)//左边界│占2字符宽度+右边界│占的2个字符宽度所以得减4 { return1; } // if(NextChess.xy.Y+y+1>=CHESS_Y+CHESS_HIGHT) { return1; } //检测与棋盘数据的冲突 if(ChessBoard[(NextChess.xy.X-CHESS_X)/2+x][NextChess.xy.Y-CHESS_Y+y])//12*18 { return1; } } } return0; }//检测ChessBoard里边是否有一行是全1是返回这一行的下标,否则返回-1intCheckRowAllOne(){ intx,y; intnum=0; for(y=17;y>=0;y--) { num=0;//归零初始化 for(x=0;x<=11;x++)//行是否全1 {if(ChessBoard[x][y]) { num++; } } if(num>=11) { returny; } } return-1; }//ClearRowintClearRow(introwY){ intx,y; for(x=1;x<=11;x++)//行是否全1 { ChessBoard[x][rowY]=0; gotoxy(CHESS_X+x*2,CHESS_Y+rowY); prt(""); } //下移所有的行 for(y=rowY;y>=1;y--) { for(x=1;x<11;x++) { gotoxy(CHESS_X+x*2,CHESS_Y+y-1); prt("");ChessBoard[x][y]=ChessBoard[x][y-1]; } } for(x=1;x<12;x++) { for(y=0;y<18;y++) gotoxy(CHESS_X+x*2,CHESS_Y+y); if(ChessBoard[x][y]) { prt("■"); }elseprt(""); }}//添加棋子数据到棋盘voidAdd1Chess(chess_dataChess){ intx,y; introwY; introwNum=0; for(x=0;x<4;x++) for(y=0;y<4;y++) { if(Chess.data[x][y]) { //ChessBoard ChessBoard[(Chess.xy.X-CHESS_X)/2+x][Chess.xy.Y-CHESS_Y+y]=1; } } //更新数据后检测 for(y=0;y<4;y++) { if((rowY=CheckRowAllOne())>=0) { //消掉这一行 ClearRow(rowY); rowNum++; //记算这一局得分情况 } } // switch(rowNum) { case1: PointNum+=10; gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5); printf("当前得分=%8d",PointNum); break; case2: PointNum+=30; gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5); printf("当前得分=%8d",PointNum); case3: PointNum+=60; gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5); printf("当前得分=%8d",PointNum); case4: PointNum+=100; gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5); printf("当前得分=%8d",PointNum); break; }}//以■方块显示棋盘数据voidShowChessBoard()//显示ChessBoard里的1{ intx,y; for(x=0;x<12;x++) for(y=0;y<18;y++) { if(ChessBoard[x][y]) { gotoxy(CHESS_X+x*2,CHESS_Y+y); prt("■"); } }}voidshowallchess(void){ intx,y; for(x=0;x<5;x++) { for(y=0;y<4;y++)//0..3 { ShowChess(DownChessData[x][y]); gotoxy(0,0); printf("%d,%d",x,y); getch(); getch(); ClearChess(DownChessData[x][y]); } }}voidpauseGame(){ staticintpause=0; if(pause) { gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2); printf("按Q键--暂停"); ResumeThread(th1); pause=0; }else { gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2); printf("按Q键--继续"); SuspendThread(th1);//线程挂起后,线程代码就暂停执行 pause=1; }}//开始游戏voidplaygame(void){ intch=0; // srand((unsigned)time(NULL)); //初始化数据 EnterCriticalSection(&cs); gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5); printf("当前得分=%8d",PointNum); gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2); printf("按Q键--暂停"); gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2);printf("难度调节+,-号",3000-speed); gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2); printf("难度:%6d",3000-speed); InitChessData(); //showallchess(); //随机初始化 rx=rand()%5; ry=0; oneChess=DownChessData[rx][ry]; oneChess.rx=rx; oneChess.ry=ry; ShowChess(oneChess); LeaveCriticalSection(&cs); // while(1) { ch=getch(); EnterCriticalSection(&cs); gotoxy(0,0); printf("%d",ch); //如果是下光标控制↓则下移//80 //如果是左光标控制←则左移//75 //如果是右光标控制→则右移//77 switch(ch) { case61://+大键盘 speed-=100; if(speed<100) { speed=100; } gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2); printf("难度:%6d",3000-speed); break; case43://+数字键盘 speed-=100; if(speed<100) { speed=100; } gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2); printf("难度:%6d",3000-speed); break; case45://-号 speed+=100; if(speed>2900) { speed=2900; } gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2); printf("难度:%6d",3000-speed); break; case113://q //如果线程在运行,就挂起它,如果暂停,我们恢复运行 pauseGame(); break; case81://Q pauseGame(); break; //上光标键 case72: //MoveUp if(CheckSpinBorder(oneChess)) { break; } MoveUp(&oneChess); break; //下 case80:// if(CheckDownBorder(oneChess)||CheckDownChess(oneChess)) { //更新数据 Add1Chess(oneChess); ShowChessBoard(); //重新赋值OneChess进行新的一轮棋子掉落 //随机初始化 rx=rand()%5; ry=0; oneChess=DownChessData[rx][ry];oneChess.rx=rx; oneChess.ry=ry; ShowChess(oneChess); }else { MoveDown(&oneChess); } break; //左 case75: if(CheckLeftBorder(oneChess)||CheckLeftChess(oneChess)) {break;} MoveLeft(&oneChess); break; //右 case77: if(CheckRightBorder(oneChess)) {break; } if(CheckRightChess(oneChess)) { break;//不移动,直接下一次循环 //continue; } MoveRight(&oneChess); break; }//endswitch LeaveCriticalSection(&cs); }//endwhile }#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#include<stdarg.h>#include<time.h>#include"hello.h"#include<share.h>#include<Windows.h>#include"gameproc.h"//#definevar333;//移动光标位置voidgotoxy(intx,inty){ COORDxy; HANDLEhstdout; hstdout=GetStdHandle(STD_OUTPUT_HANDLE); xy.X=x; xy.Y=y; SetConsoleCursorPosition(hstdout,xy); //CloseHandle(hstdout);}voidfillchar(chara,intcharlen){ COORDxy={0}; HANDLEhstdout; longbyw; hstdout=GetStdHandle(STD_OUTPUT_HANDLE); FillConsoleOutputCharacter(hstdout,a,charlen,xy,&byw); CloseHandle(hstdout);}#defineX20#defineY6//绘制边框voiddrawM(void){ inti; //上边 gotoxy(X,Y); prt("┏"); for(i=1;i<=13;i++) { prt("━"); } prt("┓");//左边 for(i=1;i<=16;i++) {gotoxy(X,Y+i); prt("┃"); } //右边 for(i=1;i<=16;i++) { gotoxy(X+28,Y+i); prt("┃"); } //下边 gotoxy(X,Y+17); prt("┗"); for(i=1;i<=13;i++) { prt("━"); } prt("┛"); return; }//drawmenuvoiddrawmenu(void){ gotoxy(X+3,Y+3); prt("1->菜单选项一");gotoxy(X+3,Y+3+2); prt("菜单选项二"); gotoxy(X+3,Y+3+2+2); prt("退出"); gotoxy(0,0);}intselmenu_Num=0;intselmenu(void){//0,1,2//如果按下↓selmenu_Num++;如果>2selmenu_Num=0;//如果按下↑selmenu_Num--;如果<0selmenu_Num=2; intch=0; while(1) { ch=getch(); //gotoxy(0,0); //prt("%d",ch); if(ch==13) { returnselmenu_Num; } switch(ch) { case72://上光标 selmenu_Num--; if(selmenu_Num<0) { selmenu_Num=2; } break; case80://下光标 selmenu_Num++; if(selmenu_Num>2) {

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论