利用数组制作的简单推箱子游戏
该游戏思路如下:
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