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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
1 S1 @, W' r% Z$ t
1
5 [# N8 d9 x' b' f. h完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:3 D+ O  p: P) t; X4 ]# u$ a

$ F4 D* ]. l2 F. I) H6 m: _
# M4 X! x! g8 W4 _1 d3 a
Factorycode如下:: A# B6 r3 n  G% V: F( M) X

/ s! H- Q9 n5 S9 v  i/*************************************
' K* ?$ v% p/ K7 E, r
! P, \. _' T! x' I- G- S* author:hgf_starlovecpp@hotmail.com
# }' x8 \. G5 v* B: T% C7 I" L

& _  p4 S+ |6 f6 y' K* version:1.0

& M9 A- k; A  [1 m) K
2 A2 u; [' A) x2 {# o* description: just for fun

7 H# U5 }% p" c4 f$ p; Y
) u  |4 O1 f: z4 f, B* todo: hard code exists need to fixed

, z* G. \- v/ B" J% i4 l+ ?0 w- h. J  h1 [$ g; y7 G$ R; E3 T
**************************************/
4 n$ p& u) o, m  F7 b1 X

+ q+ e/ X& c5 `#pragma once
/ g) b# F! J) }! X- _) X' r2 o#include <map>3 a2 n- J( Z- |/ i
#include "Tetris.h"* X: N+ s1 b$ h! ~% v" R
#include "OneTetris.h"4 i% Q& N3 @% P+ X* w! s; A! S9 i
#include "TwoTetris.h"4 f4 _$ A) a) t1 k. W
#include "ThreeTetris.h"
* f5 `! y0 K1 D#include "FourTetris.h"
4 u6 V$ v& R3 H8 Z6 I#include "FiveTetris.h"
" J" T( L+ h+ R/ j5 F) {#include "SixTetris.h"& g" S1 p6 j: W3 U9 |  B% p
#include "SevenTetris.h"4 T% k7 {* ^) n7 G% i7 V' U

$ S& B4 {; c2 |" z, Tclass TetrisFactory" m; T6 J* w. B
{5 Y  m+ C! _7 z
public:
' |0 b  a- e; M' x4 z4 I- J4 X
% a  ~4 a: [- d6 L
" W- Z$ f  A$ g2 i: ], o9 uTetrisFactory(
void)
( |$ k5 p2 t: u. h$ b" K: n/ T

2 g; v% x1 T3 \: `- M0 M7 {$ \0 T{

- g- J, B8 h6 d1 Z" r  |+ T
$ K, `5 f0 V, u, k# r: j+ f5 H! i. sm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

$ d: U: B+ B: @8 i/ ~0 ]8 r+ N! F8 A% \- [4 X/ q
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
0 }- j, i! W  A9 s1 ]+ Z
: Z" S/ I2 U: k9 l2 {" y0 q
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

$ \% b) P4 C1 _+ X) Q& q+ O# g* O" b! y
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
8 v% n; P! U3 L7 F
. M0 V8 K+ `$ {) ?' v
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

- H5 k6 \$ F$ X/ U* I9 ]' ?& U! V. o0 K' ~% Q3 l' @( ?
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
' h/ ?. \7 Z4 x; q: B2 s; P
) l* @0 @: B; @. m
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

- G% q( ?4 W( U1 P: a, K
; v, N: E  q/ \}
4 ~) t! b: g+ Y# u; t
public:- a' U( O6 v$ ~5 ?

8 y3 `; F1 q: K/ y* l5 a5 z8 r6 l9 g* }4 n! `- a7 a. L
~TetrisFactory(
void)

! W) A3 _! p5 L6 Y/ L/ ?$ [+ T+ m) L$ e7 v& K! A  P
{
2 {; {( n5 Q, {/ A  d, l2 m
" I# Q: G/ W& t2 f6 k
}

4 F7 f7 \4 C) x3 D! U1 _0 g
9 W( ]+ J) l5 VTetris* CreateTetris(
char sel)

" c8 i! x# N* x0 I* W$ M1 n% S/ R2 c- H5 z' N6 @
{

) X% H6 Y; v" H2 x' t                        return (this->*(m_sel2TetrisMap.find(sel)->second))();; i, b! h8 N* t$ ~' [
* G0 y6 b$ A& k$ X7 H% B6 n
}
8 I' R: S# d4 y$ P4 t6 a+ b
private:
- i5 N2 p; L) x# D, M  V$ @4 e2 x
( }+ ~8 @: K/ J. y% [2 J+ x% L
8 C2 j. y4 H7 s/ W

: |0 a; S9 P+ W5 c3 a$ x+ W) ^" PTetris* CreateOneTetris()

1 H7 z* S1 o7 t2 {  x0 d
' ]! k/ N8 {+ ^* s# ?{

4 ?! Q: T( ]! _( A1 ~/ ^                        static OneTetris tetris;
6 e$ e& z- n: b+ k  [4 A
$ ^" Q1 Y/ P8 ctetris.InitPos();

  J: \6 i( `5 D7 e$ r  F                        return & tetris;8 J. g2 H- C  J8 p

( a% H4 V( b! p) Y) d$ s}

1 @9 w. V2 Z. Q9 O: d2 M  [3 i
) i+ z" F0 n( j) N' Y$ T+ L7 t2 @
0 l; |6 N5 @9 e

6 R' w  A1 F+ ?5 m2 \3 w( fTetris* CreateTwoTetris()

