#include <stdio.h>
int main() {
//数组的创建
int arr1[5] = {0};
//大小为常量表达式
int arr[2 + 3];
//注意:C99之前只能用常量表示数组大小,C99之后引用的变长数组的概念,但是VS2022,2013不支持C99的变长数组
/*int n = 0;
scanf("%d", &n);
int arr3[n];*/
return 0;
}
使用VS Code连接远程Linux验证变长数组:
1.2数组的初始化
//数组的初始化
int main() {
//不完全初始化,剩下的元素默认初始化为0
int arr[10] = { 1,2,3 };
//完全初始化
int arr1[3] = { 1,2,3 };
//未指定大小的初始化(数组初始化后可以不指定大小,其大小根据初始化的内容来确定)
int arr2[] = { 1,2,3 };
//字符数组的初始化
char arr3[] = { 'a',97,'c' };//b的ASCII码值为97,没有'\0'
//用字符串初始化数组
char arr4[] = "abc";//有'\0'
return 0;
}
1.3 数组的使用
[] ,下标引用操作符。它其实就数组访问的操作符
1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。
#include <stdio.h>
//一维数组的使用
int main() {
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++) {
scanf("%d", &arr[i]);
}
for (i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
return 0;
}
1.4 一维数组在内存中的存储
//一维数组在内存中的存储
int main() {
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++) {
arr[i] = 10 - i;
}
for (i = 0; i < sz; i++) {
printf("&arr[%d]=%p\n", i,&arr[i]);
}
return 0;
}
数组在内存中是连续存放的且地址由低到高(通过数组的首元素地址即可访问数组)
2.二维数组的创建和初始化
2.1 二维数组的创建
//数组创建——添加了行和列的概念
int arr[3][4];
char arr[3][5];
double arr[2][4];
2.2 二维数组的初始化
//二维数组的初始化
int main() {
//不完全初始化
int arr[2][3] = { 0 };
//完全初始化
int arr1[2][3] = { 1,2,3,4,5,6 };
//用{}将每一行的元素扩起来时,每一行可以不完全初始化
int arr[2][3] = { {1},{3,4,5} };
return 0;
}
#include <stdio.h>
//二维数组的使用
int main() {
int arr[2][3] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
//输入1-6的值
arr[i][j] = i * 3 + j + 1;
}
}
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
}
return 0;
}
2.4 二维数组在内存中的存储
//二维数组在内存中的存储
int main() {
int arr[3][3] = { {1,3},{2,4,5},{1,5,7} };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("&arr[%d][%d]=%p\n", i, j, &arr[i][j]);
}
}
return 0;
}
#pragma once
#include <stdio.h>
//注意:预处理指令不以分号结尾;
#define Row 3
#define Col 3
//函数声明:
//初始化棋盘
//#define 定义标识符常量Row,Col,不可以作为形参变量
void InitBoard(char board[Row][Col], int row, int col);
//打印棋盘
void DisplayBoard(char board[Row][Col], int row, int col);
//玩家下棋:注意:玩家视角的棋盘与数组下标的区别
void PlayerMove(char board[Row][Col], int row, int col);
//电脑下棋
void ComputerMove(char board[Row][Col], int row, int col);
//判断输赢
char IsWin(char board[Row][Col], int row, int col);
game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void InitBoard(char board[Row][Col], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[Row][Col], int row, int col) {
for (int i = 0; i < row; i++) {
//打印每一行的列
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);//只适用于三列棋盘
//适用于所有棋盘
for (int j = 0; j < col; j++) {
printf(" %c ", board[i][j]);
if (j < col - 1) {
printf("|");
}
}
//注意:数据行和分割行的换行操作
//注意:printf()函数输出需要打印的字符串,必须用双引号打印,尽管只有一个字符
printf("\n");
if (i < row - 1) {
for (int j = 0; j < col; j++) {
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
//玩家下棋
void PlayerMove(char board[Row][Col], int row, int col) {
//注意:每一次输出都要换行
printf("玩家下棋\n");
int x = 0;
int y = 0;
while (1) {
printf("请输入坐标:\n");
scanf("%d %d", &x, &y);
if ((x < 1) || (x > row) || (y < 1) || (y > col)) {
printf("非法输入,请重新输入\n");
}
else if (board[x - 1][y - 1] != ' ') {
printf("该坐标被占用,请重新输入\n");
}
else {
board[x - 1][y - 1] = '*';
break;
}
}
}
//电脑下棋
void ComputerMove(char board[Row][Col], int row, int col) {
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1) {
//随机生成坐标
int x = rand() % row;
int y = rand() % col;
//注意:玩家的坐标与电脑随机生成的坐标的区别
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
}
//判断平局
int IsFull(char board[Row][Col],int row,int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢——直接返回棋盘中的数据,可以省去判断
//四种情况
//玩家赢——'*',电脑赢——'#',平局——'Q',游戏继续——'C'
//只要三点连成一线即可赢,这里的输赢判断只局限于三子棋
char IsWin(char board[Row][Col], int row, int col) {
int i = 0;
for (i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') {
return board[i][0];
}
}
for (i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[1][i] == board[2][1] && board[0][i] != ' ') {
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') {
return board[0][0];
}
if (IsFull(board, Row, Col)) {
return 'Q';
}
else
return 'C';
}
test.c文件
#include "game.h"
//三子棋设计
void menu() {
printf("*****************************\n");
printf("********* 1.play ************\n");
printf("********* 0.exit ************\n");
printf("*****************************\n");
}
void game() {
char ret = 0;
//定义棋盘:棋盘有行有列,是一个字符型二维数组
char board[Row][Col] = { 0 };
//初始化棋盘
InitBoard(board,Row,Col);
//打印棋盘
DisplayBoard(board, Row, Col);
while (1) {
//玩家下棋
PlayerMove(board, Row, Col);
DisplayBoard(board, Row, Col);
//判断输赢
ret = IsWin(board, Row, Col);
if (ret != 'C') {
break;
}
//电脑下棋
ComputerMove(board, Row, Col);
DisplayBoard(board, Row, Col);
//判断输赢
ret = IsWin(board, Row, Col);
if (ret != 'C') {
break;
}
}
if (ret == '*') {
printf("玩家赢\n");
}
else if (ret == '#') {
printf("电脑赢\n");
}
else {
printf("平局\n");
}
}
int main() {
int input = 0;
//调用一次srand函数
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择(0/1):\n");
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("非法输入,请重新输入\n");
break;
}
} while (input);
return 0;
}