利用数组制作的简单推箱子游戏
该游戏思路如下:
1、定义地图
2、主体循环:
2.1、清屏,显示关数
2.2、读取键盘按键,判断是否开始游戏
2.3、开始游戏,调用地图
2.3.1、确定人的初始位置
2.3.2、判断终点个数
2.3.3、显示及操作
2.3.3.1、输出显示(把数组显示成图形符号)
2.3.3.2、判断有箱子的终点个数,如果所有终点有箱子,跳出循环,进行下一关
2.3.3.3、操作(上、下、左、右)
上面思路已对应至代码中,各部分也用空行隔开,这里不再一部分一部分写。各部分代码写完,然后按思路组合、修改,再适当位置还可以添加一点小功能,比如重新开始、选关等。
代码及分析如下:
1 //推箱子小游戏
2 //1、定义地图
3 //定义一个三维数组存放地图,三维数组由单独的二维数组组成,本游戏中只有三个地图
4 int[][,] a = new int[3][,];
5 //用二维数组创建地图,0是空位,1是墙,2是人,3是箱子,4是终点
6 int[,] b0 = new int[10, 10]{
7 {1,1,1,1,1,1,1,1,1,1},
8 {1,0,0,0,1,0,1,0,0,1},
9 {1,0,0,0,1,0,1,0,0,1},
10 {1,0,3,0,1,0,1,0,0,1},
11 {1,0,0,0,1,1,1,0,0,1},
12 {1,0,0,0,0,0,0,0,0,1},
13 {1,0,0,1,0,0,0,0,0,1},
14 {1,2,0,1,1,1,1,0,0,1},
15 {1,0,0,1,0,4,0,0,0,1},
16 {1,1,1,1,1,1,1,1,1,1}};
17 int[,] b1 = new int[10, 10]{
18 {1,1,1,1,1,1,1,1,1,1},
19 {1,0,0,0,1,0,1,0,0,1},
20 {1,0,3,0,1,0,1,3,0,1},
21 {1,0,0,0,1,0,1,0,0,1},
22 {1,0,0,0,1,1,1,0,0,1},
23 {1,0,0,0,0,0,0,0,0,1},
24 {1,0,0,1,4,0,0,0,0,1},
25 {1,2,0,1,1,1,1,0,0,1},
26 {1,0,0,1,0,4,0,0,0,1},
27 {1,1,1,1,1,1,1,1,1,1}};
28 int[,] b2 = new int[10, 10]{
29 {1,1,1,1,1,1,1,1,1,1},
30 {1,0,4,1,0,0,0,0,0,1},
31 {1,0,0,1,0,0,0,0,4,1},
32 {1,0,0,0,0,0,0,0,4,1},
33 {1,0,0,3,0,0,0,0,0,1},
34 {1,1,1,0,0,0,0,0,0,1},
35 {1,0,0,2,0,0,0,0,0,1},
36 {1,0,3,0,1,0,3,0,0,1},
37 {1,0,0,0,1,0,0,0,0,1},
38 {1,1,1,1,1,1,1,1,1,1}};
39 a[0] = b0;
40 a[1] = b1;
41 a[2] = b2;
42
43 //2、主体循环
44 for (int z = 0; z < 3; z++) //如果增加地图,需修改判断条件
45 {//for1
46
47 //2.1、清屏,显示关数
48 Console.Clear();
49 Console.WriteLine("第{0}关!", z + 1); //清屏并显示第几关
50
51 //2.2、读取键盘按键,用于判断是否开始游戏
52 ConsoleKeyInfo start = Console.ReadKey();
53 string st = start.Key.ToString().ToLower(); //以上两行为读取按键信息,转成字符串格式并小写
54
55 //2.3判断游戏开始,调用地图
56 if (st == "spacebar") //按空格键,游戏开始
57 {//if1
58 int[,] map = a[z]; //读取地图
59
60 //2.3.1、确定人的初始位置,i为行,j为列
61 int i = 0, j = 0;
62 for (int m = 0; m < 10; m++)
63 {
64 for (int n = 0; n < 10; n++)
65 {
66 if (map[m, n] == 2)
67 {
68 i = m;
69 j = n;
70 break;
71 }
72 }
73 }
74
75 //2.3.2判断终点个数
76 int over = 0;
77 for (int m = 0; m < 10; m++)
78 {
79 for (int n = 0; n < 10; n++)
80 {
81 if (map[m, n] == 4)
82 {
83 over++;
84 }
85 }
86 }
87
88 //2.3.3显示及操作
89 for (; true; )
90 {//for2
91
92 //2.3.3.1输出显示
93 Console.Clear();
94 for (int x = 0; x < 10; x++)
95 {
96 for (int y = 0; y < 10; y++)
97 {
98 if (map[x, y] == 0)
99 {
100 Console.Write(" ");
101 }
102 else if (map[x, y] == 1)
103 {
104 Console.Write("■");
105 }
106 else if (map[x, y] == 2 || map[x, y] == 6)
107 {
108 Console.Write("♀");
109 }
110 else if (map[x, y] == 3 || map[x, y] == 7)
111 {
112 Console.Write("□");
113 }
114 else if (map[x, y] == 4)
115 {
116 Console.Write("※");
117 }
118 }
119 Console.Write("\n"); //换行
120 }
121
122 //2.3.3.2判断有箱子的终点个数
123 int over1 = 0;
124 for (int m = 0; m < 10; m++)
125 {
126 for (int n = 0; n < 10; n++)
127 {
128 if (map[m, n] == 7)
129 {
130 over1++;
131 }
132 }
133 }
134 //判断是否所有终点有箱子
135 if (over1 == over)
136 {
137 Console.WriteLine("过关!");
138 break;
139 }
140
141 //2.3.3.3、操作部分
142 ConsoleKeyInfo K = Console.ReadKey();
143 string k = K.Key.ToString();
144 k = k.ToLower();
145 //向上
146 if (k == "uparrow") //判断人是否是向上
147 {
148 if (map[i - 1, j] == 0 || map[i - 1, j] == 4) //判断人上方是不是空位
149 {
150 map[i - 1, j] = map[i - 1, j] + 2;
151 map[i, j] = map[i, j] - 2;
152 i--; //人移动之后,改变其所在行数
153 }
154 else if ((map[i - 1, j] == 3 || map[i - 1, j] == 7) && map[i - 2, j] != 1) //人上方是箱子,判断箱子上方是否是空位
155 {
156 map[i - 2, j] = map[i - 2, j] + 3;
157 map[i - 1, j] = map[i - 1, j] - 3 + 2;
158 map[i, j] = map[i, j] - 2;
159 i--; //人移动之后,改变其所在行数
160 }
161 else //如果人移动,输出提示音
162 Console.Write("\a");
163 }
164 //向下
165 else if (k == "downarrow")
166 {
167 if (map[i + 1, j] == 0 || map[i + 1, j] == 4) //判断人下方是不是空位
168 {
169 map[i + 1, j] = map[i + 1, j] + 2;
170 map[i, j] = map[i, j] - 2;
171 i++; //人移动之后,改变其所在行数
172 }
173 else if ((map[i + 1, j] == 3 || map[i + 1, j] == 7) && map[i + 2, j] != 1) //人下方是箱子,判断箱子下方是否是空位
174 {
175 map[i + 2, j] = map[i + 2, j] + 3;
176 map[i + 1, j] = map[i + 1, j] - 3 + 2;
177 map[i, j] = map[i, j] - 2;
178 i++; //人移动之后,改变其所在行数
179 }
180 else //如果人移动,输出提示音
181 Console.Write("\a");
182 }
183 //向左
184 else if (k == "leftarrow")
185 {
186 if (map[i, j - 1] == 0 || map[i, j - 1] == 4) //判断人左方是不是空位
187 {
188 map[i, j - 1] = map[i, j - 1] + 2;
189 map[i, j] = map[i, j] - 2;
190 j--; //人移动之后,改变其所在列数
191 }
192 else if ((map[i, j - 1] == 3 || map[i, j - 1] == 7) && map[i, j - 2] != 1) //人左方是箱子,判断箱子左方是否是空位
193 {
194 map[i, j - 2] = map[i, j - 2] + 3;
195 map[i, j - 1] = map[i, j - 1] - 3 + 2;
196 map[i, j] = map[i, j] - 2;
197 j--; //人移动之后,改变其所在列数
198 }
199 else //如果人移动,输出提示音
200 Console.Write("\a");
201 }
202 //向右
203 else if (k == "rightarrow")
204 {
205 if (map[i, j + 1] == 0 || map[i, j + 1] == 4) //判断人右方是不是空位
206 {
207 map[i, j + 1] = map[i, j + 1] + 2;
208 map[i, j] = map[i, j] - 2;
209 j++; //人移动之后,改变其所在列数
210 }
211 else if ((map[i, j + 1] == 3 || map[i, j + 1] == 7) && map[i, j + 2] != 1) //人右方是箱子,判断箱子右方是否是空位
212 {
213 map[i, j + 2] = map[i, j + 2] + 3;
214 map[i, j + 1] = map[i, j + 1] - 3 + 2;
215 map[i, j] = map[i, j] - 2;
216 j++; //人移动之后,改变其所在列数
217 }
218 else //如果人移动,输出提示音
219 Console.Write("\a");
220 }
221 //其他按键
222 else if (k == "b") //按“B”键,重新开始
223 {
224 z--; //用来抵消for1的“z++”
225 break; //跳出for2循环
226 }
227 }//for2
228 }//if1
229 else if (st == "n") //按“N”键,进入下一关
230 {
231 continue; //for1进入下一次循环
232 }
233 else
234 z--;
235 Console.Write("\a");
236 }//for1
显示效果图
程序及代码下载http://pan.baidu.com/s/1mgDlz3y