自己写的代码可能有问题,希望不要照抄查重😭😭
实验说明
- 游戏规则
本次实验对Nim游戏做了一些小的改变,具体如下:游戏界面由三行组成,计数器类型为石头,其中A行包含3个石头,B行包含5个石头,C行包含8个石头。
规则如下:
- 每个玩家轮流从某一行中移除一个或多个石头。
- 一个玩家不能在一个回合中从多个行中移除石头。
- 当某个玩家从游戏界面上移除最后剩余的石头时,此时游戏结束,该玩家获胜。
- 实验要求
- 在游戏开始时,你应该显示游戏界面的初始化状态。具体包括:在每行石头的前面,你应该先输出行的名称,例如“ROW A”。你应该使用ASCII字符小写字母“o”(ASCII码 x006F)来表示石头。游戏界面的初始化状态应该如下:
ROW A: ooo
ROW B: ooooo
ROW C: oooooooo
- 游戏总是从玩家1先开始,之后玩家1和玩家2轮流进行。在每一个回合开始时,你应该输出轮到哪一个玩家开始,并提示玩家进行操作。例如,对于玩家1,应该有如下显示:
Player 1,choose a row and number of rocks:
- 为了指定要移除哪一行中的多少石头,玩家应该输入一个字母后跟一个数字(输入结束后不需要按Enter键),其中字母(A,B或C)指定行,数字(从1到所选行中石头的数量)指定要移除的石头的数量。你的程序必须要确保玩家从有效的行中移除有效数量的石头,如果玩家输入无效,你应该输出错误提示信息并提示该玩家再次进行输入。例如,如果轮到玩家1:
Player 1, choose a row and number of rocks: D4
Invalid move. Try again.
Player 1, choose a row and number of rocks: A9
Invalid move. Try again.
Player 1, choose a row and number of rocks: A*
Invalid move. Try again.
Player 1, choose a row and number of rocks: &4
Invalid move. Try again.
Player 1, choose a row and number of rocks:
你的程序应保持提示玩家,直到玩家选择有效的输入为止。确保你的程序能够回显玩家的输入到屏幕上,当回显玩家的输入后,此时应该输出一个换行符(ASCII码x000A)使光标指向下一行。
- 玩家选择有效的输入后,你应该检查获胜者。如果有一个玩家获胜,你应该显示相应的输出来表明该玩家获胜。如果没有胜利者,你的程序应该更新游戏界面中每行石头的数量,重新显示更新的游戏界面,并轮到下一个玩家继续。
- 当某个玩家从游戏界面上移除最后的石头时,游戏结束。此时,你的程序应该显示获胜者然后停止。例如,如果玩家2移除了最后的石头,你的程序应该输出一下内容:
Player 2 Wins.
- 样例输入/输出
注意:你的程序中输入输出的格式必须完全和样例中的格式相一致
代码
c
#include <stdio.h>
#include <string.h>
char str[20];
char c;
char stone[8];
int line[26] = {0};
int valid[26] = {0};
int sum = 0;
int num = 0;
int player = 0;
int i, j;
int main() {
// 写c程序这里的实现更灵活,可以自行输入行数和对应石头数量
// 读取ROW A: ooooo,直到最后输入两次回车为止
while (fgets(str, sizeof(str), stdin) && str[0] != '\n') {
if (sscanf(str, "ROW %c: %s", &c, stone) == 2) {
if (c < 'A' || c > 'Z' || strlen(stone) > 8 || strlen(stone) < 1) {
printf("Invalid move. Try again.\n");
continue;
}
valid[c - 'A'] = 1;
sum += (line[c - 'A'] = strlen(stone));
// printf("%d,%d\n", line[c - 'A'],sum);
}
}
do {
printf("\nPlayer %d, choose a row and number of rocks: ", player + 1);
scanf(" %c%d", &c, &num);
// 添加一个空格,来忽略输入中的换行符
if (!valid[c - 'A'] || line[c - 'A'] < num) {
printf("Invalid move. Try again.\n");
continue;
}
line[c - 'A'] -= num;
sum -= num;
i = 0;
if (!sum) {
printf("Player %d Wins\n", player + 1);
break;
}
do {
if (!valid[i])
continue;
printf("\nROW %c: ", i + 'A');
j = 0;
while (j++ < line[i])
printf("o");
} while (++i < 26);
player = !player;
} while (1);
return 0;
}
go
package main
import (
"fmt"
"strings"
)
func isMultipleO(s string) bool {
trimmed := strings.Trim(s, "o")
return len(trimmed) == 0
}
func print(rowMap map[rune]int) {
for k, v := range rowMap {
fmt.Println("ROW ", string(k), ":", strings.Repeat("o", v))
}
return
}
func main() {
var A, B, C string
var input string
var row rune
var rocks int
var sum int = 0
var player int = 0
for {
fmt.Print("ROW A: ")
fmt.Scan(&A)
fmt.Print("ROW B: ")
fmt.Scan(&B)
fmt.Print("ROW C: ")
fmt.Scan(&C)
if !isMultipleO(A) || !isMultipleO(B) || !isMultipleO(C) || len(A) == 0 || len(B) == 0 || len(C) == 0 {
fmt.Println("Try again.")
continue
}
break
}
sum = len(A) + len(B) + len(C)
rowMap := map[rune]int{
'A': len(A),
'B': len(B),
'C': len(C),
}
for {
print(rowMap)
fmt.Print("Player ", player+1, ", choose a row and number of rocks: ")
fmt.Scan(&input)
fmt.Sscanf(input, "%c%d", &row, &rocks)
if row-'A' < 0 || row-'A' > 2 || rocks < 1 || rocks > rowMap[row] {
fmt.Println("Invalid move. Try again.")
fmt.Println()
continue
}
rowMap[row] -= rocks
sum -= rocks
if sum == 0 {
fmt.Println("Player ", player+1, " wins!")
break
}
player = ^player & 1
}
}
LC3
.ORIG x3000
LD R2 NUM_A
STI R2 STONE_A
LD R2 NUM_B
STI R2 STONE_B
LD R2 NUM_C
STI R2 STONE_C
LD R2 SUM
STI R2 STONE
AND R5 R5 #0 ;user ID
LD R6 ONE
chess JSR enter
LEA R0 ROW_A ;string
LDI R2 STONE_A
PUTS
JSR print ;PC is saved in R7
LEA R0 ROW_B
LDI R2 STONE_B
PUTS
JSR print
LEA R0 ROW_C
LDI R2 STONE_C
PUTS
JSR print
input LD R3 C
LD R4 A
LEA R0 PLAYER
PUTS
ADD R0 R5 R6 ;ID
OUT
LEA R0 MOVE
PUTS
GETC ;no IN
OUT
ADD R1 R0 R3
BRp err
ADD R0 R0 R4
BRn err
LD R1 STONE_A
ADD R1 R1 R0
LDR R2 R1 #0
GETC ;no IN
OUT
LD R3 ZERO
ADD R0 R0 R3
BRnz err
NOT R0 R0
ADD R0 R0 #1
ADD R2 R0 R2 ;stone
BRn err
STR R2 R1 #0
LDI R2 STONE ;sum
ADD R2 R0 R2
BRz win
STI R2 STONE
NOT R5 R5
AND R5 R5 #1
BR chess
err JSR enter
LEA R0 ERROR
PUTS
LD R0 LF
OUT
BR input
print ST R7 SAVE ;avoid R7 changed
draw ADD R2 R2 #-1 ;the number of stone
BRn return ;back to chess
LD R0 o ;int
OUT ;print R0
BR draw
return LD R0 LF
OUT
LD R7 SAVE
RET
win JSR enter
LEA R0 PLAYER
PUTS
ADD R0 R5 R6 ;ID
OUT
LEA R0 WINS
PUTS
HALT
enter ST R7 SAVE
LD R0 LF
OUT
LD R7 SAVE
RET
o .FILL #111
A .FILL #-65
C .FILL #-67
LF .FILL #10
SUM .FILL #16
ONE .FILL #49
NUM_A .FILL #3
NUM_B .FILL #5
NUM_C .FILL #8
ZERO .FILL #-48
STONE_A .FILL x4000
STONE_B .FILL x4001
STONE_C .FILL x4002
STONE .FILL x4003
SAVE .BLKW 1
MOVE .STRINGZ ", choose a row and number of rocks: "
ROW_A .STRINGZ "ROW A: "
ROW_B .STRINGZ "ROW B: "
ROW_C .STRINGZ "ROW C: "
ERROR .STRINGZ "Invalid move. Try again."
PLAYER .STRINGZ "Player "
WINS .STRINGZ " Wins!"
.END