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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
2 Z, p5 c4 \: K6 a
1! u) i& G) O% {+ v$ e* q2 M
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:# ~6 c% U# m0 L

) h4 S7 L9 ]5 ~3 C  I
4 o8 @% u; N' G2 X
Factorycode如下:4 o) t2 _6 T7 H5 R$ \

9 w/ X* y+ V( [. [* z2 M3 P7 g' M( G+ N4 E/*************************************0 I5 P/ _6 f: e) X. `* j' J
- [8 Z% Y, _  D* e/ }1 z& U$ s
* author:hgf_starlovecpp@hotmail.com
# S, g9 T8 \' L

! k' M0 R% g/ k" c5 a9 {* version:1.0

1 \) {, X2 f0 X8 B! @$ g0 {
4 b  H- r' e" t/ h( E, r$ E' Y* description: just for fun
% C: s4 e6 E' r
" v& _5 `# v# ^6 J; }
* todo: hard code exists need to fixed

! r; Q# p4 ]8 q5 f
5 y+ C" r% K# W9 K7 V+ [+ J: {% b3 [**************************************/
  a/ x, @0 E  _1 ~" R9 n7 f  E) m
  |( ^- w6 {$ ?. R2 X$ o
#pragma once6 C3 J/ F5 D3 W
#include <map>
& ~4 R, E, V3 y% C( M#include "Tetris.h"
/ S7 K$ |0 N! a* g( L# P+ C#include "OneTetris.h"
/ l0 V- I$ y4 M# [#include "TwoTetris.h"4 }' r! V& \( v4 w8 a. w
#include "ThreeTetris.h"
  l+ x* f7 n! u#include "FourTetris.h"
+ l& K, k0 v3 D3 T1 }#include "FiveTetris.h"/ C- L: l" C& b- q
#include "SixTetris.h"! [8 v% \% \6 u) e
#include "SevenTetris.h"  h* t  d2 Q" U3 u0 I1 D' O5 p+ m
7 p& x- S  D! ?$ |+ S* J. a' N/ F2 U' ^
class TetrisFactory
, |0 n& Y, C  W* d- o* c5 `2 j{6 M9 e2 V) c8 A7 L. F- B# ^7 `
public:
4 k# m) S" x, B0 u  ? 9 T3 H6 P$ @7 N2 S! `0 E* A6 z
& q' b8 g  @+ ?9 ?! C* K: H
TetrisFactory(
void)

0 A4 G2 c$ z% A; P+ w0 E
1 X: a' f6 K4 [* y# t{

0 Q) [+ N/ l6 s* R9 p3 v) k& `" s0 x: F; V7 M/ }  B
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

- Y6 A: F  g+ ^8 z0 b+ f- x# `9 ]! ]
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

; e) q( |1 l5 E0 N0 o. s0 M
6 i  o" W: x2 Q3 Sm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

8 H1 t8 T0 I, f9 g' X
9 Q( y" h- s, `8 @6 n7 {2 c& J5 Vm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

1 o+ D0 i2 J; s. }" c- k+ [" w& q* _, L) H# ^# a4 V4 E
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

( `- a0 r% B8 f# _/ s7 L! h/ V4 J* x3 E: Z( z! C( e
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
' ~6 X( L' |0 l# |

/ q- d6 y) J5 K. s$ qm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

5 z7 G' u1 c" B2 N
. a! W& U7 n4 R- {7 L5 K}

4 _8 o. M2 ~* ]1 S( g/ Jpublic:- A. P" Y* N7 `
5 g# k5 v' E2 r! g8 f) t

# \' P3 z$ I* Q( a) e. L7 y3 g~TetrisFactory(
void)
- W1 f: e# w, a; @
0 \( W1 n7 l+ S9 R% H1 X! g. A
{
3 t9 s' W4 q. F" P, S. \
, D: s3 _$ c. }* x  H# \/ t
}
, e4 r- I% W# U; E- T0 U3 r

8 A; G! F+ U4 ^, s" D; [Tetris* CreateTetris(
char sel)

4 x! r) N; J. Q& H
! L6 q9 ?% }& ?: U3 w3 `{
* W2 b( r% a6 I: N  }
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();  C5 a; J  O7 n1 ]6 A6 s  \, n
9 }; F6 Z+ |' L- ^; h. a
}
9 L. H( g8 {( z
private:3 a4 F7 W1 |/ Y1 P+ x& w* B8 k8 S0 ^

3 K- D2 U  B. N1 S  i
/ F0 @) ^0 @9 U* l3 D2 P! `
4 k9 b) z* S. Y0 [5 x% w
Tetris* CreateOneTetris()
. q4 D  ~1 W7 q  b; w
' _7 T- {; H) D2 V; ]/ P; d
{
0 `! K/ g1 w# O$ N4 `( n
                        static OneTetris tetris;. c: G  s* z4 A+ j# X* G

2 V: f& e7 V" |; k' R$ h  p, X* l1 Ltetris.InitPos();

' b0 d4 h" m# A& b- N2 [9 |                        return & tetris;
7 e, C- w& Q& R! q- C$ P* U+ j
5 k$ n# G& P+ J}
# I' |; H+ g- p
4 M' q' H) ~" g; `/ f* g, q

: |, _' w7 Q! M8 e* ^! w: d# c, Q
Tetris* CreateTwoTetris()

8 B9 a3 G* p, C& h! d% e8 i) @+ d* B& ~7 \# o  U
{
8 f3 M! Q7 q9 E( P; V; e7 a# a2 |: X
                        static TwoTetris tetris;
4 G3 m8 G: k( l( s9 N- D: n: h, h. a/ r8 C( [  E) ]
tetris.InitPos();

6 F& t) y/ p, l  @( G                        return & tetris;
& U# `9 d/ ?# {. k7 |: h
" S% W0 ~- P, I}

( R1 J$ B- \- r5 V6 x4 n* r' l
7 ]6 ?& y8 \: m1 ~; {  _4 v

9 l& A/ ]" x, K. W" N. G, w
7 r! k0 k+ ?, ^' F3 [, X8 lTetris* CreateThreeTetris()

8 |; H4 h; O* s" e1 C8 n* e4 ^3 W
{
1 K4 \9 s3 v* n0 q' \* F+ H
                        static ThreeTetris tetris;% Q# {/ s- \2 A( W

5 B' \# G. S6 m" H' F% Ctetris.InitPos();
2 Y- }. w( {1 V) \

8 x, Z5 f. Y$ C3 a% F7 \* c( v* x/ j2 y
return & tetris;

! y) m  ^3 r% F9 p0 J" R
; R6 H# z' k. M$ j}
$ n3 Y' d% g  W* {0 ^2 t- S

* x+ V4 b6 M3 H; {; {2 S8 Y; x4 t* L

% H; E4 N3 P  L: R
1 _" H) M# \4 @, g8 O' KTetris* CreateFourTetris()

7 r+ n8 \" k' F; z* q: a+ t
; A2 t; J, U+ g' E( R- q{

5 S% I7 @! h" s: P* _$ d                        static FourTetris tetris;% Y2 B5 {6 f( H* D  V+ A- U8 w

/ i& l: l, e5 r- `; `tetris.InitPos();
6 l+ l6 j7 T+ \4 c
                        return & tetris;
+ c; C+ C9 \2 b9 ?) H. ^
$ K) b: N% K! j3 h}
5 ~* p' p$ }0 \* j8 w: P  `0 [

3 |* U) D" C9 R8 ~4 |# X
! `! i7 G9 Q. }$ a  Q) t
+ L" X4 G  [$ ^4 l# {
Tetris* CreateFiveTetris()
) u8 ]  S' w+ ]8 D( G+ D
' O. o$ c' y; R- I% e$ Y: @! [
{
! Y$ v. @! |2 A  r! T+ s& w2 {& _
                        static FiveTetris tetris;5 Y* U4 v% d+ k! A1 G' t
; X+ A6 x3 P# }
tetris.InitPos();

+ w, z) ~2 M( p" D7 L9 ~/ W; n                        return & tetris;
* A$ L: p, Y, A2 `6 _' Y6 `) E' K. O# J# f. D8 h8 `
}
. d0 `( o8 y. t
6 @$ {! E/ Z  X! o7 z
7 T/ s% I: v' |$ b* J
Tetris* CreateSixTetris()
& T7 [4 t6 n' q
( H( k2 H( \. G$ ^
{
0 G  e2 }" }( G& M: i2 j/ Q
                        static SixTetris tetris;: ~$ T! S" h; \+ |6 Q& r

) A& m1 i( s6 g: k: F$ Otetris.InitPos();
; W2 K& O' k+ o9 U' Z$ T* y
                        return & tetris;" t6 o) ?. B# w6 E% k% x) h

, b) z0 q) B) ~}
5 Y/ C/ j# H  {2 |
) D3 X" _6 L; U' @1 D

* g/ V. w2 l% ]4 b) B3 l% F

) h0 x1 d, l: T. u3 o& B9 h$ f5 O/ g' K3 |  _
Tetris* CreateSevenTetris()
. V$ k" C4 K' D. E/ {: R6 r
  x# \9 i: I% t6 Z- {
{
3 W$ k8 u; @0 G6 s" g, G
                        static SevenTetris tetris;' d( C# P& D" T

: x. Q, j2 s$ t* E' Y  }6 Y' Mtetris.InitPos();
% P( x3 ]% G9 ^, l' M* T% p
                        return & tetris;
+ \4 L# H1 Y; P' r/ P. Z
3 O) U+ Z# M  X5 p3 h}
" L2 o& B# h& b; z- B

) w' z/ T# G2 v2 o+ rprivate:% h( Q9 L1 X& T' j) F

4 Z. k8 u1 l$ N0 n            typedef Tetris*(TetrisFactory::*PMA)();5 l7 V% r3 ?6 O  Y$ N: a- ]- L

" p3 |1 u- R, p, [: T6 h; Tstd::map<
char,PMA> m_sel2TetrisMap;

, x# x2 R* ^1 e" D0 O
/ ~' V% \4 p" L* h! Z% h0 O

9 l$ r" e* y! T( R};7 r) H$ g% t& j  G; D% [* D
; u8 R" Q, ]; w
有兴趣的朋友可以下下来改改玩玩。1 l% j/ M4 _& D, G- Z

" O1 e  l+ x! M% ^9 n" lThat’s all!! c$ @; \; ?1 V! L7 y  E2 E

7 B4 u$ {5 j8 ]5 Y, j$ k. l4 _+ OPeter 5 J3 H$ Q9 B1 {9 o
$ c% l7 b+ c2 `; m
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-9-1 16:55 , Processed in 1.695154 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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