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

俄罗斯方块

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

* Q! s+ `0 r" v: @% `8 {) K) E: C$ [ 1' T# d% m" o) t* L& ~1 [: R; g
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:1 I; v% j% x$ F! O  w! _) v8 e

: @" U# z! h! i
% {4 y+ ~* l- R, v/ H
Factorycode如下:
, E6 P5 `: Z2 K9 g& S
& z" U# h: V! k7 q5 e" K, ]/*************************************+ x. Q+ H4 h! h3 N7 D! Q, ?2 ^* S

! P0 q/ A2 s: B+ {0 |7 r6 I4 Q. z* author:hgf_starlovecpp@hotmail.com
4 R" g% R5 E) J5 x$ `8 a6 u

& O8 B3 l  O/ k" a) F+ U1 k/ t* version:1.0
9 Y/ L7 N# j8 S' ~0 X* T
9 f* q6 y  G* J* M
* description: just for fun

: l. r# y1 p6 g0 T( D4 r  R, c' v+ j0 ~
* todo: hard code exists need to fixed

# V2 H$ P# ~9 }: m" e, u" e1 [4 P* I1 P/ P
**************************************/
) @2 Z9 }% I. F5 u# e6 G& K
. [  |: C7 q3 ^. B" f/ F
#pragma once
. t7 k. S0 ?) O" J9 E#include <map>3 {& F0 p/ z" p
#include "Tetris.h"; o6 d0 F6 h# L& @" x- A+ Q
#include "OneTetris.h"
$ F9 |- k( Z+ s5 j7 T! W#include "TwoTetris.h"! G' r+ M4 W! S1 i
#include "ThreeTetris.h"  J7 l% h: H  X& D+ K0 ^
#include "FourTetris.h"
3 s& T  {# V4 l* o9 Y: j) Z#include "FiveTetris.h"% I+ q4 q0 `/ z
#include "SixTetris.h"* L' _0 d, Y! B- {
#include "SevenTetris.h"8 G5 m( y0 Q. d

9 U& g7 {, U* k& sclass TetrisFactory! {* m5 _* S$ ?9 W
{7 b/ P) v) I# Y: c
public:$ w0 Z7 ?2 A5 {. s
- ?9 w7 M; b3 S/ A# n" w6 |4 c

: `$ J. z. A2 |5 m( z5 ?, r- uTetrisFactory(
void)
6 @- m% X6 @8 D' ?

6 j4 e& q, i; [  ~/ z$ e0 h* T, P{
& n1 ~% _# ]# V5 \6 b
5 O8 a, X* F* N' t# g8 c8 X' c
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

( i, _; T2 D- J& W- q7 A/ B& \$ ]# H% H6 {8 Q
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
- b" e: L8 |5 `' d' ^1 A" O3 p) Q, ]
& B$ u* W6 c: u
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

7 }  s6 V! h, b" j* V" d. A# \! n: X
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
! z, b- E+ X5 O! B
; R# T) w$ d$ F, M+ ^! E
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

, U" F- k3 g, V/ J, k/ D( B- N1 V3 M: Z! W2 L
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

8 U+ m/ o+ y  |' B4 d( }' {/ j! }9 C7 `9 g5 I# R; C
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

* W9 V$ f" L; O' d; d
8 e, W& ?# W+ o5 D& `- [}
8 a5 |0 N8 u0 A" |8 L  p' A
public:& d( Q3 x! k$ J* {8 M1 }

2 s$ C  _& _! P) }. h5 X- x5 I
  ^* l. w, j% A0 @$ |; [~TetrisFactory(
void)

- E5 n$ {2 c  v' \$ C8 n5 _3 j* u( _: s
{

4 n- Y3 N7 G5 h1 V9 q5 V  P/ S
0 K# v+ P% w; M9 K6 Y- {}

6 G: n/ t- o6 w+ n$ y9 \* Q) k. X8 z# R! ?4 t, d) B
Tetris* CreateTetris(
char sel)

! H3 L- C+ D  r- P; U/ g+ U% k3 A8 I- o2 d* I0 Z9 Q: q+ m4 D+ X
{

2 c7 }* q6 `, u8 K/ j9 B                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
3 ~# J3 y( A8 v/ I5 @
  @6 C/ m; R2 X9 m! `}

- l9 b, D5 q7 J) G3 v) ^private:
- r# n, q' a2 t' @  K( r
2 e9 q$ D, U7 u* i6 K

: K7 W$ y3 X% U. k0 }/ f1 W* G
8 Q8 Z, b5 g6 A  [# }Tetris* CreateOneTetris()

; y. {8 n% m, p9 i/ h! W) w# L$ L3 _- K
{

. ~; U- b5 F8 y2 x0 Z1 U$ Q) a3 g                        static OneTetris tetris;1 E1 I, R3 r! ]+ T) y6 g( Z6 O
" E* @5 m# ~4 K
tetris.InitPos();
$ x& h* e. q& L4 f
                        return & tetris;
7 k. d; Q* u$ E9 D; |2 B
6 T5 ?) d- v4 E}

7 i3 w1 f2 c6 W) B0 Y6 w4 e. x0 J1 H* Q: [  k  S% F* Z
* r2 _$ e4 T$ Q/ l

2 }) o" Z6 ]: C' O( c1 i( y, b- ^Tetris* CreateTwoTetris()

