1. 程式人生 > >C語言實現一條龍小遊戲

C語言實現一條龍小遊戲

一條龍小遊戲
一、程式碼構思
全部程式碼分為三個檔案:game.h, game.c, text.c(game.h用來申明所有用到的函式,game.c用來寫實現遊戲的程式碼,text.c用來除錯程式碼)
第一步將棋盤初始化為空格;第二步列印棋盤;第三步設計由玩家先走(在棋盤中放入X),然後電腦走(在棋盤中放入*);第四步判斷輸贏,若有一方有三個相同的子連在一條直線上則贏了,另一方輸;若棋盤滿了也沒有三子連成一線,則為平局。
其中標頭檔案game.h


#ifndef __GAME_H__
#define __GAME_H__

#include <time.h>
#include<stdio.h>
#include <stdlib.h>
#include<time.h>

#define ROW 3//棋盤的行數
#define COL 3//棋盤的列數


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);//判斷輸贏函式

#endif //__GAME_H__

二、遊戲介面構思
設計一個簡單的進入遊戲選單及棋盤

void menu()
{
	printf("**************************************\n");
	printf("*************  1.play ****************\n");
	printf("*************  0.exit ****************\n");
	printf("**************************************\n");//遊戲選單
}

選單效果
選單效果

void DisplayBoard(char board[ROW][COL], int row, int col)//定義一個二維陣列輸出函式
{
	int i = 0;
	int j = 0;
	for (i = 0; i<row; i++)
	{
		//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);有侷限性,遊戲無法擴充套件
		for (j = 0; j<col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j<col - 1)
				printf("|");//列印資料行
		}
		printf("\n");
		if (i<row - 1)
		{
			//printf("---|---|---\n");
			for (j = 0; j<col; j++)
			{
				printf("---");
				if (j<col - 1)
					printf("|");//列印分割行
			}
			printf("\n");
		}
	}
}
void InitBoard(char board[ROW][COL], int row, int col)//定義一個二位數初始化函式
{
 memset(&board[0][0], ' ', row*col*sizeof(board[0][0]));//記憶體設定函式,從二維陣列首地址開始將所有值賦‘ ’值
}

遊戲剛開始三子棋棋盤效果
三子棋棋盤

三、遊戲程式碼實現
1.玩家走

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;  //定義兩個座標變數
	int y = 0;
	printf("玩家走:>\n");//提示玩家走

	while (1)
	{
		printf("請輸入走的座標(1-3):>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷輸入座標的合法性,且遊戲面向大眾座標從1開始
		{
			if (board[x - 1][y - 1] == ' ')//陣列座標從0開始,若為空格則可落子
			{
				board[x - 1][y - 1] = 'X';
				break;//只有輸入正確時才能跳出while(1)的死迴圈
			}
			else
			{
				printf("座標被佔用,重新輸入!\n");//遊戲規則:已經有子則重新輸入
			}
		}
		else
		{
			printf("座標有誤,重新輸入!\n");
		}
	}
}

2.電腦走

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("電腦走:>\n");//提示電腦走

	while (1)
	{
		x = rand() % row;//rand()的範圍0-32767,取餘行列從而隨機生成座標;rand()需要呼叫srand()函式
		y = rand() % col;
		if (board[x][y] == ' ')//判斷是否被佔用
		{
			board[x][y] = '*';
			break;
		}
	}
}

3.判斷遊戲輸贏

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][i]
			&& board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2]
		&& board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0]
		&& board[1][1] != ' ')
	{
		return board[1][1];
	}

	//判斷平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}

	//遊戲繼續
	return ' ';
}

4.遊戲效果
在這裡插入圖片描述