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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
0 @5 p2 {( w! }9 _# S
1' m% ~$ f8 F  I$ F4 H3 j" j
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
+ U# V1 _2 f% j+ f: D+ X' b6 R) o- A9 ]% c
/ L) R+ |9 L9 o, n  H( t7 I
Factorycode如下:& R+ A% e6 T1 [' B7 ~9 h
% `1 [1 S# q0 [- l5 C
/*************************************
! o) S" ^8 j/ \! v
8 j% A8 i9 Q! n/ A) J* author:hgf_starlovecpp@hotmail.com
- V' L5 F8 P% L& _' ~
' F% s1 {, \2 C1 l) A
* version:1.0
& D5 J- Z4 r( I
! b. M, _" v; Z* v5 P' {6 x
* description: just for fun

+ U* r$ y- y  l2 [0 z( A9 \8 `) l8 z" e0 j# T* j8 {
* todo: hard code exists need to fixed
; a$ n/ I8 y8 ]* q, ?
' g2 ?" o$ U- E: a0 M
**************************************/

/ K5 f, P- v( C! x) V  V' j0 v 2 {! s4 ~: b" O
#pragma once  U5 |8 ?, N; g% Y
#include <map>" p* ?" H* p( `+ l- C9 F0 C3 i9 t
#include "Tetris.h"
6 S% Z; e+ u- h. K#include "OneTetris.h"( H& q4 w6 p) f- m. D
#include "TwoTetris.h"# s3 K7 r% c/ B  g
#include "ThreeTetris.h"# M5 t4 H# `7 k6 l4 A8 h3 u
#include "FourTetris.h"/ E( W. F! S9 b- q
#include "FiveTetris.h"% o2 Q' V# b( E% F0 }* C/ L
#include "SixTetris.h"+ n0 g8 ~% u3 i3 ?4 @; i6 A
#include "SevenTetris.h"
8 ]- c1 D5 V" d5 ^- b# F8 ]0 V+ z; I
% f! w- m2 @( pclass TetrisFactory
7 |7 b" [* n  Q+ K# s1 S{  U( M8 C7 `( w% b
public:$ p% c) d5 V+ H: |
; p) e+ ~+ y6 h' {* C* i' S8 v

5 q, _" A: R6 }( I# y, p- mTetrisFactory(
void)
. w3 e7 _# P" D0 d

* |# k  _9 ?. D{

1 @9 B% p' x% p: A/ d  b
' P$ K& V1 n7 mm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
% U1 J) e+ ^( {( `5 T0 l' u
$ _  {% `, z) L* d9 x8 o8 q3 h0 P1 k9 v
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

5 y1 h) ?2 ~4 x7 J6 F. w! e8 f5 W6 B4 {
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

& }/ g- j& q6 d- l, ?' ?8 Y4 M: R! X' c9 l
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

: R2 h* L7 Z5 {
1 |9 I" F4 }4 d- z$ em_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
, }: z) C8 i% P0 k8 @/ t
9 L5 p6 v4 y0 {: A8 _! e7 j
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
2 w( y5 v* }) r# X8 o# T

6 F1 o: |1 |* L% _m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

5 l$ O6 L/ e+ c# J9 h7 P. Q: _' s3 @8 c+ g
}

/ Z/ }, s" w8 m1 R, ^# r1 B6 zpublic:
* L) p  A7 a& t# U: W 2 B8 \6 A4 |5 U8 \1 V* ~3 M
: c* \1 m3 P5 x
~TetrisFactory(
void)
, _" {4 t( {- A# a# u: @
: h! U9 `3 z) l5 p1 y
{

9 U! c: L" Z% L
5 Q* h; x9 s6 r+ [}

% [" k& L6 l) Z: m- \+ J
; c- t% f# d) U" I( |+ STetris* CreateTetris(
char sel)
8 N& c" l+ ~  v; M
  J$ l7 p. n1 O6 m- R
{
' k7 V2 {& i! D# g2 |3 e
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
% h1 z, h# t% k" {) z+ H7 g( G6 ~  X% u  z8 p/ k8 Z/ B, l
}
* W/ k0 V  b5 `+ b! T3 o
private:4 w$ D' u( x1 @; n$ _+ [

