PS:以前曾经用Easyx图形库写了个拼图~不过写得很粗糙~不过用CMD加system("cls");这样更粗糙了~不过感觉可以改进一下不用system("cls");windows.h里面有调整光标位置语句~还可以调整背景颜色~不过我还是当回键盘侠算啦~最近没这么多精力去逐一完善~
[此贴子已经被作者于2017-6-3 11:16编辑过]
#include "stdafx.h" //在vs、vc中可用,gcc编译器可注释掉 #include <stdio.h> #include <windows.h> #include <time.h> #include <conio.h> void setLocate(int x,int y) {//设置字符显示位置 HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); COORD loc={x,y}; SetConsoleCursorPosition(hOut,loc); } void drawframe() {//画外框 int i; printf("┌─┬─┬─┬─┐ 空格键:产生随机地图 ESC键:退出 方向键:移动空格\n"); for(i=0;i<3;i++) { printf("│ │ │ │ │\n"); printf("├─┼─┼─┼─┤\n"); } printf("│ │ │ │ │\n"); printf("└─┴─┴─┴─┘\n"); } int testmove(int a[][4],int flg) {//测试移动是否合法,合法则交换数据 int i,j,x,y,b[4][2]={-1,0,0,-1,0,1,1,0}; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(!a[i][j]) { x=i; y=j; } } } i=x+b[flg][0]; j=y+b[flg][1]; if(i<0||i>3||j<0||j>3)return 0; a[i][j]^=a[x][y]; a[x][y]^=a[i][j]; a[i][j]^=a[x][y]; return 1; } int getkey() {//获得键值 unsigned char a; int n=0; if(!kbhit())return 0; a=getch(); if(a>127) { n=a*256; a=getch(); } n=n+a; return n; } void rndmap(int a[][4]) {//随机地图产生 int i,j; srand(clock()); for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=i*4+j+1; a[3][3]=0; for(i=0;i<128;i+=testmove(a,rand()%4)); //为减少代码,该语句有死循环的危险 } void listmap(int a[][4]) { int i,j,x,y; for(i=0;i<4;i++) { for(j=0;j<4;j++) { setLocate(j*4+2,i*2+1); if(a[i][j])printf("%2d",a[i][j]); else { x=j*4+2; y=i*2+1; printf(" "); } } } setLocate(x,y); } void main() { int a[4][4],key,i; drawframe(); rndmap(a); listmap(a); while((key=getkey())!=27) { if(key==32||(key>57415&&key<57425)) { if(key==32)rndmap(a); else { i=(key-57416)/3+(key>57419); testmove(a,i); } listmap(a); } } }