数组应用之井字棋(C语言)

一、目的

利用数组实现一个简单的井字棋游戏!

二、运行环境

VS 2013 Ultimate版

三、具体步骤

这个简单的小程序是利用多文件的方法编写的。
1、创建对应的main.c(主函数所在的源文件),TIC-tac-toe.h(头文件),Tic-tac-toe.c(函数的实现文件)
(1)TIC-tac-toe.c
在这里插入图片描述
(2)Tic-tac-toe.h
右键单击管理器中的头文件添加新建项,然后如下图所示选择添加:
在这里插入图片描述
命名的时候,头文件与实现函数文件保持一致会更好!
(3)main.c
右键单击管理器中的源文件,添加新建项,然后如下图进行操作:
在这里插入图片描述
(4)至此,文件添加完成,开始写代码;
注意:头文件的写法
以#ifndef开始
#endif结束,
头文件包含所有的声明(函数,用到的头文件等的声明)
在这里插入图片描述
2.写大体的框架
在这里插入图片描述
在这里插入图片描述
3.之后进行Game()的具体实现!过程中你会发现慢慢的需要很多的函数来实现对应的功能,到时候就见招拆招!!!

四、源码

main.c

#include "Tic-tac-toe.h"
void Menu(){
	printf("*********************************\n");
	printf("** 1.开始游戏        2.退出游戏**\n");
	printf("           3.游戏帮助            \n");
	printf("*********************************\n");
	printf("请选择: ");
}
int main(){
	int  select = 0;
	do{
		Menu();
		scanf_s("%d", &select);
		switch (select){
		case 1:
			//开始游戏
			Game();
			break;
		case 2:
			//退出游戏,select == 2为退出条件
			select = 2;
			break;
		case 3:
			printf("先达三子连珠者赢!!!\n");
			break;
		default:
			printf("没有此选项,请重新输入!");
			break;
		}
	} while (select != 2);
	system("pause");
	return 0;
}

Tic-tac-toe.h

#ifndef _TIC-TAC-TOE_H_

#pragma warning(disable:4996)
#include <stdio.h>
#include <time.h>
#define NUM 3

void Game();
void InitBoard(char board[][NUM],int x,int y);
void ShowBoard(char board[][NUM],int x,int y);
void UserDown(char board[][NUM],int x,int y);
void ComputerDown(char board[][NUM], int x, int y);
char Judge(char board[][NUM], int x, int y);

#endif

Tic-tac-toe.c

#include "Tic-tac-toe.h"
void Game(){
	char result;
	char board[NUM][NUM] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
	InitBoard(board, NUM, NUM);
	do{
		ShowBoard(board, NUM, NUM);
		printf("请下棋:\n");
		UserDown(board, NUM,NUM);
		ShowBoard(board, NUM, NUM);
		result = Judge(board, NUM, NUM);
		if (result != 'N'){//不可以继续走,就跳出
			break;
		}
		ComputerDown(board, NUM, NUM);
		result = Judge(board, NUM, NUM);
		if (result != 'N'){//不可以继续走,就跳出
			break;
		}
		printf("计算机下:\n");
	} while (1);
	switch (result){
	case 'E':
		printf("平局,不想虐它一把吗?\n");
		break;
	case 'X':
		printf("很遗憾,你竟然赢了。\n");
		break;
	case 'O':
		printf("恭喜你,电脑碾压了你。\n");
		break;
	default:
		printf("不是你的错,是程序的错!\n");
		break;
	}
}


void ShowBoard(char board[][NUM], int x, int y){
	printf("   | 1 | 2 | 3 |\n");
	printf("----------------\n");
	int i = 1;
	for (; i <= 3; i++){
		printf(" %d | %c | %c | %c |\n", i,board[i-1][0],board[i-1][1],board[i-1][2]);
		printf("----------------\n");
	}
}

void UserDown(char board[][NUM], int x, int y){
	int a, b;
	while (1){
		scanf("%d %d", &a, &b);
		if (a >= 1 && b <= 3){
			if (board[a - 1][b - 1] == ' '){
				board[a - 1][b - 1] = 'X';
				break;
			}
			else{
				printf("此处已有棋!!!\n");
			}
		}
		else{
			printf("你要往哪里下?");
		}
	}	
}

