Compare commits

...

5 Commits

Author SHA1 Message Date
e9a50777df 分离css代码 2022-08-04 22:22:54 +08:00
42cc5655da 分离js代码 2022-08-04 22:22:05 +08:00
52ad894774 新增图标 2022-08-04 22:21:50 +08:00
f557b69669 修改默认端口 2022-08-04 22:21:29 +08:00
cda7a8520c 整理规则及说明 2022-08-04 22:21:16 +08:00
7 changed files with 76 additions and 81 deletions

View File

@ -1,3 +1,48 @@
# 陆战棋 # 陆战棋
陆战棋 陆战棋又称军棋是中国近代的一种双人、四人棋类设计根据军队中的军衔。每一方有25枚棋子先夺得对方军旗者为胜。
## 棋子及棋盘
| 名称 | 数量 | 说明 |
| ---- | ---- | ---------------------------- |
| 军旗 | 1 | 必须布置在大本营,不得移动 |
| 炸弹 | 2 | 不得布置在第一排 |
| 地雷 | 3 | 必须布置在最后两排,不得移动 |
| 司令 | 1 | 可吃以下任何子 |
| 军长 | 1 | 可吃以下任何子 |
| 师长 | 2 | 可吃以下任何子 |
| 旅长 | 2 | 可吃以下任何子 |
| 团长 | 2 | 可吃以下任何子 |
| 营长 | 2 | 可吃以下任何子 |
| 连长 | 3 | 可吃以下任何子 |
| 排长 | 3 | 可吃以下任何子 |
| 工兵 | 3 | 可以吃地雷 |
棋盘上每方有三十个停靠点,当中两个为大本营,另有行营五个。棋盘上的线分为两种:铁路线、公路线。两方势力通过三条铁路连接,每两条铁路之间有一个“山界”。
## 规则
1. 双方将己方棋子按规则秘密地布置在己方棋盘的兵站或大本营中后战斗开始;
2. 黑方先行, 然后依次行棋;
3. 军旗、大本营内的棋子、地雷等不能移动;
4. 行棋不得跨越已有棋子的位置;
5. 在公路线上,所有可移动棋子每回合只能沿公路线,向任意方向走一格;
6. 在铁路上的棋子,沿铁路无子阻挡时,可以直线行动不限格数(部分地区规定工兵外所有可动棋子在铁路上最多只可走三格,但可拐弯)。 若该棋子为工兵,可沿中间路程未被阻挡的铁路线行进至可能达到的任一位置;
7. 走入已有敌方棋子的位置时即为攻击;
8. 不得攻击己方或在行营内的棋子;
9. 攻击敌方相同棋子,则同归于尽;
10. 炸弹不能攻击军旗,攻击其它棋子则同归于尽;
11. 部分地区规定司令不可消灭军旗;
12. 攻击结果由裁判作出,双方不得知晓对方棋子;
13. 己方司令被消灭后强制向敌方明示己方军旗所在位置(部分地区规则规定司令+军长被消灭后须翻开非军旗的大本营中的棋子,但司令未被消灭但军长已被消灭则不须翻开任何大本营中的棋子);
14. 攻击敌方军旗,或敌方失去所有机动力时,则为获胜!
## 实现步骤
- 显示棋盘底图
- 实现虚拟的兵站、行营、大本营,并与底图对齐
- 棋子可以按规则放入兵站、行营、大本营
- 实现轮流行棋
- 实现行棋规则
- 实现吃子
- 实现输赢

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

14
public/game.js Normal file
View File

@ -0,0 +1,14 @@
const client = io()
client.on('role', (name) => {
role.innerText = name
})
client.on('player', (player) => {
gameButton.classList = player
gameButton.innerText = player == 'player1' ? '玩家1' : '玩家2'
})
gameButton.onclick = () => {
client.emit('click')
}

View File

