一.前言

代码中运用多文件编码方式,调用函数,运用数组进行传参。加深对多文件编码和对数组的理解。

二.实现功能

首先给出菜单,通过用户输入指定玩游戏或者退出。当用户选择退出时,程序运行结束。当用过户选择玩游戏时,输出棋盘,用户需要输入要落子的坐标,然后电脑会随机在棋盘上落子。显示棋盘,直到棋盘上有三子连成一条线或者棋盘上下完,没有一子,三子连成一条线。输出赢家或和棋。

三.代码编写

在编写程序时,首先我们要进行主函数的编写,确定主要逻辑。代码块如下:

int main(){
	int quit = 0;//用来退出
	while (!quit){
	menu();
	int s = 0;
	scanf("%d", &s);
	switch (s){
	case 1:
		game();
		break;
	case 2:
		quit = 1;
		break;
	default:
		printf("输入错误!请再次输入\n");
		break;
	}
 
}

在主函数中首先我们要编写一个菜单函数menu(),供用户选择是否玩游戏。

void menu(){
	printf("###################\n");
	printf("##1.play   2.exit##\n");
	printf("###################\n");

当用户选择玩游戏时,我们要进行对game()函数的编写来确定游戏函数的编写逻辑。

首先我们要确定三子棋中棋子保存在一个二维数值中。然后要将棋盘显示并且将棋盘中的棋子初始化。当用户确定落子坐标时,我们要考虑 1.落子位置是否已经有子了,2.是否超过了棋盘。然后要进行判断,是否有三子连线,当电脑落子后也要进行这一判断。直到有人胜出或者和棋。

void game(){
	char str[H][L];
	int x = 0;
	int y = 0;
	char result;
	init(str);//将棋盘中的每一位赋值为‘ ’
	do{
		srand((unsigned long )time(NULL));
		show(str);//展示棋盘
		printf("please input <x,y>:");
		scanf("%d%d" ,&x,&y);
		if (x<1 || x>3 || y<1 || y>3){
			printf("超过范围,请重新输入\n");   //判断是否超过范围,需放在判断位置是否被填入之前,别的位置随机数可能不为空。
			continue;
		}
		if (str[x-1][y-1] != Q){
			printf("该位置已被填入\n");    //判断位置是否被填入
			continue;
		}
		str[x - 1][y - 1] = P;
		result = judge(str);  //判断情况有人赢 电脑赢 下满了没人赢   没下满      
		if (result != 'N'){
			break; 
		}
		comput(str);
		result = judge(str);
		if (result != 'N'){
			break;
		}
	} while (1);
	if (result == P){
		printf("you are win!\n");
	}
	else if (result == C){
		printf("you are lose!\n");    
	}
	else{
		printf("tie game!\n");
	}
	
}

在游戏函数中
void init();函数是来初始化棋盘,这里代码是将‘ ’空格赋给棋盘。

void init(char str[][L]){
	int i = 0;
	for (; i < H; i++){
		int j = 0;
		for (; j < L; j++){
			str[i][j] = Q;
		}
	}
}

void show();用来展示棋盘。

void show(char str[][L]){
	printf("    1| 2| 3|\n");
	printf(" -----------\n");
	int i = 0;
	for (; i < H; i++){
		printf(" %d|",i+1);
		int j = 0;
		for (; j < L; j++){
			printf("%c |", str[i][j]);
		}
		printf("\n");
		printf(" -----------\n");
	}
}

void comput();函数用来电脑落子,通过电脑产生随机数对3取模,形成坐标。

void comput(char str[][L]){
	while (1){
		int x = rand() % H;
		int y = rand() % L;   //对3取余范围0 1 2
		if (str[x][y] == Q){     
			str[x][y] = C;
			break;
		}
	}
}

char judge();此函数用来进行判断是否有三子连线,是否棋盘被下满了。若有三子相同返回对应的棋子,和棋返回‘F',为下完返回‘N’。注意相同时要去除 ‘ ’ 情况。

char judge(char str[][L]){
	int i = 0;
	for (; i < H; i++){
		if (str[0][i] == str[1][i] && str[1][i] == str[2][i] && \
			str[0][i] != Q&&str[1][i] != Q&&str[2][i] != Q){     //判断行方向是否有三子相同
			return str[0][i];
		}
	}
	for (i = 0; i < L; i++){
		if (str[i][0] == str[i][1] && str[i][1] == str[i][2] && \
			str[i][0] != Q&&str[i][1] != Q&&str[i][2] != Q){     //判断列方向是否有三子相同
			return str[i][1];
		}                                                                     
	}
	if (str[1][1] == str[0][0] && str[1][1] == str[2][2] && \
		str[1][1] != Q && str[0][0] != Q &&str[2][2] != Q){     //判断列方向是否有三子相同
		return str[1][1];
	}                                                             
	if (str[1][1] == str[0][2] && str[1][1] == str[2][0] && \
		str[1][1] != Q && str[0][2] != Q &&str[2][0] != Q){
		return str[1][1];
	}                                                 //两个为判断列对角线方向是否有三子相同
	for (i = 0; i < H; i++){
		int j = 0;
		for (; j < L; j++){
			if (str[i][j] == Q){                     //判断棋盘是否满了
				return 'N';
			}
		}
	}
	return 'F';
	
}

由于运用多文件编码的方法,还需要对头文件,函数变量进行声明。

#ifndef _MYTEST_H_
#define _MYTEST_H_
 
#include<stdio.h>
#include<windows.h>
#include<time.h>
#pragma warning(disable:4996)
 
#define H 3
#define L 3
#define P 'X'
#define C 'O'
#define Q ' '
#define W 'P'
 
void menu();
void init(char str[][L]);
void show(char str[][L]);
void comput(char str[][L]);
char judge(char str[][L]);
void game();
 
 
#endif

【五子棋页游开发】