69,382
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
void main()
{
char key;
while(1)
{
key=getch();
switch(key)
{
case -32:
key=getch();
switch(key)
{
case 72:
printf("up\n");break;
case 80:
printf("down\n");break;
case 75:
printf("left\n");break;
case 77:
printf("right\n");break;
case -123:
printf("F11\n");break;
case -122:
printf("F12\n");break;
default:
printf("%x,%d,%c\n",t,t,t);break;
}
break;
default:
printf("%x,%d,%c\n",t,t,t);break;
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define KEY_UP 80
#define KEY_DOWN 72
#define KEY_LEFT 77
#define KEY_RIGHT 75
#define NEW_GAME 'n'
//省略无关代码
if(key!=-32) continue; //不是方向键
key=getch();
switch(key)
{
//测试按键
case KEY_DOWN: //按下
if(pos<=5) change(pos,pos+3);
break;
case KEY_UP: //按上
if(pos>=3) change(pos,pos-3);
break;
case KEY_LEFT: //按左
if(pos%3!=0) change(pos,pos-1);
break;
case KEY_RIGHT: //按右
if(pos%3!=2) change(pos,pos+1);
break;
}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
int getrand(int x,int y);
void gotoxy(int x,int y);
void NewGame();
int GetTheNull();
void Change(int a,int b);
void Update();
int IsSuccess();
#define KEY_UP 80
#define KEY_DOWN 72
#define KEY_LEFT 77
#define KEY_RIGHT 75
#define NEW_GAME 'n'
#define QUIT 'q'
int num[]={1,2,3,4,5,6,7,8,0};
//方块的数字
void main()
{
char key=0; //键盘码
int pos; //九格中,空格的位置
system("color 1f"); //设置背景为蓝,文字为白.
system("cls"); //清屏
NewGame();
while(1)
{
key=getch(); //获得键盘输入
if(key!=-32) continue; //不是方向键
pos=GetTheNull(); //得到空格
key=getch();
switch(key)
{
//测试按键
case KEY_DOWN: //按下
if(pos<=5) Change(pos,pos+3);
break;
case KEY_UP: //按上
if(pos>=3) Change(pos,pos-3);
break;
case KEY_LEFT: //按左
if(pos%3!=0) Change(pos,pos-1);
break;
case KEY_RIGHT: //按右
if(pos%3!=2) Change(pos,pos+1);
break;
case NEW_GAME: //按下‘n’新建游戏
NewGame();
break;
case QUIT:
return;
}
Update(); //更新
if(IsSuccess())
{
//看是否游戏成功
gotoxy(26,10); //成功了,输出一个写有Well done!的外框
printf("\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2"); //15个\x2.
gotoxy(26,11);
printf("\x2 \x2"); //12个空格+2个 \x2
gotoxy(26,12);
printf("\x2 Well Done! \x2");
gotoxy(26,13);
printf("\x2 \x2");
gotoxy(26,14);
printf("\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\n");
getch();
NewGame(); //新游戏
}
}
system("cls"); //清屏
}
void NewGame()
{
/*新建游戏,实际上就是把有数字的八个方格打散,
这种效果的实现就是随机的两两交换,而怎么不与空的那个交换呢?
这涉及有没有解的问题
不管怎么样,九格游戏最后的结果只有两个:
123 | 123
456 | 456
78 | 87 (证明从略)
而要两两交换而始终有解的话,(从原序列开始)必须:相邻交换的次数为偶
但我们用一种更有效的方法:
每一个总与其下第二个交换
第7,8个与0,1交换,只要交换次数多,仍可获得相同的效果
而这些的前提是其中的0不能与其第奇数个作奇数次交换
为了省事,不处理0..
其中产道理,请自己思考
*/
//以上是网上原文
int i,a,b;
for(i=0;i<8;i++) num[i]=i+1;
num[8]=0; //将数组复原
for(i=0;i<300;i++)
{
a=getrand(0,8); //产生随机数
b=(a+2)%8; //得到下第二个的数组下标
Change(a,b); //交换
}
Update();
}
void Update()
{
//在屏幕上画出整个九格图像,关于定位的问题自己分析
int i,j;
for(i=0;i<=2;i++)
{
gotoxy(24,8+i*3); //游戏中,用18*9以在控制台画成正方形
for(j=0;j<=2;j++)
{
if (num[j+i*3]!=0)
printf("\x2\x2\x2\x2\x2\x2");
else
printf(" ");
}
gotoxy(24,9+i*3);
for(j=0;j<=2;j++)
{
if (num[j+i*3]!=0)
printf("\x2 %d \x2",num[j+i*3]);
else
printf(" ");
}
gotoxy(24,10+i*3);
for(j=0;j<=2;j++)
{
if (num[j+i*3]!=0)
printf("\x2\x2\x2\x2\x2\x2");
else
printf(" ");
}
printf("\n");
}
}
int IsSuccess()
{
//判断是否游戏
int i;
for(i=0;i<8;i++)
{
if(!(num[i]==(i+1)))
return 0;
}
return 1;
}
int GetTheNull()
{
//获得空格的位置
int i;
for(i=0;i<=8;i++)
{
if (num[i]==0)
return i;
}
}
void Change(int a,int b)
{ //交换num[a],num[b]
int temp;
temp=num[a];
num[a]=num[b];
num[b]=temp;
}
int getrand(int x,int y)
{
long tmp ;
static f=0 ;
if(y<x)
printf("ERROR!\n");
if(!f)
{
srand((unsigned)time(NULL));
f=1 ;
}
tmp=rand()%(y-x+1) ;
tmp+=x;
return tmp ;
}
void gotoxy(int x,int y)
{
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}