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

俄罗斯方块

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

4 l& K0 C9 f5 ~; R  E+ z 1
5 M- B) Y* U! ^3 \' I完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
0 h2 E$ n3 F8 j% |( B7 L- h# z  N
. x1 [7 L: ?( \8 x

) e5 n" b  u* ~3 r: ?Factorycode如下:
3 R( m5 `7 Z6 x* b 4 a  V+ e  C* P' ~7 A+ Z; G
/*************************************+ x0 ?/ S  c3 R# \* X! g

) g7 v! z/ g; d3 T- a- l& w* author:hgf_starlovecpp@hotmail.com
6 U- K- f0 B' B; b- f
+ l- r4 H( n0 a# `, F
* version:1.0

8 G7 W5 r2 |: Z2 ^+ a8 l
. D+ G! v# U. i0 w& O* description: just for fun

) I1 K; W% R: X; e! L6 @
) a! b% s) _4 u, `; j9 G* todo: hard code exists need to fixed

' W/ v% O! X9 C& s% w2 B
* R9 C' s( h3 h, O5 `**************************************/
# ^& ?$ V1 I7 ~" Z3 C& N

) \& @/ X, h% E% }8 h& L2 i#pragma once
6 L. r8 A/ [+ W4 S* Q#include <map>5 d! x# ?1 B6 E: i, d! `( [
#include "Tetris.h"
7 S) V5 H2 G+ _# O: g8 v#include "OneTetris.h"
' J3 e6 l8 f" }4 _" D$ j#include "TwoTetris.h"( J6 x4 c' ~) b5 Z* E" z  Z
#include "ThreeTetris.h"
1 S- s, A& N5 L* F  v#include "FourTetris.h", g8 l' R5 G& _( x0 F
#include "FiveTetris.h"
. |, M+ r/ y2 w3 F, F#include "SixTetris.h"
1 M/ x) B6 c8 b& k& m1 w#include "SevenTetris.h"
9 m2 v2 V" ~  c8 X$ O, ~4 W5 A" C  @1 i . {: x+ @* F4 O% i7 t
class TetrisFactory
8 e* k8 X6 `& ]. p1 x  Q4 h{4 k" ]& H* c6 \% ~  Q
public:
& q- J2 Y  D8 N% d( v; } % _0 I1 {, `) U3 r2 |) u

' C6 x& a( P4 h; v1 m4 dTetrisFactory(
void)

* S" \) s0 E/ l( e
* a8 @& V- u8 z1 T; s- t$ y! P6 V. }4 w{
2 E" X8 z) T( [2 K1 X

4 @8 J4 w3 h7 ~# x( m* D! ]m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
* L4 C5 U) H7 k$ \8 S2 f

! T8 i9 x* J7 x# Um_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

: M; a! }' a0 h5 v  f; Y: _7 g( g, @( c, M/ F- o3 O- q/ C
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

) q, s; R$ O! b& u6 l1 O' L
- t7 _1 M; t5 w. R9 X3 E' M/ l$ Am_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
- @$ x$ i2 O* y
5 B8 o8 g) C4 I" y( M2 S8 s
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

' u% W8 T! x; Q& M! t1 @, P7 B4 w7 a9 h+ Z+ Y2 ~7 n
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

+ o6 {! L' P7 l( w6 _$ N0 @  h* Q9 F; C' R* d/ @6 u: w
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
7 {9 @2 {& P1 b  m4 K% @  L

3 G8 n! Y" t$ I  b6 h: G) p}
) F. Z, }, D2 v9 ^- u/ o9 m
public:
0 b3 O' a% P3 k5 [3 t# ~' v
# F( ?/ f5 R% L
3 V2 `+ ?1 N5 }0 I  w7 P6 R~TetrisFactory(
void)
* F5 I% u5 w4 U' c6 q: q
3 ^2 g( b4 T: G1 e1 ~
{

, z2 }0 E" r2 x6 y9 ]+ n: ]* A" b; Q* p. g2 P0 A2 F2 _2 K2 `
}

% v$ C( p& R' |& E7 _9 c! Q" ]6 p5 ]
Tetris* CreateTetris(
char sel)
* }0 s; O4 s, W9 \5 I$ `. U7 y
! y, X+ J7 N2 _2 F1 L
{
$ S+ O2 X1 ]1 F4 R! z: b- T
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
& V: t" v" j0 s8 M5 S( T. |
: X1 J! H; e' S6 r! B}
  K& D: W5 ?1 G" B$ |- M2 [2 r
private:
5 q% J5 x; [6 p* j! m9 D2 z
6 K9 }' y% d' V3 W1 D4 Z5 P
9 B! d  `9 r* N

6 ]4 \! a  H; m# y  UTetris* CreateOneTetris()

0 b! K! G8 W: D8 a3 j  q
5 E% y( ~2 e; i1 U{
5 H$ H8 Q! F4 o' ?8 [
                        static OneTetris tetris;4 @' I3 {$ O, \  D0 ?) j
( d' A4 d5 ~  b
tetris.InitPos();
9 H; x8 a2 S- f* r; q
                        return & tetris;
* ]* k* P3 R! `0 S& s6 p6 D! J7 {, L- X% P8 e
}

6 L/ \) l* p9 \* a% F4 r4 E$ y# ?: u

. U7 z& _4 s/ \; t6 ]& w7 F4 H2 u4 C9 v5 L3 c$ ^! E& M
Tetris* CreateTwoTetris()

+ V# C; b9 Q/ j9 `8 ^
) f' a5 J: u: B" R7 O{

: q7 s- x5 y, r/ `! a+ U                        static TwoTetris tetris;( N! q4 l6 X% [
3 ?- _1 x, G& r0 r: K0 |
tetris.InitPos();
& `- u$ }, L+ @. \: D
                        return & tetris;
