用csharp代码写一个俄罗斯方块小游戏
时间: 2024-06-18 21:02:26 浏览: 91
好的,以下是一个简单的用C#代码实现的俄罗斯方块小游戏示例:
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tetris
{
class Program
{
static void Main(string[] args)
{
Console.CursorVisible = false; // 隐藏光标
int x = 10; // 初始方块位置
int y = 0;
int[,] map = new int[20, 10]; // 地图,用于绘制方块
while (true)
{
Draw(map, x, y); // 绘制方块
if (Console.KeyAvailable) // 检测用户按键
{
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.LeftArrow) // 左移
{
if (x > 0) x--;
}
else if (key.Key == ConsoleKey.RightArrow) // 右移
{
if (x < 9) x++;
}
else if (key.Key == ConsoleKey.DownArrow) // 加速下落
{
y++;
}
}
else
{
y++; // 没有按键则自动下落
}
if (!CanMove(map, x, y)) // 判断是否能移动
{
y--; // 移动失败,还原位置
Draw(map, x, y); // 更新方块
for (int i = 0; i < 4; i++) // 将方块加入地图
{
map[y + i, x] = 1;
}
int count = RemoveLine(map); // 消除满行
if (count > 0)
{
Console.Beep(); // 播放声音效果
}
x = 4; // 初始化方块位置
y = 0;
if (!CanMove(map, x, y)) // 游戏结束
{
Console.Clear();
Console.WriteLine("Game Over!");
break;
}
}
System.Threading.Thread.Sleep(50); // 控制方块下落速度
}
}
static void Draw(int[,] map, int x, int y)
{
Console.Clear(); // 清空屏幕
for (int i = 0; i < map.GetLength(0); i++) // 绘制地图
{
for (int j = 0; j < map.GetLength(1); j++)
{
Console.SetCursorPosition(j * 2, i);
Console.Write(map[i, j] == 1 ? "[]" : " ");
}
}
Console.ForegroundColor = ConsoleColor.Red; // 绘制方块
for (int i = 0; i < 4; i++)
{
Console.SetCursorPosition((x + i) * 2, y + i);
Console.Write("[]");
}
Console.ResetColor();
}
static bool CanMove(int[,] map, int x, int y)
{
for (int i = 0; i < 4; i++) // 判断是否能移动
{
if (y + i >= map.GetLength(0)) return false; // 达到底部
if (map[y + i, x] == 1) return false; // 碰到障碍物
if (x < 0 || x >= map.GetLength(1)) return false; // 超出边界
}
return true;
}
static int RemoveLine(int[,] map)
{
int count = 0;
for (int i = map.GetLength(0) - 1; i >= 0; i--) // 从底部开始遍历每一行
{
bool full = true;
for (int j = 0; j < map.GetLength(1); j++)
{
if (map[i, j] == 0)
{
full = false;
break;
}
}
if (full) // 如果该行满了,则将其清除,并将上面的所有方块下移一行
{
for (int k = i; k > 0; k--)
{
for (int j = 0; j < map.GetLength(1); j++)
{
map[k, j] = map[k - 1, j];
}
}
for (int j = 0; j < map.GetLength(1); j++)
{
map[0, j] = 0;
}
count++;
i++; // 继续检测当前行,因为下一行已经被下移了一行
}
}
return count;
}
}
}
```
如果您还有其他问题或需要更多帮助,请随时提出。
阅读全文