- {+ R% v" |. S7 o' z. \; b( _; U
" A! f0 Q  I: n3 e
/ ]# }+ I, J# D
Tetris* CreateOneTetris()
, i' l" p# s2 K3 Y7 ?1 e) J

) E8 I: G+ @0 K{
9 _4 N/ ~; g6 U, R7 u
                        static OneTetris tetris;
# K2 t3 ?5 {1 v( _6 @7 D  V# i+ Y- \$ b8 T  `6 f& ~2 ?. i6 k
tetris.InitPos();
3 a# s8 l3 `% s: Q* w: o: a. B
                        return & tetris;
8 {0 }% |. G& s' q0 n$ L! z; a5 W2 \! a; \& c$ q
}
# ^9 |$ {" y# _) a1 c- X# ^
0 @7 u9 R2 D& l2 f% h( D

2 n+ V6 b& ^" j0 }) C% x  X8 i8 R. a. P1 I* h$ {$ p' ~) d8 E8 Q
Tetris* CreateTwoTetris()
# |3 J4 S9 d; s# U1 }

& F* ^8 V& W+ |. ~6 J{
5 M% B" V* l6 O: o3 a
                        static TwoTetris tetris;
* Y5 e5 u# c" S6 |* \& n: L8 d$ F& F+ P9 k9 o& R
tetris.InitPos();

. z& ~$ G7 l7 W! j7 l$ `                        return & tetris;
, |+ D& Q" p# \- }0 e# Q9 E% w8 o0 ]5 m5 A! I% ~7 T1 j
}

3 m7 z' p2 f( ~% [' F7 h
; Y$ V" b/ P+ t0 w

% F% @- J2 x+ N1 m" b# j$ S; q2 C( U* O0 f/ H  G. G
Tetris* CreateThreeTetris()

$ F% e' X& r% n3 o
+ a  _# C  b. x& z{
) S! q7 }+ V" f9 {+ f( b. N
                        static ThreeTetris tetris;
" d7 F: K. R0 q) ^6 M) U  {* `
5 H* ~9 p7 ]" o. g. J7 P( X: e! stetris.InitPos();
( U5 Q5 W+ i) }5 X. h6 {
2 z& C2 `' N+ E9 ~0 T% d

7 B- s6 y% S9 |; s. d7 _5 L" I4 v
return & tetris;

* }! z' I8 _; M6 C& J/ p' G" i( H+ ~4 A, X0 `4 R( p
}

# D* Q9 r5 e' @4 q' q. o3 v, @; @! I) \5 G$ k& F. K

( c# y5 D" Y' {
3 _! k. X9 A* @Tetris* CreateFourTetris()
& i' \4 k8 ~, q' d6 j% D  a$ h$ ^
  W, R6 j5 K5 T" ^  v
{
$ x) Q/ A  q! s2 @: T6 r
                        static FourTetris tetris;
* N- ]4 B: a3 F% R, _/ p
$ S6 ]/ ?( o5 m7 {tetris.InitPos();

8 }# ?: ]6 m$ n( O) A2 X; m                        return & tetris;
4 [6 J$ e/ H, a' b
, z' k0 H4 l# p}
& I( ]" a( H$ N

0 N) D; b+ `3 w6 w% n9 n1 Q

" K; P; _# P4 h6 X
5 _7 M7 ?4 B) H4 @' X, pTetris* CreateFiveTetris()

9 f. W/ q3 k1 V
- C9 ^8 k4 Z& p4 G, M/ C{
! W8 h! y7 Z5 O4 d, c6 Y
                        static FiveTetris tetris;$ P) D) f$ {& s! [

; X, {8 T: Y. c1 ntetris.InitPos();
, Q- K3 O% A  K5 N
                        return & tetris;
( [* n4 M; }% v1 r7 }9 i9 ]! X( q9 X& m/ E' B7 g
}
$ r) Q& v3 C& ?3 R4 E
5 l! g. J; h4 P, c- }. i& h0 e3 d

0 A' U3 s& @/ @/ dTetris* CreateSixTetris()
1 g4 [4 k" g+ l$ `: C

  i3 O& _* }9 @{
; k- y% J6 }$ \! P2 P
                        static SixTetris tetris;
/ \: p) K9 t2 R  n( I  i. a% x5 t- s1 N
tetris.InitPos();
; Z6 a$ y" \5 r$ {7 m+ l1 o
                        return & tetris;
. S) n, k1 Z6 C% Q3 c* S; F& _7 D
}

# \/ d: R, |! G/ A
7 V2 {5 N/ X) ^' d5 Z+ w# t( U! |1 O" l) q7 q  I5 {0 A

. X! D- P( I1 O8 A1 ?$ f* @- L8 f0 U8 t7 V+ w6 F$ I
Tetris* CreateSevenTetris()

. z. L) b* V5 K. |. t3 I/ V
9 b! I9 N5 t0 B5 s{

5 s( e8 X( J$ q4 g+ I                        static SevenTetris tetris;
; W. K0 ?0 |: L0 v2 g  a3 u& E5 A7 d9 ?: c
tetris.InitPos();
# }$ D# [7 k& h/ [
                        return & tetris;2 @7 M4 G+ [1 O

% V7 p8 U7 A6 o& u% N}

: j8 u. N; W4 Z6 F* O + z6 X2 _. l& B0 g' J
private:* O# w) r' g3 ?5 S
4 o& {6 v0 p! ^2 y: J
            typedef Tetris*(TetrisFactory::*PMA)();
' S8 y' u+ f. `( D7 `, ]5 _3 G" v6 O% s! U) B9 u
std::map<
char,PMA> m_sel2TetrisMap;
* W1 E& X* v$ w, e
: W2 c# }8 X4 n' E5 O
- k/ O+ p4 D. J0 i; g
};" b% Q' k5 g1 J5 l+ j, t9 `% K

! `+ p/ \  k/ y. m+ c有兴趣的朋友可以下下来改改玩玩。
9 k( Q1 v; w1 v  k, d 8 H6 k! R0 v9 u) Y! i  J) g! j
That’s all!  z; o1 Z& A0 K+ q' s6 d. h
) K" _4 H) W7 s, r) N- d0 M
Peter
3 E/ \+ U$ R1 r) ]% }6 `' z4 X5 n- L  q4 V; D+ L
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-2-19 07:16 , Processed in 0.049712 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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