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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
# \; Q% c, B  A6 ~! R/ x- w9 S- G
图 1* }; L! i+ q+ ]* ?
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
" a" p. v& l# f* e+ u' X+ J# q
) Y& @. G4 m: A6 ]! l8 `% U7 `; r0 X

1 J" V, d* e, L5 g/ k' `Factory的code如下:
, [1 R5 p7 g4 T
1 P  ?! U) ^% g& a, ]/*************************************; m' G. T- Y# K. z! s
2 }# x6 O% }, }4 j  L% L
* author:hgf_starlovecpp@hotmail.com

' b3 {5 b$ R9 ], w) q9 y) T5 d- [! n3 _( T
* version:1.0

# F8 u: k; \: a5 K  _- i7 T1 `$ e; B" v9 j( Y' S
* description: just for fun
* J+ X9 w# ]! R; k7 L! n5 ]

- j/ }  r" \5 G9 _/ E+ @* o8 f! x* todo: hard code exists need to fixed

0 _- j! U4 a7 s, Z/ y$ E7 Y' P# z9 G- _/ U
**************************************/
& B6 {2 K  w1 m: e2 g- P- x
, p$ ~# G0 b% l3 O1 H- ~  t
#pragma once
' G4 T" a6 b! R# q, [" J#include <map>9 C% I- e' E. z, e
#include "Tetris.h"
6 h* N- m5 r0 \& \% k#include "OneTetris.h"5 F8 ~, |- [" ^, v
#include "TwoTetris.h"
) _5 @: i, _6 A+ A6 ^1 m#include "ThreeTetris.h"* ?3 x+ k1 J1 V! I& Q+ W  T0 A8 G- [
#include "FourTetris.h": Q! s: a5 Z; Q5 F  X6 m, L" f
#include "FiveTetris.h"
: i' Y3 G! ]) I9 \#include "SixTetris.h"4 r! H8 Q! ?) i/ q* @- d. r; x3 I
#include "SevenTetris.h"
8 m0 j: c6 x/ M- d
" x3 K5 V- O5 y$ n& lclass TetrisFactory
: Y- F; Q$ T2 j3 u0 C{# ?4 W! D( Z3 I( a+ p  N  x4 U
public:/ Z9 X$ ^9 D$ N

) T( s; B) @. v  Q
) X% d+ O7 k* e. kTetrisFactory(
void)

# ^6 n# ]) [8 W0 h2 Z' r6 K( S& c$ Y, z# |8 b% R. X$ J* M4 n% a' T
{

3 F* V9 y6 |' H) ?1 z, T0 ]
4 R- y: c( E, f9 `* L* Rm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

/ g* z. T, \& V( K- e, M8 g5 O2 N! x6 J* D& f
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
- i. g4 A& H4 q; Z
( L2 M: j5 _9 `( |
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

  Y, U- h0 r9 w0 p7 l; n* G8 D% l& S+ Z
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
( M0 S) y7 W7 i

! i9 W$ X: d2 [. X- _; I/ ?m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

/ F3 s/ p) Q7 V0 T5 ?- }- e/ Y0 G; U7 X- Z3 n
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

( N" a0 V* x/ x0 W
: w9 q) z' K1 l# H3 o9 k! x& ~m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

2 I8 Q% p$ p. j1 P# Y! U
' T% H0 Y1 `+ g7 H}
4 u# b$ y# [( Y* f7 j% k$ z$ j5 U) f
public:- o) Z- @+ t: G2 r; k+ z; a. Z! e+ O3 |3 s
0 n7 B" d$ j8 p4 ]3 N

9 J' {; B8 |( i, G$ }~TetrisFactory(
void)
# M) R" X; `; Y, i4 [8 m

7 V4 _5 O- k4 I2 x4 h1 j{

+ B4 O. p0 C" h# h" t8 B. d5 I$ ~# k
}

, Z+ _/ d' l6 X1 p& J/ z: A; w* L( Q! Y4 v, a3 {0 m: Z
Tetris* CreateTetris(
char sel)

