更新我的阵列棋盘游戏

时间:2014-07-18 17:59:57

标签: c arrays counter multidimensional-array

所以我正在制作一款游戏。它有一个5乘5的板,上面填充了字符a,b和c。我需要创建一个函数,如果电路板检测到彼此相邻的相同字母,它就会消失,并且用一组新的字母(a,b,c)替换清空的单元格。所以有点像糖果美眉游戏。我还需要显示比赛结束前的动作次数。这是我到目前为止的地方

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 10

//creates board and fills in the letters randomly
int board()
{
    char grid[MAX][MAX];
    char letter[3] = {'a', 'b', 'c'};
    int i,j,row,col;

    printf("Please enter your grid size: ");
    scanf("%d %d", &row, &col);
    if(row < 10 && col < 10){
        for(i=0; i < MAX; i++){
            for(j=0; j < MAX; j++){
                grid[i][j] = letter[rand()%3];
            }
        }
        for(i=0; i < MAX; i++){
            for(j=0; j < MAX; j++){
                printf("%c ", grid[i][j]);
            }
            printf("\n");
        }
    }
    else{
        printf("Board is too big\n");
        board();
    }
    return 0;
}

//the count doesn't quite do what I need it to
int moveCount()
    {
    char s;
    printf("Press s to start: ");
    scanf("%c", &s);
    if(s == 's' || s == 'S'){
        int count;
        int max = 10;
        for(count=1; count < max; count++)
            if(count == max){
                -printf("No more moves can be made");
            }
            else{
                printf("Number of moves made: %d\n", count);
            }
    }
    else{
        printf("That is not s\n");
        moveCount();
    }
}

//Trying to check to make sure that n board is always atleast three cells
int inputCheck(){
    int n, m;
    if(n == 3 || n > 3 && m == 1 || m > 1){
        moveCount();
    }
}

int main()
{
    board();
    inputCheck();
}

实现检查相邻单元格是否相同然后删除它们的函数的最佳方法是什么。我会想象做一些像if(myArray [0] [0] =='a'&amp;&amp; myArray [0] [1] =='a'{做某事} ......但我不知道是否这是最好的方式或我如何循环。还有如何正确实现显示移动的计数? 我意识到这个代码有很多缺陷,但我很新,所以请轻松一下。感谢您提供任何帮助或推动正确的方向。

3 个答案:

答案 0 :(得分:1)

这是一个严重的错误:

int n, m;
if(n == 3 || n > 3 && m == 1 || m > 1){

nm未初始化使用。

#include <stdlib.h>

需要rand()

答案 1 :(得分:0)

回答你的实际问题,这样的事情会起作用。这相当邋,,但这是我的5分钟答案。我假设grid是实际的板,目前只存在于board()函数中,所以我只是将其作为参数添加。 AKA你必须让它适合你的实际游戏。

inline int clamp (int v, int min, int max) {
  return (v < min) ? min: (v > max) ? max: v;
}

void place (char ltr, int x, int y, char grid[MAX][MAX])
{
  grid[y][x] = ltr; // TODO: put bounds checking around x & y
  for (int i = clamp(y - 1, 0, MAX); i <= clamp (y + 1, 0, MAX); i++) {
    for (int j = clamp(x - 1, 0, MAX); j <= clamp(x + 1, 0, MAX); j++) {
      if (i != y || j != x && grid[i][j] == ltr) {
        grid[i][j] = '\0';  // TODO: replace null char with desired one.
      }
    }
  }
}

答案 2 :(得分:0)

电路板功能设置得很好。 如前所述,如果要在不同的函数中检查它们,参数是检查值的最佳方法,如果您希望在函数中检查它们,则可以使用简单的if命令。

我不会将整个数组作为参数传递,而是使用指向该特定单元格的指针。然后,当一个人选择一个单元格时,他们会得到一个存储器地址,然后你可以将存储器地址中存储的信息与他们正在比较的另一个存储器地址进行比较。

快速指针课程 - *用于创建指针。例如,char * ch = array;将指向整个数组的内存地址。然后通过更多研究,您将能够转到二维阵列中的特定存储器地址,例如您的电路板,查看该位置的内容并将其与二维内容中另一个存储器地址中包含的内容进行比较阵列。

你为什么要这个? 由于这不是Java,我们可以在C中进行内存管理,并使用整个数组作为参数,这是一种简单但内存成本更高的方法。此外,指针是大多数编程语言中的基本元素,对它们的了解将使您成为更好的程序员。

快乐旅行!!

这也更容易通过你的董事会说,这个人在数组[3] [2]中选择了这个地址,那时他们只会选择四个内存地址。他们选择了哪种方式,内存地址将存在,您将能够以最小的系统使用率和快速响应进行比较。