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

俄罗斯方块

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

; @# F+ o+ k0 @5 ^ 12 e9 Y7 a$ ]# B; G  [/ K* l
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:' Y2 _; Z0 f7 g* @) K8 k

3 Y% b$ ~( c. @
) B% z$ _" L3 U) Y( a1 E+ z5 h9 {
Factorycode如下:! G" O1 E6 j! Z

5 N/ ?* x$ ^, U/*************************************
9 v) {5 A6 d. c2 g$ ^/ u
. M" x+ Q: R8 d: |* author:hgf_starlovecpp@hotmail.com
  F! O1 o; v  W5 k  q

) X& |& H# i2 X5 m* version:1.0

/ j; h9 R) k8 f, R# Y1 n
/ L5 i! ~8 g) m- x+ K. f" j' D9 L* description: just for fun
: `6 p1 f' d$ e+ T
! j: u7 o! o, y, t
* todo: hard code exists need to fixed

7 Z3 _& B; O; Z7 _' ~
$ F. o! e- d' T& c+ r7 c/ l9 {**************************************/

' H8 E; o5 }* {# c
! ]/ l9 s8 H0 o# N9 J; ?. O, u#pragma once
! j8 c7 b& I5 z2 ~+ b2 q" w3 S#include <map>0 w3 c) O. p& S3 {$ H
#include "Tetris.h"0 Q% x9 n& o7 V( ]1 V9 n
#include "OneTetris.h"
) P  B+ _0 M  o* z; O#include "TwoTetris.h". ^" ?7 `; j( d' O1 p2 ^
#include "ThreeTetris.h"
. X/ W2 C7 E( C#include "FourTetris.h"" l7 x+ i( ]- r  b. z0 k- g
#include "FiveTetris.h". Q9 F3 ?9 \: i9 v, v( ~$ ?2 s6 y
#include "SixTetris.h"
5 `( s4 s8 h' R4 a6 ]7 v  d#include "SevenTetris.h"5 r: w3 l4 S1 d+ m: T. ~

) e& N% ]6 [, I  G( s+ xclass TetrisFactory
1 @9 |: Q! z; ?) ^% X3 U{# s" W3 \* D0 @5 y3 Z+ T- ]2 v# N
public:& g- {9 k1 _! f. {
2 I( Z$ q5 Y/ \( Z# j6 z. ]
1 {5 _+ ]  W, S- n% T
TetrisFactory(
void)
/ e0 u8 l# [# U8 F' E. C2 Q

# }3 x2 O/ j9 M! h- n& O{

$ {$ y# a" A* p7 k9 ?5 X$ }) t6 x8 {
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

4 z" I: X; A$ ~! O" x: T$ ~  r. Z/ j' c5 L, S* Z. ^0 `
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

. [9 m8 C) h/ ^( }
7 D. G7 v# r+ q, f! pm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

! T/ M/ X) {; V; f7 j& G0 ~6 A# w% e" H# @
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

2 H( l. }, d1 B( g- V
1 W- n! \/ t+ l! D! v5 ^: v1 D& Vm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
2 R7 x2 U8 N4 h3 y# x1 I- ]- D
# f* m& t) j2 w1 d, `& l
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
! ^5 W# u7 g, k/ O2 g# |: C
0 r% Q3 s: v5 N: S. L( k
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
4 |4 Y& F8 ~1 m
, l6 H; o6 {7 Y6 R' ]
}
% w4 {8 C5 {+ _/ z! b& V& o
public:
- S6 ]0 s. Q* t7 b# Q0 a# A 9 y( E/ b1 E  s4 N+ b/ o
; p& D, w3 c! u$ C. ]5 p# W0 I1 I
~TetrisFactory(
void)

, g5 B' q) T! C( d! f1 ~9 m1 B! [" Y/ x
{

" ~% w& G+ i; k* O
3 z& t8 A! `( ~# [! o5 t2 z5 z}
" W, n! p3 R: @$ B' z1 \

) d( D% r! p" p' q; KTetris* CreateTetris(
char sel)

$ ^% X8 N+ @1 J3 G" \  s
: |7 R" Q3 O& g, o0 w{

; b( y- X0 r2 ], S$ x1 m3 C, e                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
( C3 h9 L/ B4 ^; r3 ?  D9 d  D: y( j: G/ L4 x
}

5 K# t/ I& p& L% f9 bprivate:# e4 \% N" i" ^% C. t) t8 h" \
9 W+ D/ }2 u4 F0 D
% E. ]0 s  t  |% h( l
2 x9 ]# s  Z' r8 x+ \) j& z& l
Tetris* CreateOneTetris()
% s5 K3 b8 _! m% G2 }) i4 h
% D, q$ B7 W% l1 g
{
+ I: l8 C8 N; W: y+ ^1 M% h# O; [
                        static OneTetris tetris;
: M7 B' D* Z/ n
: N: }! w7 }) a( @  l) }$ p: Ztetris.InitPos();
6 m( |/ x' l' U" V
                        return & tetris;
. ~" L0 {: j5 V0 @
, g. P, s: e/ A}

/ V% }/ r7 b! i8 Y0 U' p+ w7 F; o: g. E. W. K
5 B3 I  i1 W' L5 D: E$ B: {
+ ~/ I( a8 J( j0 J7 P
Tetris* CreateTwoTetris()
0 q% w0 \, S0 ?2 F% ^

5 G7 d6 y( s9 b# n4 \{

3 T4 Y+ c8 n8 I$ k                        static TwoTetris tetris;3 X( g7 z9 N& H* e2 p* Z) e
) N" {8 i% `+ T# S6 r, v" ?
tetris.InitPos();
8 B6 C+ G4 ?! D
                        return & tetris;. u( w2 X, c1 @5 x6 u  v- `

9 i6 o& a* ?# S! p! m0 A4 p0 `}

+ `( E; F8 U& n/ _2 s1 x1 P
% G" {0 |9 c( R6 P" l8 {- p- B, ^" I
% i$ M- r3 a" L+ d# \; L" p, x& `

2 e! R- {$ l8 o; F" z. ]4 a' kTetris* CreateThreeTetris()
/ m1 Q( f+ i& J: }8 {8 v$ E1 q% r  k

: j1 w1 v/ a5 y8 {{

- H$ G, \5 f+ C5 n# J! \                        static ThreeTetris tetris;
; k3 c3 i0 Z" O3 R
; ?) X/ J! U- wtetris.InitPos();

1 P( l! g9 B2 o: E  Z2 K. m
5 O/ E- d4 ]/ J  ?- m" p- C5 ^
: C) u  q2 g, L+ X, I# A7 S0 G
return & tetris;
! y8 n0 Y" m/ c/ }2 V
/ q4 M  a8 B% `( c0 f4 K: P
}

; r- ^6 j& D& h/ z* W$ J* _5 s  o& E; _2 r# U1 w) o' x

1 Z! G+ a3 N# q0 F* T3 u* ^) W9 H1 e( u1 s/ J
Tetris* CreateFourTetris()
  b4 C- z0 d9 @- D8 z

1 E- H$ N; O- h3 O% P8 k{
. J$ z+ q; O+ c% \/ {
                        static FourTetris tetris;" v( i! J* V: N: A* j
7 G. l9 n  Q, U6 |) [% D
tetris.InitPos();
5 `6 z- J+ Z1 y" b- m9 r" R
                        return & tetris;! u( N$ W8 V) W) k# H, {

) o4 P7 ]; O6 a}
% u/ J; s' G3 G1 u' |; h3 g% ~# d% ~0 ~
( J% D1 d0 U# i9 s( I4 y
8 T- i- e6 ~5 E6 [- a$ h
4 L  v& X9 Q/ [, ?$ x9 p8 h
Tetris* CreateFiveTetris()
6 R# c, Y  u4 _

, P7 c' Q, u  t" Q: F# o2 P4 t{

3 F7 G; P- c" d                        static FiveTetris tetris;3 ~) s/ r- F8 x
2 R' K' R3 i  J* E3 ^
tetris.InitPos();
5 Z% C, f6 r/ w' W  v
                        return & tetris;- n5 s6 \; B# b
5 _% n7 y- ?4 H
}

: ?4 Z8 f9 @# z6 E/ d7 w* a 7 |) K5 j; C3 [: G* ^
) i: O7 I8 `) m5 a
Tetris* CreateSixTetris()
  N% H, N- \2 K2 l& H

$ I4 b3 c$ }6 n# n5 x" n{
" n4 ?/ h0 m( M  H2 O
                        static SixTetris tetris;
" N' L1 L+ P) M/ b. _9 b8 f( U; [6 u# x6 I& L6 v! z
tetris.InitPos();

0 ?) r) ^+ d: c; v/ @                        return & tetris;
# j0 U, J* C& `6 J: G0 B4 }' }: O8 \0 U3 P: z; y; R
}
- S/ R) u& S. H0 r3 m
8 b! b* E$ E: Y. E