7 C) [* Z5 s5 {' j# X6 J1 b1 Q; a: R0 Q3 c" ~
{
/ E: L, z% C& }- e) i
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();7 A8 ^* |  C' B0 P
) @6 v1 w! X# @9 {1 |5 K  P* s2 I
}
( p* |& D8 o2 h" _& d1 }* H5 V
private:$ X9 b! Q% k8 |# C# ]% H

$ o8 G3 R" C& Y
8 i5 Y4 H/ f; J( O, A# }

5 {. T. G# Z# B/ f/ O, ?Tetris* CreateOneTetris()
$ ?! Q# a- t" k/ j( L/ X' x9 G

1 e: G! G- s. h, R{
6 C9 w! k$ q- g5 O5 f: p% g
                        static OneTetris tetris;' A" y: J  \1 y2 o! u

7 m. T6 Y! Y0 h; `tetris.InitPos();
" O( r0 o5 X4 u) W
                        return & tetris;+ E; [. l) d0 a/ }! {

6 N/ b4 p. n3 d+ |2 j( z8 e* e}
, g1 c( y$ H! R- ]# b+ `  B6 R

9 p% ~$ c9 T- z
5 A/ A) z# S2 Q: k' f/ C
. P  \9 P3 k  x  Y  @2 Q8 {
Tetris* CreateTwoTetris()
5 l  h; t. o- c6 s0 Q% Z

2 ]& `$ E1 |1 [9 c' |{

! Z8 ], e+ i% o- _! K! {. I                        static TwoTetris tetris;! u9 F7 j8 l. R$ M, @/ c4 Z
5 a1 l* C, k, N* E2 ~
tetris.InitPos();

6 y5 R! I1 U; Q4 A                        return & tetris;
% }2 H$ c: h4 s. M( H+ e0 A- J
- G; c8 g4 A; `/ S$ {}

  {+ `. x' A0 \+ m, P0 c; |4 n7 T) P
  c: j  E2 b3 x, P& C
: P' _6 ?  P4 O9 p8 n
Tetris* CreateThreeTetris()
+ M+ {2 E: b& r8 W8 f* Q/ V

% F: H+ L! j( n4 N% |+ f7 Y% o{

$ Y4 n9 B: z. @; {3 E8 i8 r- k2 ]# C                        static ThreeTetris tetris;
" ]7 k& ?- H, L7 T* w+ W0 Z$ f; P/ h5 Z& k
tetris.InitPos();

5 U5 Y, b4 [* i
+ [  }& `( P  @: A# z1 _7 Z! J6 ^# v& k$ F5 j/ }# J
return & tetris;

' X* W3 _) ^- z8 v" q6 K' g) |- b
}
' Z/ L% b/ I/ c/ V' Z5 r) n
8 N+ s* V2 N  U$ t! v
; I$ u* v% F) \6 z9 r; \6 ~8 U

! p% M; \0 M( e" vTetris* CreateFourTetris()
; u2 |; @5 }8 N: k* F7 Q2 e) P
0 O1 P1 k$ J, i( w. }1 p& }
{
& y1 Z, d/ ^1 a+ z$ N, D
                        static FourTetris tetris;4 O9 M! z* H4 s$ Y6 Y& h" S. c
; i+ a" }: {0 G3 ?3 C* F7 }' L: `2 @
tetris.InitPos();

0 H" t# N9 g6 x. \* P+ \                        return & tetris;& ?1 w4 x& [$ m# M
$ z9 d1 G* z& }" L) R9 W# ~# s! v9 r
}

$ {6 x! i% e0 M, X1 k9 V4 L  G! Z  F0 E

! R3 Y" t% A5 B; U% @# c2 j( |" S
3 e" V6 A* t7 G6 a5 [Tetris* CreateFiveTetris()
* F% p2 W7 B. k6 }3 h

/ [' u( ^6 [8 V3 k1 ?2 i{
- Z( T0 d% \9 @; r2 d# [
                        static FiveTetris tetris;
( k+ r2 H  l9 Y2 X3 W8 i" \2 p$ v6 s* y' R3 G
tetris.InitPos();
- I- }9 U8 s* S( n
                        return & tetris;# M: u6 `: ]& ^6 G9 k( {5 p* G' v
3 h/ y' o/ ?; k0 m# M' R$ X4 t0 J6 i
}

- y  R2 T0 p! ^' _9 w3 s9 r9 ` # u. c" Y" v( o  E
' E7 [, O) |6 Q2 [! ^) [9 w6 Y
Tetris* CreateSixTetris()

) r8 i! G4 b5 z& R& ]8 I" F
0 h' k- w* o% H% S{
% O1 R2 X9 U' Y9 H. ]: F! j! {
                        static SixTetris tetris;
3 P/ O. o$ ?% ?& ^/ j6 U$ d! Y3 T, p$ e) ]7 w! r7 K
tetris.InitPos();
4 f7 u0 _; r  [. t3 s! R
                        return & tetris;9 r. m/ Z, y4 k  t( {

2 `2 u8 o& C& s+ j- e2 J) Z, N}
# L7 U* w) s( j

( S" G! \$ H& R5 b3 r" r( M
2 D7 E( `' ~% H

% y% f2 \  Z  I/ U3 z; c. W+ N& S' E& @, ?
Tetris* CreateSevenTetris()

- w- T) Y( V+ Y! G# m" Y- {  W) N7 |' L* _/ |$ |& P' A
{

  |5 ?4 B5 n( ^  l# _% l6 m                        static SevenTetris tetris;
2 C9 v- y0 f5 Y3 E& _/ D8 ^9 i" w$ b5 ?  i8 e! u4 x1 x
tetris.InitPos();

/ c: V. a" c9 R                        return & tetris;" k: Z% y# q% Q* R$ F0 v. }3 U
: y" V6 N2 o6 n+ a0 d' N5 I: j
}

8 v; ~* u* S. ]- o
8 ^% H9 `. X( c( Q3 z; V+ Yprivate:
; y5 h( ?! A0 p. ?/ l5 k5 e  ~# S# n+ N % a# `! Y8 V/ d4 G
            typedef Tetris*(TetrisFactory::*PMA)();
- Q0 E# x: O% \9 ^" O" N
, W1 ]) T% _0 J5 B% tstd::map<
char,PMA> m_sel2TetrisMap;

/ V: n5 j3 g3 `' G8 x& y* s  J1 g  r2 |! L) o* K
% N, I$ u2 p. P; v
};6 ~4 }! L! Z% ~9 I- `2 T! s

& e: j8 y1 Q$ z; k5 ^7 M' _& E有兴趣的朋友可以下下来改改玩玩。
# t" ^+ m: b8 C, f - T" _! B- K5 U: G, j9 I
That’s all!
4 e+ D. j7 X% G 5 S1 @" D% N) b( f* V
Peter & X" b2 Y& e: D9 H
$ q% i) r/ |" ~" C5 C- b+ c
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-10-20 09:30 , Processed in 0.120147 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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