Nim游戏-实验报告

自己写的代码可能有问题,希望不要照抄查重😭😭

实验说明

  1. 游戏规则
    本次实验对Nim游戏做了一些小的改变,具体如下:游戏界面由三行组成,计数器类型为石头,其中A行包含3个石头,B行包含5个石头,C行包含8个石头。
    规则如下:
  • 每个玩家轮流从某一行中移除一个或多个石头。
  • 一个玩家不能在一个回合中从多个行中移除石头。
  • 当某个玩家从游戏界面上移除最后剩余的石头时,此时游戏结束,该玩家获胜。
  1. 实验要求
  • 在游戏开始时,你应该显示游戏界面的初始化状态。具体包括:在每行石头的前面,你应该先输出行的名称,例如“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.

  1. 样例输入/输出
    注意:你的程序中输入输出的格式必须完全和样例中的格式相一致

代码

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
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值