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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
( g/ S: m: ?, S0 z
1
6 ~' ?8 Z! b# [6 A0 X7 G; k+ ~完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:  |  u" |9 d# H" k. F) k
, Y6 w; r' X- [! ]$ V' L
7 D. @$ ~  ~0 X% K  r4 l
Factorycode如下:$ ^* m: R0 [# G

6 @  G2 [2 z7 h0 s6 E8 k4 b, d, m" N/*************************************
0 Y3 |7 A* J" `$ R6 h* V/ s+ P( v& B1 `/ U
* author:hgf_starlovecpp@hotmail.com
( p. `( A! X7 v% \
- V8 ~: v" I* s' B  J9 H
* version:1.0
* |' X5 A% G- s' X/ E( E& {

. v7 |* X5 _9 B' W2 N1 G) K6 H* description: just for fun

8 H, ]7 c2 x* G" n6 U
/ P4 V; ^" |9 F/ d; y/ ~: z0 z* todo: hard code exists need to fixed

% v+ V: {  B  L) T8 A! a% @5 d7 J: \+ a0 u, ~0 q$ v
**************************************/
) @  ]$ @$ p# C; t
1 \3 I% j# M0 L) p* m  h
#pragma once
5 V5 `  o$ P8 W+ S#include <map>/ \% f% P* D- W1 O4 Y( x' S2 ~
#include "Tetris.h"9 i! }8 d. ?( A: J' o! M+ R
#include "OneTetris.h"4 `* p" Q# Q" N1 |8 i2 h  J
#include "TwoTetris.h"4 Z+ e! M+ H" a1 X, e: N& V9 p
#include "ThreeTetris.h"
: x6 x( B$ n- @+ H! K0 L- J5 J#include "FourTetris.h"
4 ^# u, _" ?( j. h, R& D#include "FiveTetris.h": ]+ R' v* k/ _- a4 E) O" c
#include "SixTetris.h"
; ?! y- l3 \! ^! |#include "SevenTetris.h"7 F8 R* x3 q6 v5 I+ j. r0 Y
7 D6 L+ C- O4 `) d
class TetrisFactory
# g* @6 f% p& m/ }{
+ @5 ~+ v$ U* u, n$ t# Rpublic:& P6 n9 G2 T  u, Z9 Y
; c  P$ k/ ]  G7 b5 P
$ x- d# ?1 p2 V  K8 Q" g
TetrisFactory(
void)

, i) j/ f; B% q+ x- p0 w4 s$ [9 {. Z' L# R6 w0 k
{
& q; F; k/ F' ~' _. e
; b$ E* R; m  }: p& e7 c
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
6 W5 J4 M3 C6 ]( u! ^- ~1 z

2 M( [- C) R* ]# ^m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
$ d- x, g' s4 Y2 y

) O! `' ~7 C& a1 p+ |m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

1 n4 o. {( b  K! o6 v1 u3 d5 {
! P! \* Q4 e% \$ @. v( ~" om_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

6 ]0 E1 L- B3 y9 ?- U- H" @. G+ ^" D5 t" h) f* G5 t0 y: c
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
9 X+ f) m0 w3 ~

3 k6 {6 j- F2 Y& f& \& d* Z' Sm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

& p, E$ D- Y. X* H& p$ c
6 L" L7 z7 N/ b. _8 a, o7 Um_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
0 X2 V6 X1 |4 m. ]8 m' Z

4 r' e: F  `: R% B}

5 j+ H$ W3 Q+ {! N4 Upublic:/ ~% B0 H, o, u

% D* A4 \' J, n
$ M1 n; m) V# e+ t6 O7 [4 `0 ]~TetrisFactory(
void)

. O2 A+ m1 n  C$ E  M  D7 e2 P: q/ \
{

' }$ A! E7 H7 V( a1 {4 p9 Q6 H
5 a% x+ D( i1 N  |7 G1 t}

  U* ~5 V% l" D1 `8 g! }1 q) S1 S& e7 @: \* V$ ^
Tetris* CreateTetris(
char sel)

2 L4 q/ C8 T3 T! E- K7 i* z2 {5 W3 n0 M; e
{

( l  c4 u" F( r9 ~/ }& Q# f                        return (this->*(m_sel2TetrisMap.find(sel)->second))();6 @1 K/ ^% ?$ U( Q& H0 d( u
7 t' J8 v, E$ C5 n& t5 _* [
}

; M, ?7 b& u6 Wprivate:8 ?% S# C1 L, w' P3 b0 H
8 n2 k, t( r( X; \+ z: W6 U

' z% `# A1 j% w5 b% a8 q1 F+ R! ~$ h0 t- `' [% e$ y
Tetris* CreateOneTetris()
% d( E$ h( J4 r
" k; q/ e9 ?  F# E! c
{
6 C- E+ u, J; X9 R# \% t
                        static OneTetris tetris;5 w  Q% S# d3 ~6 g3 G$ r

0 ?- x: F& e: E8 t( v0 Z( Ntetris.InitPos();
2 `6 ?7 b0 Q' D1 X
                        return & tetris;
- i/ O) L. ]" b3 F9 r
  c& |, [5 K/ g' s$ {* s+ U0 D}
  E4 t3 z) z2 F( B

* o) J8 L# e( O, j
7 r! o! ^" s7 \% W" o5 Q8 O
$ a8 z* |7 K6 f) d
Tetris* CreateTwoTetris()
* U& z- w( ]4 l0 B! c8 n7 t$ m1 b* k

8 P/ G8 J! H" l! ^9 D{
8 b9 b% K3 x/ T$ o2 K: z0 u
                        static TwoTetris tetris;3 X3 B; m: n* W1 w2 V9 S+ s
2 N6 J) p  ^  p& y2 r' }3 Y7 u* G
tetris.InitPos();
6 Z5 @+ L, Z9 P6 ]/ J! g- V# ~
                        return & tetris;; A, i. p8 E0 P% ^0 I6 K. Z! p
; w1 Y" [( v& k
}
* L% z, x2 ]0 d/ Y

# _: x$ a/ |- I! g

% q4 I) |4 c) w$ [" g
# A+ s1 `: I* a- `( c# W% tTetris* CreateThreeTetris()
: f9 e+ D1 m; p) c
) K- M& I9 @7 T
{

, Z# P& ]' Z; E                        static ThreeTetris tetris;
% Z$ W4 L2 F* y& C) A2 ~* y4 r% U% l; ~8 f: e- b/ G2 e# q4 R
tetris.InitPos();

, N7 k1 c: q7 {0 _9 F
. N9 ~0 u1 Y+ _. ?0 ~. I6 \4 ^
* x. ^: j  z* `# t4 {. F
return & tetris;

4 b8 q& x& ]# f) c6 ^$ I
. H/ e$ f6 b, `- h7 P}
, ?0 H( I( P. H/ o% g: c2 S& {
/ ?% i3 p2 |3 r8 z# _4 A  H/ f
$ b4 A6 d( Q# {" S; m  s

. K; }6 a# T+ t. x5 ^. K9 `5 Y/ w/ qTetris* CreateFourTetris()
2 y& ?9 o+ D, m( {/ o5 m
3 J  {" ]& @) ]
{

3 Y( h. k  t. o' h9 w) k$ J                        static FourTetris tetris;
/ }- C3 e7 W' C! W2 d/ A
& A/ U0 J% d% V& Ttetris.InitPos();

; z; D0 R* W3 N; {                        return & tetris;0 }; ?' f' m% J
8 F3 Y4 c9 M% o, b5 v" |6 F" Q+ t
}
8 l4 X3 n( b6 z, x+ w1 I4 f

% P' `9 C5 L) X, w) j9 f- K& R
2 ?5 E$ @1 o6 p  Y: `: A2 g- q* m
. }" I8 s: S  Z3 U3 I9 g, v& p
Tetris* CreateFiveTetris()
& {' i( Q6 g* Y" M1 U- b

8 ?  g& Y" \2 U& ^: d3 F: M{

" p4 {( n) J+ `: a9 Z% W                        static FiveTetris tetris;  x- O. o+ j  c. k# ?5 q& }, a0 }7 p
- H" v* E. u% Z7 \1 a
tetris.InitPos();
7 |5 w0 s: y6 r' [+ r$ x& ^" i4 e
                        return & tetris;: x* s- u' s' [# h- {" E

$ d& ~# X2 _# K1 P$ I+ o}

6 d4 y+ t  o' k; l! H4 N% ^ ! |; q: j% ?% I8 I' {9 j
4 c9 p% y0 h; c5 s, t9 T" H
Tetris* CreateSixTetris()
9 }' M( f6 s5 Z* h# t. w$ F8 F

9 o4 U2 v( n$ y8 y+ d0 D{
7 v& r/ T4 b7 o- m
                        static SixTetris tetris;. @+ H1 p, R9 d8 ~7 |
/ @. X& P1 o, U$ q. Y7 M9 z
tetris.InitPos();

" Y: l" d& c" @- k! b* Y; d                        return & tetris;, C! L( I  b5 @
8 ]) O5 ^. m: ~+ j. U
}
7 M. s, q* v3 C6 P& I& N

8 F6 H& |" {& Q/ s! x
- D" |* d) B! `' S2 }

" R2 v; |; q' z9 [1 Z0 B- Z
7 k6 G. j, c% F4 v4 i( c; w- q7 x2 oTetris* CreateSevenTetris()
1 ~. B4 |5 Y5 e3 ~) _2 q, v

1 N( m/ [7 Z1 d# d{

. v2 l# a! ]# A/ i                        static SevenTetris tetris;
% k6 z1 ^7 v/ z9 w5 u# B, x
; J) E5 r; S% ^tetris.InitPos();

1 r5 `. _4 F+ E% t0 |                        return & tetris;4 C2 x0 `5 W& Y# m

+ g( w8 j. f% o) x5 V}
: D) f2 j: K% o' ]2 B& h% w/ f

5 s  _* P. @+ c3 Iprivate:$ W" C/ V' e, H% L) h* l

2 K7 p& G2 ^9 M3 k            typedef Tetris*(TetrisFactory::*PMA)();
' k) c) g* L3 ~4 R+ ~: ?0 F3 G+ a" W+ H
std::map<
char,PMA> m_sel2TetrisMap;

: j' L9 n. {0 ]1 b2 R+ u/ t2 ]/ x6 Y  X

& X7 M3 h6 K4 S5 r: k};7 a$ u( d) u: h+ c+ t1 \2 u
4 l4 R$ B  }+ U/ q" G0 Q6 X0 j
有兴趣的朋友可以下下来改改玩玩。9 l4 z0 g5 q- o7 t5 G
! Z+ h2 X% N4 C7 j
That’s all!3 v$ J# `3 A2 w
0 e# b( H' E4 Z: M
Peter * |2 \, k( D! N+ }1 k6 X
  {* {& s6 S" q1 I8 m
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-9 19:04 , Processed in 0.025824 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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