青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數(shù)據(jù)加載中……

C語言 控制臺下 俄羅斯方塊(附源碼)

     昨天看到百度之星的趣味賽的帖子,很多代碼挺有意思的,于是想在控制臺下寫個簡潔點的小游戲,想想還是寫個最經(jīng)典的游戲------俄羅斯方塊 吧。睡覺的時候構(gòu)思了下大致的情況,今天早起開始寫,遇到最大的困難是鍵盤按鍵的問題,本來想開一個線程,然后讓系統(tǒng)讀getch(),但是getch和ReadConsoleInput函數(shù)一樣,是同步的,沒有輸入的狀態(tài)下會阻塞,所以不能用于鍵盤響應(yīng),找來找去,最后找到了GetAsyncKeyState函數(shù),這個函數(shù)是異步的,可以在程序進行的同時獲取鍵盤消息,而且簡單易用,GetAsyncKeyState(VK_UP)表示向上鍵被按下。按鍵的問題解決后基本就只有顯示的問題了,因為控制臺下的顯示效率很低,所以不能每次重繪整個游戲界面(system("cls")),這樣會閃屏,于是我采用的機制是:每次擦掉上一次運行的結(jié)果,然后重繪當前狀態(tài),這樣最多擦掉某一個區(qū)域,不會導(dǎo)致整個控制臺的閃爍,并且利用SetConsoleCursorPosition來設(shè)置當前光標的位置,以及利用SetConsoleCursorInfo來將光標隱藏以求達到更加真實的游戲畫面。
可執(zhí)行文件下載地址:http://code.google.com/p/sguzty/downloads/detail?name=Tertrix.exe&can=2&q=#makechanges
附兩張簡單截圖:



/*
Author : 周天涯
email : menjitianya2007@163.com
blog : 
http://m.shnenglu.com/menjitianya/
Description : 即興創(chuàng)作,《C控制臺 俄羅斯方塊》,歡迎交流與探討,直接將代碼粘貼到VC6.0的環(huán)境下即可運行。

← 左移
→ 右移
↓ 加速
↑ 旋轉(zhuǎn)

連續(xù)消去1行得1分、2行得3分、3行得5分、4行得7分。
積分達到一定程度,會有換命的活動,命最多6條。
難度會隨積分的上升逐漸上升,最多到6的難度。
*/


#include 
<iostream>
#include 
<windows.h>
#include 
<vector>
#include 
<mmsystem.h>

#pragma comment(lib, 
"winmm.lib")
using namespace std;

#define GameW 10
#define GameH 20
const int CtrlLeft = GameW*2+4 + 3;

struct Point {
    Point()
{}
    Point(
int x, int y) {_x = x, _y = y;}
    
int _x, _y;
}
;

HANDLE g_hOutput 
= GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE g_hInput  
= GetStdHandle(STD_INPUT_HANDLE);

Point g_ptCursor(
0,0);
BOOL isChecking 
= FALSE;
BOOL g_bGameOver 
= FALSE;
int g_nGameBack[GameH][GameW], Case;
int nowKeyInfo = -1;
int g_nDiff = 1;
int g_nLife = 2;
int g_nScore = 0;

void SetCursor(COORD cd) {
    SetConsoleCursorPosition(g_hOutput, cd);
}

void SetCursor(int x, int y){
    COORD cd 
= {x, y};
    SetCursor(cd);
}

void SetBlockCursor(int x, int y){
    COORD cd 
= {2*+ 2, y + 1};
    SetCursor(cd);
}


void SetBack(int x, int y, BOOL bk) {
    SetBlockCursor(x, y);
    
if (bk) 
        printf(
"%s""");
    
else
        printf(
" ");
}


bool Out(int x, int y) {
    
return x < 0 || y < 0 || x >= GameW || y >= GameH; 
}


struct xBlock {
public:
    
int len;
    
int nowRotateID;
    BOOL mask[
4][4][4];
    
static vector <xBlock> List;

