当前位置:K88软件开发文章中心编程语言C/C++C/C++01 → 文章内容

c语言方块排列游戏

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-4 7:48:45

-->

假设有九个格子,其中八个格子为1~8的互不相同的数字,另外一个为空,用0表示,现在我们需要将1~8这些数字排列成1,2,3,4,5,6,7,8,0 ?就像手机上的拼图游戏一样。

[t]程序设计思想:[/t]

1) 定义一个结构体,结构体成员为一个二维数组和“0”(空格)的坐标x,y

2)当我们进行上下左右操作时,程序应该交换0和其他数字的位置,编写上下左右函数实现交换,并应控制好越界问题。

3)另外每次交换数字之前,我们都要获取“0”的位置。 对应 find_xy() 函数。

4)获取上下左右键盘的asccii码。

#define UP 72

#define DOWN 80

#define LEFT 75

#define RIGHT 77

5) 随机生成0~8的互不相同数字。

6)打印图形界面

[t]程序如下:[/t]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include
#include
#include

#define N 3

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77

typedef struct {
int a[3][3];
int x;
int y;
}node;

void paint(node *p)
{
int row,col;
printf("0相当于空位,移动数字至这个空位,将数字排列成n1 2 3n4 5 6n7 8 0 就赢了!ttt作者:k88.netn");
printf("┌");
for (col = 0; col <N-1; col++) //输出一行
printf("─┬");
printf("─┐n");

for(row=0;row<N;row++)
{
printf("│"); //输出行号
for(col=0;col<N;col++)
{
printf("%2d│",p->a[row][col]);
}

printf("n");

if (row < N - 1)
{
printf("├"); //输出交叉线
for (col = 0; col < N - 1; col++) //输出一行
printf("─┼");
printf("─┤n");
}
}
printf("└");

for (col = 0; col < N - 1; col++) //最后一行的横线
printf("─┴");
printf("─┘n");

}

void find_xy(node *p){
int i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(p->a[i][j]==0)
{
p->x=i;
p->y=j;
}

}

void xia(node *p)
{
int t;
find_xy(p);
if(p->x-1>=0)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x-1][p->y];
p->a[p->x-1][p->y]=t;
}
else
;

}

void shang(node *p)
{
int t;
find_xy(p);
if(p->x+1<N)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x+1][p->y];
p->a[p->x+1][p->y]=t;
}
else
;

}

void you(node *p)
{
int t;
find_xy(p);
if((p->y)-1>=0)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x][p->y-1];
p->a[p->x][p->y-1]=t;
}
else
;

}

void zuo(node *p)
{
int t;
find_xy(p);
if(p->y+1<N)
{
t=p->a[p->x][p->y];
p->a[p->x][p->y]=p->a[p->x][p->y+1];
p->a[p->x][p->y+1]=t;
}
else
;

}

void vin(node *p)
{
int i;
for(i=0;i<N*N-1;)
{
if(*(*(p->a)+i)==i+1)
i++;
else
break;
if(i==N*N-1)
printf("you win !");
}

}

void srand_num(node *p)
{
int i,index,b[N*N];

for(i=0;i<N*N;i++)
b[i]=i;
srand((unsigned)time(0));
for(i=0;i<N*N;)
{
index=rand()%9; //生成0~8的不重复随机数
if(b[index]!=-1)
{
*(*(p->a)+i)=b[index];
b[index]=-1;
++i;
}

}

}

void play(node *p)
{
int key;
while(1)
{

vin(p);
key=getch();

switch(key){
case UP: shang(p); system("cls"); paint(p); break;
case DOWN: xia(p); system("cls"); paint(p); break;
case LEFT: zuo(p); system("cls"); paint(p); break;
case RIGHT: you(p); system("cls"); paint(p); break;
default: ; break;

}

}
}

void main()
{

node p;
srand_num(&p);
paint(&p);
printf("n");
play(&p);

}

c语言拼图游戏


c语言方块排列游戏