" J+ ^( X( u# a' y" g% A* T0 h( R/ r/ k8 u, p$ g
{

4 a6 H4 g2 }6 ]! \1 ?: w8 s                        static TwoTetris tetris;' I0 \' }0 X# |0 y
2 Y6 V3 V$ C1 X' G) q" w  q" ]7 n7 w
tetris.InitPos();

  c: {5 o7 ^2 E2 Q0 k                        return & tetris;
8 Q9 E) c& W2 t6 m/ u5 m  i" k5 G2 f5 w2 g4 X+ h9 m5 n
}

( A3 V& c5 c/ ^+ T  m9 f3 \# O
. e' M+ G3 i: c4 P* f. P% G
' b; M- e  T' S7 C: M

% h. }+ n4 x" P6 l; oTetris* CreateThreeTetris()
; g/ t4 Q) ^/ V

3 i4 T7 f4 s3 y7 F% m# x{
- a, v) w; ]& P! _4 q$ V  g% S
                        static ThreeTetris tetris;6 u8 H0 R' u/ |) W! ~

4 \# T, B' J' Z! _" Vtetris.InitPos();

/ g- e- ~7 b' b4 q6 ?
6 m& s; b. v1 ?8 o
# C5 i5 ]* l' q" F
return & tetris;

- \, f: r( z5 M8 Z6 [( i+ I
$ p2 ?5 J& N: V8 H9 Z2 @8 q}

: j. g3 D; `0 _/ n, A! u# Y
' y# _) w5 B7 \, [  f
5 A% b& g- F, K: W: g( |# L. z
% e1 @0 o3 e6 Q! @
Tetris* CreateFourTetris()

1 ]/ l3 N+ ~3 Q  ]3 _+ v" g7 z; o* |* [, |3 t$ C
{

) V) u% d& w4 ?! ]; A: D                        static FourTetris tetris;9 ^  s; N  P5 m0 g' |- ]

( W4 M! y4 Q# H+ Ktetris.InitPos();

$ M" |/ n5 ?# `0 v# O7 ]                        return & tetris;
9 C) @1 \( }/ t- n) s$ `% C( s; R" u! V8 T
}

* @9 R, a2 D, m: I. {; C
2 x# p. p  N8 L6 X- c+ {

" Z+ R- n7 K, `3 f. \( L* o
2 u; V, W- \' p. rTetris* CreateFiveTetris()

' e: y8 D8 Q. u  d5 E- d+ _! a' `2 h$ ^  G9 N
{
" ^! |2 ?' b6 J  w& c5 I
                        static FiveTetris tetris;
% _' B. w) _' G& e
1 J9 x! R' C+ n- Etetris.InitPos();

! }; o& Q9 ?  H4 a+ C: w5 [                        return & tetris;
6 W2 B; @& k# a3 Z% B1 }# a& d2 O- X! O! L2 o+ o1 c% a. _- _) _
}
: x  f" y4 e1 p& T4 J

9 M9 U7 f3 X+ x6 r5 \$ _2 G8 h5 C1 l7 u# U; i6 f
Tetris* CreateSixTetris()
9 F2 z( [4 R3 X' h; O+ m

4 ^+ j! C4 ?  k6 r; H{

* B, a7 U2 J8 i( i$ u. z& A5 y                        static SixTetris tetris;5 s3 Y/ n( D" D4 z3 m4 }! ]
: w+ a. }5 O" m
tetris.InitPos();

6 v/ b( k2 t0 D! i7 Y( i                        return & tetris;" ]' d% _; T5 F5 ^! _
# I! J2 e+ a) O/ K' s: Y
}

0 r- x( D3 {# b/ K9 q2 E" O
/ z2 I' `' t4 }/ J, k( q! ~1 o( G
0 s, S. q  K2 i1 i6 v1 {8 W
2 L1 U7 u) [2 N! D1 V! Q% ~
Tetris* CreateSevenTetris()
6 u) B% y# B" Z3 M/ B5 \% L# }2 b
4 E* b% A. C5 A  P& a8 [
{
  K- E& b; ^) }% M1 }
                        static SevenTetris tetris;
) o3 a  u( n! x% Y
# n" X+ ^- t' F3 ]% T2 L1 Vtetris.InitPos();
( h! J% ~; y/ _6 ?: P$ l
                        return & tetris;
' h* y# S: {- ]; [, D- h8 ~7 q2 Q' ~/ d  K: R' q- S/ z
}

( w+ ]- i" h8 w; p 5 a' f  u2 `7 j9 a+ I7 a, b! I
private:
& d1 E3 A& y9 L- q " o% p  z0 }2 }; z* X
            typedef Tetris*(TetrisFactory::*PMA)();
* }+ a" V! H; q2 Y* r  u/ t* R# {, o/ k2 E2 F
std::map<
char,PMA> m_sel2TetrisMap;
" \( A( d9 p0 S6 c; b
3 {; `0 N4 S2 }; V6 t$ L+ F
8 n% u2 Y2 N4 i5 [) E; z% Q1 w: q
};5 ^: Z7 C6 Y" W) ^* f
3 f7 Z! F) Y- _) f+ Q& l6 F9 ~
有兴趣的朋友可以下下来改改玩玩。* l, U. j% V' C3 L! G

- @9 {3 {" z! O) ?1 d3 m5 @: b2 aThat’s all!
6 Q0 \: w3 [7 Q& N! ^# j # l- _0 s+ U" R5 G0 d
Peter
4 o2 I- n+ W9 z, @
! O! D0 c' l: T" o- X) G( n! _[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-7-21 02:05 , Processed in 0.039703 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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