【小游戏】俄罗斯方块(C++版)
生活随笔
收集整理的這篇文章主要介紹了
【小游戏】俄罗斯方块(C++版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大一作品,留念#include<stdio.h>
#include<time.h>
#include<conio.h>//kbhit
#include<stdlib.h>//rand,srand
#include<windows.h>
#define wide 15
#define hight 18
#define period 500
typedef struct point
{int h;int w;
}point;/*
1 ■■■■ 1*4 -> 4*1■ ■2■■■ 3 ■■■ 2*3 -> 3*2■■ ■■ 2*3 -> 3*24 ■■ 5 ■■■■ ■6 ■■ 2*2 7 ■■■ 2*3->3*2最大面積為4*41234 ■■■■1234 ■■■■1234 ■■■■1234 ■■■■按W鍵旋轉九十度*/char map[hight][wide]={0};//1:□ 2:■ 其余的都是空格 char類型節約空間
char stay[hight][wide]={0};//殘留方塊
struct point size;//活動方塊的大小 前一個代表 高度 后一個代表 寬度 ,主要用于觸碰處理
char sqr[4][4];//活動方塊數組
struct point posi={1,wide/2-2};//方塊頂點坐標
char situ=0;//旋轉狀況0 正常 1 順時針90度 2:180 3:270
int grade=0,line=0;
//char sqr[4][4];
//point newspr={1,wide/2};
//------------函數聲明void showmap();void setmap();int keypre(char k);//按下某鍵int getrand(int,int);//取一個范圍內的隨機數int setini(int type);//初始化方塊,類型,看表吧void turn90();int isagain();//判斷活動區是否與stay區重復int exsqr(char row);//判斷stay區某一行是否存在方塊,存在返回1,不存在返回0void judge();//層滿處理
int main()
{int last=0,t;int i;srand(time(NULL));//隨機圖形setini(getrand(1,7));//屏幕渲染do{t=clock();if(t-last>=period){//周期性刷新last=t;system("cls");if(keypre('s')==0)break;setmap();printf("-----------當前分數:%d,已消除行:%d-----------\n",grade,line);showmap();}if(kbhit()==1){system("cls");if(keypre(getch())==0)break;setmap();printf("-----------當前分數:%d,已消除行:%d-----------\n",grade,line);showmap();}}while(1);system("cls");printf("----------------得分:%d 消除:%d-------------------\n",grade,line);setmap();showmap();printf("----------------游戲結束!謝謝玩耍!----------------\n");printf("按回車鍵退出!\n");while(getchar()!='\n');return 0;
}int keypre(char k)//按下某鍵
{int i,j,real=0;char top[wide];if(k=='s'){posi.h++;if(isagain())//下一步是否會重合real=1;//那么下一步不能走了//留在當前位置if(real){grade+=18;//留步加分posi.h--;//留在上一步for(i=0;i<size.h ;i++)//就留下來了{for(j=0;j<size.w;j++){if(sqr[i][j]==2)//只記錄實體stay[i+posi.h][j+posi.w ]=2;}}//出新的judge();//層滿判斷return (setini(getrand(1,7)));}}else if(k=='a'||k=='A'){posi.w --;if(isagain())posi.w ++;//移動取消}else if(k=='d'||k=='D'){posi.w ++;if(isagain())posi.w --;//移動取消}else if(k=='w'||k=='W')turn90();else if(k=='s'||k=='S'){posi.h++;if(isagain())posi.h --;//移動取消}//左右分界判斷if(posi.w+size.w>wide-1)posi.w=wide-1-size.w;if(posi.w <1)posi.w=1;return 1;}
void setmap()//初始化地圖,并置
{int i,j;//畫地圖區域for(i=0;i<hight;i++){for(j=0;j<wide;j++){if(i==0||i==hight-1||j==0||j==wide-1)map[i][j]=1;//邊界elsemap[i][j]=0;//空白}}//畫活動方塊for(i=0;i<size.h ;i++){for(j=0;j<size.w ;j++){map[posi.h+i][posi.w+j]=sqr[i][j];}}//畫殘留for(i=0;i<hight;i++){for(j=0;j<wide;j++){if(stay[i][j]==2)map[i][j]=2;}}
}
//將數組轉換為圖形
void showmap()
{int i,j;for(i=0;i<hight;i++){for(j=0;j<wide;j++){if(map[i][j]==1)printf("□");else if(map[i][j]==2)printf("■");elseprintf(" ");}printf("\n");}
}int getrand(int min,int max)//取一個范圍內的隨機數
{return (min+rand()%(max-min+1));
}void turn90()//活動方塊順時針旋轉九十度
{int i,j;char a[4][4];//臨時變量char temp[4][4];//方塊備份for(i=0;i<4;i++)for(j=0;j<4;j++)temp[i][j]=sqr[i][j];for(i=0;i<4;i++)for(j=0;j<4;j++)a[j][i]=sqr[i][j];//斜線對稱//左右對稱,即是轉動九十度i=size.h ;size.h =size.w;size.w =i;for(i=0;i<size.h ;i++)for(j=0;j<size.w ;j++)sqr[i][size.w-1-j]=a[i][j];if(isagain())for(i=0;i<4;i++)for(j=0;j<4;j++)sqr[i][j]=temp[i][j];}int setini(int type)//初始化方塊,類型,看表吧
{int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)sqr[i][j]=0;//歸零switch(type){case 1:size.h =1;size.w =4;sqr[0][0]=2;sqr[0][1]=2;sqr[0][2]=2;sqr[0][3]=2;break;case 2:size.h =2;size.w =3;sqr[0][0]=2;sqr[1][0]=2;sqr[1][1]=2;sqr[1][2]=2;break;case 3:size.h =2;size.w =3;sqr[0][2]=2;sqr[1][0]=2;sqr[1][1]=2;sqr[1][2]=2;break;case 4:size.h =2;size.w =3;sqr[0][1]=2;sqr[0][2]=2;sqr[1][0]=2;sqr[1][1]=2;break;case 5:size.h =2;size.w =3;sqr[0][0]=2;sqr[0][1]=2;sqr[1][1]=2;sqr[1][2]=2;break;case 6:size.h =2;size.w =2;sqr[0][0]=2;sqr[0][1]=2;sqr[1][0]=2;sqr[1][1]=2;break;case 7:size.h =2;size.w =3;sqr[0][1]=2;sqr[1][0]=2;sqr[1][1]=2;sqr[1][2]=2;break;}posi.h =1;posi.w =(wide-size.w )/2;if(isagain())//剛剛初始化你就重合了,你說你是不是掛了?return 0;return 1;/* 1 ■■■■ 1*4 -> 4*1■ ■2■■■ 3 ■■■ 2*3 -> 3*2■■ ■■ 2*3 -> 3*24 ■■ 5 ■■■■ ■6 ■■ 2*2 7 ■■■ 2*3->3*2*/
}
void judge()//層滿處理
{int i,j,full,k,esqr;for(i=1;i<hight-1;i++)//除掉邊界{full=1;for(j=1;j<wide-1;j++)//除掉邊界{if(stay[i][j]!=2)//存在不為方塊的full=0;//假空}if(full)//真空{line++;//已消除grade+=90;//消除加五倍分數for(j=1;j<wide-1;j++)//除掉邊界stay[i][j]=0;//置零}}//全部除完之后for(i=hight-2;i>=2;i--){int s=i;if(exsqr(i)==0)//本層為空{//上層下移while(s>=1 && exsqr(--s)==0)//該層不存在方塊//繼續向上尋找;for(j=1;j<wide-1;j++){stay[i][j]=stay[s][j];//上層下移stay[s][j]=0;//上層清空}}}
}int isagain()//判斷活動區是否與stay區重復
{int i,j;for(i=0;i<size.h ;i++){for(j=0;j<size.w ;j++){if(sqr[i][j]==2)//是實體,i,j是框內代號{if(posi.h +i >hight-2)return 1;else if(stay[posi.h +i][posi.w +j]==2)//框內位置轉換為map位置return 1;}}}return 0;//未重復}int exsqr(char row)//判斷stay區某一行是否存在方塊,存在返回1,不存在返回0
{int j;for(j=1;j<wide-1;j++)//出掉邊界if(stay[row][j]==2)return 1;return 0;
}
轉載于:https://www.cnblogs.com/tinyjian/p/6550718.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【小游戏】俄罗斯方块(C++版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS第三方地图-百度地图定位的封装
- 下一篇: 时序列数据库武斗大会之 OpenTSDB