    xBlock() 
{ len = 0; }
    xBlock(
int l, char *str) {
        
int i, j, k;
        len 
= l;
        memset(mask, FALSE, 
sizeof(mask));
        
for(i = 0; i < l; i++{
            
for(j = 0; j < l; j++{
                mask[
0][i][j] = str[i*+ j] - '0';
            }

        }

        
for(k = 1; k < 4; k++{
            
for(i = 0; i < len; i++{
                
for(j = 0; j < len; j++{
                    mask[k][i][j] 
= mask[k-1][j][len-1-i];
                }

            }

        }

        nowRotateID 
= rand() % 4;
    }


    
void rotate() {
        nowRotateID 
++;
        
if (nowRotateID >= 4)
            nowRotateID 
= 0;
    }


    BOOL getUnit(
int x, int y, int roID) {
        
if (roID == -1{
            roID 
= nowRotateID;
        }

        
return mask[roID][y][x];
    }

}
;

vector 
<xBlock> xBlock::List;

class Block {
public:
    
int x, y;
    
int ID;
    xBlock bk;

    
void reset(xBlock *pbk) {
        bk 
= *pbk;

        x 
= 4, y = 0;
        ID 
= ++ Case;

        
if(collide(0,0)) {
            lifeDown();
        }

        draw();
        
        
*pbk = xBlock::List[rand() % xBlock::List.size()];
    }

    
    
void lifeDown() {
        
int i, j;
        
for(i = 0; i < GameH; i++{
            
for(j = 0; j < GameW; j++{
                SetBack(j, i, TRUE);
                Sleep(
10);
            }

        }

        
if(g_nLife) {
            g_nLife 
--;
            
for(i = g_nLife; i < 6; i++{
                SetCursor(CtrlLeft 
+ i, 15);
                printf(
"%c"' ');
            }

            
for(i = GameH-1; i >= 0; i--{
                
for(j = GameW-1; j >= 0; j--{
                    SetBack(j, i, FALSE);
                    Sleep(
10);
                    g_nGameBack[i][j] 
= 0;
                }

            }

        }
else {
            g_bGameOver 
= TRUE;
        }

    }


    
void erase() {
        
int i, j;
        
for(i = 0; i < bk.len; i++{
            
for(j = 0; j < bk.len; j++{
                
if (bk.getUnit(j, i, -1)) {
                    
if(!Out(j+x, i+y) && g_nGameBack[i+y][j+x]) {
                        SetBack(j
+x, i+y, FALSE);
                        g_nGameBack[i
+y][j+x] = 0;
                    }

                }

            }

        }

    }

    
void draw() {
        
int i, j;
        
for(i = 0; i < bk.len; i++{
            
for(j = 0; j < bk.len; j++{
                
if (bk.getUnit(j, i, -1)) {
                    
if(!Out(j+x, i+y) && !g_nGameBack[i+y][j+x]) {
                        SetBack(j
+x, i+y, TRUE);
                        g_nGameBack[i
+y][j+x]  = ID;
                    }

                }

            }

        }

    }

    
void draw(int x, int y) {
        
int i, j;
        
for(i = 0; i < 4; i++{
            
for(j = 0; j < 4; j++{
                SetCursor(x 
+ 2*j, y + i);
                
if (bk.getUnit(j, i, -1)) {    
                    printf(
"%s""");
                }
else 
                    printf(
" ");
            }

        }

    }

    
bool collide(int dx, int dy, int roID = -1{
        
int i, j;
        
for(i = 0; i < bk.len; i++{
            
for(j = 0; j < bk.len; j++{
                
if (bk.getUnit(j, i, roID)) {
                    Point ptPos(j 
+ x + dx, i + y + dy);
                    
if(Out(ptPos._x, ptPos._y)
                    
|| g_nGameBack[ptPos._y][ptPos._x] && ID != g_nGameBack[ptPos._y][ptPos._x]) {
                        
return TRUE;
                    }

                }

            }

        }

        
return FALSE;
    }


    
void rotate(int nTimes = 1{
        
int nextro = (bk.nowRotateID + nTimes) % 4;
        
if(collide(00, nextro)) {
            
return ;
        }

        Beep(
1200050);
        erase();
        bk.nowRotateID 
= nextro;
        draw();
    }


    BOOL changepos(
int dx, int dy) {
        
if(collide(dx, dy)) {
            
return FALSE;
        }

        erase();
        x 
+= dx;
        y 
+= dy;
        draw();
        
return TRUE;
    }

}
;

void GameInit() {
    CONSOLE_CURSOR_INFO cursor_info;
    cursor_info.bVisible 
= FALSE;
    cursor_info.dwSize   
= 100;
    SetConsoleCursorInfo(g_hOutput, 
&cursor_info);
    xBlock::List.push_back(xBlock(
3"010111000"));
    xBlock::List.push_back(xBlock(
3"110110000"));
    xBlock::List.push_back(xBlock(
3"111001000"));
    xBlock::List.push_back(xBlock(
3"111100000"));
    xBlock::List.push_back(xBlock(
3"110011000"));
    xBlock::List.push_back(xBlock(
3"011110000"));
    xBlock::List.push_back(xBlock(
4"1000100010001000"));
}


void DrawFrame(int x, int y, int nWidth, int nHeight) {
    
int i;
    
for(i = 0; i < nWidth; i++{
        SetCursor(x 
+ 2*+ 2, y);
        printf(
"%s""");
        SetCursor(x 
+ 2*+ 2, y + nHeight+1);
        printf(
"%s""");
    }

    
for(i = 0; i < nHeight; i++{
        SetCursor(x, y 
+ i + 1);
        printf(
"%s""");
        SetCursor(x 
+ nWidth*2+2, y + i + 1);
        printf(
"%s""");
    }
        
    SetCursor(x, y);
    printf(
"%s""");    
    SetCursor(x, y 
+ nHeight+1);
    printf(
"%s""");
    SetCursor(x 
+ nWidth*2+2, y);
    printf(
"%s""");    
    SetCursor(x 
+ nWidth*2+2, y + nHeight+1);
    printf(
"%s""");
}


void MissionInit() {
    memset(g_nGameBack, FALSE, 
sizeof(g_nGameBack));
    Case 
= 1;
    
int i;
    DrawFrame(
00, GameW, GameH);
    DrawFrame(GameW
*2+404, GameH);
    SetCursor(CtrlLeft, 
2);
    printf(
"Next");
    
    SetCursor(CtrlLeft, 
8);
    printf(
"Speed");
    
for(i = 0; i < g_nDiff; i++{
        SetCursor(CtrlLeft 
+ i, 9);
        printf(
"%c"1);
    }


    SetCursor(CtrlLeft, 
11);
    printf(
"Score");
    SetCursor(CtrlLeft, 
12);
    printf(
"%d", g_nScore);

    SetCursor(CtrlLeft, 
14);
    printf(
"Life");
    
for(i = 0; i < g_nLife; i++{
        SetCursor(CtrlLeft 
+ i, 15);
        printf(
"%c"3);
    }


    SetCursor(CtrlLeft
-119);
    printf(
"by Zty");
    SetCursor(CtrlLeft
-120);
    printf(
"Baidu A*");
}


void Check() {
    isChecking 
= TRUE;
    
int i, j, k;
    vector 
<int> line;
    
for(i = 0; i < GameH; i++{
        
for(j = 0; j < GameW; j++{
            
if(!g_nGameBack[i][j])
                
break;
        }

        
if(j == GameW) {
            line.push_back(i);
        }

    }

    
if(line.size()) {
        
int nCount = 7;
        
while(nCount --{
            
for(i = 0; i < line.size(); i++{
                
for(j = 0; j < GameW; j++{
                    SetBack(j, line[i], nCount
&1);
                }

            }

            Sleep(
70);
        }

        
for(i = 0; i < line.size(); i++{
            
for(j = 0; j < GameW; j++{
                g_nGameBack[line[i]][j] 
= 0;
            }

        }


        
for(i = 0; i < GameW; i++{
            
int next = GameH-1;
            
for(j = GameH-1; j >= 0; j--{
                
for(k = next; k >= 0; k--{
                    
if(g_nGameBack[k][i]) 
                        
break;
                }

                next 
= k - 1;
                BOOL 
is = (k >= 0);
                SetBack(i, j, 
is);
                g_nGameBack[j][i] 
= is;
            }

        }


        g_nScore 
+= 2*line.size()-1;
        SetCursor(CtrlLeft, 
12);
        printf(
"%d", g_nScore);

        
if( g_nScore >= g_nDiff * g_nDiff * 10{
            
if(g_nDiff <= 6)
                g_nDiff 
++;
        }

        
if( g_nScore >= 50 * (g_nLife+1)) {
            
if(g_nLife <= 6)
                g_nLife 
++;
        }

    }


    isChecking 
= FALSE;
}

int main() {
    Block
* obj = new Block();
    Block
* buf = new Block();
    

    BOOL bCreateNew 
= FALSE;
    
int nTimer = GetTickCount();
    
int LastKeyDownTime = GetTickCount();


    GameInit();
    MissionInit();
    
    buf
->bk = xBlock::List[rand() % xBlock::List.size()];
    
while(1{
        
if(!bCreateNew) {
            bCreateNew 
= TRUE;
            obj
->reset(&buf->bk);
            
if(g_bGameOver)
                
break;
            buf
->draw(CtrlLeft - 14);
        }

        
if (GetTickCount() - nTimer >= 1000 / g_nDiff) {
            nTimer 
= GetTickCount();
            
if (!obj->collide(01))
                obj
->changepos(01);
            
else {
                Check();
                bCreateNew 
= FALSE;
            }

        }

        
if (GetTickCount() - LastKeyDownTime >= 100{
            
if(FALSE == isChecking) {
                LastKeyDownTime 
= GetTickCount();
                
if (GetAsyncKeyState(VK_UP)) {
                    obj
->rotate();
                }

                
if (GetAsyncKeyState(VK_LEFT)) {
                    obj
->changepos(-10);
                }

                
if (GetAsyncKeyState(VK_RIGHT)) {
                    obj
->changepos(10);
                }

                
if (GetAsyncKeyState(VK_DOWN)) {
                    
if( FALSE == obj->changepos(02) )
                        obj
->changepos(01);
                }

            }

        }

    }

    SetCursor(
810);
    printf(
"Game Over");

    SetCursor(
0, GameH+3);
    printf(
"按ESC鍵退出游戲");

    
while(1{
        
if (GetAsyncKeyState(VK_ESCAPE))
            
break;
    }

    
return 0;
}






 




 

posted on 2011-05-26 13:40 英雄哪里出來 閱讀(11156) 評論(8)  編輯 收藏 引用 所屬分類: 游戲開發(fā)

評論

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

不錯,贊一個。
2011-05-26 15:57 | 楊粼波

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

代碼挺不錯的

正好御姐也寫過一個誒,你可以看下她的:
http://hi.baidu.com/misaka20001/blog/item/a854150a49b6b9d87bcbe1b6.html

2011-05-26 16:21 | 邱震鈺(zblc)

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

@邱震鈺(zblc)
學習下~呵呵~~
2011-05-26 17:20 | 英雄哪里出來

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

旋轉(zhuǎn)的時候不太正確,尤其是長條跟正方形,正方形旋轉(zhuǎn)居然會改變位置。需要修正下。
2011-05-26 20:11 | foxtail

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

@foxtail
恩,有道理,因為在控制臺下效率低一點就會出現(xiàn)閃屏了,一味追求效率把一些原始的東西改掉了~~
2011-05-26 20:19 | 英雄哪里出來

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

bug太太太多了,再修改修改吧~
2011-05-27 00:30 | myjfm

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

@myjfm
歡迎提出建議~~Bug修改中~~
2011-05-27 11:36 | 英雄哪里出來

# re: C語言 控制臺下 俄羅斯方塊(附源碼)  回復(fù)  更多評論   

每個IT男硬盤伸出都有一個當年寫的俄羅斯方塊~
2011-05-30 09:46 | 欲三更
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲主播在线观看| 久久精品亚洲一区二区| 久久午夜精品| 亚洲自拍都市欧美小说| 亚洲九九精品| 一本色道久久综合亚洲精品高清| 欧美日韩免费看| 中文在线不卡| 亚洲视频观看| 欧美色精品天天在线观看视频| 亚洲免费在线观看视频| 99热免费精品在线观看| 国产日产欧产精品推荐色 | 欧美日韩综合在线免费观看| 欧美a级片网| 欧美精品在线免费观看| 亚洲一级在线| 亚洲国产精品久久91精品| 欧美一区二区三区精品电影| 午夜精品福利一区二区蜜股av| 精品不卡在线| 国产精品三级久久久久久电影| 国产精品伦一区| 欧美午夜国产| 久久九九热re6这里有精品| 欧美**人妖| 亚洲经典一区| 快she精品国产999| 国精产品99永久一区一区| 久久一综合视频| 久久中文精品| 国产精品婷婷| 日韩午夜电影av| 久久中文精品| 欧美国产精品v| 国产精品久久久91| 日韩天堂在线观看| 欧美+亚洲+精品+三区| 久久精品视频免费播放| 亚洲在线观看视频网站| 亚洲午夜激情免费视频| 欧美日韩综合不卡| 亚洲女女女同性video| 亚洲免费成人av电影| 久久精品免费电影| 国产亚洲激情在线| 美女黄毛**国产精品啪啪| 亚洲一区不卡| 午夜在线精品偷拍| 欧美一区午夜精品| 国产目拍亚洲精品99久久精品| 欧美激情精品久久久久久蜜臀| 欧美日本精品| 香蕉久久精品日日躁夜夜躁| 免费亚洲一区二区| 亚洲国产欧美在线人成| 国产亚洲永久域名| 一本色道久久综合| 亚洲免费人成在线视频观看| 亚洲图片欧美日产| 欧美电影打屁股sp| 小辣椒精品导航| 性色av一区二区三区| 亚洲图片欧美一区| 亚洲黄色在线视频| 日韩天堂在线观看| 亚洲性线免费观看视频成熟| 一区二区亚洲| 亚洲电影免费观看高清完整版在线 | 欧美一区二区三区四区在线| 美日韩精品免费| 另类尿喷潮videofree| 蜜桃久久av一区| 欧美日韩在线不卡| 国产一区再线| 久久乐国产精品| 欧美插天视频在线播放| 夜夜嗨av一区二区三区免费区| 一区二区高清视频| 亚洲主播在线| 久久人人爽人人爽爽久久| 亚洲女爱视频在线| 亚洲一区二区在| 日韩午夜三级在线| 久久精品国产在热久久 | 亚洲欧美在线一区二区| 欧美一区中文字幕| 99精品欧美| 欧美日韩美女一区二区| 一区二区三区国产精品| 亚洲伦理在线观看| 久久精品亚洲国产奇米99| 夜夜嗨一区二区三区| 一区二区欧美国产| 国产精品久久久久久久久| 欧美另类一区| 亚洲自拍16p| 久久国产精品久久久| 久久久久久久欧美精品| 一区二区日本视频| 影音先锋在线一区| 欧美激情国产日韩| 亚洲观看高清完整版在线观看| 午夜国产一区| 亚洲人成人99网站| 免费成人av| 亚洲精品国产精品国产自| 久久久精品五月天| 亚洲女人天堂成人av在线| 久久精品人人爽| 久久先锋影音| 亚洲国产精品久久久久久女王| 欧美大学生性色视频| 久久亚洲精品一区二区| 欧美电影在线观看完整版| 亚洲精品国产精品国产自| 一区二区三区av| 欧美成人xxx| 一区二区三区欧美视频| 国产精品一二一区| 久久精品视频播放| 99ri日韩精品视频| 欧美大片91| 欧美一级二区| 国产午夜久久久久| 亚洲私拍自拍| 男人插女人欧美| 欧美一区二区三区在线观看视频| 日韩一级不卡| 亚洲国产欧美不卡在线观看| 午夜精品久久99蜜桃的功能介绍| 久久国产黑丝| 91久久久亚洲精品| 国产精品自拍一区| 欧美精品福利视频| 在线亚洲+欧美+日本专区| 久久精品午夜| 亚洲资源av| 一区二区三区精密机械公司| 激情婷婷亚洲| 欧美少妇一区| 午夜国产欧美理论在线播放| 久久久噜噜噜久久中文字幕色伊伊| 99精品视频免费全部在线| 亚洲精品免费在线| 亚洲国产精品一区制服丝袜| 久久露脸国产精品| 先锋亚洲精品| 午夜精品久久| 亚洲综合不卡| 亚洲视频每日更新| 一区二区三区四区五区视频| 欧美国产专区| 午夜在线一区| 亚洲午夜视频在线观看| 99国产麻豆精品| 正在播放日韩| 在线播放视频一区| 欧美午夜精品久久久久久浪潮| 欧美国产一区二区| 另类亚洲自拍| 欧美日韩123| 欧美区一区二| 国产精品美女主播在线观看纯欲| 国产精品扒开腿做爽爽爽视频| 免费在线观看精品| 欧美天天在线| 亚洲欧美日韩一区二区| 久久久久久久久久久成人| 久久久久久久综合日本| 久久久久国产精品麻豆ai换脸| 亚洲欧美一区二区精品久久久| 亚洲精品日韩欧美| 亚洲国产毛片完整版| 亚洲欧美在线aaa| 欧美伦理在线观看| 欧美精品v国产精品v日韩精品| 欧美精品一区二区三区一线天视频 | 欧美精品一区二区精品网| 欧美成人精品h版在线观看| 国产精品久久国产愉拍| 一区二区三区日韩精品视频| 亚洲手机视频| 韩国精品在线观看| 久久亚洲欧美国产精品乐播| 免费在线看一区| 99国产欧美久久久精品| 国产精品区免费视频| 亚洲一区欧美二区| 欧美激情区在线播放| 在线亚洲伦理| 久久久久久欧美| 一区二区三区在线观看国产| 翔田千里一区二区| 国产亚洲欧美另类中文 | 亚洲激情欧美激情| 欧美揉bbbbb揉bbbbb| 狠狠入ady亚洲精品| 亚洲一区二区动漫| 欧美激情一区在线|