! X( p8 {5 [; [, P- Z( i; ?3 {; E) v6 R5 V* k! B: ~! U2 b5 c
}
$ F$ b! r6 ]4 J3 m, U9 @5 |8 U
. z6 \( ]7 g' D0 ]

( e8 g# d  ~! F: u8 @
4 f7 a: S- G' ?Tetris* CreateThreeTetris()

' z$ S0 o' w$ j4 L
+ r1 C& z6 y$ I{

' o: Q* r/ {' k. z                        static ThreeTetris tetris;
7 R9 ~  B, }% n6 J% A+ a  g
; _. c' D3 F) T' k) x; x" |tetris.InitPos();

& g0 D3 Q$ I; P8 j+ ]* i: w  d
* ]6 ]" Y/ m+ B6 y+ L& r# d0 V0 c/ h
return & tetris;

: ^3 Z/ Z& {5 T' f% O/ h4 K- g* [4 ]6 S8 f+ I: x1 ?) y
}

: u+ b9 ^9 o: h# M" ?! j- {" H
' F% E( M8 A" N; W( j
& q2 E& h0 \' H* I+ G: i) U

" P) S% P9 {2 @$ l8 U/ A* j/ tTetris* CreateFourTetris()

0 |7 Y0 m! R3 G( n0 t% C
& ^" N; y' A2 d$ ~{
: O: N7 w4 y1 d7 e& I0 ^8 W
                        static FourTetris tetris;
4 V4 V2 F: X( m7 K4 H5 m# c
. s$ H$ M9 X) X% I* X5 ^% Btetris.InitPos();

0 R( j$ ?6 _" s5 S5 f                        return & tetris;
) e8 r0 y" _7 g8 o( n
2 B) f7 v* L9 T}
. W1 l; W0 V/ O' l
+ x9 g6 v) @# K$ D3 U& O

; E/ H# m* A, j1 f; {9 x1 E2 k1 y
; Y% m6 F* r3 q# r! c: DTetris* CreateFiveTetris()

1 `% w& v8 x' ?( b8 a# {
, w, a) {# O4 l, H& i; o; d{

1 g# @* b( `/ J) P" t6 l                        static FiveTetris tetris;
) ?. O. k6 L+ S' m# S. ?
& q8 D6 D3 u) p6 otetris.InitPos();

; s' U! @' Y$ P( _' o" b                        return & tetris;& {; U5 J* o8 B) a: a% H9 O/ D$ Y

. J" V% i' r4 E* s; L7 M' {}

  Z8 F9 T2 o6 f  r   F+ Y$ W5 ^8 Q3 N6 G
4 P4 N! O" v. c7 r2 F2 K* R
Tetris* CreateSixTetris()

  t% F6 n$ b& B1 `1 @- l' P! Z* v! J
{
- F! @7 T* g% r+ `, p$ s
                        static SixTetris tetris;
. t$ O+ S6 Q. b* I7 s
+ E1 m3 @, H" K) E! ktetris.InitPos();

0 b5 e% m% f) x" Q" u7 V( F% f                        return & tetris;
8 v7 A/ m3 ?! N# \
8 N1 L. D& K' h- M, x1 C% K}

8 A/ Y9 c$ \% F; v$ f: L- `5 }. D
! j; h5 h( m* [0 n# T! T# A( Z% W& i9 `! K( V" h0 C

" w4 q* @( A1 q" Q% ^0 U* H& o' T3 [( A! n) u
Tetris* CreateSevenTetris()

  K2 o# }* d) c4 r! k+ l7 @
$ y. T& I" j; D2 Q+ k- I{
( d/ i1 [. H; B; g8 g
                        static SevenTetris tetris;" J& j& x( F* x8 @* L) v

% _% N# g! E3 C  y5 ~) w" vtetris.InitPos();

4 ?% s. k/ O, a# H/ g- W                        return & tetris;
9 u6 L& r5 ~2 c+ p8 p$ H4 E& M
% C- h8 w9 P5 B* [9 Y. J0 ]}
5 [1 S: q2 J- C3 J" M6 S
6 P3 b# \+ n3 U" p  z- R- {
private:! E. K6 D. f* {8 B* Y
; O3 ~3 `0 y2 E  Q' m
            typedef Tetris*(TetrisFactory::*PMA)();) T) y& x5 |, M

" X  a0 h( R8 u6 o6 tstd::map<
char,PMA> m_sel2TetrisMap;

2 @% B5 B0 h) p& c- c- C
( S, a" M: M6 C" @
; L8 @4 L6 _9 @$ ^( i3 I2 Y$ K% Q8 W
};# C3 @7 ]  Q) S% K- t
+ d! \& R/ }. }; c
有兴趣的朋友可以下下来改改玩玩。" s2 M) l0 J1 ?$ Q6 [& f& a8 ?3 C

' b! u# O0 H5 y! n6 r1 e$ AThat’s all!# A: X. A! G2 }4 Z+ Y
+ ~6 ~2 o" {- V: S$ n
Peter 1 t. u- x9 _9 P

  S7 @' g' V0 }+ [5 o8 a[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-4-19 22:20 , Processed in 0.085224 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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