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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
/ }3 K9 D- V  O
图 1; Z% f% K( z$ s* Z& I
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
$ C; n: u! @1 A3 T- d# J" H  u0 z& H, A1 s
# }' u/ h/ m! r5 |
Factory的code如下:/ E2 C) L0 W7 K* \0 a

" Y, u1 R9 ]% a8 n/*************************************
6 z! F9 J8 e- U4 v5 ^
( c) J* o  w8 ?7 A# }* author:hgf_starlovecpp@hotmail.com
9 P# `2 n- N) J! ]

, A1 ]; S2 A  d; ?+ X: X. C  [9 C6 z* version:1.0
( x+ E( w7 y* v- p2 c1 ]3 [; t0 g2 b
2 D; V: e2 l0 D2 U
* description: just for fun
# [* q4 f' \+ j; S1 L# L* P. ~
( H) Q  `, k: w+ j5 H: H
* todo: hard code exists need to fixed

, {$ {% S( I/ j2 g$ c4 E/ S) u# W6 Y% r, a+ \0 j1 q0 n
**************************************/

5 R$ p6 ?6 B1 L! A' ]. e* [ 2 `' S) g5 U+ d) S+ r% C
#pragma once
3 J6 T( t$ \: [9 [( C#include <map>& P- n$ A: V2 i' z1 ^' T
#include "Tetris.h"0 Q' Q7 J1 |& m/ K9 A
#include "OneTetris.h"+ R/ p7 b7 o% V7 ^0 u& w
#include "TwoTetris.h"3 w' P  l% I; V' Y4 f/ }/ j0 A6 H
#include "ThreeTetris.h"* ]  u; i; W' R- I
#include "FourTetris.h"6 G4 T/ a, U' {# M* t6 [% G/ k
#include "FiveTetris.h"0 }! _( P$ r& g' J  C1 D2 i8 R
#include "SixTetris.h"
3 a0 L% w7 m$ B3 @- {#include "SevenTetris.h"
, T4 `/ K. r$ t+ O# H5 t" d ) I5 b7 j% b- r4 t8 Y- e; \& c
class TetrisFactory
4 s* ^/ `  d* l, m{
9 r+ v) l" F5 ?) l, Zpublic:
  a# |* I! d2 m$ d! s4 Z + v; |4 S. l& x8 g, Q, d7 W
" z4 a! M; o! N7 [1 C
TetrisFactory(
void)

0 {4 C: ]6 t4 T/ M/ h1 Z2 @, K- ]! R3 `  o5 C! D
{
9 O: j" E, z6 j9 c5 C
4 n! U) N; {& e1 _; v. n
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

/ ?( n  z1 l; P& [( z1 ?$ S/ n
0 N" u( I- N- f6 H0 hm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
/ j7 E+ G4 {" E- S* h
! R+ G+ w7 i, g$ h. W0 @
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

/ ^1 W' k9 H9 H) ^. {1 f& q4 E+ D0 r# u& V5 G; M
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
& _) U1 a1 P( m9 l! F3 w
1 n' ?9 V. s" [- M+ O) ~+ D
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
1 N0 B2 b8 p1 E0 Z* ?2 `0 h

' X- G  ^& Q' e- m& J, B2 t4 qm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

9 F+ V9 b, d8 U" o% d/ z3 _1 i
" h! m% q* Y- Q! c* X# ~m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
/ G) Z- E3 Y/ `% _
. t- |0 t( u$ d* M/ X
}
- m- ^8 l' L! ?1 z9 A( U4 d7 M
public:4 R% ^3 `% Q( k& B, E: k) m1 @

1 X: ~4 W2 ]+ u; o
) b2 l- G; G5 c1 `~TetrisFactory(
void)

/ c  j7 c9 Q; d- X1 s$ e: H. t' L4 Q8 D0 l
{
5 Z; Y" ?4 w% a2 y4 @1 N

. F8 K! e7 a* S}
2 p8 F4 e' O# L+ k& t- W! `

& a( l7 A! C# U  o, `6 fTetris* CreateTetris(
char sel)

/ c, b# B0 S  F1 t- t" E8 q
# j/ [; s2 e! N" W{
2 |8 H! H# m. X: W
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();, T' {$ U+ a: N3 @
! R8 T6 W7 V) N
}

5 i; D+ B0 I( k$ u. Z) h9 Tprivate:2 z; ^2 P  P/ D4 e
/ P+ _$ s7 l% Z7 B. u# L  c

/ V5 K  ~0 S4 t3 y3 o0 z! v6 f7 ^; V9 y) s, m1 T7 }5 }2 d
Tetris* CreateOneTetris()
' V8 g7 Y% @+ M0 _

