|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: ' ]5 f' q8 U0 X, g! S
图 1% N1 M5 G$ g2 j! A! j+ k! s
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
9 O$ q$ C4 |4 H% F/ p* o8 P; ~9 Y* f# {: a" {, m) M) O
& S0 |7 H5 T7 i) z$ i( h
Factory的code如下:: u5 N0 p% e4 @, N4 m3 G
K% U+ L+ h2 x( I$ ]9 Y0 O6 X7 ^
/*************************************- _* E& ?: t0 U: T2 T
- A6 O. }9 M6 m* L/ s B* author:hgf_starlovecpp@hotmail.com
( n" w/ c9 L& ^2 W# K. n2 z6 S% G7 ^# [! E' a$ G9 [, B
* version:1.0
$ x+ a( A/ K0 n5 L( p- l) y) k9 e+ e; V# i
* description: just for fun$ H% t1 F. h7 k2 n$ ?: Y
0 A' x5 B! G# r" z( O5 o! P. D5 ^* todo: hard code exists need to fixed
l0 [) I& b& Y- W0 G; \
4 M% @3 s( O3 I3 z3 p% K9 ?7 v4 Y**************************************/% k: V }% w& b; Z
4 g7 Q: ]2 _( [1 q7 Q a( d" R#pragma once, G" }7 h! f9 r0 R; B, N) U. C
#include <map>
# m% C, W8 e) D9 q0 E6 x#include "Tetris.h"
4 D4 W2 v% {0 C/ x' U5 D2 S#include "OneTetris.h"
9 J5 z5 o+ C. O" y#include "TwoTetris.h"
# p/ u! F. g3 t/ Y3 i#include "ThreeTetris.h"# @7 u& Z" C% f1 F" V5 \
#include "FourTetris.h"
; S, {* H& e4 R! h5 p% H#include "FiveTetris.h"& I+ }) k5 X: q5 e" e% o: G$ w+ a
#include "SixTetris.h"* ~$ V7 F% \; @. r
#include "SevenTetris.h"
. Z& C$ B; h( E) Y( V o . L/ n( m3 O9 s$ m, z
class TetrisFactory4 n I$ V& x3 _
{
5 F) b2 z9 Z5 X- l" ]% Y4 Npublic:
1 e, R( D- e9 M- k 0 c& C# B3 P8 k1 l6 V! k/ V
2 L# Z1 R. i- h0 O9 W: @2 j% _4 a: g1 wTetrisFactory(void)0 H2 ?/ ~3 C+ M- g
4 T4 b4 \) k* Y5 w0 \6 S% O) x% e{5 g! K4 h* t, t" @0 Q' {
E1 _( }2 i( { }+ k2 _m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
$ }& x, D6 [: `7 W. S: g" D4 [0 w0 t7 M7 c
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;4 c3 H) y4 x; y$ ]6 X. P6 o; p
6 H* P( C, N# [9 W# S6 t# `
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;/ s% B# ?" J; M
4 m4 W8 ^0 H+ i9 Lm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
4 P' A( L- D7 M- d/ y/ x; {; m/ X# m4 G( S
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
4 ]& e/ q# q9 w- x( y; k: e0 f9 G7 r6 f9 [( F6 ~9 b
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
8 w! e* ~8 y7 {. y0 ]7 m
. l. d/ L+ f/ a" ?2 Um_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;/ Q1 d; m0 F+ i% m
/ q1 K8 C; [4 O$ }% n$ t K# m
}
5 E! M. r& ~- g- B c( W9 Z# Tpublic:2 ]$ @0 M9 D, z
7 a0 m' ^, I- v4 `
/ v! s- O3 H, A! T~TetrisFactory(void)9 ^ U; e2 n4 @
' Y; H' Y7 S+ u/ a$ W+ p8 q( N{
8 @" u* ` U! O0 v- d; v) v" k2 t) x% y5 W
}
4 y3 Q) g' t9 F5 A# L- ^4 T% T
2 Z# P" p0 o' j% @, k" xTetris* CreateTetris(char sel)
' U. g3 p$ T0 s6 y; D/ C# ^
- J9 \4 K( L4 z* r4 R: q! p. X W4 X{0 v4 P* S/ a2 j! A' L& P
return (this->*(m_sel2TetrisMap.find(sel)->second))();9 q+ f' ]. M+ t7 J* ^7 d
$ f% e! f+ O$ i}
" y$ T" y' I' R3 K% tprivate:' q$ ~8 H. u" u
+ |" w, @! o+ ]% g
) O, Q- ]) Z& u2 U* k/ v
% p& c1 V7 S( N1 b5 x* v3 d
Tetris* CreateOneTetris(), Y- i4 G& S; j9 K$ n6 Z2 P
9 r- Q# J; s( c) I2 V% L{* q! a% ~1 S9 \+ n* y+ r
static OneTetris tetris;
# _& x9 ~' I! P ]6 I) H! w2 ?. M* C9 |% T& o
tetris.InitPos();
7 |% ^" t' ^9 b# S& v0 o return & tetris; F; R7 k, Z5 E; J
! y( o( }/ m* [/ p3 x
}
: {) o; c6 o8 r$ _4 u
8 f& {0 E; w7 R+ {6 B" K* w2 v0 Z" F" s L6 Y, b1 _/ y* H
; V$ z7 n; N- U' ^
Tetris* CreateTwoTetris()- E, K6 h+ V! a; l D1 l
$ N1 |3 L4 ?! U" G+ T; v4 Y{
: ^0 L% a6 r. G9 s7 {( ]6 H static TwoTetris tetris;
( {3 V4 B, D+ K/ }0 `4 ~( T7 Q2 T* a% A1 I7 R
tetris.InitPos();2 y0 O; @! h- T, m5 ^* G
return & tetris;8 W1 N9 l D0 V. \" B
0 g% o$ i% o3 f5 T7 ^& U}
$ U; x& i; Q' b+ T* V% X' c# u$ P) v/ ~7 X' o. N1 {5 [" C( ?
1 F* O1 o+ y' }) u
' l* d( {3 u- m1 l# c" e; cTetris* CreateThreeTetris()* P" Z4 v3 T" x# w9 q0 |
0 S5 a: r/ W5 T6 `{ |0 O+ I' t) e: x1 G9 c
static ThreeTetris tetris;. d m& ~' x( Y. |4 @4 @
0 x' z U8 q3 D3 S' i, c
tetris.InitPos();1 u! F/ X7 I# P
. ?$ }& j3 D- o# J; C# v" B' N4 n
& [: a9 n( @9 {$ D, d! I/ m% dreturn & tetris;4 H {4 }; L% y0 U1 T) ?: N+ C
0 U4 r1 ^8 }9 b
}
$ A) c9 j2 N' z8 S: l' ]" w2 H# B u6 l% R+ Z1 e) e( D
2 u P; _0 X" Z% d Y, p5 z( Q
3 u$ u! w0 G% B+ f+ MTetris* CreateFourTetris()
1 e3 R3 E; G( Y' a" K
+ Z2 U8 x7 [; B- j8 ~1 ^8 Q2 }{+ n3 t3 C2 o1 m5 T, R
static FourTetris tetris;
& }: m4 h9 F, r2 `% F! `: r) F! ?1 |% ]8 Q: {3 z4 U0 J$ u7 m9 b
tetris.InitPos();! n* ]. i. X6 i# r! ^/ a, w
return & tetris;& N) ^' f8 ?- n
. _2 ` e/ v( D
}2 g J6 s/ m& o5 r% L Y( w/ @
2 j2 z" a* j1 J6 A
- r' R# X# A+ r# m, }8 |& k
( D3 u' I3 ~$ {" g' s- rTetris* CreateFiveTetris()- \3 t+ m+ H, _5 T, u8 S) T
+ N8 ], l9 y. u! v
{
' z9 `. I3 f$ H' P% ^) V8 ? static FiveTetris tetris;6 y R, K/ u' ~: S: k! P
# m# m# @- \9 @3 atetris.InitPos();5 d5 j# Q# c3 [: |( J+ @# |
return & tetris;1 K4 K! \- H) w
/ v3 |7 F) ^- q3 v; Q& j2 I( ^}: O- x% g5 h4 d
. Z! ~* w% p, l& i. O- w+ x2 n# \/ `! o
Tetris* CreateSixTetris()9 p; y8 E5 X% n. u9 p8 M
' U: W7 L6 P$ N& F4 k/ L{
$ |, v+ ]3 _6 I% T: G/ p static SixTetris tetris;
9 a* U9 K% T! M" A; F
1 X5 U' I' t- x; j9 [ mtetris.InitPos();+ a( @. o. A( w$ l9 e
return & tetris;
1 y; w; N4 V6 u6 F- I
. d) |( U3 j0 k7 S- V: D! q; B; s1 g}
2 Y: ?# O' {0 [0 e$ y
" p' `; D) u, J* a
" z7 r4 V( Z- f% a# y9 y u) y( k# J V3 S; w" O2 n; C7 Y+ w+ J9 p8 J
% y! y6 t. S) y& hTetris* CreateSevenTetris()
) d6 d. p" b v9 p- @3 u2 q; g1 k7 P, r) O! P9 i |* M
{
0 N8 L6 Q! C+ n: Q U8 Z static SevenTetris tetris; R/ A2 U8 P- F5 Y1 ?+ c1 k0 w
: L1 D* W8 \; d% [7 B) ytetris.InitPos();" x9 t/ d& y# H5 o' S" l5 I
return & tetris;. i& N7 z3 m D( g7 u( ~( m. M
: L6 {3 Z7 Z1 o4 T! l
}
7 _: _/ n4 ^ b$ n' ? ! c. l/ j* K) A/ ] k
private:
$ f; A" O. S% J" @4 N& Y0 x
+ M( g2 C* i$ h3 ~0 i typedef Tetris*(TetrisFactory::*PMA)();7 t2 \6 s7 | ~( x9 C. h( H
7 ~+ p$ `0 L* s! Z; P' t
std::map<char,PMA> m_sel2TetrisMap;
3 v/ {4 A. [4 Q' O# I1 w$ q* A
- e7 y' O8 K) B# |. {- t% p1 O; ?
; o* _+ f: \9 C' W+ l* x; `4 [};7 L) R7 E" _1 J2 ~( I4 E8 y1 x6 U
8 Y* p( d- M$ j5 `7 d有兴趣的朋友可以下下来改改玩玩。) c/ B& n( l) c, x
; _5 J4 f6 K" v0 ]3 EThat’s all!6 } M. y. `4 y; n% Z k% W5 N0 W
1 b, Y& `5 O& p8 C7 E5 J) dPeter , M- w& W/ E: z1 q; T
7 s) M- {0 c8 h) k! H, i
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|