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