一.前言
代码中运用多文件编码方式,调用函数,运用数组进行传参。加深对多文件编码和对数组的理解。
二.实现功能
首先给出菜单,通过用户输入指定玩游戏或者退出。当用户选择退出时,程序运行结束。当用过户选择玩游戏时,输出棋盘,用户需要输入要落子的坐标,然后电脑会随机在棋盘上落子。显示棋盘,直到棋盘上有三子连成一条线或者棋盘上下完,没有一子,三子连成一条线。输出赢家或和棋。
三.代码编写
在编写程序时,首先我们要进行主函数的编写,确定主要逻辑。代码块如下:
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
【五子棋页游开发】