|
游戏目标
移动小块的拼图零件使它恢复成原始图片。
操作说明
用方向键上、下、左、右来控制周围某个小图案往空白图案移动。
程序源码- /* * * * * * * * * * * * * * * * * * * * * * * * * *
- // Project: puzzle(拼图)
- // Author: problue
- // Date: 13:14 26/08/2013
- * * * * * * * * * * * * * * * * * * * * * * * * * */
- #include <stdio.h>
- #include "pcc32.h" //from ROCoder
- // 定义控制台窗口尺寸
- #define APP_WIDTH 40
- #define APP_HEIGHT 20
- // 定义拼图坐标及最大尺寸
- #define PUZ_BASE_X (APP_WIDTH/2-5)
- #define PUZ_BASE_Y 5
- #define PUZ_ROW_MAX 5
- #define PUZ_COL_MAX 5
- // 定义空白图片的编号
- #define BLANK_NO (puzzleSize.r*puzzleSize.c)
- typedef struct
- {
- uint8 r, c;
- }POINT2D, *PPOINT2D;
- // 拼图零件
- typedef struct
- {
- int no;
- char pic[4];
- }PIECE;
- // 游戏等级数据: 拼图尺寸、拼图图片
- POINT2D myLevelSizes[] =
- {
- {3,3}, {4,4}, {5,5}
- };
- static char myLevelGraphs[][PUZ_ROW_MAX * PUZ_COL_MAX][4] =
- {
- {"╔","╦","╗","╠","╬","╣","╚","╩","╝"},
- {"△","▽","○","◇","□","☆","▲","▼","●","◆","★","◎","⊙","Θ","¤"," "},
- {"A ","B ","C ","D ","E ","F ","G ","H ","I ","J ","K ","L ","M ","N ","O ","P ","Q ","R ","S ","T ","U ","V ","W ","X ","Y "}
- };
- int levelNo;
- POINT2D puzzleSize;
- POINT2D blankPos;
- PIECE puzzle[PUZ_ROW_MAX][PUZ_COL_MAX];
- int moves = 0;
- long appTime, playTimeS = 1;
- void drawPuzzle();
- void drawPiece(int r, int c);
- void movePiece(POINT2D fromPos);
- void swapPiece(PIECE* pa, PIECE* pb);
- void randPuzzle();
- int isFull();
- void printScore();
- void gameStart();
- void gameOver();
- int main()
- {
- int isOver = 0;
- POINT2D select;
- fixConsoleSize(APP_WIDTH, APP_HEIGHT);
- setCursorVisible(0);
- setConsoleTitle("Puzzle by problue.");
- gameStart();
- randPuzzle();
- drawPuzzle();
- appTime = clock();
- while (!isOver)
- {
- printScore();
- select = blankPos;
- if (jkHasKey())
- {
- switch (jkGetKey())
- {
- case JK_UP:
- if (blankPos.r < puzzleSize.r - 1)
- select.r = blankPos.r + 1;
- break;
- case JK_DOWN:
- if (blankPos.r > 0)
- select.r = blankPos.r - 1;
- break;
- case JK_LEFT:
- if (blankPos.c < puzzleSize.c - 1)
- select.c = blankPos.c + 1;
- break;
- case JK_RIGHT:
- if (blankPos.c > 0)
- select.c = blankPos.c - 1;
- break;
- case JK_ESC:
- isOver = 1;
- break;
- default:
- break;
- }
- movePiece(select);
- if (!isOver);
- isOver = isFull();
- }
- }
- gameOver();
- jkGetKey();
- return 0;
- }
- void movePiece(POINT2D fromPos)
- {
- swapPiece(&puzzle[fromPos.r][fromPos.c], &puzzle[blankPos.r][blankPos.c]);
- drawPiece(fromPos.r, fromPos.c);
- drawPiece(blankPos.r, blankPos.c);
- blankPos = fromPos;
- moves++;
- return;
- }
- void randPuzzle()
- {
- int i, j;
- for (i = 0;i < puzzleSize.r; i++)
- {
- for (j = 0;j < puzzleSize.c; j++)
- {
- puzzle[i][j].no = i * puzzleSize.c + j + 1;
- strcpy(puzzle[i][j].pic, myLevelGraphs[levelNo][ i * puzzleSize.c + j ]);
- }
- }
- srand((uint32)time(NULL));
- for (i = 0; i < puzzleSize.r; i++)
- for (j = 0; j < puzzleSize.c; j++)
- swapPiece(&puzzle[i][j], &puzzle[i][ rand() % puzzleSize.c ]);
- for (i = 0; i < puzzleSize.r; i++)
- for (j = 0; j < puzzleSize.c; j++)
- if (puzzle[i][j].no == BLANK_NO)
- goto BREAK;
- BREAK:
- blankPos.r = i;
- blankPos.c = j;
- strcpy(puzzle[blankPos.r][blankPos.c].pic, "\40\40");
- }
- void swapPiece(PIECE* pa, PIECE* pb)
- {
- PIECE temp = *pa;
- *pa = *pb;
- *pb = temp;
- }
- int isFull()
- {
- if (puzzle[puzzleSize.r-1][puzzleSize.c-1].no != BLANK_NO)
- return 0;
- int i, j;
- for (i = 0;i < puzzleSize.r; i++)
- for (j = 0;j < puzzleSize.c - 1; j++)
- if ( (puzzle[i][j].no - puzzle[i][j+1].no) != -1)
- return 0;
- return 1;
- }
- void drawPiece(int r, int c)
- {
- gotoTextPos(PUZ_BASE_X + c * 2, PUZ_BASE_Y + r);
- printf("%2s", puzzle[r][c].pic);
- }
- void drawPuzzle()
- {
- int i, j;
- clearText();
- for (i = 0; i < puzzleSize.r; i++)
- for (j = 0; j < puzzleSize.c; j++)
- drawPiece(i, j);
-
- for (i = 0; i < puzzleSize.r; i++)
- {
- for (j = 0; j < puzzleSize.c; j++)
- {
- gotoTextPos((APP_WIDTH - puzzleSize.c * 2) + j * 2, APP_HEIGHT - puzzleSize.r + i - 1);
- printf("%2s", myLevelGraphs[levelNo][ i * puzzleSize.c + j ]);
- }
- }
- }
- void printScore()
- {
- gotoTextPos(0, 0);
- printf("Step: %d", moves);
- if (clock() - appTime > playTimeS*1000)
- {
- gotoTextPos(20, 0);
- printf("Time: %ld", playTimeS);
- playTimeS++;
- }
- }
- void gameStart()
- {
- int choice;
- puts("请选择游戏等级:");
- puts("1.简单");
- puts("2.普通");
- puts("3.困难");
- do
- {
- choice = getch();
- } while (! ('1' <= choice && choice <= '3'));
- levelNo = choice - '0' - 1;
- puzzleSize = myLevelSizes[levelNo];
- }
- void gameOver()
- {
- gotoTextPos(PUZ_BASE_X - 6 , PUZ_BASE_Y + puzzleSize.r + 2);
- setTextColor(YELLOW);
- printf("完成拼图!");
- }
复制代码 运行效果截图:
完整程序及源码(包含库pcc32):
控制台游戏.拼图.rar
(7.98 KB, 下载次数: 266)
|
|