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

俄罗斯方块

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

0 i7 m, O  ]- j# K+ L  J$ P4 V 1- ]. M# F: k- A2 X; C' y( A7 e
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
3 X' G6 O( n/ u0 z: N& P1 `4 {) i# G9 t- X$ F; T  L) k

# s4 M" y' }" \Factorycode如下:
7 Y5 r% d" U  @2 @  y$ }8 J
) O( G% _' I5 t5 P0 F; O/*************************************& ?8 b  [( z- s
" A) q2 y: F# P  Z: p: A1 Q1 m8 E
* author:hgf_starlovecpp@hotmail.com

; G- n: \: Z: F5 L4 I6 S' S& w0 F/ g7 Y4 q4 o
* version:1.0
( A( `  R' S3 c8 Z  @" n, J
& {! U7 F% Y+ |# {
* description: just for fun

# u7 B% ]% o! A/ m% W2 S0 L9 w. |+ W% u- @1 j5 [$ Z
* todo: hard code exists need to fixed

. A2 V8 R  Z. D+ R5 H! x4 R! k) @0 x" ]) i
**************************************/

& q5 n( H5 J+ ^/ a8 ?   B. E( A4 q- M( m' n4 {
#pragma once% |+ S7 F8 B, F! I# {! h
#include <map>  Y8 G7 ^$ H7 H5 r: \
#include "Tetris.h"
" h6 k1 l7 L, |0 S& L& U#include "OneTetris.h"2 W) }) _$ |2 l  n/ H$ Z5 [( ]
#include "TwoTetris.h"
! U: L# v7 M/ S; ^. j9 ]#include "ThreeTetris.h"  G2 e3 R  R. X
#include "FourTetris.h"
9 x( z+ Y& U" ?8 E#include "FiveTetris.h"
! _  b; U9 @- f0 o#include "SixTetris.h"
8 Y- g+ z( }" M#include "SevenTetris.h"
$ S1 G8 ^: \. q+ f+ L
  ]2 i- q! ^6 R' ?3 Q. Q6 b, Dclass TetrisFactory" k8 c# ?' w% ]; S" k8 |$ V* r
{
  W; g9 n/ j, Upublic:' x8 [& v2 U7 A% v( A1 c

6 j; Y7 s2 s* C. }4 u- A" n$ x
  J2 z, G, b7 b/ a/ YTetrisFactory(
void)
( z5 W9 B$ G: e- i6 G& k1 N
! T) W$ I' z7 N" n( z
{

$ F$ B! c# H8 m  L2 z% m: J
' y" }$ J- {4 O: J9 {2 s+ T- Am_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

1 ~* y) ~) k, r6 J% O& |
# \4 ]" J$ o0 t) E2 V- Vm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

0 p& }! T/ ?5 k$ D0 r$ O. ?/ \5 [; Y8 M8 Q8 B: J3 E* z+ L" p5 `
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
/ g! l0 \2 P) k6 I5 c+ Z
0 s5 v. e9 }( ^4 v9 q9 L
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

$ o! a. Y' P0 L  U- ~
; p4 v8 d/ r, `: C8 }) R- [m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
' X& Z0 a1 G0 B" G

8 r6 X3 e% ]4 r: Rm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

- R2 K) W; u8 r% o, K0 n! S' n- }% P; Y# v6 w, b, V4 A7 u
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

/ j$ B+ N5 p/ p* K' X8 j; ?2 s4 o5 J
}
+ ~7 g. ]4 K" q  N
public:, ^5 b" ?% [9 `) j2 s7 v

, k0 m/ B5 P; ~+ T4 h  b! S' _& _" B0 }, w, ~- m
~TetrisFactory(
void)

3 i! w) F3 O6 {
% m' M8 |3 p# }5 g. i- F{

& b( _/ r- x6 \. C8 P. ^: ~
9 f* C+ E. j" P. ]( }( }}

, P% D/ {6 B' f  S+ G- I. m7 _
  o. t. Y" l: Z; C  L8 v" vTetris* CreateTetris(
char sel)

- ]0 C+ ]: X( _/ H. c! r  I
- W- @% R7 m0 L. R! Y% C6 o7 Y4 M, J{

9 c7 T7 Q2 H9 M$ e                        return (this->*(m_sel2TetrisMap.find(sel)->second))();, H( [" |2 f& x# m

! W7 }" \) {: u* d0 r5 L/ F}

* H5 f. d# W# @private:
2 \6 _8 ^0 j+ X- {) M+ _% m5 s* G/ |; q9 a" h  c2 K

' x0 I  y- P. _8 v8 E# Y+ i7 N+ W) p9 S- ~! q5 o( T6 [: ]3 C
Tetris* CreateOneTetris()

# n) m- E: H6 B  b
- K6 q1 w. t: i( z9 t9 d) R{
4 j  f: R8 E+ k) M# e
                        static OneTetris tetris;
- i  W: I1 N  a- {0 T) T5 L) Y% j( `9 K$ u' }4 p& y
tetris.InitPos();
- H: W5 W8 j+ l" ^
                        return & tetris;; W! O6 Y" q0 I' {% Y

) Q) f. ~  p# ~- `9 b}
2 {# m. Q1 V. r! d" B

6 W4 o1 o1 c  P0 T  b
% \6 G6 r( t! v& k4 X5 M

' P- z! t9 h$ X/ a3 C4 b. YTetris* CreateTwoTetris()

/ h2 B1 t  t4 g  O6 w1 F" q, u# m4 w8 A! U! y
{

# E/ [+ ~* \+ l6 Q! g$ y                        static TwoTetris tetris;
1 Y, m8 ^2 X0 j% D3 J2 f! z! x1 z4 Y9 H4 J1 h
tetris.InitPos();

- `0 ~+ c; S( f; X5 r  N                        return & tetris;1 s3 g' J( j9 K. Q

3 n# u% S  B4 P}

8 i- r) m3 s. N8 j
1 d. m9 y$ C/ \- F1 g9 Q
! I% l$ {& k* c' T1 a& G

& R$ E) C4 d! |1 @3 y, tTetris* CreateThreeTetris()
% W; ?0 b3 ~& I$ I5 I, Y

' P: _1 l4 R- s+ C6 i; Z% B8 `{
3 I. Z/ g! }5 D4 f1 ?% o
                        static ThreeTetris tetris;
* Z+ g0 F+ G0 h1 t6 m+ Q) C7 q1 t2 a$ h8 A9 K& N/ w0 F/ C- I9 A
tetris.InitPos();
' M, V4 |4 }; R% }- e7 u4 C

  [0 U. j* N; \7 W: u7 |( h' e* E4 U2 L2 A
return & tetris;
# y5 g* m/ G3 n" F
) }6 H1 q! P" v3 s1 Y% h# o
}

* j% ?" I) \; X& w! w# D! H5 l
$ ?0 J8 R, x8 X% `/ x9 K1 @& R

. c* z' \# t7 p0 I, N
9 z! Z6 u& e: A3 m5 o& G1 i; XTetris* CreateFourTetris()

; D. |5 ?0 k! Y7 b3 A
9 L9 \9 q; e- A3 j$ ?6 a{
7 ?" q2 E$ x) F" O) I# K9 I
                        static FourTetris tetris;
: I; ^( x9 ^! C. {% U' H" K" ]. w( \" Q3 O" ~8 @2 z) I/ C
tetris.InitPos();
- s0 @! w2 ?1 u; S5 l
                        return & tetris;( j* w& H2 P' U& v6 C" D5 J. D# [$ Y
4 e( z% z) ~( B
}

4 z+ |* s7 A& \( ]6 W6 k$ B1 ~8 L/ v) v& c+ x" O/ t4 A

: V5 v; T6 [% }  e; P, v$ E+ L5 h; t! ~+ ~+ W
Tetris* CreateFiveTetris()

2 M: k5 a: i, V8 b! P8 E/ ~
( K9 Z& u' h& |. y; P) c. B{
1 n% |( [5 A" G
                        static FiveTetris tetris;
- H. q2 M: S: N) D  {: S
$ K+ \! k1 i# b' O- P! Vtetris.InitPos();
& S) d5 W$ h: \/ m4 n9 ~! X
                        return & tetris;
" O* K, e5 ^8 Q9 r: j  V: H! m2 k/ T; c3 F0 D% }' I
}

8 q2 ?" N* U2 Y6 w% Q5 u 3 v; ]7 _+ Y; u! Y% G5 e, e

* f$ p5 B2 Z  @2 P- S1 ?Tetris* CreateSixTetris()

, |" H2 A* |( J
; G; h& G6 Q& }3 H- c3 M, w+ G{
/ e: M9 a& V  S/ }/ }' F
                        static SixTetris tetris;! I! ]5 w, v6 N% u2 A

: Y1 p4 l3 ?! v; m! Ytetris.InitPos();

9 F. h% u$ n1 {/ e7 b0 ]) X                        return & tetris;' S# s: H; Z9 D* o7 _* f
+ R5 @7 z. N, o( a
}
0 v$ y, a( ~3 t' t9 p3 M
+ K2 M1 Z3 r2 D( ^, o% |+ s

5 w3 _6 v1 U: x' U: n9 n
/ j1 ~+ Z1 s& m4 R- r
2 g5 s$ l0 Q7 \2 B9 L% H
Tetris* CreateSevenTetris()
3 [/ Q: r) `* g: t* Z
- Y8 @0 M" C1 ~7 S6 s
{
! T" `) W2 m7 b7 f" t& j* v8 y6 x% Y
                        static SevenTetris tetris;, F& ^$ X, [0 _

7 p* y% V7 C" {* F+ |- jtetris.InitPos();
2 Q/ d: K  j; `. q7 N; A( {
                        return & tetris;
$ Q  ~' ^" X/ S5 y+ E( R4 v, C  i  @! ?& r4 P
}
7 }& z) i( ~+ j' X" x( ?

" G& v5 q$ m0 I6 i$ q2 j* Jprivate:# Y  a" r0 ^7 V6 Z
# t3 L, e! |9 G9 A
            typedef Tetris*(TetrisFactory::*PMA)();2 ^8 y( T! d( [+ z* T! [& [

% s2 n2 h8 I1 t  }! }std::map<
char,PMA> m_sel2TetrisMap;
9 G( J& H0 z3 o% _; v6 [* f
+ z$ p* I& i9 b3 D, E

* _$ G. M9 ?/ ?  z- p9 a% J0 L};7 }& |8 `( O4 X4 R
  w) x8 t( K$ G1 f+ _
有兴趣的朋友可以下下来改改玩玩。0 @7 T9 s8 s$ u6 ?

! ]5 w. Q+ z; n8 n+ j. [( rThat’s all!- x6 K* ~) ]( v; d; f

8 J9 U" T* p. u7 e) ]3 {9 Y9 y/ b! sPeter
9 m6 d0 _7 {5 [3 L/ o: g* y9 y2 w4 S/ ~3 y+ R
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-9-21 20:41 , Processed in 0.074417 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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