void ComputerDown(char board[][NUM], int x, int y){
	int a, b;
	srand((unsigned int)time(NULL));
	while (1){
		a = rand() % 3 + 1;
		b = rand() % 3 + 1;
		if (a >= 1 && b <= 3){
			if (board[a - 1][b - 1] == ' '){
				board[a - 1][b - 1] = 'O';
				break;
			}
			else{
				//此处无操作
			}
		}
		else{
			//此处无操作,让计算机自己随机生成数
		}
	}
}

char Judge(char board[][NUM], int x, int y){
	int i, j;
	//判断行是否相等
	for (i = 0; i < NUM; i++){
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && \
			board[i][0] != ' '){
			return board[i][1];
		}
		else{
			//空语句
		}
	}
	//判断列是否相等
	for (j = 0; j <= NUM; j++){
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && \
			board[0][j] != ' '){
			return board[0][j];
		}
		else{
			//空语句
		}
	}
	//判断对角线是否相等
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){
		return board[0][0];
	}
	else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){
		return board[0][2];
	}
	else{
		//先执行上面的代码是判断是否有人先三子连珠,因为可能棋没有下完,但是出现了赢家
		for (i = 0; i <= NUM; i++){
			for (j = 0; j <= NUM; j++){
				if (board[i][j] == ' '){
					return 'N';
				}
			}
		}
	}
	//走到这里就说明是平局
	return 'E';
}

void InitBoard(char board[][NUM], int x, int y){
	int i, j;
	for (i = 0; i < NUM; i++){
		for (j = 0; j < NUM; j++){
			board[i][j] = ' ';
		}
	}
}

总结:
完成这个小游戏,对数组的操作就会更加得心应手了。打下了不错的基础!

参考:有缘人的指点

以下是简易井字棋C语言数组代码: #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_ROW 3 #define MAX_COL 3 //初始化棋盘 void Init(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { board[row][col] = ' '; } } } //打印棋盘 void printboard(char board[MAX_ROW][MAX_COL]) { printf(" 1 2 3\n"); for (int row = 0; row < MAX_ROW; row++) { printf("%d ", row + 1); for (int col = 0; col < MAX_COL; col++) { printf("%c", board[row][col]); if (col != MAX_COL - 1) { printf("|"); } } printf("\n"); if (row != MAX_ROW - 1) { printf(" -----\n"); } } } //玩家落子 void player(char board[MAX_ROW][MAX_COL]) { int row, col; printf("请落子(行 列):"); scanf("%d %d", &row, &col); while (board[row - 1][col - 1] != ' ') { printf("该位置已有棋子,请重新落子(行 列):"); scanf("%d %d", &row, &col); } board[row - 1][col - 1] = 'x'; } //电脑落子 void computer(char board[MAX_ROW][MAX_COL]) { int row, col; do { row = rand() % MAX_ROW; col = rand() % MAX_COL; } while (board[row][col] != ' '); board[row][col] = 'o'; } //判断胜负 char cheak(char board[MAX_ROW][MAX_COL]) { //判断行 for (int row = 0; row < MAX_ROW; row++) { if (board[row] == board[row] && board[row] == board[row] && board[row] != ' ') { return board[row]; } } //判断列 for (int col = 0; col < MAX_COL; col++) { if (board[col] == board[col] && board[col] == board[col] && board[col] != ' ') { return board[col]; } } //判断对角线 if (board == board && board[1] == board && board != ' ') { return board; } if (board == board && board[1] == board && board != ' ') { return board; } //判断平局 for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { if (board[row][col] == ' ') { return ' '; } } } return 't'; } int main() { //创建棋盘,初始化为全0 char board[MAX_ROW][MAX_COL] = { 0 }; //使用Init函数将棋盘初始位置改为' ' Init(board); //生成随机种子,程序开始前设置即可 srand((unsigned int)time(0)); char winner = ' '; while (1) { //打印棋盘 printboard(board); //玩家落子 player(board); //电脑落子 computer(board); //判断胜负 winner = cheak(board); if (winner != ' ') { //胜负已分,循环结束 break; } } if (winner == 'x') { printf("恭喜你赢了!!\n"); } else if (winner == 'o') { printf("你真菜!!\n"); } else { printf("你和人工智障五五开\n"); } system("pause"); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值