3 |6 A5 V3 N( |! y/ f& E1 G. z$ a+ N* ~# i0 i- {% e
{
' r" C: J9 r# I2 [  ]
                        static TwoTetris tetris;0 v  ~2 K) R8 I1 J$ ^. l8 i$ a

* ~! F; d8 _( Qtetris.InitPos();

, w* k3 q/ o$ k- P' C                        return & tetris;3 r1 C% z& v, @

8 {# L' a/ ~" d0 B/ f& b}

, a% ?1 K$ u* h! Y) T, `* X
# |- ]* @0 L" b% C

# j$ V% i& z5 w0 d$ F* u8 z
( \- g/ j! C% Y* W. F, [Tetris* CreateThreeTetris()
9 p/ a2 g4 `+ G

* n# @- v: I9 y5 S{

) t& m4 z- e/ {% B                        static ThreeTetris tetris;
% y: ~4 R( o- y" c$ C! T$ m. P. a
8 h8 e! ?* K4 l) h" P5 @tetris.InitPos();

& ~9 F5 S9 x% }8 @% I$ s; b6 s0 F4 G  k# B* L, w0 ]$ c& U5 x$ @  o
2 f0 d  q0 y, t9 A# g  @
return & tetris;

+ L6 l, n; L9 d% |/ n( Y! h
( f1 j% _8 N$ C* I, w- i}

: \3 u# X9 D9 o1 h1 F2 b
5 [0 V+ @% {  U- `, N

+ I2 Y0 H6 o: T7 E2 x
2 R8 ]& y; a4 Q( T. z' ITetris* CreateFourTetris()
" R" D% }2 v1 E& k8 g: j" {4 T
1 r/ b% e! R* L7 `& u& x
{

: F1 ~7 H+ @( P, H                        static FourTetris tetris;3 w' j, `- Z# A  j

# E$ V' |/ Y5 U% f6 T  L; Wtetris.InitPos();
/ \7 x$ p  E; @0 H1 B
                        return & tetris;" {* f* W5 e8 X6 y  \# \
8 _" u  _! H1 R" y; J3 t
}
0 z) H0 k% @* R1 g' V9 T
; s2 H  X( L) C* j

5 A2 H% _- n: V8 f) x) O+ h
6 C2 G' R4 K% c3 dTetris* CreateFiveTetris()

" K, `. E( p+ ?; r: k( J
( G$ q, n; ~& L& e+ {{

2 ^& {/ A+ e# A4 j                        static FiveTetris tetris;
7 k9 O" I* x) ~% w  h" P  A" k' j! f
+ g4 f" e  M! u, Qtetris.InitPos();
. l+ |! i: c4 `# f8 q
                        return & tetris;) K/ b! }0 J8 O! J2 u' K, K; V

# c0 J  v4 K5 y0 h( ~$ o}
$ q3 E9 b& q9 ~! P) N; E, q

+ w' L3 M7 c( U5 t/ I/ |! {) a4 c/ e* K) j
Tetris* CreateSixTetris()

& [1 x5 E$ v. g% w$ q. A7 l
* N/ X) w2 _" x- b4 b0 Q{

5 i6 t2 O, j; W3 K5 N! k! l" I                        static SixTetris tetris;4 c6 P7 K& d+ s' E
$ x- A* H% a# k% D& ^
tetris.InitPos();

0 g  r3 y: n, B6 p                        return & tetris;( o. ]% A" J( N7 }

2 D( w$ E, B3 `) y/ g7 n. L}
3 t+ V' p# {3 E

6 o. b# @6 \7 y- Y5 e) k0 h/ u8 z- w
0 x9 r/ R' C" ]* J
! C1 f- z1 [3 P. q- R! T& {
Tetris* CreateSevenTetris()

! g4 A+ x) l/ Z! \+ p, m9 E6 K8 u# T. P! g, u2 |8 P
{
- [3 @5 L  ]! S
                        static SevenTetris tetris;
! K8 {2 T4 s5 v' Y; {% l$ O6 c! H1 j7 z
tetris.InitPos();
$ k0 [- }1 [& B3 a- R
                        return & tetris;
  n. h: w# {% @+ L' V
1 x# `3 T; S% B6 J0 p9 Q/ Z}
7 E2 |, l. Y7 [  A. y, w/ X
2 }- \& t- e3 e
private:5 g# s: C* }  K; s' q
0 k% m# k+ x* m
            typedef Tetris*(TetrisFactory::*PMA)();: F* w" Q. i9 b2 d& L

0 R4 L( d1 w6 T& {2 T8 a; pstd::map<
char,PMA> m_sel2TetrisMap;
+ J/ e; [, \* B" F1 {9 q

; j% I) ?, J2 i3 y3 P

  B" O1 K' F, z2 i};
, l0 Z5 V" ~2 A' [0 R
5 G" O9 |; S. p& J9 w有兴趣的朋友可以下下来改改玩玩。
' e* t$ g5 u- }  s
0 P) q. U9 J+ G1 `# ZThat’s all!
+ e! _9 u) W* [/ Q& ?2 Q" p 1 i: ]3 ]/ L& }9 ?8 Y, i8 m
Peter 6 C0 I0 e3 d1 W0 t2 O; A% H( d

" e; t! d: X2 ^% r[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-5-26 09:39 , Processed in 0.333874 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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