找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 9859|回复: 0

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:

' S4 \# u* S. m 1
4 J: ~  G1 A! V! R5 U) R( e完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
/ B* m, I, o( ^6 w. o3 ^! E- O! t  z) x$ x

# L$ [4 d& N. d9 xFactorycode如下:. s, h# X3 k$ G
! I/ R8 g: Q, [- Y6 V- i6 c
/*************************************
9 l+ j7 Y: |! ~3 x0 M, B/ |! f: _* n7 T$ U  V% O
* author:hgf_starlovecpp@hotmail.com
7 Q4 U" \' E8 I

: E# s* H9 G2 r. `* version:1.0
. h! M! [7 Z4 N; J! i( i( A
- g. e# c2 a2 B6 R
* description: just for fun
8 ~8 u% e7 U, B1 ?" C1 @
. Z6 y; m$ o& E# u
* todo: hard code exists need to fixed
, H) a0 o( ?# w+ r

* m/ @9 D% v% I. p**************************************/
5 i8 R; H: l" N& T8 \6 F+ q+ c* l+ t) w

8 p* p4 F1 t7 g: n$ u& z#pragma once" u& `" H% |; m) O
#include <map>
/ T. i, q' h4 S* v& L! y: O1 t#include "Tetris.h"
" b7 W& A6 L# N, a" t#include "OneTetris.h"
, s/ P6 G2 U8 ]9 I8 S#include "TwoTetris.h"
: ]! q2 R; C2 W2 R4 f/ m4 Y#include "ThreeTetris.h"
- @( H0 S, u. y1 O1 U#include "FourTetris.h"' W% o1 p4 R4 @
#include "FiveTetris.h"
2 k  D. O5 ^7 C8 K( x5 o) a$ R#include "SixTetris.h"; t& `  K+ I; w/ f- J2 \' t6 q
#include "SevenTetris.h"- k. C  S) {  P: y) t
0 ]6 b( f0 d# ^+ s/ r+ P2 k. O
class TetrisFactory
/ D, l1 y$ U* S* ]  U) y{- W( A& G/ c/ Z
public:
+ ~8 s+ C8 H, T. [ % Q2 ^, ^: _' V# W9 b4 w
  h4 f/ c5 p! X, K3 {0 k
TetrisFactory(
void)

" r1 i0 R% d! N4 T& d8 D
- T; T# d, X. v0 {/ a{
5 y6 z7 X0 O+ k. \: S4 ]& k' }; ^
5 ]0 c+ B, j! W
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
1 s# |7 l5 S4 q1 Q% l
; y& T: {) C0 Y. B; B% u
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

1 ?' F+ Q) m- v# l( b" z) J& t, z8 _6 v& w- E! s. Y
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

" a" Y& L2 L) w% \
7 w; f. O! E  j7 @. z* @' R2 @m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
7 K& r: F- ^% e( z6 O
3 ]9 M# _9 w7 _! i0 R  D; L
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
# F, \  `% s3 ]) ?+ H
+ e4 Y3 c3 ~- ]" S/ C
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
  f) |" k; |( w7 d+ ?
