写这段代码可谓是历经一番波折,各种错误低级高级,总之报错不停,中途烦的我不想写了都,结果睡一觉第二天还是耐心的理了思路,在细节上找错误,由于是数组的应用较多,数组又有许多易错的点,所以一定要多加注意.
先说一下总结的关于数组易错点:
下标越界问题!!!非常非常麻烦而且难查,尽量避免出错.
注意形参中数组写arr[],数组中最注意的就是格式,一旦有错就会不停报错
传参时实参arr不带[]
形参写做int* arr[]
解引用时要么*arr要么arr[]
下面这个错误就是解引用格式错误引起的:
—我这一步为什么读取位置 0x00000009 时发生访问冲突了,我琢磨了一下,下标也没越界呀,执行这一行的时候数组长度也没改啊
—这个赋值语句有问题,后面那个等号后面那个部分你方块儿已经是解用了,然后又进入一次,这个就有问题了呀。—方括号就是解引用
!!!*arr或者arr[]只能用一个!!!
—那这两种写法应该选哪个?
—这两种写法是等价的!
下面这个是我写完全篇代码之后并检查所有语句错误 并且编译成功了,但是运行过程强制中断,这句话意思是变量“xxx”周围的堆栈已损坏
打断点找错误去改,这个我也搞不明白是什么原因,一般是数组越界!
//二维数组的应用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define I 3
#define J 3
void init(char board[I][J]){
for (int i = 0; i <= I; i++){
for (int j = 0; j <= J; j++){
board[i][j] = ' ';
}
}
//设置随机种子
//程序启动时根据时间设置一次即可
srand((unsigned int)time(0));
}
void printfboard(char board[I][J]){
system("cls");//每次打印棋盘之前清个屏
for (int i = 0; i < I; i++){
printf("+---+---+---+\n");
for (int j = 0; j < J; j++){
printf("| %c ", board[i][j]);//打印字符用%c
}
printf("|");
printf("\n");
}
printf("+---+---+---+\n");
}
void player(char board[I][J]){
printf("玩家选落子位置:");
while (1){
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
//需要验证一下玩家输入的符不符合要求
if (i < 0 || i >= I || j < 0 || j >= J)
{
printf("不对!!!!!!傻憨憨!\n");
printf("重新输一个位置:");
continue;
}
if (board[i][j] != ' ')
{
printf("这位置被下过了会不会玩啊,无语...\n");
continue;
}
board[i][j] = 'x';//玩家落子
break;//用break跳出循环
}
}
void computer(char board[I][J]){
printf("电脑落子\n");
while (1)
{
int i = rand() % I;
int j = rand() % J;
if (board[i][j] != ' '){
continue;
}
board[i][j] = 'o';//电脑落子
break;
}
}
int isFull(char board[I][J]) {
for (int i = 0; i < I; i++) {
for (int j = 0; j < J; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
char cheakBoard(char board[I][J]) {
//判定每行是不是连成线
for (int i = 0; i <= I; i++){
if (board[i][0] != ' '&&board[i][0] == board[i][1] && board[i][0] == board[i][2]){
return board[i][0];
}
}
//判定每列是不是连成线
for (int j = 0; j <= J; j++){
if (board[0][j] != ' '&&board[0][j] == board[1][j] && board[0][j] == board[2][j]){
return board[0][j];
}
}
//判定两个对角线
if (board[0][0] != ' '&&board[1][1] == board[0][0] && board[2][2] == board[0][0]){
return board[0][0];
}
if (board[0][2] != ' '&&board[0][2] == board[1][1] && board[0][2] == board[2][0]){
return board[0][2];
}
else if (isFull(board)){
return 'q';
}
return 'p';
}
int main(){
//1.创建一个3*3的棋盘,并进行初始化,用二维数组board表示
char board[I][J] = { 0 };
//2.写一个函数把每个格子都初始化成一个空格''
init(board);
char win = ' ';
while (1){
//3.打印棋盘
printfboard(board);
//4.玩家落子
player(board);
//5.判定胜负
win = cheakBoard(board);
if (win == 'x'){
printf("赢了\n");
}
else if (win == 'o'){
printf("输了,你咋连简单模式的都下不过\n");
}
else if (win == 'q'){
printf("这把和了\n");
}
if (win != 'p'){
break;
}
//6.电脑落子
computer(board);
//7.判定胜负
win = cheakBoard(board);
if (win == 'x'){
printf("赢了\n");
}
else if (win == 'o'){
printf("输了,你咋连简单模式的都下不过\n");
}
else if (win == 'q'){
printf("这把和了\n");
}
if (win != 'p'){
break;
}
}
system("pause");
return 0;
}
再点一下就是这样