9 h6 _) ^2 q- Q! ?; R- ^

  T2 f4 x, v4 z& h! a# A
  O- K9 ?5 n$ {1 B. J  sTetris* CreateSevenTetris()

8 F& D9 u! W. b+ J* D6 U# D
5 ]6 i9 j% h" f: I{
" l6 a( l) }" G: p! l0 m6 G& w
                        static SevenTetris tetris;6 k/ [- n, A0 F. M
* S7 o; `/ f) |- B5 M* E! ]
tetris.InitPos();

6 k1 M! l0 G% j0 f# P* B                        return & tetris;7 o7 B. o( d8 d$ S* _

9 L8 S8 e4 m- U; B6 _}

9 f3 h# c5 J5 B) V" W& \- p 5 [9 |& b5 `1 `; j; D5 I0 {
private:/ a9 v: e, F! f, e$ l7 K

, M- p1 A- \# z; `! [3 c            typedef Tetris*(TetrisFactory::*PMA)();/ k1 u" P. ]4 S3 @8 ]$ P9 K) I+ @

2 f5 \$ ?0 G3 X! b% e; wstd::map<
char,PMA> m_sel2TetrisMap;

# x) u9 i& Y/ a& n2 g+ ^, E' ~' b( p* |/ b/ S( q

0 V* {& @- i3 T3 Y! l1 P. O};* a* C$ J: w5 o

6 F. G' z! i& x/ q: d4 a有兴趣的朋友可以下下来改改玩玩。
( S& M( i8 B$ ?* y. m! u
- P. s" X0 m6 Q4 nThat’s all!  s2 T) k- G( N, ]( J& i' I4 h0 Y1 j

- X! ^% S" l3 p6 z6 Y4 bPeter * X, G9 D. W" `: N# l, O' H

- F6 T# t- d; Y[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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