@ -5,24 +5,8 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="data:" type="image/x-icon"> <link rel="stylesheet" href="style.css">
<title>陆战棋游戏</title> <title>陆战棋游戏</title>
<style>
button {
padding: 0.5rem;
color: lightgray;
cursor: pointer;
}
.player1 {
color: black;
}
.player2 {
color: red;
}
</style>
</head> </head>
<body> <body>
@ -30,22 +14,7 @@
<h2 id="role"></h2> <h2 id="role"></h2>
<button id="gameButton">玩家1</button> <button id="gameButton">玩家1</button>
<script src="/socket.io/socket.io.min.js"></script> <script src="/socket.io/socket.io.min.js"></script>
<script> <script src="game.js"></script>
const client = io()
client.on('role', (name) => {
role.innerText = name
})
client.on('player', (player) => {
gameButton.classList = player
gameButton.innerText = player == 'player1' ? '玩家1' : '玩家2'
})
gameButton.onclick = () => {
client.emit('click')
}
</script>
</body> </body>
</html> </html>

13
public/style.css Normal file
View File

@ -0,0 +1,13 @@
button {
padding: 0.5rem;
color: lightgray;
cursor: pointer;
}
.player1 {
color: black;
}
.player2 {
color: red;
}

View File

@ -2,7 +2,7 @@ const express = require('express')
const app = express() const app = express()
app.use(express.static('public')) app.use(express.static('public'))
const host = process.env.HOST || '0.0.0.0' const host = process.env.HOST || '0.0.0.0'
const port = process.env.PORT || 8000 const port = process.env.PORT || 3000
const server = app.listen(port, host, () => console.log(`陆战棋游戏运行在http://${host}:${port}/`)) const server = app.listen(port, host, () => console.log(`陆战棋游戏运行在http://${host}:${port}/`))
const io = require('socket.io')(server) const io = require('socket.io')(server)

View File

@ -1,46 +0,0 @@
# 军棋
显现步骤
- 显示棋盘底图
- 实现虚拟的兵站、行营、大本营,并与底图对齐
- 棋子可以按规则放入兵站、行营、大本营
- 实现轮流行棋
- 实现行棋规则
- 实现吃子
- 实现输赢
## 规则
1. 司令 > 军长 > 师长 > 旅长 > 团长 > 营长 > 连长 > 排长 > 工兵 > 地雷
2. 相同棋子相遇,同归于尽
3. 地雷不得移动,被工兵攻击则败,被其他任何敌方棋子攻击皆同归于尽
4. 炸弹与任何敌方棋子相遇都会同归于尽,但不包括军旗
5. 军旗不能移动。在铁路上的棋子,沿铁路无子阻挡中间路程时,可以直线行动不限格数;若该棋子为工兵,可沿中间路程未被阻挡的铁路线行进至可能达到的任一位置。在公路线上,所有可移动棋子每回合只能沿公路线,向任意方向走一格。
6. 进入大本营的棋子不能移动。
7. 当棋子在行营内对方不得攻击。
8. 同方棋子不能相互攻击。
```
行棋
每步只能移动一个棋子,地雷与军旗不能移动。
棋盘上的线分为两种:铁路线、公路线。 在铁路上的棋子,沿铁路无子阻挡中间路程时,可以直线行动不限格数;若该棋子为工兵,可沿中间路程未被阻挡的铁路线行进至可能达到的任一位置。部分规则中规定工兵外所有可动棋子在铁路上最多只可走三格,但可拐弯。在公路线上,所有可移动棋子每回合只能沿公路线,向任意方向走一格。
吃子
当棋子移动的目的地有棋子时,移来的棋子攻击未动的棋子,此时按上述规则决定胜负,负者被消灭,胜者留存在该位置或同归于尽。若目的地的棋子不能攻击,则不能如此移动。
同方棋子不能相互攻击。
当棋子在行营内对方不得攻击。
布阵规则:
棋子可以摆放在己方的兵站或大本营中,不能摆放在行营中。
军旗必须放在大本营中。
炸弹不能放在第一排。
地雷必须放在最后两排。
黑方先行棋,然后轮流走子。
进入大本营的棋子不能移动。
出现棋子相攻的情况,由裁判决定的棋子出局。玩家只会知道己方及对方的棋子是否出局,不会直接知道对方的棋子是什么。
司令被消灭后强制向敌方明示己方军旗所在位置。 (部分地区规则规定司令+军长被消灭后须翻开非军旗的大本营中的棋子,但司令未被消灭但军长已被消灭则不须翻开任何大本营中的棋子)
下暗棋时双方要发挥想象力和判断力,躲过大子,吃掉小子,直至最后夺得对方的军旗,或者消灭敌方所有可以动的棋。
部分地区规定司令不可消灭军旗
```