当前位置: 首页 > 知识库问答 >
问题:

在Java以同样的比分再次上场

包嘉懿
2023-03-14

我如何添加“玩一次”功能在我的井字游戏,并保持分数从以前的游戏?我想要一个消息弹出告诉用户按“空格”再玩当有人赢了或当它是平局。有人建议我做一个while循环,但我不确定下一步该做什么。如果有人赢了/平局了,我是否应该将布尔玩法设置为fales,如果玩法者按了“空格”,我应该将它设置为true,但是我如何保持上一场游戏的比分呢?现在看起来是这样的

boolean playing = false;

do {
 // JFrame where the game is painted, all the buttons etc

 while(playing == true);

共有1个答案

寿翰飞
2023-03-14

我写的C版这款游戏女巫很像Java多年的时代。这可能会有帮助。

#include <stdio.h>

#define TRUE 1
#define EMPTYCELL ' '
#define TABLEFORMAT " %c | %c | %c \n-----------\n %c | %c | %c \n-----------\n %c | %c | %c \n"
#define POSITIONINPUTFORMAT "Player %c turn\nPLease enter a number from 1 to 9 :\n"
#define X 'X'
#define O 'O'

/*Functions Prototypes*/
void welcome(int);
void printTable(char[]);
int inputCheck(char[], int);
int endCheck(char[], char);
int newGame(char[]);
char roundTurn(int);
void updateGameData(int, char[], char);

int main() {

    int round = 0;
    char cells[10] = {EMPTYCELL, EMPTYCELL, EMPTYCELL, EMPTYCELL, EMPTYCELL, EMPTYCELL, EMPTYCELL, EMPTYCELL, EMPTYCELL,EMPTYCELL};
    int position;
    welcome(1);
    int end;

    while (TRUE) {

        round++;
        printf(POSITIONINPUTFORMAT, roundTurn(round));
        position = inputCheck(cells, position);
        updateGameData(position, cells, roundTurn(round));
        printTable(cells);
        end = endCheck(cells, roundTurn(round));

        if (end == TRUE) {
            int newGameVal = newGame(cells);
            
            if (newGameVal == 1) {
                round = 0;
                welcome(2);
                continue;
            } else if (newGameVal == 2) break;
        }
    }
    return 0;
}

void welcome(int gameNum) {

    if (gameNum == 1) {
        /*Welcome Messages*/
        printf("Hello\nWellCome to Tic Tac Toe\n");
        printf("PLease enter a number from map bellow\n"
               ""TABLEFORMAT, '1', '2', '3', '4', '5', '6', '7', '8', '9');
    } else if (gameNum == 2)
        printf("PLease enter a number from map bellow\n"
               ""TABLEFORMAT, '1', '2', '3', '4', '5', '6', '7', '8', '9');
    else printf("????");
}
void printTable(char cells[]) {
    /*Print Table*/
    printf(TABLEFORMAT, cells[1], cells[2], cells[3], cells[4],
           cells[5], cells[6], cells[7], cells[8], cells[9]);
}
int inputCheck(char cells[], int position) {

    while (TRUE) {

        fflush(stdin);
        scanf("%d", &position);
        /*Input Validation*/
        if (((position == 1) && (cells[1] == EMPTYCELL))
            || ((position == 2) && (cells[2] == EMPTYCELL))
            || ((position == 3) && (cells[3] == EMPTYCELL))
            || ((position == 4) && (cells[4] == EMPTYCELL))
            || ((position == 5) && (cells[5] == EMPTYCELL))
            || ((position == 6) && (cells[6] == EMPTYCELL))
            || ((position == 7) && (cells[7] == EMPTYCELL))
            || ((position == 8) && (cells[8] == EMPTYCELL))
            || ((position == 9) && (cells[9] == EMPTYCELL))) {
            break;
        } else {
            printf("Please enter correct number :\n");
            continue;
        }
    }
    return position;
}
int endCheck(char cells[], char turn) {
    /*Checking Win Situation*/
    if (((cells[1] == turn) && (cells[2] == turn) && (cells[3] == turn))
        || ((cells[4] == turn) && (cells[5] == turn) && (cells[6] == turn))
        || ((cells[7] == turn) && (cells[8] == turn) && (cells[9] == turn))
        || ((cells[1] == turn) && (cells[4] == turn) && (cells[7] == turn))
        || ((cells[2] == turn) && (cells[5] == turn) && (cells[8] == turn))
        || ((cells[3] == turn) && (cells[6] == turn) && (cells[9] == turn))
        || ((cells[1] == turn) && (cells[5] == turn) && (cells[9] == turn))
        || ((cells[3] == turn) && (cells[5] == turn) && (cells[7] == turn))) {

        printf("Player %c Wins\n", turn);
        return TRUE;
        /*Checking Draw Situation*/
    } else if ((cells[1] != EMPTYCELL) && (cells[2] != EMPTYCELL) && (cells[3] != EMPTYCELL)
               && (cells[4] != EMPTYCELL) && (cells[5] != EMPTYCELL) && (cells[6] != EMPTYCELL)
               && (cells[7] != EMPTYCELL) && (cells[8] != EMPTYCELL) && (cells[9] != EMPTYCELL)) {

        printf("Game Draw\nNo One Win\n");
        return TRUE;
    }
}
int newGame(char cells[]) {

    int exit;
    /*Asking For New Game Or Exit*/
    printf("To play another game enter 1\nFor exit 2\n");
    scanf("%d", &exit);
    while ((exit != 1) && (exit != 2)) {
        fflush(stdin);
        printf("Please enter correct number :\n");
        scanf("%d", &exit);
    }
    if (exit == 1) {
        /*Reset Game Data*/
        for (int i = 0; i < 11; i++) cells[i] = EMPTYCELL;
        return 1;
    } else if (exit == 2) {
        return 2;
    }
}
char roundTurn(int round) {
    /*Checking The Player Turn*/
    if ((round % 2) == 1) return X;
    else if ((round % 2) == 0) return O;
    else return '?';
}
void updateGameData(int position, char cells[], char turn) {
    /*Change Empty Cell With Player Turn*/
    cells[position] = turn;
}
 类似资料:
  • 问题内容: 新手问题,但我有以下代码: 当用户输入“ y”时,我只需要简单地再次打印欢迎消息即可。但这不起作用。有任何想法吗? 问题答案: 在Java中,使用来比较原始类型(int,long,boolean等)的相等性,而使用方法来比较对象类型(String等)的相等性。如果使用比较两个Object类型,则要检查 身份 ,而不是相等性-也就是说,您要验证两个对象在内存中是否共享完全相同的引用(因此

  • 我有一个关于查询对象两次的问题。我是说我有这样的情况: > - 后来在网站中,我把一个表单编辑一个实体。它就是上述实体之一。所以我查询这个实体的数据库(整体,而不是部分),并把它放在表单中。 问题是,如果我编辑其中一个实体,就不会再次查询它以获取所有字段,因为我以前已经查询过它。 你知道怎么解决这个问题吗?我不想查询选择框的完整实体。

  • 拼命尝试编写https://www.npmjs.com/package/node-firebird#reading-blobs-aasynchronous的同步版本 基本上我需要(a)等两次: 执行回调函数,以便事件发射器可用 为结束事件发生 然后返回Buffer。 我的代码(现在是JS/TS混合代码)当前执行2,但不是1:readBlob返回未定义的,然后Buffer.concat(buffer

  • 我在两个html文件的头部包含了相同的javascript文件: 和html页面1,然后链接到html页面2。但是,当您跟随指向page2的超链接时,加载page2时,javascript文件中的代码不会再次被调用。即使我试图在html文件2的头部或正文中添加一块代码来调用JS文件中的函数,它也不会执行。 我做错什么了吗? 编辑:这是代码http://jsfiddle.net/dL6gpveL/1

  • 我试着为家庭锻炼建立一个倒计时器,它在相同的间隔下运行两次,然后给你一个额外的间隔Rest。之后,它应该重新开始与3个间隔。 目前,我正在成功地运行从30秒到零的第一个间隔。我的问题是,我不能确定JavaFX任务是否完成。更准确地说,如果不创建几个自覆盖进程(例如,使用for循环),我就无法重新开始使用它。 这是我的用于处理我的FXML文件: 描述功能的GUI设计 接下来我可以尝试什么?已经尝试了

  • 问题内容: 如果“之间的区别一个谷歌”,那么很多的解释,会弹出(除了留下javadoc的段落)。这一切都归结于被唤醒等待的线程数:一个是和所有。 但是(如果我确实正确理解了这两种方法之间的区别),总是仅选择一个线程来进行进一步的监视器获取;在第一种情况下,由VM选择,在第二种情况下,由系统线程调度程序选择。程序员不知道它们的确切选择过程(一般情况下)。 然后和的有用区别是什么?我想念什么吗? 问题