: Z* {6 `. l* l9 d( y# n
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
! B& ]5 l- ^/ f+ ~9 M: _% s; ]. \. X

6 b! q5 K7 i& }, b$ _}

, m. H' @1 t4 |5 ]: n# Y& tpublic:
6 j' Q% C  L/ N  \) C 2 [+ O7 i: `# K, U0 h
0 C' [$ i3 d: Z0 I. A1 Y. L
~TetrisFactory(
void)

; T! ]2 _: v% ^4 R( U( _1 @" P; N6 u: |7 o) d
{

9 c8 s: k+ I( i3 _6 S8 |
, a% t  n2 l- m5 `4 ?+ @, \}
* H2 n0 [0 O8 C9 Y

# `2 T5 @; i* E8 T1 a3 kTetris* CreateTetris(
char sel)
7 A! u& F8 J- S! y
3 X' S& X6 k+ s$ ]8 N
{
9 |0 h0 u  ]4 ^) g# x, T$ x
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();  Z# j/ m( {2 s, W6 S4 f
2 S' {  i9 H: `' w
}

" H8 U, B4 R- a/ H9 ^# m4 A- I5 Vprivate:0 w( @. M2 T& u# h. g. O1 D9 L9 l
3 b( L& z/ n0 w/ s. h

1 [7 D  ~. x& J" |
7 E* `4 a: ]! G  ?1 ]7 Y. hTetris* CreateOneTetris()

  E4 [! n; a2 u& ]- w% A) Y0 J' F! w. X& U
{
+ u  R; z) S8 Q: w% @
                        static OneTetris tetris;2 N( H9 x$ i, v: c/ l
1 Y3 u- T  H, C0 v/ i# E& W
tetris.InitPos();

) @4 [$ p% G) G, r                        return & tetris;
# p5 b, f& I2 q/ ~- n6 h  P) E6 J! E. s$ z; D( g9 @
}

- j& l% j) d: I+ |: i
6 ]$ F8 N$ N$ X* R

+ W5 c  T1 j6 S
- L6 ?4 D' w" Z+ F, Z5 PTetris* CreateTwoTetris()

5 M' b- [: ]" y8 q3 w! O3 Q2 r' f: g- g2 i# z! E
{
6 Q9 ^* B+ t3 T$ [) m
                        static TwoTetris tetris;
& F( x: E3 B/ C- a* B; @* N
2 \6 C/ r8 D  p+ y/ R# p0 z7 a& G) @: ptetris.InitPos();

2 n8 Z9 g3 P  e/ p                        return & tetris;
; p5 L( E5 \3 k2 W$ C0 V" r) ^0 Z$ z! d) g( b1 ^1 y
}

* R) R+ v# |3 `( Q/ d( J8 u- ^0 t, B- `

9 D% P$ [& \5 ?0 H2 u$ _1 v; f4 F. L, p# @0 {; m7 X, u, h7 k
Tetris* CreateThreeTetris()

/ d, n$ X- T) o9 o. c( d& @$ C
5 u3 U; a$ \& p7 R7 _: _4 O{

5 q6 \0 C- [" g8 t                        static ThreeTetris tetris;+ e7 S( b2 K, n6 W* l( }% M* T
" c0 f; u, R6 |, j4 A5 E5 c
tetris.InitPos();
6 U4 R- y' D" W+ y

! G, c0 w7 K0 R- r" X  E7 b7 W, O% o/ h. h$ \" r+ a* c9 ~
return & tetris;
7 C+ W& N! `4 p1 }) ]# m" e, Y3 ]

( J1 i0 O4 c6 w: Q+ t/ }/ s: u}

% j4 W8 m) Y" q: o6 i5 J4 B) r2 x3 V" M% S2 S( e

- g7 v% z7 {. V
$ @: q- \9 ~$ C/ f; `0 d+ I5 @Tetris* CreateFourTetris()

7 T, U5 g( V9 C0 V6 O7 h7 E
* i9 S: r2 k4 u4 U  b  p, A{
9 D6 j$ W$ L1 [4 {" I5 f# c  d
                        static FourTetris tetris;
# a5 F- F5 U9 @2 {% C+ e9 p9 \2 W0 W: i
tetris.InitPos();

$ S$ N1 }5 B% V6 g6 K0 H2 |                        return & tetris;" k. o* Z. `& x8 z$ d  V8 c

8 o8 Q' E' N- h" g( M' G( i}
6 M1 N! M5 G1 U2 e

8 J8 l7 O; Y: F

, ]" D% H4 b: ~7 y: k& Z8 t. S. K% X9 C8 c  A0 \
Tetris* CreateFiveTetris()
* W$ m, {" V1 w4 ^
) U' R/ t6 V( Q8 {% [$ C& x
{
% z, M* N3 l! L9 E0 F. A
                        static FiveTetris tetris;
' M, Y, B( L" X3 h/ J, a$ f7 A* }; D( |2 G
tetris.InitPos();
& M: |+ P. U9 U/ _
                        return & tetris;
9 V) N' z8 B3 X- j$ \% {! O, j$ V+ V
}
' h  d$ T+ ^* ^. p; y
+ @2 b7 L0 |+ A1 F$ E4 j
- p; Y7 t) e: w) s7 }& j
Tetris* CreateSixTetris()

6 Z2 t8 r/ ]+ _8 ?4 i2 ~7 M2 K- S! e: O' p( b' Q
{

3 I, y2 q5 m: U# {& E                        static SixTetris tetris;
6 R- h2 O3 h# S3 r# Z$ `8 P# h5 b3 y, a& _" `
tetris.InitPos();
9 w8 G0 c: Q1 W# _3 Y' J( a7 ]
                        return & tetris;
: N1 [, @5 Z1 M! k6 F* G
' W  a  _8 f% W}
/ j- C3 m! g' s2 [' E
3 o7 _: S0 y7 N4 J5 M& V4 n5 I# Z. [7 N

8 N( h* L. ^1 c+ S5 T* |

, R6 w* @* f, c# s7 ^; M2 l; S3 C$ _
Tetris* CreateSevenTetris()

* Y* ~- R9 d1 u$ K; Z) V6 {' J2 Q/ c. v3 h/ Q
{
/ \+ s6 e7 n& B: B
                        static SevenTetris tetris;6 p: {. P- z' R
0 j: `$ w5 z/ c- r& S7 x
tetris.InitPos();
3 i4 l8 b+ v* Y. t" _
                        return & tetris;
7 o0 Z5 m; G) o+ w: N6 Y3 E) {6 _" Y' Q
}
. h. U3 N$ h: z
1 d& g8 _& `# t' e
private:
7 l$ k( G' o+ w0 B% T8 O ; `0 P5 y6 E1 {
            typedef Tetris*(TetrisFactory::*PMA)();4 N) u  l" l3 s: s  @3 a5 D# ]

: N! i; V8 f; B/ A7 S1 h7 J% Z4 Astd::map<
char,PMA> m_sel2TetrisMap;
+ Y# D$ v+ c% ]5 }# X
+ k0 P0 ?1 p, p9 @4 s
- d; {/ c4 Q2 K0 p! |
};
9 m+ h5 N; ^9 w2 h
# h" E# y) z+ O有兴趣的朋友可以下下来改改玩玩。+ j% P" R' [3 b5 m7 Y
/ R7 L" ?& }" W2 T8 Q
That’s all!
, b" T- }$ t$ Z0 R 8 S, z$ M3 D, k  u, W% y- k
Peter
7 G% Q2 X' k2 E2 t: C2 F: @7 G; U3 C2 |
& }% d. s9 G8 n5 b& c' m' E[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-2-1 04:16 , Processed in 0.401963 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表