本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下
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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
|
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define ROW 4
#define COL ROW
#define KEY1 224
#define KEY_LEFT 75
#define KEY_UP 72
#define KEY_RIGHT 77
#define KEY_DOWN 80
int g_sgap = 0;
/*
应用市场下载2048
如果需要图形界面,需要加界面库
*/
//在数组arr产生一个新的数字
void GetNewVal( int arr[ROW][COL])
{
srand ( (unsigned) time ( NULL ) + g_sgap++);
int x = rand ()%ROW; //行下标,保证不越界
int y = rand ()%COL; //列下标,保证不越界
int newval = 2;
if (x == 0) //75%的概率为2,25%的概率为4
{
newval = 4;
}
//找到空闲的格子
while (arr[x][y] != 0) //该格子已经有值,todo有可能死循环
{
y++;
if (y == COL) //
{
y = 0;
x = (x+1)%ROW; //下一行
}
}
arr[x][y] = newval;
}
//打印
void Show( int arr[ROW][COL])
{
system ( "cls" );
for ( int i=0; i<ROW;i++)
{
for ( int j=0;j<COL;j++)
{
printf ( "%4d" ,arr[i][j]);
}
printf ( "\n" );
}
}
//显示开始界面
void Start( int arr[ROW][COL])
{
//获取两个数字,然后显示界面
GetNewVal(arr);
GetNewVal(arr);
Show(arr);
}
//获取键值,左:1,上:2,右:3,下:4,其它:0
int GetButton()
{
int key1 = 0; //第一个键值
int key2 = 0; //第二个键值
while (1)
{
if (_kbhit())
{
key1 = _getch(); //获得第一个键值
if (key1 == KEY1) //0xE0
{
key2 = _getch(); //获取第二个键值
if (key2 == KEY_LEFT)
{
return 1;
}
else if (key2 == KEY_UP)
{
return 2;
}
else if (key2 == KEY_RIGHT)
{
return 3;
}
else if (key2 == KEY_DOWN)
{
return 4;
}
}
}
Sleep(100); //睡眠,让出CPU,避免忙等待
}
}
//向左合并
bool MergeLeft( int arr[ROW][COL])
{
int x1 = -1; //第一个需要合并的数字下标
bool flg = false ; //当前没有有效合并(没有数据合并,也没有数据移动)
for ( int i=0;i<ROW;i++)
{
x1 = -1;
//第一步,合并相同的数字
for ( int j=0;j<COL;j++)
{
if (arr[i][j]!=0)
{
if (x1 == -1) //该行第一个非0的值
{
x1 = j;
}
else //当前第二个需要处理的值
{
if (arr[i][j] == arr[i][x1]) //合并,将x1下标的值*2,j下标的值置为0
{
arr[i][x1] *= 2;
arr[i][j] = 0;
x1 = -1;
flg = true ;
}
else //第一个值和第二个值不等,
{
x1 = j;
}
}
}
}
//第二步,移动数字
int index = 0; //当前可以放数据的下标
for ( int j=0;j<COL;j++)
{
if (arr[i][j]!=0) //需要移动数据
{
if (index != j)
{
arr[i][index] = arr[i][j];
arr[i][j] = 0;
index++;
flg = true ;
}
else
{
index++;
}
}
}
}
return flg;
}
//游戏是否结束
//1.没有空闲单元格
//2.相邻没有相同的数字
bool IsGameOver( int arr[ROW][COL])
{
//判断有没有空闲单元格
int activeCell = 0; //统计空闲单元格数量
for ( int i=0;i<ROW;i++)
{
for ( int j=0;j<COL;j++)
{
if (arr[i][j] == 0)
{
activeCell++;
}
}
}
if (activeCell != 0)
{
return false ;
}
//相邻是否有相同的数字,只需要判断右边和下边
for ( int i=0;i<ROW;i++)
{
for ( int j=0;j<COL;j++)
{
//if(arr[i][j]==arr[i][j+1] || arr[i][j] == arr[i+1][j])
if (j+1<COL&&arr[i][j]==arr[i][j+1] || i+1<ROW&&arr[i][j]==arr[i+1][j])
{
return false ;
}
}
}
return true ;
}
void Run( int arr[ROW][COL])
{
int bt;
bool rt = false ;
while (1)
{
bt = GetButton();
if (bt == 1) //方向键左
{
rt = MergeLeft(arr);
if (rt)
{
GetNewVal(arr);
Show(arr);
if (IsGameOver(arr))
{
return ;
}
}
}
}
}
int main()
{
int arr[ROW][COL] = {0};
Start(arr);
Run(arr);
return 0;
}
int main1()
{
int a = 0;
while (1)
{
if (_kbhit())
{
a = _getch(); //getchar();
printf ( "键值是:%d\n" ,a);
}
}
return 0;
}
/*
int main()
{
srand( (unsigned)time( NULL ) );
for(int i=0;i<10;i++)
{
printf("%d ",rand());
}
printf("\n");
return 0;
}
*/
|
运行画面
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/LINZEYU666/article/details/120977819