预处理部分 ==============================================================================*/
#define NEO_temp_dir_unused #define BOARD_COLOR 7
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "neo.h"
/*============================================================================== 全局变量部分 ==============================================================================*/
char chesscolor[9][9]={0}; /* 定义棋盘棋子颜色 */ char chessboard[9][9]; /* 定义棋盘空位 */ long grade=0; /* 分数 */
/*============================================================================== 函数部分 ==============================================================================*/ /*============================================================================== 检查棋盘是否已满 满返回1,不满返回0. ==============================================================================*/
int boardfull(void) { int i,t; /* 临时计数 */ for(i=0;i<9;i++) for(t=0;t<9;t++) if(chessboard[i][t]==1) return 0; return 1; }
/*============================================================================== 随机生成棋子. ==============================================================================*/
void buildchess(void) { int x,y; do { x=rand()%9; y=rand()%9; }while(chesscolor[y][x]!=0); chesscolor[y][x]=rand()%7+1; chessboard[y][x]=0; delchess(y,x); }
/*============================================================================== 绘制整个棋盘(包括棋子). ==============================================================================*/
void drawboard(void) { int i,t; /* 临时计数 */ for(i=20;i<420;i+=40) hline(20,i,380,BOARD_COLOR); for(i=20;i<420;i+=40) vline(i,20,380,BOARD_COLOR); for(i=0;i<9;i++) for(t=0;t<9;t++) circlefill(t*40+40,i*40+40,12,chesscolor[i][t]); }
/*============================================================================== 判断位于第x行,y列的棋子是否能移动到第to_x行,to_y列,可以返回1,否则返回0. ==============================================================================*/
int canmove(int x,int y,int to_x,int to_y) { if(x==to_x && y==to_y) return 1; chessboard[x][y]=0; if(chessboard[x+1][y] && x<8) if(canmove(x+1,y,to_x,to_y)) { chessboard[x][y]=1; return 1; } if(chessboard[x-1][y] && x>0) if(canmove(x-1,y,to_x,to_y)) { chessboard[x][y]=1; return 1; } if(chessboard[x][y+1] && y<8) if(canmove(x,y+1,to_x,to_y)) { chessboard[x][y]=1; return 1; } if(chessboard[x][y-1] && y>0) if(canmove(x,y-1,to_x,to_y)) { chessboard[x][y]=1; return 1; } chessboard[x][y]=1; return 0; }
/*============================================================================== 判断新增棋子后是否可以消去棋子,可以则消去并返回1,否则返回0. ==============================================================================*/
int delchess(int x,int y) { int i,j; /* 临时计数 */ int sum=0; /* 消除竖行 */ for(i=x;i<9;i++) { if(chesscolor[x][y]!=chesscolor[i][y]) break; sum++; } for(i=x;i>-1;i--) { if(chesscolor[x][y]!=chesscolor[i][y]) break; sum++; } if(sum>5) { for(i=x+1;i<9;i++) { if(chesscolor[x][y]!=chesscolor[i][y]) break; chesscolor[i][y]=0; chessboard[i][y]=1; } for(i=x-1;i>-1;i--) { if(chesscolor[x][y]!=chesscolor[i][y]) break; chesscolor[i][y]=0; chessboard[i][y]=1; } chesscolor[x][y]=0; chessboard[x][y]=1; return 1; } sum=0; /* 消除横行 */ for(i=y;i<9;i++) { if(chesscolor[x][y]!=chesscolor[x][i]) break; sum++; } for(i=y;i>-1;i--) { if(chesscolor[x][y]!=chesscolor[x][i]) break; sum++; } if(sum>5) { for(i=y+1;i<9;i++) { if(chesscolor[x][y]!=chesscolor[x][i]) break; chesscolor[x][i]=0; chessboard[x][i]=1; } for(i=y-1;i>-1;i--) { if(chesscolor[x][y]!=chesscolor[x][i]) break; chesscolor[x][i]=0; chessboard[x][i]=1; } chesscolor[x][y]=0; chessboard[x][y]=1; return 1; } sum=0; /* 消除斜行( \ ) */ for(i=x,j=y;(i<9)&&(j<9);i++,j++) { if(chesscolor[x][y]!=chesscolor[i][j]) break; sum++; } for(i=x,j=y;(i>-1)&&(j>-1);i--,j--) { if(chesscolor[x][y]!=chesscolor[i][j]) break; sum++; } if(sum>5) { for(i=x+1,j=y+1;(i<9)&&(j<9);i++,j++) { if(chesscolor[x][y]!=chesscolor[i][j]) break; chesscolor[i][j]=0; chessboard[i][j]=1; } for(i=x-1,j=y-1;(i>-1)&&(j>-1);i--,j--) { if(chesscolor[x][y]!=chesscolor[i][j]) break; chesscolor[i][j]=0; chessboard[i][j]=1; } chesscolor[x][y]=0; chessboard[x][y]=1; return 1; } sum=0; /* 消除斜行( / ) */ for(i=x,j=y;(i<9)&&(j>-1);i++,j--) { if(chesscolor[x][y]!=chesscolor[i][j]) break; sum++; } for(i=x,j=y;(i>-1)&&(j<9);i--,j++) { if(chesscolor[x][y]!=chesscolor[i][j]) break; sum++; } if(sum>5) { for(i=x+1,j=y-1;(i<9)&&(j>-1);i++,j--) { if(chesscolor[x][y]!=chesscolor[i][j]) break; chesscolor[i][j]=0; chessboard[i][j]=1; } for(i=x-1,j=y+1;(i>-1)&&(j<9);i--,j++) { if(chesscolor[x][y]!=chesscolor[i][j]) break; chesscolor[i][j]=0; chessboard[i][j]=1; } chesscolor[x][y]=0; chessboard[x][y]=1; return 1; } return 0; }
/*============================================================================== 移动棋子. ==============================================================================*/
void movechess(void) { int mousex,mousey; int mousetox,mousetoy; while(1) { scare_mouse(); drawboard(); /* 绘制棋盘 */ rectfill(0,0,640,16,0); neo_printf(0,0,"当前分数:%ld",grade); unscare_mouse(); while(get_click_info()!=8) ; mousex=get_mouse_x(); mousey=get_mouse_y(); if(mousex<=20 || mousex>=380) continue; if(mousey<=20 || mousey>=380) continue; mousex=(mousex-20)/40; mousey=(mousey-20)/40; if(chessboard[mousey][mousex]==1) continue; rect(mousex*40+20,mousey*40+20,mousex*40+60,mousey*40+60,4); while(get_click_info()!=8) ; mousetox=get_mouse_x(); mousetoy=get_mouse_y(); if(mousetox<=20 || mousetox>=380) continue; if(mousetoy<=20 || mousetoy>=380) continue; mousetox=(mousetox-20)/40; mousetoy=(mousetoy-20)/40; if(chessboard[mousetoy][mousetox]==0) continue;
if(canmove(mousey,mousex,mousetoy,mousetox)) { chessboard[mousetoy][mousetox]=0; chessboard[mousey][mousex]=1; chesscolor[mousetoy][mousetox]=chesscolor[mousey][mousex]; chesscolor[mousey][mousex]=0; if(delchess(mousetoy,mousetox)) { grade+=10; continue; } } else continue; break; } }
/*============================================================================== 主函数. ==============================================================================*/
int main(void) { int i; /* 临时计数 */ int n=3; neo_init(); /* 初始化NEO库 */ set_video_mode(640,480,8,0,0); /* 640X480X64K模式 */ install_keyboard(); /* 加载高级键盘 */ _install_timer(); /* 加载时钟 */ change_timer(500); /* 改变(时钟频率)鼠标刷新频率为500次/秒 */ install_mouse(); /* 加载高级鼠标 */ srand(100); /* 初始化随机函数 */
memset(chessboard,1,sizeof(chessboard));
for(i=0;i<n;i++) buildchess(); while(!boardfull()) { movechess(); for(i=0;i<n;i++) if(!boardfull()) buildchess(); } scare_mouse(); drawboard(); /* 绘制棋盘 */ rectfill(0,0,640,16,0); neo_printf(0,0,"游戏结束,你的最终得分:%ld,谢谢你的使用",grade); _getch(); return 0; }
|