数组应用之 三子棋小游戏(我写的第一个小游戏)

写这段代码可谓是历经一番波折,各种错误低级高级,总之报错不停,中途烦的我不想写了都,结果睡一觉第二天还是耐心的理了思路,在细节上找错误,由于是数组的应用较多,数组又有许多易错的点,所以一定要多加注意.

先说一下总结的关于数组易错点:

下标越界问题!!!非常非常麻烦而且难查,尽量避免出错.
注意形参中数组写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;
}

在这里插入图片描述再点一下就是这样
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值