1 y5 \1 [! b& C{
( Z( z' I3 J. Y. u8 D! W7 T
                        static OneTetris tetris;8 Y* J  q% Y# |7 E3 m6 n
* B- H3 ?" k6 ~* P: h6 h
tetris.InitPos();
) i8 ?0 V5 ~3 F& v
                        return & tetris;
) Y$ e: I9 c9 M( u9 {/ C
3 H8 z7 o5 d7 T9 Y/ C* f}
- c" K2 \9 G8 G4 ~/ d
' {5 ?0 _* d4 H& d" Q) Q* y
6 v# f  q& v& _0 z

% M& B4 }$ t8 U1 X& r3 BTetris* CreateTwoTetris()
2 V6 ^( i: E5 t8 m
7 u) N! [' M( d/ Y/ z( w7 X. _$ k
{
( `7 O4 \0 ]" O
                        static TwoTetris tetris;
; f" z9 W2 a3 Q. ^  P& x- b; l& L5 ^. c( c; N
tetris.InitPos();

  Y5 _$ z% n/ Q" Z- G6 ^) u                        return & tetris;
- D, p2 A; c" x: Y, b: M
. ~  e6 [7 F7 w% w- g) m}
3 C  O; }8 {) {
) `1 P3 A. n! z) X8 v
1 p4 N' Y% I7 O2 j! v0 D
7 ]1 Y* n, t( \% A( G  x( W
Tetris* CreateThreeTetris()

' A' i1 y& \) {0 u# b) u
9 \+ |% R9 ~2 c* ], A/ @{

. R* X  }! u. D' S: E6 Q: [                        static ThreeTetris tetris;
+ G( u* \/ R0 z  E
: G) z' I. G* a2 w& f0 Z3 V; F/ Ctetris.InitPos();

& z: I9 l  W! N2 F3 l( ?2 ]9 w; Z8 z- r" Y
8 C! J7 S0 G" g2 h5 q& R2 R- ]
return & tetris;
8 ~' h+ q4 N7 c! p) o) J/ z4 X

3 {" e1 M' L! ?' i. |}

, X; W# Z2 }9 I  w8 I. N
$ E% T  Y5 {+ F" a; k& k6 s. W/ i
/ A0 V7 _6 S' R2 ~

0 k( {' o8 C/ n: P- b* xTetris* CreateFourTetris()
. u0 r( b' T  |) J  Z8 V3 m9 t1 K
8 q/ y& J5 r6 W# ~
{

% H. b4 I' D. l  S- ^) U                        static FourTetris tetris;
& u6 \: q0 e+ P- F" l8 X& g$ i" N6 \
tetris.InitPos();
! o# c) |" X5 E* s
                        return & tetris;7 `; `0 H9 [' Z" a5 n; `. }6 Q

& o) ?1 o- n& s* K% e}
7 ^( ~" s1 l; ^- Y6 t
9 L6 e: x  E: W) @
8 V: H; Y0 a, R
+ s; @: Y, D$ w+ D5 D
Tetris* CreateFiveTetris()

' @  q4 O/ Y* h( g: H, ]' t* w
{
$ E0 Y, g1 ]; s
                        static FiveTetris tetris;5 i0 f! _: A, L
8 V- {8 o" _5 J4 s' b% ~
tetris.InitPos();
( u8 q9 z) N5 p9 ]( Y
                        return & tetris;( r) h3 g  \/ ^

" Z% Z# D) C; L8 \  q- [! f* m# c}

. K, i6 N) h# a$ W   O! w( f& A- I* Y

! f7 Y- N+ N) QTetris* CreateSixTetris()

. O! E& X% d& c% R
2 n) p1 |+ C/ w  M% ?. ^0 ?8 w{

: @8 |$ u) N- s                        static SixTetris tetris;
: ~+ \6 C+ M8 G: ^& |) t6 o( q& k) k
tetris.InitPos();
5 d. d7 }8 L7 Z1 C! r4 E1 _" w
                        return & tetris;, T' D+ R3 Y5 s8 r: d

+ \; e; O; w- S* e: R0 U}

6 n( p: s# ?- c! |8 F( T) L
# U1 _: g9 S% n8 g+ H" T
! u* l- J0 _1 D6 E
7 i# ]0 v: q4 h/ M9 p

3 N& P' G# g- Y. h" WTetris* CreateSevenTetris()

) q- ]9 u  y+ i
5 ~$ v- B) r2 H8 D  t{
/ I" V! H: ?* e" _
                        static SevenTetris tetris;
4 O. L' `( E3 [
' X8 X; M+ g3 |2 ~' M9 [6 jtetris.InitPos();
% \9 s$ c! ?+ Z6 B/ w  f2 j! @
                        return & tetris;
( h, s: @$ _+ x/ Z
/ o2 T0 b5 T4 m- g  {. K  ?, S}
+ Z+ ~* g& S% Y) X
; z* y  j' H- r& {( e  q# C/ y
private:, q. v) }( h& h) `6 l. X

  Z  w+ c7 h. A            typedef Tetris*(TetrisFactory::*PMA)();
1 p; \* K/ d  k6 _  J3 T
. o# J! P& K6 ~! h* [std::map<
char,PMA> m_sel2TetrisMap;
: B9 F+ J7 E5 ~. Z
- }; C& {! t$ F
* Z. b6 y* X7 E# X2 N. \
};
8 o( l, b1 j1 b
* _2 P" e" J+ T# w# o; v- j$ I+ L有兴趣的朋友可以下下来改改玩玩。
% C( S8 X" T# r2 x/ [- n5 k1 L4 C
7 F) K* [0 r1 B# d, ]0 a! vThat’s all!3 w- r1 c/ ]3 W# @

. L; }# W5 A4 @Peter
$ W% O6 G, J7 P; F" ?$ S; ^2 l" k) z8 W; T! q  w
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-11-1 22:41 , Processed in 0.441243 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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