C语言编程俄罗斯方块的算法及源代码.docx
- 文档编号:25469413
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:12
- 大小:17.26KB
C语言编程俄罗斯方块的算法及源代码.docx
《C语言编程俄罗斯方块的算法及源代码.docx》由会员分享,可在线阅读,更多相关《C语言编程俄罗斯方块的算法及源代码.docx(12页珍藏版)》请在冰豆网上搜索。
C语言编程俄罗斯方块的算法及源代码
//俄罗斯方块
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include"windows.h"
#include"time.h"
#defineN17
#defineM13
#defineK19
ints[N][M]={{0,0,0},{0,0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},
{1},{1,0,0,1},{1,1,1,1,1,1,0,1,1,0,0,1,1}};/*当前状态*/
inta[K][3][3]={{0,2,0,2,2,2},{0,2,0,2,2,0,0,2},{0,2,0,0,2,2,0,2},{2,2,2,0,2},{2,2,2,0,0,2,0},
{2,0,0,2,2,2},{2,0,0,2,0,0,2,2},{0,0,2,0,0,2,0,2,2},{0,0,2,2,2,2},{2,2,2,2,0,0},
{2,2,0,0,2,0,0,2,0},{0,2,2,0,2,0,0,2,0},{{2},{2},{2}},{2,2,2},{2,2,0,2,2,0},
{2,0,0,2,2,0,0,2},{0,0,2,0,2,2,0,2},{2,2,0,0,2,2},{0,2,2,2,2,0}};
voidDisp()
{
inti,j;
for(i=0;i { for(j=0;j printf("%c",s[i][j]? 48+s[i][j]: ''); printf("┃\n"); } printf("━━━━━━━━"); printf("\n\n操作说明: A-->左移,D-->右移,W-->变形,ESC-->退出\n"); } voidDown() { inti,j,k; for(j=0;j if(s[N-1][j]==2) break;/*判断是否在下边界*/ if(j 容易判断方块是否“着陆”及左右移动时,是否碰壁*/ { for(i=0;i for(j=0;j if(s[i][j]==2) s[i][j]=1; for(i=N-1;i>=0;i--) { for(j=0;j if(s[i][j]==0) break; if(j==M)/*若第i行没空格消去第i行*/ for(k=i++-1;k>=0;k--)//? for(j=0;j s[k+1][j]=s[k][j]; } return; } for(i=0;i { for(j=0;j if(s[i][j]==2) if(s[i+1][j]! =0&&s[i+1][j]! =2) break;/*方块下方不空说明触到1了退出内循环*/ if(j break;/*方块下方不空退出外循环*/ } if(i {for(i=0;i for(j=0;j if(s[i][j]==2) s[i][j]=1; for(i=N-1;i>=0;i--) { for(j=0;j if(s[i][j]==0) break;//判断第i行是否有空格 if(j==M)/*若第i行没空格消去第i行*/ for(k=i++-1;k>=0;k--) for(j=0;j s[k+1][j]=s[k][j]; } return; } for(i=N-1;i>=0;i--) for(j=0;j if(s[i][j]==2) s[i+1][j]=s[i][j],s[i][j]=0;/*方块下移*/ } voidRight() { inti,j; for(i=0;i if(s[i][M-1]==2) return;/*已经在右边界退出*/ for(i=0;i for(j=0;j if(s[i][j]==2) if(s[i][j+1]! =0&&s[i][j+1]! =2) return;/*方块右方不空,即方块右边有1退出*/ for(j=M-2;j>=0;j--) for(i=0;i if(s[i][j]==2) s[i][j+1]=s[i][j],s[i][j]=0;/*方块右移*/ } voidLeft() { inti,j; for(i=0;i if(s[i][0]==2)return;/*已经在左边界退出*/ for(i=0;i for(j=1;j if(s[i][j]==2) if(s[i][j-1]! =0&&s[i][j-1]! =2)return;/*方块左方不空退出*/ for(j=1;j for(i=0;i if(s[i][j]==2) s[i][j-1]=s[i][j],s[i][j]=0;/*方块左移*/ } intHave()/*判断是否有可移动方块,没有返回1,否则返回0*/ { inti,j; for(i=0;i for(j=1;j if(s[i][j]==2)return0; return1; } intAdd()/*随机生成方块*/ { intt,x;/*生成两随机数t和x分别作为第t种方块和第x位置出现*/ inti,j; srand((unsignedint)time(NULL)); t=rand()%K; x=rand()%(M-3); if(x<0)x=-x%(M-3);//? for(i=0;i<3;i++) for(j=x;j s[i][j]=a[t][i][j-x]; returnt; } voidbianxing(intt,intn) { inti,j,k,m,x,y; for(i=0;i {m=-1; for(j=0;j if(s[i][j]==2) { m=i,x=j,y=i;break;//y,x记录所在行、列;并退出内循环 } if(m! =-1)//m! =-1证明有移动方块 break;//退出外循环 } if(m! =-1)//m! =-1证明有移动方块 { if(x+3>M||y+3>N)return;//判断是否有可变形空间,没有就返回 for(i=y;i for(j=x;j if(s[i][j]==1)return; } /*擦除当前移动方块;因为上面判断3*3的移动空间,是从上面开始扫描,遇到第一个小格子时, 依他为基点向右下方扫描是否有3*3的空间;显然只进行下面的变形--存储是不行的; 如: 002002022-->2220020时,显然前面的方格倒数第二个2,留在了3*3变形空间的外面,输出图形将多一个 格子,所以要在变形-->存储操作前进行擦除操作*/ for(i=y;i for(j=0;j if(s[i][j]==2) s[i][j]=0; //变形并把它存储到当前状态中 if(t<=3&&t>=0) { staticinth1; if(h1>n) h1=0; for(i=y;i for(j=x;j s[i][j]=a[h1][i-y][j-x]; h1++; } elseif(t<=11&&t>=4) { staticinth2=4; if(h2>n) h2=4; for(i=y;i for(j=x;j s[i][j]=a[h2][i-y][j-x]; h2++; } elseif(t<=13&&t>=12) { staticinth3=12; if(h3>n) h3=12; for(i=y;i for(j=x;j s[i][j]=a[h3][i-y][j-x]; h3++; } elseif(t<=18&&t>=15) { staticinth4=15; if(h4>n) h4=0; for(i=y;i for(j=x;j s[i][j]=a[h4][i-y][j-x]; h4++; } } voidmain() { charc; inti=0,t; charstr[][50]={ "((`'-\"``\"\"-'`))", ")--(", "/(o_o)\", "\(0)/", "_'-.._'='_..-'_", "/`;#'#'#.-.#'#'#;`\", "\_))'#'((_/", "#.☆Game☆#", "'#.Over! .#'", "/'#..#'\", "_\\'#..#'//_", "(((___)'#'(___)", "" }; system("color0a"); while (1)/*判断是否有按键,没有循环输出i,否则停,conio.h*/ { if(! kbhit())/*kbhit用来判断是否有按键输入,若有按键返回非零值,否则返回零; 没有按键时c被赋予一个“非操作键值”,它将一直下移;有按键是调用getch函数,读取键值*/ c='2'; else c=getch(); if(c=='p')//停止键;按任意键可解除停止 getch(); system("CLS");/*清屏,TC用clrscr();,VC用system("CLS");*/ if(Have())//Have()判断是否有可移动方块,没有返回1,否则返回0 t=Add(); switch(c) { case'a': Left();break;/*左移*/ case'd': Right();break;/*右移*/ case27: system("pause");return;/*按Esc(=27)另存后退出*/ default: ; } //变形 if(c=='w') if(t>=0&&t<=3)bianxing(t,3); elseif(t>=4&&t<=11)bianxing(t,11); elseif(t==12||t==13)bianxing(t,13); elseif(t>=15&&t<=18)bianxing(t,18); c='2'; Down();//判断方块的停、走和消除 //判断顶层是否有1有: 游戏结束 for(i=0;i if(s[0][i]==1) { system("CLS"); i=0; while (1) { if(strlen(str[i])==0)break; printf("%s\n",str[i++]); } system("pause"); exit(0); } Disp();//刷屏 Sleep(500);/*睡眠ms,windows.h*/ } } ***********************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编程 俄罗斯方块 算法 源代码